* Fixed 'mount -a' so it works as expected.
* Implemented 'ls -R' (enabled by enabling BB_FEATURE_LS_RECURSIVE)
-Erik
* "mount" now reports errors from nfsmount() and assumes NFS mount
if ':' is present in the device name - Pavel Roskin
* Fixed exit status for killall - Pavel Roskin
+ * Fixed 'swapon -a' and 'swapoff -a', which were broken.
+ * Fixed 'mount -a' so it works as expected.
+ * Implemented 'ls -R' (enabled by enabling BB_FEATURE_LS_RECURSIVE)
* More doc updates
Bugs that need fixing before the 0.44 release goes out the door:
- - mkfs.minix rev 1.7 completely broke the parser. Fix it.
- 'grep foo$ file' doesn't work
- 'grep *foo file' segfaults
- ps dirent race bug (need to stat the file before attempting chdir)
- - I believe that swaponoff may also be also broken (check it).
- - It used to be that BusyBox tar would happily overwrite existing files on
- an extraction. However, as of 0.42, BusyBox tar simply dies as soon as an
- existing file is found.
- - Make 'mount -a' work even when /proc isn't mounted (ugly bug).
- Make 'ln -s /tmp/file .' work the way GNU ln does (i.e. makes a link to
/tmp/file in the current directory, rather then trying and failing to create
a symlink named "." in the current working directory).
- - implement 'ls -R'.
- "math" should also take input from stdin
- "more" doesn't accept " " to scroll by one page when BB_FEATURE_USE_TERMIOS
is not on.
// enable ls -p and -F
#define BB_FEATURE_LS_FILETYPES
//
+// enable ls -R
+#define BB_FEATURE_LS_RECURSIVE
+//
// Change ping implementation -- simplified, featureless, but really small.
//#define BB_SIMPLE_PING
//
#define DISP_DOT 8 /* show . and .. */
#define DISP_NUMERIC 16 /* numeric uid and gid */
#define DISP_FULLTIME 32 /* show extended time display */
-#define DIR_NOLIST 64 /* show directory as itself, not contents */
+#define DIR_NOLIST 64 /* show directory as itself, not contents */
#define DISP_DIRNAME 128 /* show directory name (for internal use) */
+#define DISP_RECURSIVE 256 /* Do a recursive listing */
#ifndef MAJOR
#define MAJOR(dev) (((dev)>>8)&0xff)
"xAC"
#ifdef BB_FEATURE_LS_FILETYPES
"F"
+#endif
+#ifdef BB_FEATURE_LS_RECURSIVE
+ "R"
#endif
"] [filenames...]\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
#ifdef BB_FEATURE_LS_FILETYPES
"\t-F\tappend indicator (one of */=@|) to entries\n"
#endif
+#ifdef BB_FEATURE_LS_RECURSIVE
+ "\t-R\tlist subdirectories recursively\n"
+#endif
#endif
;
+
+#ifdef BB_FEATURE_LS_RECURSIVE
+static int dirAction(const char *fileName, struct stat *statbuf, void* junk)
+{
+ int i;
+ fprintf(stdout, "\n%s:\n", fileName);
+ i = list_item(fileName);
+ newline();
+ return (i);
+}
+#endif
+
extern int ls_main(int argc, char **argv)
{
int argi = 1, i;
case 'e':
opts |= DISP_FULLTIME;
break;
+#endif
+#ifdef BB_FEATURE_LS_RECURSIVE
+ case 'R':
+ opts |= DISP_RECURSIVE;
+ break;
#endif
default:
goto print_usage_message;
#endif
/* process files specified, or current directory if none */
- i = 0;
- if (argi == argc)
- i = list_item(".");
- while (argi < argc)
- i |= list_item(argv[argi++]);
- newline();
+#ifdef BB_FEATURE_LS_RECURSIVE
+ if (opts & DISP_RECURSIVE) {
+ i = 0;
+ if (argi == argc) {
+ i = recursiveAction(".", TRUE, FALSE, FALSE, NULL, dirAction, NULL);
+ }
+ while (argi < argc) {
+ i |= recursiveAction(argv[argi++], TRUE, FALSE, FALSE, NULL, dirAction, NULL);
+ }
+ } else
+#endif
+ {
+ i = 0;
+ if (argi == argc)
+ i = list_item(".");
+ while (argi < argc)
+ i |= list_item(argv[argi++]);
+ newline();
+ }
exit(i);
print_usage_message:
=item ls
-Usage: ls [B<-1acdelnpuxACF>] [filenames...]
+Usage: ls [B<-1acdelnpuxACFR>] [filenames...]
Options:
-A do not list implied . and ..
-C list entries by columns
-F append indicator (one of */=@|) to entries
+ -R list subdirectories recursively
-------------------------------
=cut
-# $Id: busybox.pod,v 1.35 2000/06/06 16:15:23 andersen Exp $
+# $Id: busybox.pod,v 1.36 2000/06/07 17:28:53 andersen Exp $
#define DISP_DOT 8 /* show . and .. */
#define DISP_NUMERIC 16 /* numeric uid and gid */
#define DISP_FULLTIME 32 /* show extended time display */
-#define DIR_NOLIST 64 /* show directory as itself, not contents */
+#define DIR_NOLIST 64 /* show directory as itself, not contents */
#define DISP_DIRNAME 128 /* show directory name (for internal use) */
+#define DISP_RECURSIVE 256 /* Do a recursive listing */
#ifndef MAJOR
#define MAJOR(dev) (((dev)>>8)&0xff)
"xAC"
#ifdef BB_FEATURE_LS_FILETYPES
"F"
+#endif
+#ifdef BB_FEATURE_LS_RECURSIVE
+ "R"
#endif
"] [filenames...]\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
#ifdef BB_FEATURE_LS_FILETYPES
"\t-F\tappend indicator (one of */=@|) to entries\n"
#endif
+#ifdef BB_FEATURE_LS_RECURSIVE
+ "\t-R\tlist subdirectories recursively\n"
+#endif
#endif
;
+
+#ifdef BB_FEATURE_LS_RECURSIVE
+static int dirAction(const char *fileName, struct stat *statbuf, void* junk)
+{
+ int i;
+ fprintf(stdout, "\n%s:\n", fileName);
+ i = list_item(fileName);
+ newline();
+ return (i);
+}
+#endif
+
extern int ls_main(int argc, char **argv)
{
int argi = 1, i;
case 'e':
opts |= DISP_FULLTIME;
break;
+#endif
+#ifdef BB_FEATURE_LS_RECURSIVE
+ case 'R':
+ opts |= DISP_RECURSIVE;
+ break;
#endif
default:
goto print_usage_message;
#endif
/* process files specified, or current directory if none */
- i = 0;
- if (argi == argc)
- i = list_item(".");
- while (argi < argc)
- i |= list_item(argv[argi++]);
- newline();
+#ifdef BB_FEATURE_LS_RECURSIVE
+ if (opts & DISP_RECURSIVE) {
+ i = 0;
+ if (argi == argc) {
+ i = recursiveAction(".", TRUE, FALSE, FALSE, NULL, dirAction, NULL);
+ }
+ while (argi < argc) {
+ i |= recursiveAction(argv[argi++], TRUE, FALSE, FALSE, NULL, dirAction, NULL);
+ }
+ } else
+#endif
+ {
+ i = 0;
+ if (argi == argc)
+ i = list_item(".");
+ while (argi < argc)
+ i |= list_item(argv[argi++]);
+ newline();
+ }
exit(i);
print_usage_message:
}
}
#endif
- status =
- mount(specialfile, dir, filesystemtype, flags, string_flags);
+ status = mount(specialfile, dir, filesystemtype, flags, string_flags);
}
del_loop(specialfile);
}
#endif
+
+ if (errno == EPERM) {
+ fatalError("mount: permission denied. Are you root?\n");
+ }
+
return (FALSE);
}
fakeIt, mtab_opts);
}
- if (status == FALSE && whineOnErrors == TRUE) {
+ if (status == FALSE) {
if (whineOnErrors == TRUE) {
fprintf(stderr, "Mounting %s on %s failed: %s\n",
blockDevice, directory, strerror(errno));
// If the filesystem isn't noauto,
// and isn't swap or nfs, then mount it
if ((!strstr(m->mnt_opts, "noauto")) &&
- (!strstr(m->mnt_type, "swap")) &&
- (!strstr(m->mnt_type, "nfs"))) {
+ (!strstr(m->mnt_type, "swap")) &&
+ (!strstr(m->mnt_type, "nfs"))) {
flags = 0;
*string_flags = '\0';
parse_mount_options(m->mnt_opts, &flags, string_flags);
- /* If the directory is /, try to remount
- * with the options specified in fstab */
- if (m->mnt_dir[0] == '/' && m->mnt_dir[1] == '\0') {
- flags |= MS_REMOUNT;
- }
if (mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,
- flags, string_flags, useMtab, fakeIt,
- extra_opts, FALSE))
+ flags, string_flags, useMtab, fakeIt,
+ extra_opts, FALSE)==FALSE)
{
/* Try again, but this time try a remount */
mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,
- flags|MS_REMOUNT, string_flags, useMtab, fakeIt,
- extra_opts, TRUE);
+ flags|MS_REMOUNT, string_flags, useMtab, fakeIt,
+ extra_opts, TRUE);
}
}
}
exit(FALSE);
}
while ((m = getmntent(f)) != NULL) {
- if (!strstr(m->mnt_type, MNTTYPE_SWAP)) {
+ if (strcmp(m->mnt_type, MNTTYPE_SWAP)==0) {
swap_enable_disable(m->mnt_fsname);
}
}
}
}
#endif
- status =
- mount(specialfile, dir, filesystemtype, flags, string_flags);
+ status = mount(specialfile, dir, filesystemtype, flags, string_flags);
}
del_loop(specialfile);
}
#endif
+
+ if (errno == EPERM) {
+ fatalError("mount: permission denied. Are you root?\n");
+ }
+
return (FALSE);
}
fakeIt, mtab_opts);
}
- if (status == FALSE && whineOnErrors == TRUE) {
+ if (status == FALSE) {
if (whineOnErrors == TRUE) {
fprintf(stderr, "Mounting %s on %s failed: %s\n",
blockDevice, directory, strerror(errno));
// If the filesystem isn't noauto,
// and isn't swap or nfs, then mount it
if ((!strstr(m->mnt_opts, "noauto")) &&
- (!strstr(m->mnt_type, "swap")) &&
- (!strstr(m->mnt_type, "nfs"))) {
+ (!strstr(m->mnt_type, "swap")) &&
+ (!strstr(m->mnt_type, "nfs"))) {
flags = 0;
*string_flags = '\0';
parse_mount_options(m->mnt_opts, &flags, string_flags);
- /* If the directory is /, try to remount
- * with the options specified in fstab */
- if (m->mnt_dir[0] == '/' && m->mnt_dir[1] == '\0') {
- flags |= MS_REMOUNT;
- }
if (mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,
- flags, string_flags, useMtab, fakeIt,
- extra_opts, FALSE))
+ flags, string_flags, useMtab, fakeIt,
+ extra_opts, FALSE)==FALSE)
{
/* Try again, but this time try a remount */
mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,
- flags|MS_REMOUNT, string_flags, useMtab, fakeIt,
- extra_opts, TRUE);
+ flags|MS_REMOUNT, string_flags, useMtab, fakeIt,
+ extra_opts, TRUE);
}
}
}
exit(FALSE);
}
while ((m = getmntent(f)) != NULL) {
- if (!strstr(m->mnt_type, MNTTYPE_SWAP)) {
+ if (strcmp(m->mnt_type, MNTTYPE_SWAP)==0) {
swap_enable_disable(m->mnt_fsname);
}
}