*
* 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;
}
#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]) {
#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;
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);
/* 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();
}
}
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;
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;
}
int ln_main(int argc, char **argv)
{
int status = EXIT_SUCCESS;
- int flag;
+ int opts;
char *last;
char *src_name;
char *src;
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;
src = last;
if (is_directory(src,
- (flag & LN_NODEREFERENCE) ^ LN_NODEREFERENCE,
+ (opts & LN_NODEREFERENCE) ^ LN_NODEREFERENCE,
NULL)
) {
src_name = xstrdup(*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);
}
}
- if (flag & LN_BACKUP) {
+ if (opts & LN_BACKUP) {
char *backup;
backup = xasprintf("%s%s", src, suffix);
if (rename(src, backup) < 0 && errno != ENOENT) {
* 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;
}
#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;
}
#endif
- if (optind == argc) {
- bb_show_usage();
- }
-
argv += optind;
+ if (!argv[0])
+ bb_show_usage();
do {
if (bb_make_directory(*argv, mode, flags)) {
*/
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)) {
}
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);
#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);
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:
/* 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;
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
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
--- /dev/null
+/* 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];
+}
;
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
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);
txc.tick = xatol(opt_t);
txc.modes |= ADJ_TICK;
}
- if (argc != optind) { /* no valid non-option parameters */
- bb_show_usage();
- }
ret = adjtimex(&txc);
#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;
}
}
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) {
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);
#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;
/*
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,
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);
#endif
#if ENABLE_FEATURE_FDISK_WRITABLE
- if (argc != 1)
+ if (!argv[0] || argv[1])
bb_show_usage();
disk_device = argv[0];
#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);