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) | ||||
| 	* Renamed "mnc" to the more correct "nc" (for netcat). | ||||
| 	* 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 | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										12
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								TODO
									
									
									
									
									
								
							| @@ -21,6 +21,18 @@ Bugs that need fixing: | ||||
|  - 'grep foo$ file' doesn't work | ||||
|  - 'grep *foo file' segfaults | ||||
|  - 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"> | ||||
| Current documentation for BusyBox includes:  | ||||
| <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  | ||||
| 		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  | ||||
|   | ||||
							
								
								
									
										63
									
								
								init.c
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								init.c
									
									
									
									
									
								
							| @@ -745,7 +745,7 @@ void parse_inittab(void) | ||||
| #ifdef BB_FEATURE_USE_INITTAB | ||||
| 	FILE *file; | ||||
| 	char buf[256], lineAsRead[256], tmpConsole[256]; | ||||
| 	char *p, *q, *r, *s; | ||||
| 	char *id, *runlev, *action, *process, *eol; | ||||
| 	const struct initActionType *a = actions; | ||||
| 	int foundIt; | ||||
|  | ||||
| @@ -772,64 +772,69 @@ void parse_inittab(void) | ||||
|  | ||||
| 	while (fgets(buf, 255, file) != NULL) { | ||||
| 		foundIt = FALSE; | ||||
| 		for (p = buf; *p == ' ' || *p == '\t'; p++); | ||||
| 		if (*p == '#' || *p == '\n') | ||||
| 		/* Skip leading spaces */ | ||||
| 		for (id = buf; *id == ' ' || *id == '\t'; id++); | ||||
|  | ||||
| 		/* Skip the line if it's a comment */ | ||||
| 		if (*id == '#' || *id == '\n') | ||||
| 			continue; | ||||
|  | ||||
| 		/* Trim the trailing \n */ | ||||
| 		q = strrchr(p, '\n'); | ||||
| 		if (q != NULL) | ||||
| 			*q = '\0'; | ||||
| 		eol = strrchr(id, '\n'); | ||||
| 		if (eol != NULL) | ||||
| 			*eol = '\0'; | ||||
|  | ||||
| 		/* Keep a copy around for posterity's sake (and error msgs) */ | ||||
| 		strcpy(lineAsRead, buf); | ||||
|  | ||||
| 		/* Grab the ID field */ | ||||
| 		s = p; | ||||
| 		p = strchr(p, ':'); | ||||
| 		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') { | ||||
| 		/* Separate the ID field from the runlevels */ | ||||
| 		runlev = strchr(id, ':'); | ||||
| 		if (runlev == NULL || *(runlev + 1) == '\0') { | ||||
| 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | ||||
| 			continue; | ||||
| 		} else { | ||||
| 			*q = '\0'; | ||||
| 			++q; | ||||
| 			*runlev = '\0'; | ||||
| 			++runlev; | ||||
| 		} | ||||
|  | ||||
| 		/* Now peel off the action field */ | ||||
| 		r = strrchr(p, ':'); | ||||
| 		if (r == NULL || *(r + 1) == '\0') { | ||||
| 		/* Separate the runlevels from the action */ | ||||
| 		action = strchr(runlev, ':'); | ||||
| 		if (action == NULL || *(action + 1) == '\0') { | ||||
| 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | ||||
| 			continue; | ||||
| 		} 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 */ | ||||
| 		a = actions; | ||||
| 		while (a->name != 0) { | ||||
| 			if (strcmp(a->name, r) == 0) { | ||||
| 				if (*s != '\0') { | ||||
| 			if (strcmp(a->name, action) == 0) { | ||||
| 				if (*id != '\0') { | ||||
| 					struct stat statBuf; | ||||
|  | ||||
| 					strcpy(tmpConsole, "/dev/"); | ||||
| 					strncat(tmpConsole, s, 200); | ||||
| 					strncat(tmpConsole, id, 200); | ||||
| 					if (stat(tmpConsole, &statBuf) != 0) { | ||||
| 						message(LOG | CONSOLE, | ||||
| 								"device '%s' does not exist.  Did you read the directions?\n", | ||||
| 								tmpConsole); | ||||
| 						break; | ||||
| 					} | ||||
| 					s = tmpConsole; | ||||
| 					id = tmpConsole; | ||||
| 				} | ||||
| 				new_initAction(a->action, q, s); | ||||
| 				new_initAction(a->action, process, id); | ||||
| 				foundIt = TRUE; | ||||
| 			} | ||||
| 			a++; | ||||
|   | ||||
							
								
								
									
										63
									
								
								init/init.c
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								init/init.c
									
									
									
									
									
								
							| @@ -745,7 +745,7 @@ void parse_inittab(void) | ||||
| #ifdef BB_FEATURE_USE_INITTAB | ||||
| 	FILE *file; | ||||
| 	char buf[256], lineAsRead[256], tmpConsole[256]; | ||||
| 	char *p, *q, *r, *s; | ||||
| 	char *id, *runlev, *action, *process, *eol; | ||||
| 	const struct initActionType *a = actions; | ||||
| 	int foundIt; | ||||
|  | ||||
| @@ -772,64 +772,69 @@ void parse_inittab(void) | ||||
|  | ||||
| 	while (fgets(buf, 255, file) != NULL) { | ||||
| 		foundIt = FALSE; | ||||
| 		for (p = buf; *p == ' ' || *p == '\t'; p++); | ||||
| 		if (*p == '#' || *p == '\n') | ||||
| 		/* Skip leading spaces */ | ||||
| 		for (id = buf; *id == ' ' || *id == '\t'; id++); | ||||
|  | ||||
| 		/* Skip the line if it's a comment */ | ||||
| 		if (*id == '#' || *id == '\n') | ||||
| 			continue; | ||||
|  | ||||
| 		/* Trim the trailing \n */ | ||||
| 		q = strrchr(p, '\n'); | ||||
| 		if (q != NULL) | ||||
| 			*q = '\0'; | ||||
| 		eol = strrchr(id, '\n'); | ||||
| 		if (eol != NULL) | ||||
| 			*eol = '\0'; | ||||
|  | ||||
| 		/* Keep a copy around for posterity's sake (and error msgs) */ | ||||
| 		strcpy(lineAsRead, buf); | ||||
|  | ||||
| 		/* Grab the ID field */ | ||||
| 		s = p; | ||||
| 		p = strchr(p, ':'); | ||||
| 		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') { | ||||
| 		/* Separate the ID field from the runlevels */ | ||||
| 		runlev = strchr(id, ':'); | ||||
| 		if (runlev == NULL || *(runlev + 1) == '\0') { | ||||
| 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | ||||
| 			continue; | ||||
| 		} else { | ||||
| 			*q = '\0'; | ||||
| 			++q; | ||||
| 			*runlev = '\0'; | ||||
| 			++runlev; | ||||
| 		} | ||||
|  | ||||
| 		/* Now peel off the action field */ | ||||
| 		r = strrchr(p, ':'); | ||||
| 		if (r == NULL || *(r + 1) == '\0') { | ||||
| 		/* Separate the runlevels from the action */ | ||||
| 		action = strchr(runlev, ':'); | ||||
| 		if (action == NULL || *(action + 1) == '\0') { | ||||
| 			message(LOG | CONSOLE, "Bad inittab entry: %s\n", lineAsRead); | ||||
| 			continue; | ||||
| 		} 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 */ | ||||
| 		a = actions; | ||||
| 		while (a->name != 0) { | ||||
| 			if (strcmp(a->name, r) == 0) { | ||||
| 				if (*s != '\0') { | ||||
| 			if (strcmp(a->name, action) == 0) { | ||||
| 				if (*id != '\0') { | ||||
| 					struct stat statBuf; | ||||
|  | ||||
| 					strcpy(tmpConsole, "/dev/"); | ||||
| 					strncat(tmpConsole, s, 200); | ||||
| 					strncat(tmpConsole, id, 200); | ||||
| 					if (stat(tmpConsole, &statBuf) != 0) { | ||||
| 						message(LOG | CONSOLE, | ||||
| 								"device '%s' does not exist.  Did you read the directions?\n", | ||||
| 								tmpConsole); | ||||
| 						break; | ||||
| 					} | ||||
| 					s = tmpConsole; | ||||
| 					id = tmpConsole; | ||||
| 				} | ||||
| 				new_initAction(a->action, q, s); | ||||
| 				new_initAction(a->action, process, id); | ||||
| 				foundIt = TRUE; | ||||
| 			} | ||||
| 			a++; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user