makedevs: shrink by Vladimir

function                                             old     new   delta
makedevs_main                                       1071    1049     -22
packed_usage                                       24744   24708     -36

diff --git a/miscutils/makedevs.c b/miscutils/makedevs.c
index 91da169..be08055 100644
--- a/miscutils/makedevs.c
+++ b/miscutils/makedevs.c
@@ -15,7 +15,7 @@
 TYPEs:
 b       Block device
 c       Character device
-p       FIFO
+f       FIFO
 
 FIRST..LAST specify numbers appended to NAME.
 If 's' is the last argument, the base device is created as well.
@@ -82,28 +82,27 @@
 int makedevs_main(int argc UNUSED_PARAM, char **argv)
 {
 	parser_t *parser;
-	char *rootdir = NULL;
 	char *line = (char *)"-";
-	int linenum;
 	int ret = EXIT_SUCCESS;
 
 	opt_complementary = "=1"; /* exactly one param */
 	getopt32(argv, "d:", &line);
-	rootdir = argv[optind];
-	parser = config_open(line);
+	argv += optind;
 
-	xchdir(rootdir);
+	xchdir(*argv); /* ensure root dir exists */
 
 	umask(0);
 
-	printf("rootdir=%s\n", rootdir);
+	printf("rootdir=%s\ntable=", *argv);
 	if (NOT_LONE_DASH(line)) {
-		printf("table='%s'\n", line);
+		printf("'%s'\n", line);
 	} else {
-		printf("table=<stdin>\n");
+		puts("<stdin>");
 	}
 
+	parser = config_open(line);
 	while (config_read(parser, &line, 1, 1, "# \t", PARSE_NORMAL)) {
+		int linenum;
 		char type;
 		unsigned mode = 0755;
 		unsigned major = 0;
@@ -114,7 +113,7 @@
 		char name[41];
 		char user[41];
 		char group[41];
-		char *full_name;
+		char *full_name = name;
 		uid_t uid;
 		gid_t gid;
 
@@ -132,7 +131,10 @@
 
 		gid = (*group) ? get_ug_id(group, xgroup2gid) : getgid();
 		uid = (*user) ? get_ug_id(user, xuname2uid) : getuid();
-		full_name = concat_path_file(rootdir, name);
+		/* We are already in the right root dir,
+		 * so make absolute paths relative */
+		if ('/' == *full_name)
+			full_name++;
 
 		if (type == 'd') {
 			bb_make_directory(full_name, mode | S_IFDIR, FILEUTILS_RECUR);
@@ -140,20 +142,20 @@
  chown_fail:
 				bb_perror_msg("line %d: can't chown %s", linenum, full_name);
 				ret = EXIT_FAILURE;
-				goto loop;
+				continue;
 			}
 			if (chmod(full_name, mode) < 0) {
  chmod_fail:
 				bb_perror_msg("line %d: can't chmod %s", linenum, full_name);
 				ret = EXIT_FAILURE;
-				goto loop;
+				continue;
 			}
 		} else if (type == 'f') {
 			struct stat st;
 			if ((stat(full_name, &st) < 0 || !S_ISREG(st.st_mode))) {
 				bb_perror_msg("line %d: regular file '%s' does not exist", linenum, full_name);
 				ret = EXIT_FAILURE;
-				goto loop;
+				continue;
 			}
 			if (chown(full_name, uid, gid) < 0)
 				goto chown_fail;
@@ -173,7 +175,7 @@
 			} else {
 				bb_error_msg("line %d: unsupported file type %c", linenum, type);
 				ret = EXIT_FAILURE;
-				goto loop;
+				continue;
 			}
 
 			full_name_inc = xmalloc(strlen(full_name) + sizeof(int)*3 + 2);
@@ -195,8 +197,6 @@
 			}
 			free(full_name_inc);
 		}
-loop:
-		free(full_name);
 	}
 	if (ENABLE_FEATURE_CLEAN_UP)
 		config_close(parser);