* 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:
		| @@ -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
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								TODO
									
									
									
									
									
								
							| @@ -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. | ||||
|   | ||||
| @@ -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 | ||||
| // | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
| @@ -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
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								ls.c
									
									
									
									
									
								
							| @@ -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
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								mount.c
									
									
									
									
									
								
							| @@ -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); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|   | ||||
| @@ -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); | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
| @@ -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); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|   | ||||
| @@ -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); | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user