* 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)
 -Erik
This commit is contained in:
Eric Andersen 2000-06-07 17:28:53 +00:00
parent 1f6262b8e2
commit a42982e8f5
10 changed files with 125 additions and 53 deletions

View File

@ -60,6 +60,9 @@
* "mount" now reports errors from nfsmount() and assumes NFS mount * "mount" now reports errors from nfsmount() and assumes NFS mount
if ':' is present in the device name - Pavel Roskin if ':' is present in the device name - Pavel Roskin
* Fixed exit status for killall - 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 * More doc updates

7
TODO
View File

@ -18,19 +18,12 @@ around to it some time. If you have any good ideas, please let me know.
Bugs that need fixing before the 0.44 release goes out the door: 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' doesn't work
- 'grep *foo file' segfaults - 'grep *foo file' segfaults
- ps dirent race bug (need to stat the file before attempting chdir) - 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 - 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 /tmp/file in the current directory, rather then trying and failing to create
a symlink named "." in the current working directory). a symlink named "." in the current working directory).
- implement 'ls -R'.
- "math" should also take input from stdin - "math" should also take input from stdin
- "more" doesn't accept " " to scroll by one page when BB_FEATURE_USE_TERMIOS - "more" doesn't accept " " to scroll by one page when BB_FEATURE_USE_TERMIOS
is not on. is not on.

View File

@ -154,6 +154,9 @@
// enable ls -p and -F // enable ls -p and -F
#define BB_FEATURE_LS_FILETYPES #define BB_FEATURE_LS_FILETYPES
// //
// enable ls -R
#define BB_FEATURE_LS_RECURSIVE
//
// Change ping implementation -- simplified, featureless, but really small. // Change ping implementation -- simplified, featureless, but really small.
//#define BB_SIMPLE_PING //#define BB_SIMPLE_PING
// //

View File

@ -88,6 +88,7 @@
#define DISP_FULLTIME 32 /* show extended time display */ #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_DIRNAME 128 /* show directory name (for internal use) */
#define DISP_RECURSIVE 256 /* Do a recursive listing */
#ifndef MAJOR #ifndef MAJOR
#define MAJOR(dev) (((dev)>>8)&0xff) #define MAJOR(dev) (((dev)>>8)&0xff)
@ -448,6 +449,9 @@ static const char ls_usage[] = "ls [-1a"
"xAC" "xAC"
#ifdef BB_FEATURE_LS_FILETYPES #ifdef BB_FEATURE_LS_FILETYPES
"F" "F"
#endif
#ifdef BB_FEATURE_LS_RECURSIVE
"R"
#endif #endif
"] [filenames...]\n" "] [filenames...]\n"
#ifndef BB_FEATURE_TRIVIAL_HELP #ifndef BB_FEATURE_TRIVIAL_HELP
@ -477,9 +481,24 @@ static const char ls_usage[] = "ls [-1a"
#ifdef BB_FEATURE_LS_FILETYPES #ifdef BB_FEATURE_LS_FILETYPES
"\t-F\tappend indicator (one of */=@|) to entries\n" "\t-F\tappend indicator (one of */=@|) to entries\n"
#endif #endif
#ifdef BB_FEATURE_LS_RECURSIVE
"\t-R\tlist subdirectories recursively\n"
#endif
#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) extern int ls_main(int argc, char **argv)
{ {
int argi = 1, i; int argi = 1, i;
@ -543,6 +562,11 @@ extern int ls_main(int argc, char **argv)
case 'e': case 'e':
opts |= DISP_FULLTIME; opts |= DISP_FULLTIME;
break; break;
#endif
#ifdef BB_FEATURE_LS_RECURSIVE
case 'R':
opts |= DISP_RECURSIVE;
break;
#endif #endif
default: default:
goto print_usage_message; goto print_usage_message;
@ -570,12 +594,25 @@ extern int ls_main(int argc, char **argv)
#endif #endif
/* process files specified, or current directory if none */ /* process files specified, or current directory if none */
#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; i = 0;
if (argi == argc) if (argi == argc)
i = list_item("."); i = list_item(".");
while (argi < argc) while (argi < argc)
i |= list_item(argv[argi++]); i |= list_item(argv[argi++]);
newline(); newline();
}
exit(i); exit(i);
print_usage_message: print_usage_message:

View File

@ -956,7 +956,7 @@ Example:
=item ls =item ls
Usage: ls [B<-1acdelnpuxACF>] [filenames...] Usage: ls [B<-1acdelnpuxACFR>] [filenames...]
Options: Options:
@ -974,6 +974,7 @@ Options:
-A do not list implied . and .. -A do not list implied . and ..
-C list entries by columns -C list entries by columns
-F append indicator (one of */=@|) to entries -F append indicator (one of */=@|) to entries
-R list subdirectories recursively
------------------------------- -------------------------------
@ -1947,4 +1948,4 @@ Enrique Zanardi <ezanardi@ull.es>
=cut =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 $

37
ls.c
View File

@ -88,6 +88,7 @@
#define DISP_FULLTIME 32 /* show extended time display */ #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_DIRNAME 128 /* show directory name (for internal use) */
#define DISP_RECURSIVE 256 /* Do a recursive listing */
#ifndef MAJOR #ifndef MAJOR
#define MAJOR(dev) (((dev)>>8)&0xff) #define MAJOR(dev) (((dev)>>8)&0xff)
@ -448,6 +449,9 @@ static const char ls_usage[] = "ls [-1a"
"xAC" "xAC"
#ifdef BB_FEATURE_LS_FILETYPES #ifdef BB_FEATURE_LS_FILETYPES
"F" "F"
#endif
#ifdef BB_FEATURE_LS_RECURSIVE
"R"
#endif #endif
"] [filenames...]\n" "] [filenames...]\n"
#ifndef BB_FEATURE_TRIVIAL_HELP #ifndef BB_FEATURE_TRIVIAL_HELP
@ -477,9 +481,24 @@ static const char ls_usage[] = "ls [-1a"
#ifdef BB_FEATURE_LS_FILETYPES #ifdef BB_FEATURE_LS_FILETYPES
"\t-F\tappend indicator (one of */=@|) to entries\n" "\t-F\tappend indicator (one of */=@|) to entries\n"
#endif #endif
#ifdef BB_FEATURE_LS_RECURSIVE
"\t-R\tlist subdirectories recursively\n"
#endif
#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) extern int ls_main(int argc, char **argv)
{ {
int argi = 1, i; int argi = 1, i;
@ -543,6 +562,11 @@ extern int ls_main(int argc, char **argv)
case 'e': case 'e':
opts |= DISP_FULLTIME; opts |= DISP_FULLTIME;
break; break;
#endif
#ifdef BB_FEATURE_LS_RECURSIVE
case 'R':
opts |= DISP_RECURSIVE;
break;
#endif #endif
default: default:
goto print_usage_message; goto print_usage_message;
@ -570,12 +594,25 @@ extern int ls_main(int argc, char **argv)
#endif #endif
/* process files specified, or current directory if none */ /* process files specified, or current directory if none */
#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; i = 0;
if (argi == argc) if (argi == argc)
i = list_item("."); i = list_item(".");
while (argi < argc) while (argi < argc)
i |= list_item(argv[argi++]); i |= list_item(argv[argi++]);
newline(); newline();
}
exit(i); exit(i);
print_usage_message: print_usage_message:

17
mount.c
View File

@ -154,8 +154,7 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
} }
} }
#endif #endif
status = status = mount(specialfile, dir, filesystemtype, flags, string_flags);
mount(specialfile, dir, filesystemtype, flags, string_flags);
} }
@ -176,6 +175,11 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
del_loop(specialfile); del_loop(specialfile);
} }
#endif #endif
if (errno == EPERM) {
fatalError("mount: permission denied. Are you root?\n");
}
return (FALSE); return (FALSE);
} }
@ -307,7 +311,7 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
fakeIt, mtab_opts); fakeIt, mtab_opts);
} }
if (status == FALSE && whineOnErrors == TRUE) { if (status == FALSE) {
if (whineOnErrors == TRUE) { if (whineOnErrors == TRUE) {
fprintf(stderr, "Mounting %s on %s failed: %s\n", fprintf(stderr, "Mounting %s on %s failed: %s\n",
blockDevice, directory, strerror(errno)); blockDevice, directory, strerror(errno));
@ -463,14 +467,9 @@ extern int mount_main(int argc, char **argv)
flags = 0; flags = 0;
*string_flags = '\0'; *string_flags = '\0';
parse_mount_options(m->mnt_opts, &flags, string_flags); 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, if (mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,
flags, string_flags, useMtab, fakeIt, flags, string_flags, useMtab, fakeIt,
extra_opts, FALSE)) extra_opts, FALSE)==FALSE)
{ {
/* Try again, but this time try a remount */ /* Try again, but this time try a remount */
mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type, mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,

View File

@ -83,7 +83,7 @@ static void do_em_all()
exit(FALSE); exit(FALSE);
} }
while ((m = getmntent(f)) != NULL) { 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); swap_enable_disable(m->mnt_fsname);
} }
} }

View File

@ -154,8 +154,7 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
} }
} }
#endif #endif
status = status = mount(specialfile, dir, filesystemtype, flags, string_flags);
mount(specialfile, dir, filesystemtype, flags, string_flags);
} }
@ -176,6 +175,11 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
del_loop(specialfile); del_loop(specialfile);
} }
#endif #endif
if (errno == EPERM) {
fatalError("mount: permission denied. Are you root?\n");
}
return (FALSE); return (FALSE);
} }
@ -307,7 +311,7 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
fakeIt, mtab_opts); fakeIt, mtab_opts);
} }
if (status == FALSE && whineOnErrors == TRUE) { if (status == FALSE) {
if (whineOnErrors == TRUE) { if (whineOnErrors == TRUE) {
fprintf(stderr, "Mounting %s on %s failed: %s\n", fprintf(stderr, "Mounting %s on %s failed: %s\n",
blockDevice, directory, strerror(errno)); blockDevice, directory, strerror(errno));
@ -463,14 +467,9 @@ extern int mount_main(int argc, char **argv)
flags = 0; flags = 0;
*string_flags = '\0'; *string_flags = '\0';
parse_mount_options(m->mnt_opts, &flags, string_flags); 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, if (mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,
flags, string_flags, useMtab, fakeIt, flags, string_flags, useMtab, fakeIt,
extra_opts, FALSE)) extra_opts, FALSE)==FALSE)
{ {
/* Try again, but this time try a remount */ /* Try again, but this time try a remount */
mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type, mount_one(m->mnt_fsname, m->mnt_dir, m->mnt_type,

View File

@ -83,7 +83,7 @@ static void do_em_all()
exit(FALSE); exit(FALSE);
} }
while ((m = getmntent(f)) != NULL) { 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); swap_enable_disable(m->mnt_fsname);
} }
} }