Minor doc fix. Added several bugs to the todo list. Fixed the way init
scans /etc/inittab entries so that commands can contain ":"s. -Erik
This commit is contained in:
		| @@ -34,6 +34,9 @@ | |||||||
| 	* zcat now works (wasn't working since option parsing was broken) | 	* zcat now works (wasn't working since option parsing was broken) | ||||||
| 	* Renamed "mnc" to the more correct "nc" (for netcat). | 	* Renamed "mnc" to the more correct "nc" (for netcat). | ||||||
| 	* Makefile intelligence updates | 	* Makefile intelligence updates | ||||||
|  | 	* Changed the way init parses /etc/inittab entries to avoid problems | ||||||
|  | 	    with commands that contain colons in them.  Fix thanks to  | ||||||
|  | 	    Pavel Roskin <pavel_roskin@geocities.com> | ||||||
| 	* More doc updates | 	* More doc updates | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								TODO
									
									
									
									
									
								
							| @@ -21,6 +21,18 @@ Bugs that need fixing: | |||||||
|  - '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) | ||||||
|  |  - The following commands segfault: | ||||||
|  | 	chmod -R | ||||||
|  | 	chown -R | ||||||
|  | 	chgrp -R | ||||||
|  | 	cp -a -a | ||||||
|  | 	ln -s -s | ||||||
|  | 	rm -f | ||||||
|  | 	touch -c | ||||||
|  |   - 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. | ||||||
|  |  | ||||||
|  |  | ||||||
| ----------- | ----------- | ||||||
|   | |||||||
| @@ -248,7 +248,7 @@ BusyBox is licensed under the | |||||||
| <TR><TD BGCOLOR="#eeeee0"> | <TR><TD BGCOLOR="#eeeee0"> | ||||||
| Current documentation for BusyBox includes:  | Current documentation for BusyBox includes:  | ||||||
| <ul> | <ul> | ||||||
|     <li> <a href="BusyBox.html">BusyBox.html</a> |     <li> <a href="ftp://ftp.lineo.com/pub/busybox/BusyBox.html">BusyBox.html</a> | ||||||
| 		This is a list of the all the available commands in BusyBox with complete  | 		This is a list of the all the available commands in BusyBox with complete  | ||||||
| 		usage information and examples of how to use each app.  I spent  | 		usage information and examples of how to use each app.  I spent  | ||||||
| 		a <em>lot</em> of time updating these docs and trying to make them  | 		a <em>lot</em> of time updating these docs and trying to make them  | ||||||
|   | |||||||
							
								
								
									
										63
									
								
								init.c
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								init.c
									
									
									
									
									
								
							| @@ -745,7 +745,7 @@ void parse_inittab(void) | |||||||
| #ifdef BB_FEATURE_USE_INITTAB | #ifdef BB_FEATURE_USE_INITTAB | ||||||
| 	FILE *file; | 	FILE *file; | ||||||
| 	char buf[256], lineAsRead[256], tmpConsole[256]; | 	char buf[256], lineAsRead[256], tmpConsole[256]; | ||||||
| 	char *p, *q, *r, *s; | 	char *id, *runlev, *action, *process, *eol; | ||||||
| 	const struct initActionType *a = actions; | 	const struct initActionType *a = actions; | ||||||
| 	int foundIt; | 	int foundIt; | ||||||
|  |  | ||||||
| @@ -772,64 +772,69 @@ void parse_inittab(void) | |||||||
|  |  | ||||||
| 	while (fgets(buf, 255, file) != NULL) { | 	while (fgets(buf, 255, file) != NULL) { | ||||||
| 		foundIt = FALSE; | 		foundIt = FALSE; | ||||||
| 		for (p = buf; *p == ' ' || *p == '\t'; p++); | 		/* Skip leading spaces */ | ||||||
| 		if (*p == '#' || *p == '\n') | 		for (id = buf; *id == ' ' || *id == '\t'; id++); | ||||||
|  |  | ||||||
|  | 		/* Skip the line if it's a comment */ | ||||||
|  | 		if (*id == '#' || *id == '\n') | ||||||
| 			continue; | 			continue; | ||||||
|  |  | ||||||
| 		/* Trim the trailing \n */ | 		/* Trim the trailing \n */ | ||||||
| 		q = strrchr(p, '\n'); | 		eol = strrchr(id, '\n'); | ||||||
| 		if (q != NULL) | 		if (eol != NULL) | ||||||
| 			*q = '\0'; | 			*eol = '\0'; | ||||||
|  |  | ||||||
| 		/* Keep a copy around for posterity's sake (and error msgs) */ | 		/* Keep a copy around for posterity's sake (and error msgs) */ | ||||||
| 		strcpy(lineAsRead, buf); | 		strcpy(lineAsRead, buf); | ||||||
|  |  | ||||||
| 		/* Grab the ID field */ | 		/* Separate the ID field from the runlevels */ | ||||||
| 		s = p; | 		runlev = strchr(id, ':'); | ||||||
| 		p = strchr(p, ':'); | 		if (runlev == NULL || *(runlev + 1) == '\0') { | ||||||
| 		if (p != NULL || *(p + 1) != '\0') { |  | ||||||
| 			*p = '\0'; |  | ||||||
| 			++p; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		/* Now peel off the process field from the end |  | ||||||
| 		 * of the string */ |  | ||||||
| 		q = strrchr(p, ':'); |  | ||||||
| 		if (q == NULL || *(q + 1) == '\0') { |  | ||||||
| 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else { | 		} else { | ||||||
| 			*q = '\0'; | 			*runlev = '\0'; | ||||||
| 			++q; | 			++runlev; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		/* Now peel off the action field */ | 		/* Separate the runlevels from the action */ | ||||||
| 		r = strrchr(p, ':'); | 		action = strchr(runlev, ':'); | ||||||
| 		if (r == NULL || *(r + 1) == '\0') { | 		if (action == NULL || *(action + 1) == '\0') { | ||||||
| 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else { | 		} else { | ||||||
| 			++r; | 			*action = '\0'; | ||||||
|  | 			++action; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		/* Separate the action from the process */ | ||||||
|  | 		process = strchr(action, ':'); | ||||||
|  | 		if (process == NULL || *(process + 1) == '\0') { | ||||||
|  | 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | ||||||
|  | 			continue; | ||||||
|  | 		} else { | ||||||
|  | 			*process = '\0'; | ||||||
|  | 			++process; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		/* Ok, now process it */ | 		/* Ok, now process it */ | ||||||
| 		a = actions; | 		a = actions; | ||||||
| 		while (a->name != 0) { | 		while (a->name != 0) { | ||||||
| 			if (strcmp(a->name, r) == 0) { | 			if (strcmp(a->name, action) == 0) { | ||||||
| 				if (*s != '\0') { | 				if (*id != '\0') { | ||||||
| 					struct stat statBuf; | 					struct stat statBuf; | ||||||
|  |  | ||||||
| 					strcpy(tmpConsole, "/dev/"); | 					strcpy(tmpConsole, "/dev/"); | ||||||
| 					strncat(tmpConsole, s, 200); | 					strncat(tmpConsole, id, 200); | ||||||
| 					if (stat(tmpConsole, &statBuf) != 0) { | 					if (stat(tmpConsole, &statBuf) != 0) { | ||||||
| 						message(LOG | CONSOLE, | 						message(LOG | CONSOLE, | ||||||
| 								"device '%s' does not exist.  Did you read the directions?\n", | 								"device '%s' does not exist.  Did you read the directions?\n", | ||||||
| 								tmpConsole); | 								tmpConsole); | ||||||
| 						break; | 						break; | ||||||
| 					} | 					} | ||||||
| 					s = tmpConsole; | 					id = tmpConsole; | ||||||
| 				} | 				} | ||||||
| 				new_initAction(a->action, q, s); | 				new_initAction(a->action, process, id); | ||||||
| 				foundIt = TRUE; | 				foundIt = TRUE; | ||||||
| 			} | 			} | ||||||
| 			a++; | 			a++; | ||||||
|   | |||||||
							
								
								
									
										63
									
								
								init/init.c
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								init/init.c
									
									
									
									
									
								
							| @@ -745,7 +745,7 @@ void parse_inittab(void) | |||||||
| #ifdef BB_FEATURE_USE_INITTAB | #ifdef BB_FEATURE_USE_INITTAB | ||||||
| 	FILE *file; | 	FILE *file; | ||||||
| 	char buf[256], lineAsRead[256], tmpConsole[256]; | 	char buf[256], lineAsRead[256], tmpConsole[256]; | ||||||
| 	char *p, *q, *r, *s; | 	char *id, *runlev, *action, *process, *eol; | ||||||
| 	const struct initActionType *a = actions; | 	const struct initActionType *a = actions; | ||||||
| 	int foundIt; | 	int foundIt; | ||||||
|  |  | ||||||
| @@ -772,64 +772,69 @@ void parse_inittab(void) | |||||||
|  |  | ||||||
| 	while (fgets(buf, 255, file) != NULL) { | 	while (fgets(buf, 255, file) != NULL) { | ||||||
| 		foundIt = FALSE; | 		foundIt = FALSE; | ||||||
| 		for (p = buf; *p == ' ' || *p == '\t'; p++); | 		/* Skip leading spaces */ | ||||||
| 		if (*p == '#' || *p == '\n') | 		for (id = buf; *id == ' ' || *id == '\t'; id++); | ||||||
|  |  | ||||||
|  | 		/* Skip the line if it's a comment */ | ||||||
|  | 		if (*id == '#' || *id == '\n') | ||||||
| 			continue; | 			continue; | ||||||
|  |  | ||||||
| 		/* Trim the trailing \n */ | 		/* Trim the trailing \n */ | ||||||
| 		q = strrchr(p, '\n'); | 		eol = strrchr(id, '\n'); | ||||||
| 		if (q != NULL) | 		if (eol != NULL) | ||||||
| 			*q = '\0'; | 			*eol = '\0'; | ||||||
|  |  | ||||||
| 		/* Keep a copy around for posterity's sake (and error msgs) */ | 		/* Keep a copy around for posterity's sake (and error msgs) */ | ||||||
| 		strcpy(lineAsRead, buf); | 		strcpy(lineAsRead, buf); | ||||||
|  |  | ||||||
| 		/* Grab the ID field */ | 		/* Separate the ID field from the runlevels */ | ||||||
| 		s = p; | 		runlev = strchr(id, ':'); | ||||||
| 		p = strchr(p, ':'); | 		if (runlev == NULL || *(runlev + 1) == '\0') { | ||||||
| 		if (p != NULL || *(p + 1) != '\0') { |  | ||||||
| 			*p = '\0'; |  | ||||||
| 			++p; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		/* Now peel off the process field from the end |  | ||||||
| 		 * of the string */ |  | ||||||
| 		q = strrchr(p, ':'); |  | ||||||
| 		if (q == NULL || *(q + 1) == '\0') { |  | ||||||
| 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else { | 		} else { | ||||||
| 			*q = '\0'; | 			*runlev = '\0'; | ||||||
| 			++q; | 			++runlev; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		/* Now peel off the action field */ | 		/* Separate the runlevels from the action */ | ||||||
| 		r = strrchr(p, ':'); | 		action = strchr(runlev, ':'); | ||||||
| 		if (r == NULL || *(r + 1) == '\0') { | 		if (action == NULL || *(action + 1) == '\0') { | ||||||
| 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | ||||||
| 			continue; | 			continue; | ||||||
| 		} else { | 		} else { | ||||||
| 			++r; | 			*action = '\0'; | ||||||
|  | 			++action; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		/* Separate the action from the process */ | ||||||
|  | 		process = strchr(action, ':'); | ||||||
|  | 		if (process == NULL || *(process + 1) == '\0') { | ||||||
|  | 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | ||||||
|  | 			continue; | ||||||
|  | 		} else { | ||||||
|  | 			*process = '\0'; | ||||||
|  | 			++process; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		/* Ok, now process it */ | 		/* Ok, now process it */ | ||||||
| 		a = actions; | 		a = actions; | ||||||
| 		while (a->name != 0) { | 		while (a->name != 0) { | ||||||
| 			if (strcmp(a->name, r) == 0) { | 			if (strcmp(a->name, action) == 0) { | ||||||
| 				if (*s != '\0') { | 				if (*id != '\0') { | ||||||
| 					struct stat statBuf; | 					struct stat statBuf; | ||||||
|  |  | ||||||
| 					strcpy(tmpConsole, "/dev/"); | 					strcpy(tmpConsole, "/dev/"); | ||||||
| 					strncat(tmpConsole, s, 200); | 					strncat(tmpConsole, id, 200); | ||||||
| 					if (stat(tmpConsole, &statBuf) != 0) { | 					if (stat(tmpConsole, &statBuf) != 0) { | ||||||
| 						message(LOG | CONSOLE, | 						message(LOG | CONSOLE, | ||||||
| 								"device '%s' does not exist.  Did you read the directions?\n", | 								"device '%s' does not exist.  Did you read the directions?\n", | ||||||
| 								tmpConsole); | 								tmpConsole); | ||||||
| 						break; | 						break; | ||||||
| 					} | 					} | ||||||
| 					s = tmpConsole; | 					id = tmpConsole; | ||||||
| 				} | 				} | ||||||
| 				new_initAction(a->action, q, s); | 				new_initAction(a->action, process, id); | ||||||
| 				foundIt = TRUE; | 				foundIt = TRUE; | ||||||
| 			} | 			} | ||||||
| 			a++; | 			a++; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user