From e992bae6f9adf3718c6263a36c004ead1c7272a8 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sat, 28 Nov 2009 15:18:53 +0100 Subject: [PATCH] *: remove a few more cases of argc usage. -89 bytes. Signed-off-by: Denys Vlasenko --- 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 302ffb4f9..977c26905 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 9b3d70044..f7228a61a 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 a0e6fe070..11a739816 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 1f5f70dfd..94c22a7ee 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 baf879e54..1911f5319 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 eb7171959..f977aa177 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 a110165db..c837e9726 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 f44e2af61..c9e65d2ba 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 2bc9a086c..bbd2e6a7c 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 f29fa64f7..0485b8011 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 9d3f67550..d757a4504 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 1f39c95e1..8d3df6191 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 d9d5ad793..130ad25de 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 000000000..6173c884e --- /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 07f083428..c12a10b25 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 a2a852bbf..113e49ff2 100644 --- a/miscutils/raidautorun.c +++ b/miscutils/raidautorun.c @@ -14,12 +14,8 @@ #include 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 3a8b6a8fe..4c5d5a19c 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 8b787543f..48b83960d 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 6a194fd1a..c9f57c6d6 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"), §or_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 6b9d95e69..4949056a6 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); -- 2.25.1