* 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
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

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:
- 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.

View File

@ -154,6 +154,9 @@
// 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
//

View File

@ -86,8 +86,9 @@
#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)
@ -448,6 +449,9 @@ static const char ls_usage[] = "ls [-1a"
"xAC"
#ifdef BB_FEATURE_LS_FILETYPES
"F"
#endif
#ifdef BB_FEATURE_LS_RECURSIVE
"R"
#endif
"] [filenames...]\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
@ -477,9 +481,24 @@ static const char ls_usage[] = "ls [-1a"
#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;
@ -543,6 +562,11 @@ extern int ls_main(int argc, char **argv)
case 'e':
opts |= DISP_FULLTIME;
break;
#endif
#ifdef BB_FEATURE_LS_RECURSIVE
case 'R':
opts |= DISP_RECURSIVE;
break;
#endif
default:
goto print_usage_message;
@ -570,12 +594,25 @@ extern int ls_main(int argc, char **argv)
#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:

View File

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

51
ls.c
View File

@ -86,8 +86,9 @@
#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)
@ -448,6 +449,9 @@ static const char ls_usage[] = "ls [-1a"
"xAC"
#ifdef BB_FEATURE_LS_FILETYPES
"F"
#endif
#ifdef BB_FEATURE_LS_RECURSIVE
"R"
#endif
"] [filenames...]\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
@ -477,9 +481,24 @@ static const char ls_usage[] = "ls [-1a"
#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;
@ -543,6 +562,11 @@ extern int ls_main(int argc, char **argv)
case 'e':
opts |= DISP_FULLTIME;
break;
#endif
#ifdef BB_FEATURE_LS_RECURSIVE
case 'R':
opts |= DISP_RECURSIVE;
break;
#endif
default:
goto print_usage_message;
@ -570,12 +594,25 @@ extern int ls_main(int argc, char **argv)
#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:

27
mount.c
View File

@ -154,8 +154,7 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
}
}
#endif
status =
mount(specialfile, dir, filesystemtype, flags, string_flags);
status = mount(specialfile, dir, filesystemtype, flags, string_flags);
}
@ -176,6 +175,11 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
del_loop(specialfile);
}
#endif
if (errno == EPERM) {
fatalError("mount: permission denied. Are you root?\n");
}
return (FALSE);
}
@ -307,7 +311,7 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
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));
@ -458,24 +462,19 @@ extern int mount_main(int argc, char **argv)
// 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);
}
}
}

View File

@ -83,7 +83,7 @@ static void do_em_all()
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);
}
}

View File

@ -154,8 +154,7 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
}
}
#endif
status =
mount(specialfile, dir, filesystemtype, flags, string_flags);
status = mount(specialfile, dir, filesystemtype, flags, string_flags);
}
@ -176,6 +175,11 @@ do_mount(char *specialfile, char *dir, char *filesystemtype,
del_loop(specialfile);
}
#endif
if (errno == EPERM) {
fatalError("mount: permission denied. Are you root?\n");
}
return (FALSE);
}
@ -307,7 +311,7 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
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));
@ -458,24 +462,19 @@ extern int mount_main(int argc, char **argv)
// 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);
}
}
}

View File

@ -83,7 +83,7 @@ static void do_em_all()
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);
}
}