[git commit master] *: remove a few more cases of argc usage. -89 bytes.

Denys Vlasenko vda.linux at googlemail.com
Sat Nov 28 14:18:53 UTC 2009


commit: http://git.busybox.net/busybox/commit/?id=e992bae6f9adf3718c6263a36c004ead1c7272a8
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 console-tools/chvt.c     |   11 ++---------
 coreutils/chroot.c       |   10 ++++------
 coreutils/df.c           |    4 ++--
 coreutils/dirname.c      |    9 ++-------
 coreutils/dos2unix.c     |    8 ++++----
 coreutils/ln.c           |   19 ++++++++-----------
 coreutils/mkdir.c        |    8 +++-----
 coreutils/nohup.c        |    4 ++--
 coreutils/stat.c         |   22 +++++++++++-----------
 coreutils/stty.c         |    8 +++++---
 coreutils/yes.c          |    5 ++---
 include/libbb.h          |    1 +
 libbb/Kbuild             |    1 +
 libbb/single_argv.c      |   16 ++++++++++++++++
 miscutils/adjtimex.c     |    8 +++-----
 miscutils/raidautorun.c  |    8 ++------
 miscutils/rx.c           |    7 ++-----
 runit/runsv.c            |    4 +---
 util-linux/fdisk.c       |   11 +++++------
 util-linux/freeramdisk.c |    8 +++-----
 20 files changed, 79 insertions(+), 93 deletions(-)
 create mode 100644 libbb/single_argv.c

diff --git a/console-tools/chvt.c b/console-tools/chvt.c
index 302ffb4..977c269 100644
--- a/console-tools/chvt.c
+++ b/console-tools/chvt.c
@@ -6,19 +6,12 @@
  *
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
-
 #include "libbb.h"
 
 int chvt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int chvt_main(int argc, char **argv)
+int chvt_main(int argc UNUSED_PARAM, char **argv)
 {
-	int num;
-
-	if (argc != 2) {
-		bb_show_usage();
-	}
-
-	num = xatou_range(argv[1], 1, 63);
+	int num = xatou_range(single_argv(argv), 1, 63);
 	console_make_active(get_console_fd_or_die(), num);
 	return EXIT_SUCCESS;
 }
diff --git a/coreutils/chroot.c b/coreutils/chroot.c
index 9b3d700..f7228a6 100644
--- a/coreutils/chroot.c
+++ b/coreutils/chroot.c
@@ -12,18 +12,16 @@
 #include "libbb.h"
 
 int chroot_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int chroot_main(int argc, char **argv)
+int chroot_main(int argc UNUSED_PARAM, char **argv)
 {
-	if (argc < 2) {
-		bb_show_usage();
-	}
-
 	++argv;
+	if (!*argv)
+		bb_show_usage();
 	xchroot(*argv);
 	xchdir("/");
 
 	++argv;
-	if (argc == 2) {
+	if (!*argv) { /* no 2nd param (PROG), use shell */
 		argv -= 2;
 		argv[0] = getenv("SHELL");
 		if (!argv[0]) {
diff --git a/coreutils/df.c b/coreutils/df.c
index a0e6fe0..11a7398 100644
--- a/coreutils/df.c
+++ b/coreutils/df.c
@@ -35,7 +35,7 @@ static unsigned long kscale(unsigned long b, unsigned long bs)
 #endif
 
 int df_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int df_main(int argc, char **argv)
+int df_main(int argc UNUSED_PARAM, char **argv)
 {
 	unsigned long blocks_used;
 	unsigned blocks_percent_used;
@@ -105,7 +105,7 @@ int df_main(int argc, char **argv)
 
 	mount_table = NULL;
 	argv += optind;
-	if (optind >= argc) {
+	if (!argv[0]) {
 		mount_table = setmntent(bb_path_mtab_file, "r");
 		if (!mount_table)
 			bb_perror_msg_and_die(bb_path_mtab_file);
diff --git a/coreutils/dirname.c b/coreutils/dirname.c
index 1f5f70d..94c22a7 100644
--- a/coreutils/dirname.c
+++ b/coreutils/dirname.c
@@ -15,13 +15,8 @@
 /* This is a NOFORK applet. Be very careful! */
 
 int dirname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int dirname_main(int argc, char **argv)
+int dirname_main(int argc UNUSED_PARAM, char **argv)
 {
-	if (argc != 2) {
-		bb_show_usage();
-	}
-
-	puts(dirname(argv[1]));
-
+	puts(dirname(single_argv(argv)));
 	return fflush_all();
 }
diff --git a/coreutils/dos2unix.c b/coreutils/dos2unix.c
index baf879e..1911f53 100644
--- a/coreutils/dos2unix.c
+++ b/coreutils/dos2unix.c
@@ -69,7 +69,7 @@ static void convert(char *fn, int conv_type)
 }
 
 int dos2unix_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int dos2unix_main(int argc, char **argv)
+int dos2unix_main(int argc UNUSED_PARAM, char **argv)
 {
 	int o, conv_type;
 
@@ -88,11 +88,11 @@ int dos2unix_main(int argc, char **argv)
 	if (o)
 		conv_type = o;
 
+	argv += optind;
 	do {
 		/* might be convert(NULL) if there is no filename given */
-		convert(argv[optind], conv_type);
-		optind++;
-	} while (optind < argc);
+		convert(*argv, conv_type);
+	} while (*++argv);
 
 	return 0;
 }
diff --git a/coreutils/ln.c b/coreutils/ln.c
index eb71719..f977aa1 100644
--- a/coreutils/ln.c
+++ b/coreutils/ln.c
@@ -26,7 +26,7 @@ int ln_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int ln_main(int argc, char **argv)
 {
 	int status = EXIT_SUCCESS;
-	int flag;
+	int opts;
 	char *last;
 	char *src_name;
 	char *src;
@@ -34,11 +34,8 @@ int ln_main(int argc, char **argv)
 	struct stat statbuf;
 	int (*link_func)(const char *, const char *);
 
-	flag = getopt32(argv, "sfnbS:", &suffix);
-
-	if (argc == optind) {
-		bb_show_usage();
-	}
+	opt_complementary = "-1"; /* min one arg */
+	opts = getopt32(argv, "sfnbS:", &suffix);
 
 	last = argv[argc - 1];
 	argv += optind;
@@ -53,7 +50,7 @@ int ln_main(int argc, char **argv)
 		src = last;
 
 		if (is_directory(src,
-		                (flag & LN_NODEREFERENCE) ^ LN_NODEREFERENCE,
+		                (opts & LN_NODEREFERENCE) ^ LN_NODEREFERENCE,
 		                NULL)
 		) {
 			src_name = xstrdup(*argv);
@@ -61,7 +58,7 @@ int ln_main(int argc, char **argv)
 			free(src_name);
 			src_name = src;
 		}
-		if (!(flag & LN_SYMLINK) && stat(*argv, &statbuf)) {
+		if (!(opts & LN_SYMLINK) && stat(*argv, &statbuf)) {
 			// coreutils: "ln dangling_symlink new_hardlink" works
 			if (lstat(*argv, &statbuf) || !S_ISLNK(statbuf.st_mode)) {
 				bb_simple_perror_msg(*argv);
@@ -71,7 +68,7 @@ int ln_main(int argc, char **argv)
 			}
 		}
 
-		if (flag & LN_BACKUP) {
+		if (opts & LN_BACKUP) {
 			char *backup;
 			backup = xasprintf("%s%s", src, suffix);
 			if (rename(src, backup) < 0 && errno != ENOENT) {
@@ -87,12 +84,12 @@ int ln_main(int argc, char **argv)
 			 * Therefore, always unlink().
 			 */
 			unlink(src);
-		} else if (flag & LN_FORCE) {
+		} else if (opts & LN_FORCE) {
 			unlink(src);
 		}
 
 		link_func = link;
-		if (flag & LN_SYMLINK) {
+		if (opts & LN_SYMLINK) {
 			link_func = symlink;
 		}
 
diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c
index a110165..c837e97 100644
--- a/coreutils/mkdir.c
+++ b/coreutils/mkdir.c
@@ -34,7 +34,7 @@ static const char mkdir_longopts[] ALIGN1 =
 #endif
 
 int mkdir_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int mkdir_main(int argc, char **argv)
+int mkdir_main(int argc UNUSED_PARAM, char **argv)
 {
 	mode_t mode = (mode_t)(-1);
 	int status = EXIT_SUCCESS;
@@ -64,11 +64,9 @@ int mkdir_main(int argc, char **argv)
 	}
 #endif
 
-	if (optind == argc) {
-		bb_show_usage();
-	}
-
 	argv += optind;
+	if (!argv[0])
+		bb_show_usage();
 
 	do {
 		if (bb_make_directory(*argv, mode, flags)) {
diff --git a/coreutils/nohup.c b/coreutils/nohup.c
index f44e2af..c9e65d2 100644
--- a/coreutils/nohup.c
+++ b/coreutils/nohup.c
@@ -32,14 +32,14 @@ nohup: redirecting stderr to stdout
 */
 
 int nohup_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int nohup_main(int argc, char **argv)
+int nohup_main(int argc UNUSED_PARAM, char **argv)
 {
 	const char *nohupout;
 	char *home;
 
 	xfunc_error_retval = 127;
 
-	if (argc < 2) bb_show_usage();
+	if (!argv[1]) bb_show_usage();
 
 	/* If stdin is a tty, detach from it. */
 	if (isatty(STDIN_FILENO)) {
diff --git a/coreutils/stat.c b/coreutils/stat.c
index 2bc9a08..bbd2e6a 100644
--- a/coreutils/stat.c
+++ b/coreutils/stat.c
@@ -640,29 +640,29 @@ static bool do_stat(const char *filename, const char *format)
 }
 
 int stat_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int stat_main(int argc, char **argv)
+int stat_main(int argc UNUSED_PARAM, char **argv)
 {
 	IF_FEATURE_STAT_FORMAT(char *format = NULL;)
 	int i;
-	int ok = 1;
+	int ok;
+	unsigned opts;
 	statfunc_ptr statfunc = do_stat;
 
-	getopt32(argv, "ftL"
+	opt_complementary = "-1"; /* min one arg */
+	opts = getopt32(argv, "ftL"
 		IF_SELINUX("Z")
 		IF_FEATURE_STAT_FORMAT("c:", &format)
 	);
-
-	if (option_mask32 & OPT_FILESYS) /* -f */
+	if (opts & OPT_FILESYS) /* -f */
 		statfunc = do_statfs;
-	if (argc == optind)           /* files */
-		bb_show_usage();
-
 #if ENABLE_SELINUX
-	if (option_mask32 & OPT_SELINUX) {
+	if (opts & OPT_SELINUX) {
 		selinux_or_die();
 	}
-#endif	/* ENABLE_SELINUX */
-	for (i = optind; i < argc; ++i)
+#endif
+	ok = 1;
+	argv += optind;
+	for (i = 0; argv[i]; ++i)
 		ok &= statfunc(argv[i] IF_FEATURE_STAT_FORMAT(, format));
 
 	return (ok ? EXIT_SUCCESS : EXIT_FAILURE);
diff --git a/coreutils/stty.c b/coreutils/stty.c
index f29fa64..0485b80 100644
--- a/coreutils/stty.c
+++ b/coreutils/stty.c
@@ -1156,7 +1156,7 @@ static void set_control_char_or_die(const struct control_info *info,
 #define STTY_noargs             (1 << 4)
 
 int stty_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int stty_main(int argc, char **argv)
+int stty_main(int argc UNUSED_PARAM, char **argv)
 {
 	struct termios mode;
 	void (*output_func)(const struct termios *, const int);
@@ -1211,8 +1211,10 @@ int stty_main(int argc, char **argv)
 						if (!file_name)
 							bb_error_msg_and_die(bb_msg_requires_arg, "-F");
 						/* remove -F param from arg[vc] */
-						--argc;
-						while (argv[p]) { argv[p] = argv[p+1]; ++p; }
+						while (argv[p]) {
+							argv[p] = argv[p+1];
+							++p;
+						}
 					}
 					goto end_option;
 				default:
diff --git a/coreutils/yes.c b/coreutils/yes.c
index 9d3f675..d757a45 100644
--- a/coreutils/yes.c
+++ b/coreutils/yes.c
@@ -19,14 +19,13 @@
 /* This is a NOFORK applet. Be very careful! */
 
 int yes_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int yes_main(int argc, char **argv)
+int yes_main(int argc UNUSED_PARAM, char **argv)
 {
 	char **pp;
 
 	argv[0] = (char*)"y";
-	if (argc != 1) {
+	if (argv[1])
 		++argv;
-	}
 
 	do {
 		pp = argv;
diff --git a/include/libbb.h b/include/libbb.h
index 1f39c95..8d3df61 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -869,6 +869,7 @@ void bb_sanitize_stdio(void) FAST_FUNC;
 int sanitize_env_if_suid(void) FAST_FUNC;
 
 
+char* single_argv(char **argv) FAST_FUNC;
 extern const char *const bb_argv_dash[]; /* "-", NULL */
 extern const char *opt_complementary;
 #if ENABLE_LONG_OPTS || ENABLE_FEATURE_GETOPT_LONG
diff --git a/libbb/Kbuild b/libbb/Kbuild
index d9d5ad7..130ad25 100644
--- a/libbb/Kbuild
+++ b/libbb/Kbuild
@@ -92,6 +92,7 @@ lib-y += setup_environment.o
 lib-y += sha1.o
 lib-y += signals.o
 lib-y += simplify_path.o
+lib-y += single_argv.o
 lib-y += skip_whitespace.o
 lib-y += speed_table.o
 lib-y += str_tolower.o
diff --git a/libbb/single_argv.c b/libbb/single_argv.c
new file mode 100644
index 0000000..6173c88
--- /dev/null
+++ b/libbb/single_argv.c
@@ -0,0 +1,16 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Utility routines.
+ *
+ * Copyright (C) 2009 Denys Vlasenko
+ *
+ * Licensed under GPLv2, see file LICENSE in this tarball for details.
+ */
+#include "libbb.h"
+
+char* FAST_FUNC single_argv(char **argv)
+{
+	if (!argv[1] || argv[2])
+		bb_show_usage();
+	return argv[1];
+}
diff --git a/miscutils/adjtimex.c b/miscutils/adjtimex.c
index 07f0834..c12a10b 100644
--- a/miscutils/adjtimex.c
+++ b/miscutils/adjtimex.c
@@ -56,7 +56,7 @@ static const char ret_code_descript[] =
 ;
 
 int adjtimex_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int adjtimex_main(int argc, char **argv)
+int adjtimex_main(int argc UNUSED_PARAM, char **argv)
 {
 	enum {
 		OPT_quiet = 0x1
@@ -66,10 +66,11 @@ int adjtimex_main(int argc, char **argv)
 	struct timex txc;
 	int i, ret;
 	const char *descript;
-	txc.modes=0;
 
+	opt_complementary = "=0"; /* no valid non-option parameters */
 	opt = getopt32(argv, "qo:f:p:t:",
 			&opt_o, &opt_f, &opt_p, &opt_t);
+	txc.modes = 0;
 	//if (opt & 0x1) // -q
 	if (opt & 0x2) { // -o
 		txc.offset = xatol(opt_o);
@@ -87,9 +88,6 @@ int adjtimex_main(int argc, char **argv)
 		txc.tick = xatol(opt_t);
 		txc.modes |= ADJ_TICK;
 	}
-	if (argc != optind) { /* no valid non-option parameters */
-		bb_show_usage();
-	}
 
 	ret = adjtimex(&txc);
 
diff --git a/miscutils/raidautorun.c b/miscutils/raidautorun.c
index a2a852b..113e49f 100644
--- a/miscutils/raidautorun.c
+++ b/miscutils/raidautorun.c
@@ -14,12 +14,8 @@
 #include <linux/raid/md_u.h>
 
 int raidautorun_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int raidautorun_main(int argc, char **argv)
+int raidautorun_main(int argc UNUSED_PARAM, char **argv)
 {
-	if (argc != 2)
-		bb_show_usage();
-
-	xioctl(xopen(argv[1], O_RDONLY), RAID_AUTORUN, NULL);
-
+	xioctl(xopen(single_argv(argv), O_RDONLY), RAID_AUTORUN, NULL);
 	return EXIT_SUCCESS;
 }
diff --git a/miscutils/rx.c b/miscutils/rx.c
index 3a8b6a8..4c5d5a1 100644
--- a/miscutils/rx.c
+++ b/miscutils/rx.c
@@ -234,21 +234,18 @@ static void sigalrm_handler(int UNUSED_PARAM signum)
 }
 
 int rx_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int rx_main(int argc, char **argv)
+int rx_main(int argc UNUSED_PARAM, char **argv)
 {
 	struct termios tty, orig_tty;
 	int termios_err;
 	int file_fd;
 	int n;
 
-	if (argc != 2)
-		bb_show_usage();
-
 	/* Disabled by vda:
 	 * why we can't receive from stdin? Why we *require*
 	 * controlling tty?? */
 	/*read_fd = xopen(CURRENT_TTY, O_RDWR);*/
-	file_fd = xopen(argv[1], O_RDWR|O_CREAT|O_TRUNC);
+	file_fd = xopen(single_argv(argv), O_RDWR|O_CREAT|O_TRUNC);
 
 	termios_err = tcgetattr(read_fd, &tty);
 	if (termios_err == 0) {
diff --git a/runit/runsv.c b/runit/runsv.c
index 8b78754..48b8396 100644
--- a/runit/runsv.c
+++ b/runit/runsv.c
@@ -463,9 +463,7 @@ int runsv_main(int argc UNUSED_PARAM, char **argv)
 
 	INIT_G();
 
-	if (!argv[1] || argv[2])
-		bb_show_usage();
-	dir = argv[1];
+	dir = single_argv(argv);
 
 	xpiped_pair(selfpipe);
 	close_on_exec_on(selfpipe.rd);
diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c
index 6a194fd..c9f57c6 100644
--- a/util-linux/fdisk.c
+++ b/util-linux/fdisk.c
@@ -2821,7 +2821,7 @@ unknown_command(int c)
 #endif
 
 int fdisk_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int fdisk_main(int argc, char **argv)
+int fdisk_main(int argc UNUSED_PARAM, char **argv)
 {
 	unsigned opt;
 	/*
@@ -2839,7 +2839,6 @@ int fdisk_main(int argc, char **argv)
 	opt_complementary = "b+:C+:H+:S+"; /* numeric params */
 	opt = getopt32(argv, "b:C:H:lS:u" IF_FEATURE_FDISK_BLKSIZE("s"),
 				&sector_size, &user_cylinders, &user_heads, &user_sectors);
-	argc -= optind;
 	argv += optind;
 	if (opt & OPT_b) { // -b
 		/* Ugly: this sector size is really per device,
@@ -2883,14 +2882,14 @@ int fdisk_main(int argc, char **argv)
 		int j;
 
 		nowarn = 1;
-		if (argc <= 0)
+		if (!argv[0])
 			bb_show_usage();
-		for (j = 0; j < argc; j++) {
+		for (j = 0; argv[j]; j++) {
 			unsigned long long size;
 			fd = xopen(argv[j], O_RDONLY);
 			size = bb_BLKGETSIZE_sectors(fd) / 2;
 			close(fd);
-			if (argc == 1)
+			if (argv[1])
 				printf("%llu\n", size);
 			else
 				printf("%s: %llu\n", argv[j], size);
@@ -2900,7 +2899,7 @@ int fdisk_main(int argc, char **argv)
 #endif
 
 #if ENABLE_FEATURE_FDISK_WRITABLE
-	if (argc != 1)
+	if (!argv[0] || argv[1])
 		bb_show_usage();
 
 	disk_device = argv[0];
diff --git a/util-linux/freeramdisk.c b/util-linux/freeramdisk.c
index 6b9d95e..4949056 100644
--- a/util-linux/freeramdisk.c
+++ b/util-linux/freeramdisk.c
@@ -15,16 +15,14 @@
 #define FDFLUSH  _IO(2,0x4b)
 
 int freeramdisk_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int freeramdisk_main(int argc, char **argv)
+int freeramdisk_main(int argc UNUSED_PARAM, char **argv)
 {
 	int fd;
 
-	if (argc != 2) bb_show_usage();
-
-	fd = xopen(argv[1], O_RDWR);
+	fd = xopen(single_argv(argv), O_RDWR);
 
 	// Act like freeramdisk, fdflush, or both depending on configuration.
-	ioctl_or_perror_and_die(fd, (ENABLE_FREERAMDISK && applet_name[1]=='r')
+	ioctl_or_perror_and_die(fd, (ENABLE_FREERAMDISK && applet_name[1] == 'r')
 			|| !ENABLE_FDFLUSH ? BLKFLSBUF : FDFLUSH, NULL, "%s", argv[1]);
 
 	if (ENABLE_FEATURE_CLEAN_UP) close(fd);
-- 
1.6.3.3



More information about the busybox-cvs mailing list