makedevs: shrink (by Vladimir); testsuite
function old new delta makedevs_main 1153 1071 -82
This commit is contained in:
		@@ -10,26 +10,39 @@
 | 
			
		||||
#include "libbb.h"
 | 
			
		||||
 | 
			
		||||
#if ENABLE_FEATURE_MAKEDEVS_LEAF
 | 
			
		||||
/*
 | 
			
		||||
makedevs NAME TYPE MAJOR MINOR FIRST LAST [s]
 | 
			
		||||
TYPEs:
 | 
			
		||||
b       Block device
 | 
			
		||||
c       Character device
 | 
			
		||||
p       FIFO
 | 
			
		||||
 | 
			
		||||
FIRST..LAST specify numbers appended to NAME.
 | 
			
		||||
If 's' is the last argument, the base device is created as well.
 | 
			
		||||
Examples:
 | 
			
		||||
        makedevs /dev/ttyS c 4 66 2 63   ->  ttyS2-ttyS63
 | 
			
		||||
        makedevs /dev/hda b 3 0 0 8 s    ->  hda,hda1-hda8
 | 
			
		||||
*/
 | 
			
		||||
int makedevs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 | 
			
		||||
int makedevs_main(int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
	mode_t mode;
 | 
			
		||||
	char *basedev, *type, *nodname, buf[255];
 | 
			
		||||
	char *basedev, *type, *nodname, *buf;
 | 
			
		||||
	int Smajor, Sminor, S, E;
 | 
			
		||||
 | 
			
		||||
	if (argc < 7 || *argv[1]=='-')
 | 
			
		||||
	if (argc < 7 || argv[1][0] == '-')
 | 
			
		||||
		bb_show_usage();
 | 
			
		||||
 | 
			
		||||
	basedev = argv[1];
 | 
			
		||||
	buf = xasprintf("%s%u", argv[1], (unsigned)-1);
 | 
			
		||||
	type = argv[2];
 | 
			
		||||
	Smajor = xatoi_u(argv[3]);
 | 
			
		||||
	Sminor = xatoi_u(argv[4]);
 | 
			
		||||
	S = xatoi_u(argv[5]);
 | 
			
		||||
	E = xatoi_u(argv[6]);
 | 
			
		||||
	nodname = argc == 8 ? basedev : buf;
 | 
			
		||||
	nodname = argv[7] ? basedev : buf;
 | 
			
		||||
 | 
			
		||||
	mode = 0660;
 | 
			
		||||
 | 
			
		||||
	switch (type[0]) {
 | 
			
		||||
	case 'c':
 | 
			
		||||
		mode |= S_IFCHR;
 | 
			
		||||
@@ -45,18 +58,14 @@ int makedevs_main(int argc, char **argv)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (S <= E) {
 | 
			
		||||
		int sz;
 | 
			
		||||
 | 
			
		||||
		sz = snprintf(buf, sizeof(buf), "%s%d", basedev, S);
 | 
			
		||||
		if (sz < 0 || sz >= sizeof(buf))  /* libc different */
 | 
			
		||||
			bb_error_msg_and_die("%s too large", basedev);
 | 
			
		||||
 | 
			
		||||
	/* if mode != S_IFCHR and != S_IFBLK third param in mknod() ignored */
 | 
			
		||||
		sprintf(buf, "%s%u", basedev, S);
 | 
			
		||||
 | 
			
		||||
		/* if mode != S_IFCHR and != S_IFBLK,
 | 
			
		||||
		 * third param in mknod() ignored */
 | 
			
		||||
		if (mknod(nodname, mode, makedev(Smajor, Sminor)))
 | 
			
		||||
			bb_error_msg("failed to create: %s", nodname);
 | 
			
		||||
			bb_perror_msg("can't create %s", nodname);
 | 
			
		||||
 | 
			
		||||
		if (nodname == basedev) /* ex. /dev/hda - to /dev/hda1 ... */
 | 
			
		||||
		/*if (nodname == basedev)*/ /* ex. /dev/hda - to /dev/hda1 ... */
 | 
			
		||||
			nodname = buf;
 | 
			
		||||
		S++;
 | 
			
		||||
		Sminor++;
 | 
			
		||||
@@ -70,34 +79,31 @@ int makedevs_main(int argc, char **argv)
 | 
			
		||||
/* Licensed under the GPL v2 or later, see the file LICENSE in this tarball. */
 | 
			
		||||
 | 
			
		||||
int makedevs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 | 
			
		||||
int makedevs_main(int argc, char **argv)
 | 
			
		||||
int makedevs_main(int argc UNUSED_PARAM, char **argv)
 | 
			
		||||
{
 | 
			
		||||
	FILE *table = stdin;
 | 
			
		||||
	parser_t *parser;
 | 
			
		||||
	char *rootdir = NULL;
 | 
			
		||||
	char *line = NULL;
 | 
			
		||||
	int linenum = 0;
 | 
			
		||||
	char *line = (char *)"-";
 | 
			
		||||
	int linenum;
 | 
			
		||||
	int ret = EXIT_SUCCESS;
 | 
			
		||||
 | 
			
		||||
	opt_complementary = "=1"; /* exactly one param */
 | 
			
		||||
	getopt32(argv, "d:", &line);
 | 
			
		||||
	if (line)
 | 
			
		||||
		table = xfopen_for_read(line);
 | 
			
		||||
 | 
			
		||||
	if (optind >= argc || (rootdir=argv[optind])==NULL) {
 | 
			
		||||
		bb_error_msg_and_die("root directory not specified");
 | 
			
		||||
	}
 | 
			
		||||
	rootdir = argv[optind];
 | 
			
		||||
	parser = config_open(line);
 | 
			
		||||
 | 
			
		||||
	xchdir(rootdir);
 | 
			
		||||
 | 
			
		||||
	umask(0);
 | 
			
		||||
 | 
			
		||||
	printf("rootdir=%s\n", rootdir);
 | 
			
		||||
	if (line) {
 | 
			
		||||
	if (NOT_LONE_DASH(line)) {
 | 
			
		||||
		printf("table='%s'\n", line);
 | 
			
		||||
	} else {
 | 
			
		||||
		printf("table=<stdin>\n");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while ((line = xmalloc_fgetline(table)) != NULL) {
 | 
			
		||||
	while (config_read(parser, &line, 1, 1, "# \t", PARSE_NORMAL)) {
 | 
			
		||||
		char type;
 | 
			
		||||
		unsigned mode = 0755;
 | 
			
		||||
		unsigned major = 0;
 | 
			
		||||
@@ -112,22 +118,17 @@ int makedevs_main(int argc, char **argv)
 | 
			
		||||
		uid_t uid;
 | 
			
		||||
		gid_t gid;
 | 
			
		||||
 | 
			
		||||
		linenum++;
 | 
			
		||||
		linenum = parser->lineno;
 | 
			
		||||
 | 
			
		||||
		if ((2 > sscanf(line, "%40s %c %o %40s %40s %u %u %u %u %u", name,
 | 
			
		||||
						&type, &mode, user, group, &major,
 | 
			
		||||
						&minor, &start, &increment, &count)) ||
 | 
			
		||||
				((major | minor | start | count | increment) > 255))
 | 
			
		||||
		{
 | 
			
		||||
			if (*line=='\0' || *line=='#' || isspace(*line))
 | 
			
		||||
				continue;
 | 
			
		||||
		if ((2 > sscanf(line, "%40s %c %o %40s %40s %u %u %u %u %u",
 | 
			
		||||
					name, &type, &mode, user, group,
 | 
			
		||||
					&major,	&minor, &start, &increment, &count))
 | 
			
		||||
		 || ((unsigned)(major | minor | start | count | increment) > 255)
 | 
			
		||||
		) {
 | 
			
		||||
			bb_error_msg("invalid line %d: '%s'", linenum, line);
 | 
			
		||||
			ret = EXIT_FAILURE;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		if (name[0] == '#') {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		gid = (*group) ? get_ug_id(group, xgroup2gid) : getgid();
 | 
			
		||||
		uid = (*user) ? get_ug_id(user, xuname2uid) : getuid();
 | 
			
		||||
@@ -136,12 +137,14 @@ int makedevs_main(int argc, char **argv)
 | 
			
		||||
		if (type == 'd') {
 | 
			
		||||
			bb_make_directory(full_name, mode | S_IFDIR, FILEUTILS_RECUR);
 | 
			
		||||
			if (chown(full_name, uid, gid) == -1) {
 | 
			
		||||
				bb_perror_msg("line %d: chown failed for %s", linenum, full_name);
 | 
			
		||||
 chown_fail:
 | 
			
		||||
				bb_perror_msg("line %d: can't chown %s", linenum, full_name);
 | 
			
		||||
				ret = EXIT_FAILURE;
 | 
			
		||||
				goto loop;
 | 
			
		||||
			}
 | 
			
		||||
			if (chmod(full_name, mode) < 0) {
 | 
			
		||||
				bb_perror_msg("line %d: chmod failed for %s", linenum, full_name);
 | 
			
		||||
 chmod_fail:
 | 
			
		||||
				bb_perror_msg("line %d: can't chmod %s", linenum, full_name);
 | 
			
		||||
				ret = EXIT_FAILURE;
 | 
			
		||||
				goto loop;
 | 
			
		||||
			}
 | 
			
		||||
@@ -152,26 +155,20 @@ int makedevs_main(int argc, char **argv)
 | 
			
		||||
				ret = EXIT_FAILURE;
 | 
			
		||||
				goto loop;
 | 
			
		||||
			}
 | 
			
		||||
			if (chown(full_name, uid, gid) == -1) {
 | 
			
		||||
				bb_perror_msg("line %d: chown failed for %s", linenum, full_name);
 | 
			
		||||
				ret = EXIT_FAILURE;
 | 
			
		||||
				goto loop;
 | 
			
		||||
			}
 | 
			
		||||
			if (chmod(full_name, mode) < 0) {
 | 
			
		||||
				bb_perror_msg("line %d: chmod failed for %s", linenum, full_name);
 | 
			
		||||
				ret = EXIT_FAILURE;
 | 
			
		||||
				goto loop;
 | 
			
		||||
			}
 | 
			
		||||
			if (chown(full_name, uid, gid) < 0)
 | 
			
		||||
				goto chown_fail;
 | 
			
		||||
			if (chmod(full_name, mode) < 0)
 | 
			
		||||
				goto chmod_fail;
 | 
			
		||||
		} else {
 | 
			
		||||
			dev_t rdev;
 | 
			
		||||
			unsigned i;
 | 
			
		||||
			char *full_name_inc;
 | 
			
		||||
 | 
			
		||||
			if (type == 'p') {
 | 
			
		||||
				mode |= S_IFIFO;
 | 
			
		||||
			}
 | 
			
		||||
			else if (type == 'c') {
 | 
			
		||||
			} else if (type == 'c') {
 | 
			
		||||
				mode |= S_IFCHR;
 | 
			
		||||
			}
 | 
			
		||||
			else if (type == 'b') {
 | 
			
		||||
			} else if (type == 'b') {
 | 
			
		||||
				mode |= S_IFBLK;
 | 
			
		||||
			} else {
 | 
			
		||||
				bb_error_msg("line %d: unsupported file type %c", linenum, type);
 | 
			
		||||
@@ -179,49 +176,30 @@ int makedevs_main(int argc, char **argv)
 | 
			
		||||
				goto loop;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (count > 0) {
 | 
			
		||||
				unsigned i;
 | 
			
		||||
				char *full_name_inc;
 | 
			
		||||
 | 
			
		||||
				full_name_inc = xmalloc(strlen(full_name) + 4);
 | 
			
		||||
				for (i = start; i < count; i++) {
 | 
			
		||||
					sprintf(full_name_inc, "%s%d", full_name, i);
 | 
			
		||||
					rdev = makedev(major, minor + (i * increment - start));
 | 
			
		||||
					if (mknod(full_name_inc, mode, rdev) == -1) {
 | 
			
		||||
						bb_perror_msg("line %d: cannot create node %s", linenum, full_name_inc);
 | 
			
		||||
						ret = EXIT_FAILURE;
 | 
			
		||||
					}
 | 
			
		||||
					else if (chown(full_name_inc, uid, gid) == -1) {
 | 
			
		||||
						bb_perror_msg("line %d: chown failed for %s", linenum, full_name_inc);
 | 
			
		||||
						ret = EXIT_FAILURE;
 | 
			
		||||
					}
 | 
			
		||||
					if (chmod(full_name_inc, mode) < 0) {
 | 
			
		||||
						bb_perror_msg("line %d: chmod failed for %s", linenum, full_name_inc);
 | 
			
		||||
						ret = EXIT_FAILURE;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				free(full_name_inc);
 | 
			
		||||
			} else {
 | 
			
		||||
				rdev = makedev(major, minor);
 | 
			
		||||
				if (mknod(full_name, mode, rdev) == -1) {
 | 
			
		||||
					bb_perror_msg("line %d: cannot create node %s", linenum, full_name);
 | 
			
		||||
			full_name_inc = xmalloc(strlen(full_name) + sizeof(int)*3 + 2);
 | 
			
		||||
			if (count)
 | 
			
		||||
				count--;
 | 
			
		||||
			for (i = start; i <= start + count; i++) {
 | 
			
		||||
				sprintf(full_name_inc, count ? "%s%u" : "%s", full_name, i);
 | 
			
		||||
				rdev = makedev(major, minor + (i - start) * increment);
 | 
			
		||||
				if (mknod(full_name_inc, mode, rdev) < 0) {
 | 
			
		||||
					bb_perror_msg("line %d: can't create node %s", linenum, full_name_inc);
 | 
			
		||||
					ret = EXIT_FAILURE;
 | 
			
		||||
				}
 | 
			
		||||
				else if (chown(full_name, uid, gid) == -1) {
 | 
			
		||||
					bb_perror_msg("line %d: chown failed for %s", linenum, full_name);
 | 
			
		||||
				} else if (chown(full_name_inc, uid, gid) < 0) {
 | 
			
		||||
					bb_perror_msg("line %d: can't chown %s", linenum, full_name_inc);
 | 
			
		||||
					ret = EXIT_FAILURE;
 | 
			
		||||
				}
 | 
			
		||||
				if (chmod(full_name, mode) < 0) {
 | 
			
		||||
					bb_perror_msg("line %d: chmod failed for %s", linenum, full_name);
 | 
			
		||||
				} else if (chmod(full_name_inc, mode) < 0) {
 | 
			
		||||
					bb_perror_msg("line %d: can't chmod %s", linenum, full_name_inc);
 | 
			
		||||
					ret = EXIT_FAILURE;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			free(full_name_inc);
 | 
			
		||||
		}
 | 
			
		||||
loop:
 | 
			
		||||
		free(line);
 | 
			
		||||
		free(full_name);
 | 
			
		||||
	}
 | 
			
		||||
	fclose(table);
 | 
			
		||||
	if (ENABLE_FEATURE_CLEAN_UP)
 | 
			
		||||
		config_close(parser);
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user