Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/include


Ignore:
Timestamp:
Feb 25, 2011, 9:26:54 PM (13 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
Location:
branches/2.2.9/mindi-busybox/include
Files:
10 added
12 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mindi-busybox/include/applets.h

    r1765 r2725  
     1/* DO NOT EDIT. This file is generated from applets.src.h */
    12/* vi: set sw=4 ts=4: */
    23/*
     
    56 * If you write a new applet, you need to add an entry to this list to make
    67 * busybox aware of it.
    7  *
    8  * It is CRUCIAL that this listing be kept in ascii order, otherwise the binary
    9  * search lookup contributed by Gaute B Strokkenes stops working. If you value
    10  * your kneecaps, you'll be sure to *make sure* that any changes made to this
    11  * file result in the listing remaining in ascii order. You have been warned.
    128 */
    139
     
    1814l     - location to install link to: [/usr]/[s]bin
    1915s     - suid type:
    20         _BB_SUID_ALWAYS: will complain if busybox isn't suid
     16        _BB_SUID_REQUIRE: will complain if busybox isn't suid
    2117        and is run by non-root (applet_main() will not be called at all)
    22         _BB_SUID_NEVER: will drop suid prior to applet_main()
     18        _BB_SUID_DROP: will drop suid prior to applet_main()
    2319        _BB_SUID_MAYBE: neither of the above
    2420*/
    2521
    2622#if defined(PROTOTYPES)
    27 # define APPLET(name,l,s)                    int name##_main(int argc, char **argv);
    28 # define APPLET_NOUSAGE(name,main,l,s)       int main##_main(int argc, char **argv);
    29 # define APPLET_ODDNAME(name,main,l,s,name2) int main##_main(int argc, char **argv);
    30 # define APPLET_NOEXEC(name,main,l,s,name2)  int main##_main(int argc, char **argv);
    31 # define APPLET_NOFORK(name,main,l,s,name2)  int main##_main(int argc, char **argv);
     23# define APPLET(name,l,s)                    int name##_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     24# define APPLET_ODDNAME(name,main,l,s,name2) int main##_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     25# define APPLET_NOEXEC(name,main,l,s,name2)  int main##_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     26# define APPLET_NOFORK(name,main,l,s,name2)  int main##_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     27
     28#elif defined(NAME_MAIN_CNAME)
     29# define APPLET(name,l,s)                    name name##_main name
     30# define APPLET_ODDNAME(name,main,l,s,name2) name main##_main name2
     31# define APPLET_NOEXEC(name,main,l,s,name2)  name main##_main name2
     32# define APPLET_NOFORK(name,main,l,s,name2)  name main##_main name2
    3233
    3334#elif defined(MAKE_USAGE) && ENABLE_FEATURE_VERBOSE_USAGE
    34 # define APPLET(name,l,s)                    name##_trivial_usage "\n\n" name##_full_usage "\0"
    35 # define APPLET_NOUSAGE(name,main,l,s)       "\b\0"
    36 # define APPLET_ODDNAME(name,main,l,s,name2) name2##_trivial_usage "\n\n" name2##_full_usage "\0"
    37 # define APPLET_NOEXEC(name,main,l,s,name2)  name2##_trivial_usage "\n\n" name2##_full_usage "\0"
    38 # define APPLET_NOFORK(name,main,l,s,name2)  name2##_trivial_usage "\n\n" name2##_full_usage "\0"
     35# define APPLET(name,l,s)                    MAKE_USAGE(#name, name##_trivial_usage name##_full_usage)
     36# define APPLET_ODDNAME(name,main,l,s,name2) MAKE_USAGE(#name, name2##_trivial_usage name2##_full_usage)
     37# define APPLET_NOEXEC(name,main,l,s,name2)  MAKE_USAGE(#name, name2##_trivial_usage name2##_full_usage)
     38# define APPLET_NOFORK(name,main,l,s,name2)  MAKE_USAGE(#name, name2##_trivial_usage name2##_full_usage)
    3939
    4040#elif defined(MAKE_USAGE) && !ENABLE_FEATURE_VERBOSE_USAGE
    41 # define APPLET(name,l,s)                    name##_trivial_usage "\0"
    42 # define APPLET_NOUSAGE(name,main,l,s)       "\b\0"
    43 # define APPLET_ODDNAME(name,main,l,s,name2) name2##_trivial_usage "\0"
    44 # define APPLET_NOEXEC(name,main,l,s,name2)  name2##_trivial_usage "\0"
    45 # define APPLET_NOFORK(name,main,l,s,name2)  name2##_trivial_usage "\0"
     41# define APPLET(name,l,s)                    MAKE_USAGE(#name, name##_trivial_usage)
     42# define APPLET_ODDNAME(name,main,l,s,name2) MAKE_USAGE(#name, name2##_trivial_usage)
     43# define APPLET_NOEXEC(name,main,l,s,name2)  MAKE_USAGE(#name, name2##_trivial_usage)
     44# define APPLET_NOFORK(name,main,l,s,name2)  MAKE_USAGE(#name, name2##_trivial_usage)
    4645
    4746#elif defined(MAKE_LINKS)
    4847# define APPLET(name,l,c)                    LINK l name
    49 # define APPLET_NOUSAGE(name,main,l,s)       LINK l name
    5048# define APPLET_ODDNAME(name,main,l,s,name2) LINK l name
    5149# define APPLET_NOEXEC(name,main,l,s,name2)  LINK l name
     
    5351
    5452#else
    55   const struct bb_applet applets[] = { /*    name, main, location, need_suid */
    56 # define APPLET(name,l,s)                    { #name, name##_main USE_FEATURE_INSTALLER(,l) USE_FEATURE_SUID(,s) },
    57 # define APPLET_NOUSAGE(name,main,l,s)       { #name, main##_main USE_FEATURE_INSTALLER(,l) USE_FEATURE_SUID(,s) },
    58 # define APPLET_ODDNAME(name,main,l,s,name2) { #name, main##_main USE_FEATURE_INSTALLER(,l) USE_FEATURE_SUID(,s) },
    59 # define APPLET_NOEXEC(name,main,l,s,name2)  { #name, main##_main USE_FEATURE_INSTALLER(,l) USE_FEATURE_SUID(,s) USE_FEATURE_PREFER_APPLETS(,1) },
    60 # define APPLET_NOFORK(name,main,l,s,name2)  { #name, main##_main USE_FEATURE_INSTALLER(,l) USE_FEATURE_SUID(,s) USE_FEATURE_PREFER_APPLETS(,1 ,1) },
     53  static struct bb_applet applets[] = { /*    name, main, location, need_suid */
     54# define APPLET(name,l,s)                    { #name, #name, l, s },
     55# define APPLET_ODDNAME(name,main,l,s,name2) { #name, #main, l, s },
     56# define APPLET_NOEXEC(name,main,l,s,name2)  { #name, #main, l, s, 1 },
     57# define APPLET_NOFORK(name,main,l,s,name2)  { #name, #main, l, s, 1, 1 },
    6158#endif
    6259
     
    6764
    6865
    69 USE_TEST(APPLET_NOEXEC([, test, _BB_DIR_USR_BIN, _BB_SUID_NEVER, test))
    70 USE_TEST(APPLET_NOUSAGE([[, test, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    71 USE_ADDGROUP(APPLET(addgroup, _BB_DIR_BIN, _BB_SUID_NEVER))
    72 USE_ADDUSER(APPLET(adduser, _BB_DIR_BIN, _BB_SUID_NEVER))
    73 USE_ADJTIMEX(APPLET(adjtimex, _BB_DIR_SBIN, _BB_SUID_NEVER))
    74 USE_AR(APPLET(ar, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    75 USE_ARP(APPLET(arp, _BB_DIR_SBIN, _BB_SUID_NEVER))
    76 USE_ARPING(APPLET(arping, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    77 USE_ASH(APPLET_NOUSAGE(ash, ash, _BB_DIR_BIN, _BB_SUID_NEVER))
    78 USE_AWK(APPLET_NOEXEC(awk, awk, _BB_DIR_USR_BIN, _BB_SUID_NEVER, awk))
    79 USE_BASENAME(APPLET_NOFORK(basename, basename, _BB_DIR_USR_BIN, _BB_SUID_NEVER, basename))
    80 USE_BBCONFIG(APPLET(bbconfig, _BB_DIR_BIN, _BB_SUID_NEVER))
    81 //USE_BBSH(APPLET(bbsh, _BB_DIR_BIN, _BB_SUID_NEVER))
    82 USE_BUNZIP2(APPLET(bunzip2, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    83 USE_BUNZIP2(APPLET_ODDNAME(bzcat, bunzip2, _BB_DIR_USR_BIN, _BB_SUID_NEVER, bzcat))
    84 USE_CAL(APPLET(cal, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    85 USE_CAT(APPLET_NOFORK(cat, cat, _BB_DIR_BIN, _BB_SUID_NEVER, cat))
    86 USE_CATV(APPLET(catv, _BB_DIR_BIN, _BB_SUID_NEVER))
    87 USE_CHATTR(APPLET(chattr, _BB_DIR_BIN, _BB_SUID_NEVER))
    88 USE_CHCON(APPLET(chcon, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    89 USE_CHGRP(APPLET_NOEXEC(chgrp, chgrp, _BB_DIR_BIN, _BB_SUID_NEVER, chgrp))
    90 USE_CHMOD(APPLET_NOEXEC(chmod, chmod, _BB_DIR_BIN, _BB_SUID_NEVER, chmod))
    91 USE_CHOWN(APPLET_NOEXEC(chown, chown, _BB_DIR_BIN, _BB_SUID_NEVER, chown))
    92 USE_CHPASSWD(APPLET(chpasswd, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    93 USE_CHPST(APPLET(chpst, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    94 USE_CHROOT(APPLET(chroot, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    95 USE_CHRT(APPLET(chrt, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    96 USE_CHVT(APPLET(chvt, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    97 USE_CKSUM(APPLET(cksum, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    98 USE_CLEAR(APPLET(clear, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    99 USE_CMP(APPLET(cmp, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    100 USE_COMM(APPLET(comm, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    101 USE_CP(APPLET_NOEXEC(cp, cp, _BB_DIR_BIN, _BB_SUID_NEVER, cp))
    102 USE_CPIO(APPLET(cpio, _BB_DIR_BIN, _BB_SUID_NEVER))
    103 USE_CROND(APPLET(crond, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    104 USE_CRONTAB(APPLET(crontab, _BB_DIR_USR_BIN, _BB_SUID_ALWAYS))
    105 USE_CRYPTPW(APPLET(cryptpw, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    106 USE_CTTYHACK(APPLET_NOUSAGE(cttyhack, cttyhack, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    107 USE_CUT(APPLET_NOEXEC(cut, cut, _BB_DIR_USR_BIN, _BB_SUID_NEVER, cut))
    108 USE_DATE(APPLET(date, _BB_DIR_BIN, _BB_SUID_NEVER))
    109 USE_DC(APPLET(dc, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    110 USE_DD(APPLET_NOEXEC(dd, dd, _BB_DIR_BIN, _BB_SUID_NEVER, dd))
    111 USE_DEALLOCVT(APPLET(deallocvt, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    112 USE_DELGROUP(APPLET_ODDNAME(delgroup, deluser, _BB_DIR_BIN, _BB_SUID_NEVER, delgroup))
    113 USE_DELUSER(APPLET(deluser, _BB_DIR_BIN, _BB_SUID_NEVER))
    114 USE_DEVFSD(APPLET(devfsd, _BB_DIR_SBIN, _BB_SUID_NEVER))
    115 USE_DF(APPLET(df, _BB_DIR_BIN, _BB_SUID_NEVER))
    116 USE_APP_DHCPRELAY(APPLET(dhcprelay, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    117 USE_DIFF(APPLET(diff, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    118 USE_DIRNAME(APPLET_NOFORK(dirname, dirname, _BB_DIR_USR_BIN, _BB_SUID_NEVER, dirname))
    119 USE_DMESG(APPLET(dmesg, _BB_DIR_BIN, _BB_SUID_NEVER))
    120 USE_DNSD(APPLET(dnsd, _BB_DIR_USR_SBIN, _BB_SUID_ALWAYS))
    121 USE_DOS2UNIX(APPLET(dos2unix, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    122 USE_DPKG(APPLET(dpkg, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    123 USE_DPKG_DEB(APPLET_ODDNAME(dpkg-deb, dpkg_deb, _BB_DIR_USR_BIN, _BB_SUID_NEVER, dpkg_deb))
    124 USE_DU(APPLET(du, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    125 USE_DUMPKMAP(APPLET(dumpkmap, _BB_DIR_BIN, _BB_SUID_NEVER))
    126 USE_APP_DUMPLEASES(APPLET(dumpleases, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    127 //USE_E2FSCK(APPLET(e2fsck, _BB_DIR_SBIN, _BB_SUID_NEVER))
    128 //USE_E2LABEL(APPLET_NOUSAGE(e2label, tune2fs, _BB_DIR_SBIN, _BB_SUID_NEVER))
    129 USE_ECHO(APPLET_NOFORK(echo, echo, _BB_DIR_BIN, _BB_SUID_NEVER, echo))
    130 USE_ED(APPLET(ed, _BB_DIR_BIN, _BB_SUID_NEVER))
    131 USE_FEATURE_GREP_EGREP_ALIAS(APPLET_NOUSAGE(egrep, grep, _BB_DIR_BIN, _BB_SUID_NEVER))
    132 USE_EJECT(APPLET(eject, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    133 USE_ENV(APPLET(env, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    134 USE_ENVDIR(APPLET_ODDNAME(envdir, chpst, _BB_DIR_USR_BIN, _BB_SUID_NEVER, envdir))
    135 USE_ENVUIDGID(APPLET_ODDNAME(envuidgid, chpst, _BB_DIR_USR_BIN, _BB_SUID_NEVER, envuidgid))
    136 USE_ETHER_WAKE(APPLET_ODDNAME(ether-wake, ether_wake, _BB_DIR_USR_BIN, _BB_SUID_NEVER, ether_wake))
    137 USE_EXPAND(APPLET(expand, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    138 USE_EXPR(APPLET(expr, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    139 USE_FAKEIDENTD(APPLET(fakeidentd, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    140 USE_FALSE(APPLET_NOFORK(false, false, _BB_DIR_BIN, _BB_SUID_NEVER, false))
    141 USE_FBSET(APPLET(fbset, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    142 USE_FDFLUSH(APPLET_ODDNAME(fdflush, freeramdisk, _BB_DIR_BIN, _BB_SUID_NEVER, fdflush))
    143 USE_FDFORMAT(APPLET(fdformat, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    144 USE_FDISK(APPLET(fdisk, _BB_DIR_SBIN, _BB_SUID_NEVER))
    145 USE_FEATURE_GREP_FGREP_ALIAS(APPLET_NOUSAGE(fgrep, grep, _BB_DIR_BIN, _BB_SUID_NEVER))
    146 USE_FIND(APPLET_NOEXEC(find, find, _BB_DIR_USR_BIN, _BB_SUID_NEVER, find))
    147 //USE_FINDFS(APPLET_NOUSAGE(findfs, tune2fs, _BB_DIR_SBIN, _BB_SUID_NEVER))
    148 USE_FOLD(APPLET(fold, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    149 USE_FREE(APPLET(free, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    150 USE_FREERAMDISK(APPLET(freeramdisk, _BB_DIR_SBIN, _BB_SUID_NEVER))
    151 USE_FSCK(APPLET(fsck, _BB_DIR_SBIN, _BB_SUID_NEVER))
    152 //USE_E2FSCK(APPLET_NOUSAGE(fsck.ext2, e2fsck, _BB_DIR_SBIN, _BB_SUID_NEVER))
    153 //USE_E2FSCK(APPLET_NOUSAGE(fsck.ext3, e2fsck, _BB_DIR_SBIN, _BB_SUID_NEVER))
    154 USE_FSCK_MINIX(APPLET_ODDNAME(fsck.minix, fsck_minix, _BB_DIR_SBIN, _BB_SUID_NEVER, fsck_minix))
    155 USE_FTPGET(APPLET_ODDNAME(ftpget, ftpgetput, _BB_DIR_USR_BIN, _BB_SUID_NEVER, ftpget))
    156 USE_FTPPUT(APPLET_ODDNAME(ftpput, ftpgetput, _BB_DIR_USR_BIN, _BB_SUID_NEVER, ftpput))
    157 USE_FUSER(APPLET(fuser, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    158 USE_GETENFORCE(APPLET(getenforce, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    159 USE_GETOPT(APPLET(getopt, _BB_DIR_BIN, _BB_SUID_NEVER))
    160 USE_GETSEBOOL(APPLET(getsebool, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    161 USE_GETTY(APPLET(getty, _BB_DIR_SBIN, _BB_SUID_NEVER))
    162 USE_GREP(APPLET(grep, _BB_DIR_BIN, _BB_SUID_NEVER))
    163 USE_GUNZIP(APPLET(gunzip, _BB_DIR_BIN, _BB_SUID_NEVER))
    164 USE_GZIP(APPLET(gzip, _BB_DIR_BIN, _BB_SUID_NEVER))
    165 USE_HALT(APPLET(halt, _BB_DIR_SBIN, _BB_SUID_NEVER))
    166 USE_HDPARM(APPLET(hdparm, _BB_DIR_SBIN, _BB_SUID_NEVER))
    167 USE_HEAD(APPLET(head, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    168 USE_HEXDUMP(APPLET_NOEXEC(hexdump, hexdump, _BB_DIR_USR_BIN, _BB_SUID_NEVER, hexdump))
    169 USE_HOSTID(APPLET_NOFORK(hostid, hostid, _BB_DIR_USR_BIN, _BB_SUID_NEVER, hostid))
    170 USE_HOSTNAME(APPLET(hostname, _BB_DIR_BIN, _BB_SUID_NEVER))
    171 USE_HTTPD(APPLET(httpd, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    172 USE_HUSH(APPLET_NOUSAGE(hush, hush, _BB_DIR_BIN, _BB_SUID_NEVER))
    173 USE_HWCLOCK(APPLET(hwclock, _BB_DIR_SBIN, _BB_SUID_NEVER))
    174 USE_ID(APPLET(id, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    175 USE_IFCONFIG(APPLET(ifconfig, _BB_DIR_SBIN, _BB_SUID_NEVER))
    176 USE_IFUPDOWN(APPLET_ODDNAME(ifdown, ifupdown, _BB_DIR_SBIN, _BB_SUID_NEVER, ifdown))
    177 USE_IFUPDOWN(APPLET_ODDNAME(ifup, ifupdown, _BB_DIR_SBIN, _BB_SUID_NEVER, ifup))
    178 USE_INETD(APPLET(inetd, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    179 USE_INIT(APPLET(init, _BB_DIR_SBIN, _BB_SUID_NEVER))
    180 USE_INSMOD(APPLET(insmod, _BB_DIR_SBIN, _BB_SUID_NEVER))
    181 USE_INSTALL(APPLET(install, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
     66IF_BUNZIP2(APPLET(bunzip2, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     67IF_BUNZIP2(APPLET_ODDNAME(bzcat, bunzip2, _BB_DIR_USR_BIN, _BB_SUID_DROP, bzcat))
     68IF_DATE(APPLET(date, _BB_DIR_BIN, _BB_SUID_DROP))
     69IF_BASE64(APPLET(base64, _BB_DIR_BIN, _BB_SUID_DROP))
     70IF_PATCH(APPLET(patch, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     71IF_FIND(APPLET_NOEXEC(find, find, _BB_DIR_USR_BIN, _BB_SUID_DROP, find))
     72IF_GREP(APPLET(grep, _BB_DIR_BIN, _BB_SUID_DROP))
     73IF_FEATURE_GREP_EGREP_ALIAS(APPLET_ODDNAME(egrep, grep, _BB_DIR_BIN, _BB_SUID_DROP, egrep))
     74IF_FEATURE_GREP_FGREP_ALIAS(APPLET_ODDNAME(fgrep, grep, _BB_DIR_BIN, _BB_SUID_DROP, fgrep))
     75IF_XARGS(APPLET_NOEXEC(xargs, xargs, _BB_DIR_USR_BIN, _BB_SUID_DROP, xargs))
     76IF_BOOTCHARTD(APPLET(bootchartd, _BB_DIR_SBIN, _BB_SUID_DROP))
     77IF_HALT(APPLET(halt, _BB_DIR_SBIN, _BB_SUID_DROP))
     78IF_HALT(APPLET_ODDNAME(poweroff, halt, _BB_DIR_SBIN, _BB_SUID_DROP, poweroff))
     79IF_HALT(APPLET_ODDNAME(reboot, halt, _BB_DIR_SBIN, _BB_SUID_DROP, reboot))
     80IF_INIT(APPLET(init, _BB_DIR_SBIN, _BB_SUID_DROP))
     81IF_FEATURE_INITRD(APPLET_ODDNAME(linuxrc, init, _BB_DIR_ROOT, _BB_SUID_DROP, linuxrc))
     82IF_MESG(APPLET(mesg, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     83IF_ADD_SHELL(   APPLET_ODDNAME(add-shell   , add_remove_shell, _BB_DIR_USR_BIN, _BB_SUID_DROP, add_shell   ))
     84IF_REMOVE_SHELL(APPLET_ODDNAME(remove-shell, add_remove_shell, _BB_DIR_USR_BIN, _BB_SUID_DROP, remove_shell))
     85IF_CONSPY(APPLET(conspy, _BB_DIR_BIN, _BB_SUID_DROP))
     86IF_NANDWRITE(APPLET(nandwrite, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     87IF_NANDWRITE(APPLET_ODDNAME(nanddump, nandwrite, _BB_DIR_USR_SBIN, _BB_SUID_DROP, nanddump))
     88IF_UBIATTACH(APPLET_ODDNAME(ubiattach, ubi_attach_detach, _BB_DIR_USR_SBIN, _BB_SUID_DROP, ubiattach))
     89IF_UBIDETACH(APPLET_ODDNAME(ubidetach, ubi_attach_detach, _BB_DIR_USR_SBIN, _BB_SUID_DROP, ubidetach))
     90IF_DEPMOD(APPLET(depmod, _BB_DIR_SBIN, _BB_SUID_DROP))
     91IF_INSMOD(APPLET(insmod, _BB_DIR_SBIN, _BB_SUID_DROP))
     92IF_LSMOD(APPLET(lsmod, _BB_DIR_SBIN, _BB_SUID_DROP))
     93IF_MODINFO(APPLET(modinfo, _BB_DIR_SBIN, _BB_SUID_DROP))
     94IF_MODPROBE(APPLET(modprobe, _BB_DIR_SBIN, _BB_SUID_DROP))
     95IF_MODPROBE_SMALL(APPLET(modprobe, _BB_DIR_SBIN, _BB_SUID_DROP))
     96IF_MODPROBE_SMALL(APPLET_ODDNAME(depmod, modprobe, _BB_DIR_SBIN, _BB_SUID_DROP, modprobe))
     97IF_MODPROBE_SMALL(APPLET_ODDNAME(insmod, modprobe, _BB_DIR_SBIN, _BB_SUID_DROP, modprobe))
     98IF_MODPROBE_SMALL(APPLET_ODDNAME(lsmod, modprobe, _BB_DIR_SBIN, _BB_SUID_DROP, modprobe))
     99IF_MODPROBE_SMALL(APPLET_ODDNAME(rmmod, modprobe, _BB_DIR_SBIN, _BB_SUID_DROP, modprobe))
     100IF_RMMOD(APPLET(rmmod, _BB_DIR_SBIN, _BB_SUID_DROP))
     101IF_NBDCLIENT(APPLET_ODDNAME(nbd-client, nbdclient, _BB_DIR_USR_SBIN, _BB_SUID_DROP, nbdclient))
     102IF_IOSTAT(APPLET(iostat, _BB_DIR_BIN, _BB_SUID_DROP))
     103IF_MPSTAT(APPLET(mpstat, _BB_DIR_BIN, _BB_SUID_DROP))
     104IF_PMAP(APPLET(pmap, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     105IF_POWERTOP(APPLET(powertop, _BB_DIR_BIN, _BB_SUID_DROP))
     106IF_SMEMCAP(APPLET(smemcap, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     107IF_ASH(APPLET(ash, _BB_DIR_BIN, _BB_SUID_DROP))
     108IF_FEATURE_SH_IS_ASH(APPLET_ODDNAME(sh, ash, _BB_DIR_BIN, _BB_SUID_DROP, sh))
     109IF_FEATURE_BASH_IS_ASH(APPLET_ODDNAME(bash, ash, _BB_DIR_BIN, _BB_SUID_DROP, bash))
     110IF_CTTYHACK(APPLET(cttyhack, _BB_DIR_BIN, _BB_SUID_DROP))
     111IF_HUSH(APPLET(hush, _BB_DIR_BIN, _BB_SUID_DROP))
     112IF_MSH(APPLET(msh, _BB_DIR_BIN, _BB_SUID_DROP))
     113IF_FEATURE_SH_IS_HUSH(APPLET_ODDNAME(sh, hush, _BB_DIR_BIN, _BB_SUID_DROP, sh))
     114IF_FEATURE_BASH_IS_HUSH(APPLET_ODDNAME(bash, hush, _BB_DIR_BIN, _BB_SUID_DROP, bash))
     115IF_BLOCKDEV(APPLET(blockdev, _BB_DIR_SBIN, _BB_SUID_DROP))
     116IF_REV(APPLET(rev, _BB_DIR_BIN, _BB_SUID_DROP))
     117IF_TEST(APPLET_NOFORK([,  test, _BB_DIR_USR_BIN, _BB_SUID_DROP, test))
     118IF_TEST(APPLET_NOFORK([[, test, _BB_DIR_USR_BIN, _BB_SUID_DROP, test))
     119IF_ACPID(APPLET(acpid, _BB_DIR_SBIN, _BB_SUID_DROP))
     120IF_ADDGROUP(APPLET(addgroup, _BB_DIR_BIN, _BB_SUID_DROP))
     121IF_ADDUSER(APPLET(adduser, _BB_DIR_BIN, _BB_SUID_DROP))
     122IF_ADJTIMEX(APPLET(adjtimex, _BB_DIR_SBIN, _BB_SUID_DROP))
     123IF_AR(APPLET(ar, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     124IF_ARP(APPLET(arp, _BB_DIR_SBIN, _BB_SUID_DROP))
     125IF_ARPING(APPLET(arping, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     126IF_AWK(APPLET_NOEXEC(awk, awk, _BB_DIR_USR_BIN, _BB_SUID_DROP, awk))
     127IF_BASENAME(APPLET_NOFORK(basename, basename, _BB_DIR_USR_BIN, _BB_SUID_DROP, basename))
     128IF_BBCONFIG(APPLET(bbconfig, _BB_DIR_BIN, _BB_SUID_DROP))
     129IF_BEEP(APPLET(beep, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     130IF_BLKID(APPLET(blkid, _BB_DIR_SBIN, _BB_SUID_DROP))
     131IF_BRCTL(APPLET(brctl, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     132IF_BZIP2(APPLET(bzip2, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     133IF_CAL(APPLET(cal, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     134IF_CAT(APPLET_NOFORK(cat, cat, _BB_DIR_BIN, _BB_SUID_DROP, cat))
     135IF_CATV(APPLET(catv, _BB_DIR_BIN, _BB_SUID_DROP))
     136IF_CHAT(APPLET(chat, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     137IF_CHATTR(APPLET(chattr, _BB_DIR_BIN, _BB_SUID_DROP))
     138IF_CHCON(APPLET(chcon, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     139IF_CHGRP(APPLET_NOEXEC(chgrp, chgrp, _BB_DIR_BIN, _BB_SUID_DROP, chgrp))
     140IF_CHMOD(APPLET_NOEXEC(chmod, chmod, _BB_DIR_BIN, _BB_SUID_DROP, chmod))
     141IF_CHOWN(APPLET_NOEXEC(chown, chown, _BB_DIR_BIN, _BB_SUID_DROP, chown))
     142IF_CHPASSWD(APPLET(chpasswd, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     143IF_CHPST(APPLET(chpst, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     144IF_CHROOT(APPLET(chroot, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     145IF_CHRT(APPLET(chrt, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     146IF_CHVT(APPLET(chvt, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     147IF_CKSUM(APPLET_NOEXEC(cksum, cksum, _BB_DIR_USR_BIN, _BB_SUID_DROP, cksum))
     148IF_CLEAR(APPLET(clear, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     149IF_CMP(APPLET(cmp, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     150IF_COMM(APPLET(comm, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     151IF_CP(APPLET_NOEXEC(cp, cp, _BB_DIR_BIN, _BB_SUID_DROP, cp))
     152IF_CPIO(APPLET(cpio, _BB_DIR_BIN, _BB_SUID_DROP))
     153IF_CROND(APPLET(crond, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     154IF_CRONTAB(APPLET(crontab, _BB_DIR_USR_BIN, _BB_SUID_REQUIRE))
     155IF_CRYPTPW(APPLET(cryptpw, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     156IF_CUT(APPLET_NOEXEC(cut, cut, _BB_DIR_USR_BIN, _BB_SUID_DROP, cut))
     157IF_DC(APPLET(dc, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     158IF_DD(APPLET_NOEXEC(dd, dd, _BB_DIR_BIN, _BB_SUID_DROP, dd))
     159IF_DEALLOCVT(APPLET(deallocvt, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     160IF_DELGROUP(APPLET_ODDNAME(delgroup, deluser, _BB_DIR_BIN, _BB_SUID_DROP, delgroup))
     161IF_DELUSER(APPLET(deluser, _BB_DIR_BIN, _BB_SUID_DROP))
     162IF_DEVFSD(APPLET(devfsd, _BB_DIR_SBIN, _BB_SUID_DROP))
     163IF_DEVMEM(APPLET(devmem, _BB_DIR_SBIN, _BB_SUID_DROP))
     164IF_DF(APPLET(df, _BB_DIR_BIN, _BB_SUID_DROP))
     165IF_DHCPRELAY(APPLET(dhcprelay, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     166IF_DIFF(APPLET(diff, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     167IF_DIRNAME(APPLET_NOFORK(dirname, dirname, _BB_DIR_USR_BIN, _BB_SUID_DROP, dirname))
     168IF_DMESG(APPLET(dmesg, _BB_DIR_BIN, _BB_SUID_DROP))
     169IF_DNSD(APPLET(dnsd, _BB_DIR_USR_SBIN, _BB_SUID_REQUIRE))
     170IF_HOSTNAME(APPLET_ODDNAME(dnsdomainname, hostname, _BB_DIR_BIN, _BB_SUID_DROP, dnsdomainname))
     171IF_DOS2UNIX(APPLET_NOEXEC(dos2unix, dos2unix, _BB_DIR_USR_BIN, _BB_SUID_DROP, dos2unix))
     172IF_DPKG(APPLET(dpkg, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     173IF_DPKG_DEB(APPLET_ODDNAME(dpkg-deb, dpkg_deb, _BB_DIR_USR_BIN, _BB_SUID_DROP, dpkg_deb))
     174IF_DU(APPLET(du, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     175IF_DUMPKMAP(APPLET(dumpkmap, _BB_DIR_BIN, _BB_SUID_DROP))
     176IF_DUMPLEASES(APPLET(dumpleases, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     177//IF_E2FSCK(APPLET(e2fsck, _BB_DIR_SBIN, _BB_SUID_DROP))
     178//IF_E2LABEL(APPLET_ODDNAME(e2label, tune2fs, _BB_DIR_SBIN, _BB_SUID_DROP, e2label))
     179IF_ECHO(APPLET_NOFORK(echo, echo, _BB_DIR_BIN, _BB_SUID_DROP, echo))
     180IF_ED(APPLET(ed, _BB_DIR_BIN, _BB_SUID_DROP))
     181IF_EJECT(APPLET(eject, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     182IF_ENV(APPLET_NOEXEC(env, env, _BB_DIR_USR_BIN, _BB_SUID_DROP, env))
     183IF_ENVDIR(APPLET_ODDNAME(envdir, chpst, _BB_DIR_USR_BIN, _BB_SUID_DROP, envdir))
     184IF_ENVUIDGID(APPLET_ODDNAME(envuidgid, chpst, _BB_DIR_USR_BIN, _BB_SUID_DROP, envuidgid))
     185IF_ETHER_WAKE(APPLET_ODDNAME(ether-wake, ether_wake, _BB_DIR_USR_BIN, _BB_SUID_DROP, ether_wake))
     186IF_EXPAND(APPLET(expand, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     187IF_EXPR(APPLET(expr, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     188IF_FAKEIDENTD(APPLET(fakeidentd, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     189IF_FALSE(APPLET_NOFORK(false, false, _BB_DIR_BIN, _BB_SUID_DROP, false))
     190IF_FBSET(APPLET(fbset, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     191IF_FBSPLASH(APPLET(fbsplash, _BB_DIR_SBIN, _BB_SUID_DROP))
     192IF_FDFLUSH(APPLET_ODDNAME(fdflush, freeramdisk, _BB_DIR_BIN, _BB_SUID_DROP, fdflush))
     193IF_FDFORMAT(APPLET(fdformat, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     194IF_FDISK(APPLET(fdisk, _BB_DIR_SBIN, _BB_SUID_DROP))
     195IF_FGCONSOLE(APPLET(fgconsole, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     196IF_FINDFS(APPLET(findfs, _BB_DIR_SBIN, _BB_SUID_MAYBE))
     197IF_FLASH_ERASEALL(APPLET(flash_eraseall, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     198IF_FLASH_LOCK(APPLET_ODDNAME(flash_lock, flash_lock_unlock, _BB_DIR_USR_SBIN, _BB_SUID_DROP, flash_lock))
     199IF_FLASH_UNLOCK(APPLET_ODDNAME(flash_unlock, flash_lock_unlock, _BB_DIR_USR_SBIN, _BB_SUID_DROP, flash_unlock))
     200IF_FLASHCP(APPLET(flashcp, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     201IF_FLOCK(APPLET(flock, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     202IF_FOLD(APPLET_NOEXEC(fold, fold, _BB_DIR_USR_BIN, _BB_SUID_DROP, fold))
     203IF_FREE(APPLET(free, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     204IF_FREERAMDISK(APPLET(freeramdisk, _BB_DIR_SBIN, _BB_SUID_DROP))
     205IF_FSCK(APPLET(fsck, _BB_DIR_SBIN, _BB_SUID_DROP))
     206//IF_E2FSCK(APPLET_ODDNAME(fsck.ext2, e2fsck, _BB_DIR_SBIN, _BB_SUID_DROP, fsck_ext2))
     207//IF_E2FSCK(APPLET_ODDNAME(fsck.ext3, e2fsck, _BB_DIR_SBIN, _BB_SUID_DROP, fsck_ext3))
     208IF_FSCK_MINIX(APPLET_ODDNAME(fsck.minix, fsck_minix, _BB_DIR_SBIN, _BB_SUID_DROP, fsck_minix))
     209IF_FSYNC(APPLET_NOFORK(fsync, fsync, _BB_DIR_BIN, _BB_SUID_DROP, fsync))
     210IF_FTPD(APPLET(ftpd, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     211IF_FTPGET(APPLET_ODDNAME(ftpget, ftpgetput, _BB_DIR_USR_BIN, _BB_SUID_DROP, ftpget))
     212IF_FTPPUT(APPLET_ODDNAME(ftpput, ftpgetput, _BB_DIR_USR_BIN, _BB_SUID_DROP, ftpput))
     213IF_FUSER(APPLET(fuser, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     214IF_GETENFORCE(APPLET(getenforce, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     215IF_GETOPT(APPLET(getopt, _BB_DIR_BIN, _BB_SUID_DROP))
     216IF_GETSEBOOL(APPLET(getsebool, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     217IF_GETTY(APPLET(getty, _BB_DIR_SBIN, _BB_SUID_DROP))
     218IF_GUNZIP(APPLET(gunzip, _BB_DIR_BIN, _BB_SUID_DROP))
     219IF_GZIP(APPLET(gzip, _BB_DIR_BIN, _BB_SUID_DROP))
     220IF_HD(APPLET_NOEXEC(hd, hexdump, _BB_DIR_USR_BIN, _BB_SUID_DROP, hd))
     221IF_HDPARM(APPLET(hdparm, _BB_DIR_SBIN, _BB_SUID_DROP))
     222IF_HEAD(APPLET_NOEXEC(head, head, _BB_DIR_USR_BIN, _BB_SUID_DROP, head))
     223IF_HEXDUMP(APPLET_NOEXEC(hexdump, hexdump, _BB_DIR_USR_BIN, _BB_SUID_DROP, hexdump))
     224IF_HOSTID(APPLET_NOFORK(hostid, hostid, _BB_DIR_USR_BIN, _BB_SUID_DROP, hostid))
     225IF_HOSTNAME(APPLET(hostname, _BB_DIR_BIN, _BB_SUID_DROP))
     226IF_HTTPD(APPLET(httpd, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     227IF_HWCLOCK(APPLET(hwclock, _BB_DIR_SBIN, _BB_SUID_DROP))
     228IF_ID(APPLET_NOEXEC(id, id, _BB_DIR_USR_BIN, _BB_SUID_DROP, id))
     229IF_IFCONFIG(APPLET(ifconfig, _BB_DIR_SBIN, _BB_SUID_DROP))
     230IF_IFUPDOWN(APPLET_ODDNAME(ifdown, ifupdown, _BB_DIR_SBIN, _BB_SUID_DROP, ifdown))
     231IF_IFENSLAVE(APPLET(ifenslave, _BB_DIR_SBIN, _BB_SUID_DROP))
     232IF_IFPLUGD(APPLET(ifplugd, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     233IF_IFUPDOWN(APPLET_ODDNAME(ifup, ifupdown, _BB_DIR_SBIN, _BB_SUID_DROP, ifup))
     234IF_INETD(APPLET(inetd, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     235IF_INOTIFYD(APPLET(inotifyd, _BB_DIR_SBIN, _BB_SUID_DROP))
     236IF_INSTALL(APPLET(install, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     237IF_IONICE(APPLET(ionice, _BB_DIR_BIN, _BB_SUID_DROP))
    182238#if ENABLE_FEATURE_IP_ADDRESS \
    183239 || ENABLE_FEATURE_IP_ROUTE \
     
    185241 || ENABLE_FEATURE_IP_TUNNEL \
    186242 || ENABLE_FEATURE_IP_RULE
    187 USE_IP(APPLET(ip, _BB_DIR_BIN, _BB_SUID_NEVER))
     243IF_IP(APPLET(ip, _BB_DIR_BIN, _BB_SUID_DROP))
    188244#endif
    189 USE_IPADDR(APPLET(ipaddr, _BB_DIR_BIN, _BB_SUID_NEVER))
    190 USE_IPCALC(APPLET(ipcalc, _BB_DIR_BIN, _BB_SUID_NEVER))
    191 USE_IPCRM(APPLET(ipcrm, _BB_DIR_USR_BIN, _BB_SUID_ALWAYS))
    192 USE_IPCS(APPLET(ipcs, _BB_DIR_USR_BIN, _BB_SUID_ALWAYS))
    193 USE_IPLINK(APPLET(iplink, _BB_DIR_BIN, _BB_SUID_NEVER))
    194 USE_IPROUTE(APPLET(iproute, _BB_DIR_BIN, _BB_SUID_NEVER))
    195 USE_IPRULE(APPLET(iprule, _BB_DIR_BIN, _BB_SUID_NEVER))
    196 USE_IPTUNNEL(APPLET(iptunnel, _BB_DIR_BIN, _BB_SUID_NEVER))
    197 USE_KILL(APPLET(kill, _BB_DIR_BIN, _BB_SUID_NEVER))
    198 USE_KILLALL(APPLET_ODDNAME(killall, kill, _BB_DIR_USR_BIN, _BB_SUID_NEVER, killall))
    199 USE_KILLALL5(APPLET_ODDNAME(killall5, kill, _BB_DIR_USR_BIN, _BB_SUID_NEVER, killall5))
    200 USE_KLOGD(APPLET(klogd, _BB_DIR_SBIN, _BB_SUID_NEVER))
    201 USE_LASH(APPLET(lash, _BB_DIR_BIN, _BB_SUID_NEVER))
    202 USE_LAST(APPLET(last, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    203 USE_LENGTH(APPLET_NOFORK(length, length, _BB_DIR_USR_BIN, _BB_SUID_NEVER, length))
    204 USE_LESS(APPLET(less, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    205 USE_SETARCH(APPLET_NOUSAGE(linux32, setarch, _BB_DIR_BIN, _BB_SUID_NEVER))
    206 USE_SETARCH(APPLET_NOUSAGE(linux64, setarch, _BB_DIR_BIN, _BB_SUID_NEVER))
    207 USE_FEATURE_INITRD(APPLET_NOUSAGE(linuxrc, init, _BB_DIR_ROOT, _BB_SUID_NEVER))
    208 USE_LN(APPLET_NOEXEC(ln, ln, _BB_DIR_BIN, _BB_SUID_NEVER, ln))
    209 USE_LOAD_POLICY(APPLET(load_policy, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    210 USE_LOADFONT(APPLET(loadfont, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    211 USE_LOADKMAP(APPLET(loadkmap, _BB_DIR_SBIN, _BB_SUID_NEVER))
    212 USE_LOGGER(APPLET(logger, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    213 USE_LOGIN(APPLET(login, _BB_DIR_BIN, _BB_SUID_ALWAYS))
    214 USE_LOGNAME(APPLET_NOFORK(logname, logname, _BB_DIR_USR_BIN, _BB_SUID_NEVER, logname))
    215 USE_LOGREAD(APPLET(logread, _BB_DIR_SBIN, _BB_SUID_NEVER))
    216 USE_LOSETUP(APPLET(losetup, _BB_DIR_SBIN, _BB_SUID_NEVER))
    217 USE_LS(APPLET_NOEXEC(ls, ls, _BB_DIR_BIN, _BB_SUID_NEVER, ls))
    218 USE_LSATTR(APPLET(lsattr, _BB_DIR_BIN, _BB_SUID_NEVER))
    219 USE_LSMOD(APPLET(lsmod, _BB_DIR_SBIN, _BB_SUID_NEVER))
    220 USE_UNLZMA(APPLET_ODDNAME(lzmacat, unlzma, _BB_DIR_USR_BIN, _BB_SUID_NEVER, lzmacat))
    221 USE_MAKEDEVS(APPLET(makedevs, _BB_DIR_SBIN, _BB_SUID_NEVER))
    222 USE_MATCHPATHCON(APPLET(matchpathcon, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    223 USE_MD5SUM(APPLET_ODDNAME(md5sum, md5_sha1_sum, _BB_DIR_USR_BIN, _BB_SUID_NEVER, md5sum))
    224 USE_MDEV(APPLET(mdev, _BB_DIR_SBIN, _BB_SUID_NEVER))
    225 USE_MESG(APPLET(mesg, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    226 USE_MKDIR(APPLET_NOFORK(mkdir, mkdir, _BB_DIR_BIN, _BB_SUID_NEVER, mkdir))
    227 //USE_MKE2FS(APPLET(mke2fs, _BB_DIR_SBIN, _BB_SUID_NEVER))
    228 USE_MKFIFO(APPLET(mkfifo, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    229 //USE_MKE2FS(APPLET_NOUSAGE(mkfs.ext2, mke2fs, _BB_DIR_SBIN, _BB_SUID_NEVER))
    230 //USE_MKE2FS(APPLET_NOUSAGE(mkfs.ext3, mke2fs, _BB_DIR_SBIN, _BB_SUID_NEVER))
    231 USE_MKFS_MINIX(APPLET_ODDNAME(mkfs.minix, mkfs_minix, _BB_DIR_SBIN, _BB_SUID_NEVER, mkfs_minix))
    232 USE_MKNOD(APPLET(mknod, _BB_DIR_BIN, _BB_SUID_NEVER))
    233 USE_MKSWAP(APPLET(mkswap, _BB_DIR_SBIN, _BB_SUID_NEVER))
    234 USE_MKTEMP(APPLET(mktemp, _BB_DIR_BIN, _BB_SUID_NEVER))
    235 USE_MODPROBE(APPLET(modprobe, _BB_DIR_SBIN, _BB_SUID_NEVER))
    236 USE_MORE(APPLET(more, _BB_DIR_BIN, _BB_SUID_NEVER))
    237 USE_MOUNT(APPLET(mount, _BB_DIR_BIN, USE_DESKTOP(_BB_SUID_MAYBE) SKIP_DESKTOP(_BB_SUID_NEVER)))
    238 USE_MOUNTPOINT(APPLET(mountpoint, _BB_DIR_BIN, _BB_SUID_NEVER))
    239 USE_MSH(APPLET_NOUSAGE(msh, msh, _BB_DIR_BIN, _BB_SUID_NEVER))
    240 USE_MT(APPLET(mt, _BB_DIR_BIN, _BB_SUID_NEVER))
    241 USE_MV(APPLET(mv, _BB_DIR_BIN, _BB_SUID_NEVER))
    242 USE_NAMEIF(APPLET(nameif, _BB_DIR_SBIN, _BB_SUID_NEVER))
    243 USE_NC(APPLET(nc, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    244 USE_NETSTAT(APPLET(netstat, _BB_DIR_BIN, _BB_SUID_NEVER))
    245 USE_NICE(APPLET(nice, _BB_DIR_BIN, _BB_SUID_NEVER))
    246 USE_NMETER(APPLET(nmeter, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    247 USE_NOHUP(APPLET(nohup, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    248 USE_NSLOOKUP(APPLET(nslookup, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    249 USE_OD(APPLET(od, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    250 USE_OPENVT(APPLET(openvt, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    251 USE_PASSWD(APPLET(passwd, _BB_DIR_USR_BIN, _BB_SUID_ALWAYS))
    252 USE_PATCH(APPLET(patch, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    253 USE_PIDOF(APPLET(pidof, _BB_DIR_BIN, _BB_SUID_NEVER))
    254 USE_PING(APPLET(ping, _BB_DIR_BIN, _BB_SUID_MAYBE))
    255 USE_PING6(APPLET(ping6, _BB_DIR_BIN, _BB_SUID_NEVER))
    256 USE_PIPE_PROGRESS(APPLET_NOUSAGE(pipe_progress, pipe_progress, _BB_DIR_BIN, _BB_SUID_NEVER))
    257 USE_PIVOT_ROOT(APPLET(pivot_root, _BB_DIR_SBIN, _BB_SUID_NEVER))
    258 USE_HALT(APPLET_ODDNAME(poweroff, halt, _BB_DIR_SBIN, _BB_SUID_NEVER, poweroff))
    259 USE_PRINTENV(APPLET(printenv, _BB_DIR_BIN, _BB_SUID_NEVER))
    260 USE_PRINTF(APPLET(printf, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    261 USE_PS(APPLET(ps, _BB_DIR_BIN, _BB_SUID_NEVER))
    262 USE_PSCAN(APPLET(pscan, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    263 USE_PWD(APPLET_NOFORK(pwd, pwd, _BB_DIR_BIN, _BB_SUID_NEVER, pwd))
    264 USE_RAIDAUTORUN(APPLET(raidautorun, _BB_DIR_SBIN, _BB_SUID_NEVER))
    265 USE_RDATE(APPLET(rdate, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    266 USE_READAHEAD(APPLET(readahead, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    267 USE_READLINK(APPLET(readlink, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    268 USE_READPROFILE(APPLET(readprofile, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    269 USE_REALPATH(APPLET(realpath, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    270 USE_HALT(APPLET_ODDNAME(reboot, halt, _BB_DIR_SBIN, _BB_SUID_NEVER, reboot))
    271 USE_RENICE(APPLET(renice, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    272 USE_RESET(APPLET(reset, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    273 USE_RESIZE(APPLET(resize, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    274 USE_RESTORECON(APPLET_ODDNAME(restorecon, setfiles, _BB_DIR_SBIN, _BB_SUID_NEVER, restorecon))
    275 USE_RM(APPLET_NOFORK(rm, rm, _BB_DIR_BIN, _BB_SUID_NEVER, rm))
    276 USE_RMDIR(APPLET_NOFORK(rmdir, rmdir, _BB_DIR_BIN, _BB_SUID_NEVER, rmdir))
    277 USE_RMMOD(APPLET(rmmod, _BB_DIR_SBIN, _BB_SUID_NEVER))
    278 USE_ROUTE(APPLET(route, _BB_DIR_SBIN, _BB_SUID_NEVER))
    279 USE_RPM(APPLET(rpm, _BB_DIR_BIN, _BB_SUID_NEVER))
    280 USE_RPM2CPIO(APPLET(rpm2cpio, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    281 USE_RUN_PARTS(APPLET_ODDNAME(run-parts, run_parts, _BB_DIR_BIN, _BB_SUID_NEVER, run_parts))
    282 USE_RUNCON(APPLET(runcon, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    283 USE_RUNLEVEL(APPLET(runlevel, _BB_DIR_SBIN, _BB_SUID_NEVER))
    284 USE_RUNSV(APPLET(runsv, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    285 USE_RUNSVDIR(APPLET(runsvdir, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    286 USE_RX(APPLET(rx, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    287 USE_SED(APPLET(sed, _BB_DIR_BIN, _BB_SUID_NEVER))
    288 USE_SELINUXENABLED(APPLET(selinuxenabled, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    289 USE_SEQ(APPLET_NOFORK(seq, seq, _BB_DIR_USR_BIN, _BB_SUID_NEVER, seq))
    290 USE_SETARCH(APPLET(setarch, _BB_DIR_BIN, _BB_SUID_NEVER))
    291 USE_SETCONSOLE(APPLET(setconsole, _BB_DIR_SBIN, _BB_SUID_NEVER))
    292 USE_SETENFORCE(APPLET(setenforce, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    293 USE_SETFILES(APPLET(setfiles, _BB_DIR_SBIN, _BB_SUID_NEVER))
    294 USE_SETKEYCODES(APPLET(setkeycodes, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    295 USE_SETLOGCONS(APPLET(setlogcons, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    296 USE_SETSID(APPLET(setsid, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    297 USE_SETUIDGID(APPLET_ODDNAME(setuidgid, chpst, _BB_DIR_USR_BIN, _BB_SUID_NEVER, setuidgid))
    298 USE_FEATURE_SH_IS_ASH(APPLET_NOUSAGE(sh, ash, _BB_DIR_BIN, _BB_SUID_NEVER))
    299 USE_FEATURE_SH_IS_HUSH(APPLET_NOUSAGE(sh, hush, _BB_DIR_BIN, _BB_SUID_NEVER))
    300 USE_FEATURE_SH_IS_LASH(APPLET_NOUSAGE(sh, lash, _BB_DIR_BIN, _BB_SUID_NEVER))
    301 USE_FEATURE_SH_IS_MSH(APPLET_NOUSAGE(sh, msh, _BB_DIR_BIN, _BB_SUID_NEVER))
    302 USE_SHA1SUM(APPLET_ODDNAME(sha1sum, md5_sha1_sum, _BB_DIR_USR_BIN, _BB_SUID_NEVER, sha1sum))
    303 USE_SLATTACH(APPLET(slattach, _BB_DIR_SBIN, _BB_SUID_NEVER))
    304 USE_SLEEP(APPLET_NOFORK(sleep, sleep, _BB_DIR_BIN, _BB_SUID_NEVER, sleep))
    305 USE_SOFTLIMIT(APPLET_ODDNAME(softlimit, chpst, _BB_DIR_USR_BIN, _BB_SUID_NEVER, softlimit))
    306 USE_SORT(APPLET_NOEXEC(sort, sort, _BB_DIR_USR_BIN, _BB_SUID_NEVER, sort))
    307 USE_SPLIT(APPLET(split, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    308 USE_START_STOP_DAEMON(APPLET_ODDNAME(start-stop-daemon, start_stop_daemon, _BB_DIR_SBIN, _BB_SUID_NEVER, start_stop_daemon))
    309 USE_STAT(APPLET(stat, _BB_DIR_BIN, _BB_SUID_NEVER))
    310 USE_STRINGS(APPLET(strings, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    311 USE_STTY(APPLET(stty, _BB_DIR_BIN, _BB_SUID_NEVER))
    312 USE_SU(APPLET(su, _BB_DIR_BIN, _BB_SUID_ALWAYS))
    313 USE_SULOGIN(APPLET(sulogin, _BB_DIR_SBIN, _BB_SUID_NEVER))
    314 USE_SUM(APPLET(sum, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    315 USE_SV(APPLET(sv, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    316 USE_SVLOGD(APPLET(svlogd, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    317 USE_SWAPONOFF(APPLET_ODDNAME(swapoff, swap_on_off, _BB_DIR_SBIN, _BB_SUID_NEVER,swapoff))
    318 USE_SWAPONOFF(APPLET_ODDNAME(swapon, swap_on_off, _BB_DIR_SBIN, _BB_SUID_NEVER, swapon))
    319 USE_SWITCH_ROOT(APPLET(switch_root, _BB_DIR_SBIN, _BB_SUID_NEVER))
    320 USE_SYNC(APPLET_NOFORK(sync, sync, _BB_DIR_BIN, _BB_SUID_NEVER, sync))
    321 USE_BB_SYSCTL(APPLET(sysctl, _BB_DIR_SBIN, _BB_SUID_NEVER))
    322 USE_SYSLOGD(APPLET(syslogd, _BB_DIR_SBIN, _BB_SUID_NEVER))
    323 USE_TAIL(APPLET(tail, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    324 USE_TAR(APPLET(tar, _BB_DIR_BIN, _BB_SUID_NEVER))
    325 USE_TASKSET(APPLET(taskset, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    326 USE_TCPSVD(APPLET_ODDNAME(tcpsvd, tcpudpsvd, _BB_DIR_USR_BIN, _BB_SUID_NEVER, tcpsvd))
    327 USE_TEE(APPLET(tee, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    328 USE_TELNET(APPLET(telnet, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    329 USE_TELNETD(APPLET(telnetd, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    330 USE_TEST(APPLET_NOEXEC(test, test, _BB_DIR_USR_BIN, _BB_SUID_NEVER, test))
     245IF_IPADDR(APPLET(ipaddr, _BB_DIR_BIN, _BB_SUID_DROP))
     246IF_IPCALC(APPLET(ipcalc, _BB_DIR_BIN, _BB_SUID_DROP))
     247IF_IPCRM(APPLET(ipcrm, _BB_DIR_USR_BIN, _BB_SUID_REQUIRE))
     248IF_IPCS(APPLET(ipcs, _BB_DIR_USR_BIN, _BB_SUID_REQUIRE))
     249IF_IPLINK(APPLET(iplink, _BB_DIR_BIN, _BB_SUID_DROP))
     250IF_IPROUTE(APPLET(iproute, _BB_DIR_BIN, _BB_SUID_DROP))
     251IF_IPRULE(APPLET(iprule, _BB_DIR_BIN, _BB_SUID_DROP))
     252IF_IPTUNNEL(APPLET(iptunnel, _BB_DIR_BIN, _BB_SUID_DROP))
     253IF_KBD_MODE(APPLET(kbd_mode, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     254IF_KILL(APPLET(kill, _BB_DIR_BIN, _BB_SUID_DROP))
     255IF_KILLALL(APPLET_ODDNAME(killall, kill, _BB_DIR_USR_BIN, _BB_SUID_DROP, killall))
     256IF_KILLALL5(APPLET_ODDNAME(killall5, kill, _BB_DIR_USR_BIN, _BB_SUID_DROP, killall5))
     257IF_KLOGD(APPLET(klogd, _BB_DIR_SBIN, _BB_SUID_DROP))
     258IF_LAST(APPLET(last, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     259IF_LENGTH(APPLET_NOFORK(length, length, _BB_DIR_USR_BIN, _BB_SUID_DROP, length))
     260IF_LESS(APPLET(less, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     261IF_SETARCH(APPLET_ODDNAME(linux32, setarch, _BB_DIR_BIN, _BB_SUID_DROP, linux32))
     262IF_SETARCH(APPLET_ODDNAME(linux64, setarch, _BB_DIR_BIN, _BB_SUID_DROP, linux64))
     263IF_LN(APPLET_NOEXEC(ln, ln, _BB_DIR_BIN, _BB_SUID_DROP, ln))
     264IF_LOAD_POLICY(APPLET(load_policy, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     265IF_LOADFONT(APPLET(loadfont, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     266IF_LOADKMAP(APPLET(loadkmap, _BB_DIR_SBIN, _BB_SUID_DROP))
     267IF_LOGGER(APPLET(logger, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     268IF_LOGIN(APPLET(login, _BB_DIR_BIN, _BB_SUID_REQUIRE))
     269IF_LOGNAME(APPLET_NOFORK(logname, logname, _BB_DIR_USR_BIN, _BB_SUID_DROP, logname))
     270IF_LOGREAD(APPLET(logread, _BB_DIR_SBIN, _BB_SUID_DROP))
     271IF_LOSETUP(APPLET(losetup, _BB_DIR_SBIN, _BB_SUID_DROP))
     272IF_LPD(APPLET(lpd, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     273IF_LPQ(APPLET_ODDNAME(lpq, lpqr, _BB_DIR_USR_BIN, _BB_SUID_DROP, lpq))
     274IF_LPR(APPLET_ODDNAME(lpr, lpqr, _BB_DIR_USR_BIN, _BB_SUID_DROP, lpr))
     275IF_LS(APPLET_NOEXEC(ls, ls, _BB_DIR_BIN, _BB_SUID_DROP, ls))
     276IF_LSATTR(APPLET(lsattr, _BB_DIR_BIN, _BB_SUID_DROP))
     277IF_LSPCI(APPLET(lspci, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     278IF_LSUSB(APPLET(lsusb, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     279IF_UNLZMA(APPLET_ODDNAME(lzcat, unlzma, _BB_DIR_USR_BIN, _BB_SUID_DROP, lzcat))
     280IF_LZMA(APPLET_ODDNAME(lzma, unlzma, _BB_DIR_USR_BIN, _BB_SUID_DROP, lzma))
     281IF_LZOP(APPLET(lzop, _BB_DIR_BIN, _BB_SUID_DROP))
     282IF_LZOP(APPLET_ODDNAME(lzopcat, lzop, _BB_DIR_USR_BIN, _BB_SUID_DROP, lzopcat))
     283IF_MAKEDEVS(APPLET(makedevs, _BB_DIR_SBIN, _BB_SUID_DROP))
     284IF_MAKEMIME(APPLET(makemime, _BB_DIR_BIN, _BB_SUID_DROP))
     285IF_MAN(APPLET(man, _BB_DIR_SBIN, _BB_SUID_DROP))
     286IF_MATCHPATHCON(APPLET(matchpathcon, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     287IF_MD5SUM(APPLET_NOEXEC(md5sum, md5_sha1_sum, _BB_DIR_USR_BIN, _BB_SUID_DROP, md5sum))
     288IF_MDEV(APPLET(mdev, _BB_DIR_SBIN, _BB_SUID_DROP))
     289IF_MICROCOM(APPLET(microcom, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     290IF_MKDIR(APPLET_NOFORK(mkdir, mkdir, _BB_DIR_BIN, _BB_SUID_DROP, mkdir))
     291IF_MKFS_VFAT(APPLET_ODDNAME(mkdosfs, mkfs_vfat, _BB_DIR_SBIN, _BB_SUID_DROP, mkfs_vfat))
     292IF_MKFS_EXT2(APPLET_ODDNAME(mke2fs, mkfs_ext2, _BB_DIR_SBIN, _BB_SUID_DROP, mkfs_ext2))
     293IF_MKFIFO(APPLET_NOEXEC(mkfifo, mkfifo, _BB_DIR_USR_BIN, _BB_SUID_DROP, mkfifo))
     294IF_MKFS_EXT2(APPLET_ODDNAME(mkfs.ext2, mkfs_ext2, _BB_DIR_SBIN, _BB_SUID_DROP, mkfs_ext2))
     295//IF_MKE2FS(APPLET_ODDNAME(mkfs.ext3, mke2fs, _BB_DIR_SBIN, _BB_SUID_DROP, mkfs_ext3))
     296IF_MKFS_MINIX(APPLET_ODDNAME(mkfs.minix, mkfs_minix, _BB_DIR_SBIN, _BB_SUID_DROP, mkfs_minix))
     297IF_MKFS_REISER(APPLET_ODDNAME(mkfs.reiser, mkfs_reiser, _BB_DIR_SBIN, _BB_SUID_DROP, mkfs_reiser))
     298IF_MKFS_VFAT(APPLET_ODDNAME(mkfs.vfat, mkfs_vfat, _BB_DIR_SBIN, _BB_SUID_DROP, mkfs_vfat))
     299IF_MKNOD(APPLET_NOEXEC(mknod, mknod, _BB_DIR_BIN, _BB_SUID_DROP, mknod))
     300IF_CRYPTPW(APPLET_ODDNAME(mkpasswd, cryptpw, _BB_DIR_USR_BIN, _BB_SUID_DROP, mkpasswd))
     301IF_MKSWAP(APPLET(mkswap, _BB_DIR_SBIN, _BB_SUID_DROP))
     302IF_MKTEMP(APPLET(mktemp, _BB_DIR_BIN, _BB_SUID_DROP))
     303IF_MORE(APPLET(more, _BB_DIR_BIN, _BB_SUID_DROP))
     304IF_MOUNT(APPLET(mount, _BB_DIR_BIN, IF_DESKTOP(_BB_SUID_MAYBE) IF_NOT_DESKTOP(_BB_SUID_DROP)))
     305IF_MOUNTPOINT(APPLET(mountpoint, _BB_DIR_BIN, _BB_SUID_DROP))
     306IF_MT(APPLET(mt, _BB_DIR_BIN, _BB_SUID_DROP))
     307IF_MV(APPLET(mv, _BB_DIR_BIN, _BB_SUID_DROP))
     308IF_NAMEIF(APPLET(nameif, _BB_DIR_SBIN, _BB_SUID_DROP))
     309IF_NC(APPLET(nc, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     310IF_NETSTAT(APPLET(netstat, _BB_DIR_BIN, _BB_SUID_DROP))
     311IF_NICE(APPLET(nice, _BB_DIR_BIN, _BB_SUID_DROP))
     312IF_NMETER(APPLET(nmeter, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     313IF_NOHUP(APPLET(nohup, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     314IF_NSLOOKUP(APPLET(nslookup, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     315IF_NTPD(APPLET(ntpd, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     316IF_OD(APPLET(od, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     317IF_OPENVT(APPLET(openvt, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     318//IF_PARSE(APPLET(parse, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     319IF_PASSWD(APPLET(passwd, _BB_DIR_USR_BIN, _BB_SUID_REQUIRE))
     320IF_PGREP(APPLET(pgrep, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     321IF_PIDOF(APPLET(pidof, _BB_DIR_BIN, _BB_SUID_DROP))
     322IF_PING(APPLET(ping, _BB_DIR_BIN, _BB_SUID_MAYBE))
     323IF_PING6(APPLET(ping6, _BB_DIR_BIN, _BB_SUID_MAYBE))
     324IF_PIPE_PROGRESS(APPLET(pipe_progress, _BB_DIR_BIN, _BB_SUID_DROP))
     325IF_PIVOT_ROOT(APPLET(pivot_root, _BB_DIR_SBIN, _BB_SUID_DROP))
     326IF_PKILL(APPLET_ODDNAME(pkill, pgrep, _BB_DIR_USR_BIN, _BB_SUID_DROP, pkill))
     327IF_POPMAILDIR(APPLET(popmaildir, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     328IF_PRINTENV(APPLET_NOFORK(printenv, printenv, _BB_DIR_BIN, _BB_SUID_DROP, printenv))
     329IF_PRINTF(APPLET_NOFORK(printf, printf, _BB_DIR_USR_BIN, _BB_SUID_DROP, printf))
     330IF_PS(APPLET(ps, _BB_DIR_BIN, _BB_SUID_DROP))
     331IF_PSCAN(APPLET(pscan, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     332IF_PWD(APPLET_NOFORK(pwd, pwd, _BB_DIR_BIN, _BB_SUID_DROP, pwd))
     333IF_RAIDAUTORUN(APPLET(raidautorun, _BB_DIR_SBIN, _BB_SUID_DROP))
     334IF_RDATE(APPLET(rdate, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     335IF_RDEV(APPLET(rdev, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     336IF_READAHEAD(APPLET(readahead, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     337IF_READLINK(APPLET(readlink, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     338IF_READPROFILE(APPLET(readprofile, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     339IF_REALPATH(APPLET(realpath, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     340IF_REFORMIME(APPLET(reformime, _BB_DIR_BIN, _BB_SUID_DROP))
     341IF_RENICE(APPLET(renice, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     342IF_RESET(APPLET(reset, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     343IF_RESIZE(APPLET(resize, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     344IF_RESTORECON(APPLET_ODDNAME(restorecon, setfiles, _BB_DIR_SBIN, _BB_SUID_DROP, restorecon))
     345IF_RFKILL(APPLET(rfkill, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     346IF_RM(APPLET_NOFORK(rm, rm, _BB_DIR_BIN, _BB_SUID_DROP, rm))
     347IF_RMDIR(APPLET_NOFORK(rmdir, rmdir, _BB_DIR_BIN, _BB_SUID_DROP, rmdir))
     348IF_ROUTE(APPLET(route, _BB_DIR_SBIN, _BB_SUID_DROP))
     349IF_RPM(APPLET(rpm, _BB_DIR_BIN, _BB_SUID_DROP))
     350IF_RPM2CPIO(APPLET(rpm2cpio, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     351IF_RTCWAKE(APPLET(rtcwake, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     352IF_RUN_PARTS(APPLET_ODDNAME(run-parts, run_parts, _BB_DIR_BIN, _BB_SUID_DROP, run_parts))
     353IF_RUNCON(APPLET(runcon, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     354IF_RUNLEVEL(APPLET(runlevel, _BB_DIR_SBIN, _BB_SUID_DROP))
     355IF_RUNSV(APPLET(runsv, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     356IF_RUNSVDIR(APPLET(runsvdir, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     357IF_RX(APPLET(rx, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     358IF_SCRIPT(APPLET(script, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     359IF_SCRIPTREPLAY(APPLET(scriptreplay, _BB_DIR_BIN, _BB_SUID_DROP))
     360IF_SED(APPLET(sed, _BB_DIR_BIN, _BB_SUID_DROP))
     361IF_SELINUXENABLED(APPLET(selinuxenabled, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     362IF_SENDMAIL(APPLET(sendmail, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     363IF_SEQ(APPLET_NOFORK(seq, seq, _BB_DIR_USR_BIN, _BB_SUID_DROP, seq))
     364IF_SESTATUS(APPLET(sestatus, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     365IF_SETARCH(APPLET(setarch, _BB_DIR_BIN, _BB_SUID_DROP))
     366IF_SETCONSOLE(APPLET(setconsole, _BB_DIR_SBIN, _BB_SUID_DROP))
     367IF_SETENFORCE(APPLET(setenforce, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     368IF_SETFILES(APPLET(setfiles, _BB_DIR_SBIN, _BB_SUID_DROP))
     369IF_SETFONT(APPLET(setfont, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     370IF_SETKEYCODES(APPLET(setkeycodes, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     371IF_SETLOGCONS(APPLET(setlogcons, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     372IF_SETSEBOOL(APPLET(setsebool, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     373IF_SETSID(APPLET(setsid, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     374IF_SETUIDGID(APPLET_ODDNAME(setuidgid, chpst, _BB_DIR_USR_BIN, _BB_SUID_DROP, setuidgid))
     375IF_SHA1SUM(APPLET_NOEXEC(sha1sum, md5_sha1_sum, _BB_DIR_USR_BIN, _BB_SUID_DROP, sha1sum))
     376IF_SHA256SUM(APPLET_NOEXEC(sha256sum, md5_sha1_sum, _BB_DIR_USR_BIN, _BB_SUID_DROP, sha256sum))
     377IF_SHA512SUM(APPLET_NOEXEC(sha512sum, md5_sha1_sum, _BB_DIR_USR_BIN, _BB_SUID_DROP, sha512sum))
     378IF_SHOWKEY(APPLET(showkey, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     379IF_SLATTACH(APPLET(slattach, _BB_DIR_SBIN, _BB_SUID_DROP))
     380/* Do not make this applet NOFORK. It breaks ^C-ing of pauses in shells */
     381IF_SLEEP(APPLET(sleep, _BB_DIR_BIN, _BB_SUID_DROP))
     382IF_SOFTLIMIT(APPLET_ODDNAME(softlimit, chpst, _BB_DIR_USR_BIN, _BB_SUID_DROP, softlimit))
     383IF_SORT(APPLET_NOEXEC(sort, sort, _BB_DIR_USR_BIN, _BB_SUID_DROP, sort))
     384IF_SPLIT(APPLET(split, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     385IF_START_STOP_DAEMON(APPLET_ODDNAME(start-stop-daemon, start_stop_daemon, _BB_DIR_SBIN, _BB_SUID_DROP, start_stop_daemon))
     386IF_STAT(APPLET(stat, _BB_DIR_BIN, _BB_SUID_DROP))
     387IF_STRINGS(APPLET(strings, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     388IF_STTY(APPLET(stty, _BB_DIR_BIN, _BB_SUID_DROP))
     389IF_SU(APPLET(su, _BB_DIR_BIN, _BB_SUID_REQUIRE))
     390IF_SULOGIN(APPLET(sulogin, _BB_DIR_SBIN, _BB_SUID_DROP))
     391IF_SUM(APPLET(sum, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     392IF_SV(APPLET(sv, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     393IF_SVLOGD(APPLET(svlogd, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     394IF_SWAPONOFF(APPLET_ODDNAME(swapoff, swap_on_off, _BB_DIR_SBIN, _BB_SUID_DROP, swapoff))
     395IF_SWAPONOFF(APPLET_ODDNAME(swapon, swap_on_off, _BB_DIR_SBIN, _BB_SUID_DROP, swapon))
     396IF_SWITCH_ROOT(APPLET(switch_root, _BB_DIR_SBIN, _BB_SUID_DROP))
     397IF_SYNC(APPLET_NOFORK(sync, sync, _BB_DIR_BIN, _BB_SUID_DROP, sync))
     398IF_BB_SYSCTL(APPLET(sysctl, _BB_DIR_SBIN, _BB_SUID_DROP))
     399IF_SYSLOGD(APPLET(syslogd, _BB_DIR_SBIN, _BB_SUID_DROP))
     400IF_TAC(APPLET_NOEXEC(tac, tac, _BB_DIR_USR_BIN, _BB_SUID_DROP, tac))
     401IF_TAIL(APPLET(tail, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     402IF_TAR(APPLET(tar, _BB_DIR_BIN, _BB_SUID_DROP))
     403IF_TASKSET(APPLET(taskset, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     404/* IF_TC(APPLET(tc, _BB_DIR_SBIN, _BB_SUID_DROP)) */
     405IF_TCPSVD(APPLET_ODDNAME(tcpsvd, tcpudpsvd, _BB_DIR_USR_BIN, _BB_SUID_DROP, tcpsvd))
     406IF_TEE(APPLET(tee, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     407IF_TELNET(APPLET(telnet, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     408IF_TELNETD(APPLET(telnetd, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     409IF_TEST(APPLET_NOFORK(test, test, _BB_DIR_USR_BIN, _BB_SUID_DROP, test))
    331410#if ENABLE_FEATURE_TFTP_GET || ENABLE_FEATURE_TFTP_PUT
    332 USE_TFTP(APPLET(tftp, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
     411IF_TFTP(APPLET(tftp, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     412IF_TFTPD(APPLET(tftpd, _BB_DIR_USR_BIN, _BB_SUID_DROP))
    333413#endif
    334 USE_TIME(APPLET(time, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    335 USE_TOP(APPLET(top, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    336 USE_TOUCH(APPLET_NOFORK(touch, touch, _BB_DIR_BIN, _BB_SUID_NEVER, touch))
    337 USE_TR(APPLET(tr, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    338 USE_TRACEROUTE(APPLET(traceroute, _BB_DIR_USR_BIN, _BB_SUID_MAYBE))
    339 USE_TRUE(APPLET_NOFORK(true, true, _BB_DIR_BIN, _BB_SUID_NEVER, true))
    340 USE_TTY(APPLET(tty, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    341 USE_TTYSIZE(APPLET(ttysize, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    342 //USE_TUNE2FS(APPLET(tune2fs, _BB_DIR_SBIN, _BB_SUID_NEVER))
    343 USE_APP_UDHCPC(APPLET(udhcpc, _BB_DIR_SBIN, _BB_SUID_NEVER))
    344 USE_APP_UDHCPD(APPLET(udhcpd, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
    345 USE_UDPSVD(APPLET_ODDNAME(udpsvd, tcpudpsvd, _BB_DIR_USR_BIN, _BB_SUID_NEVER, udpsvd))
    346 USE_UMOUNT(APPLET(umount, _BB_DIR_BIN, _BB_SUID_NEVER))
    347 USE_UNAME(APPLET(uname, _BB_DIR_BIN, _BB_SUID_NEVER))
    348 USE_UNCOMPRESS(APPLET(uncompress, _BB_DIR_BIN, _BB_SUID_NEVER))
    349 USE_UNEXPAND(APPLET_ODDNAME(unexpand, expand, _BB_DIR_USR_BIN, _BB_SUID_NEVER, unexpand))
    350 USE_UNIQ(APPLET(uniq, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    351 USE_UNIX2DOS(APPLET_ODDNAME(unix2dos, dos2unix, _BB_DIR_USR_BIN, _BB_SUID_NEVER, unix2dos))
    352 USE_UNLZMA(APPLET(unlzma, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    353 USE_UNZIP(APPLET(unzip, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    354 USE_UPTIME(APPLET(uptime, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    355 USE_USLEEP(APPLET_NOFORK(usleep, usleep, _BB_DIR_BIN, _BB_SUID_NEVER, usleep))
    356 USE_UUDECODE(APPLET(uudecode, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    357 USE_UUENCODE(APPLET(uuencode, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    358 USE_VCONFIG(APPLET(vconfig, _BB_DIR_SBIN, _BB_SUID_NEVER))
    359 USE_VI(APPLET(vi, _BB_DIR_BIN, _BB_SUID_NEVER))
    360 USE_VLOCK(APPLET(vlock, _BB_DIR_USR_BIN, _BB_SUID_ALWAYS))
    361 USE_WATCH(APPLET(watch, _BB_DIR_BIN, _BB_SUID_NEVER))
    362 USE_WATCHDOG(APPLET(watchdog, _BB_DIR_SBIN, _BB_SUID_NEVER))
    363 USE_WC(APPLET(wc, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    364 USE_WGET(APPLET(wget, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    365 USE_WHICH(APPLET(which, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    366 USE_WHO(APPLET(who, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
    367 USE_WHOAMI(APPLET_NOFORK(whoami, whoami, _BB_DIR_USR_BIN, _BB_SUID_NEVER, whoami))
    368 USE_XARGS(APPLET_NOEXEC(xargs, xargs, _BB_DIR_USR_BIN, _BB_SUID_NEVER, xargs))
    369 USE_YES(APPLET_NOFORK(yes, yes, _BB_DIR_USR_BIN, _BB_SUID_NEVER, yes))
    370 USE_GUNZIP(APPLET_ODDNAME(zcat, gunzip, _BB_DIR_BIN, _BB_SUID_NEVER, zcat))
    371 USE_ZCIP(APPLET(zcip, _BB_DIR_SBIN, _BB_SUID_NEVER))
    372 
    373 #if !defined(PROTOTYPES) && !defined(MAKE_USAGE)
    374     { NULL }
     414IF_TIME(APPLET(time, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     415IF_TIMEOUT(APPLET(timeout, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     416IF_TOP(APPLET(top, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     417IF_TOUCH(APPLET_NOFORK(touch, touch, _BB_DIR_BIN, _BB_SUID_DROP, touch))
     418IF_TR(APPLET(tr, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     419IF_TRACEROUTE(APPLET(traceroute, _BB_DIR_USR_BIN, _BB_SUID_MAYBE))
     420IF_TRACEROUTE6(APPLET(traceroute6, _BB_DIR_USR_BIN, _BB_SUID_MAYBE))
     421IF_TRUE(APPLET_NOFORK(true, true, _BB_DIR_BIN, _BB_SUID_DROP, true))
     422IF_TTY(APPLET(tty, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     423IF_TTYSIZE(APPLET(ttysize, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     424IF_TUNCTL(APPLET(tunctl, _BB_DIR_SBIN, _BB_SUID_DROP))
     425IF_TUNE2FS(APPLET(tune2fs, _BB_DIR_SBIN, _BB_SUID_DROP))
     426IF_UDHCPC(APPLET(udhcpc, _BB_DIR_SBIN, _BB_SUID_DROP))
     427IF_UDHCPD(APPLET(udhcpd, _BB_DIR_USR_SBIN, _BB_SUID_DROP))
     428IF_UDPSVD(APPLET_ODDNAME(udpsvd, tcpudpsvd, _BB_DIR_USR_BIN, _BB_SUID_DROP, udpsvd))
     429IF_UMOUNT(APPLET(umount, _BB_DIR_BIN, _BB_SUID_DROP))
     430IF_UNAME(APPLET(uname, _BB_DIR_BIN, _BB_SUID_DROP))
     431IF_UNCOMPRESS(APPLET(uncompress, _BB_DIR_BIN, _BB_SUID_DROP))
     432IF_UNEXPAND(APPLET_ODDNAME(unexpand, expand, _BB_DIR_USR_BIN, _BB_SUID_DROP, unexpand))
     433IF_UNIQ(APPLET(uniq, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     434IF_UNIX2DOS(APPLET_NOEXEC(unix2dos, dos2unix, _BB_DIR_USR_BIN, _BB_SUID_DROP, unix2dos))
     435IF_UNXZ(APPLET(unxz, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     436IF_UNLZMA(APPLET(unlzma, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     437IF_LZOP(APPLET_ODDNAME(unlzop, lzop, _BB_DIR_USR_BIN, _BB_SUID_DROP, unlzop))
     438IF_UNZIP(APPLET(unzip, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     439IF_UPTIME(APPLET(uptime, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     440IF_USLEEP(APPLET_NOFORK(usleep, usleep, _BB_DIR_BIN, _BB_SUID_DROP, usleep))
     441IF_UUDECODE(APPLET(uudecode, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     442IF_UUENCODE(APPLET(uuencode, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     443IF_VCONFIG(APPLET(vconfig, _BB_DIR_SBIN, _BB_SUID_DROP))
     444IF_VI(APPLET(vi, _BB_DIR_BIN, _BB_SUID_DROP))
     445IF_VLOCK(APPLET(vlock, _BB_DIR_USR_BIN, _BB_SUID_REQUIRE))
     446IF_VOLNAME(APPLET(volname, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     447IF_WALL(APPLET(wall, _BB_DIR_USR_BIN, _BB_SUID_REQUIRE))
     448IF_WATCH(APPLET(watch, _BB_DIR_BIN, _BB_SUID_DROP))
     449IF_WATCHDOG(APPLET(watchdog, _BB_DIR_SBIN, _BB_SUID_DROP))
     450IF_WC(APPLET(wc, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     451IF_WGET(APPLET(wget, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     452IF_WHICH(APPLET(which, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     453IF_WHO(APPLET(who, _BB_DIR_USR_BIN, _BB_SUID_DROP))
     454IF_WHOAMI(APPLET_NOFORK(whoami, whoami, _BB_DIR_USR_BIN, _BB_SUID_DROP, whoami))
     455IF_UNXZ(APPLET_ODDNAME(xzcat, unxz, _BB_DIR_USR_BIN, _BB_SUID_DROP, xzcat))
     456IF_XZ(APPLET_ODDNAME(xz, unxz, _BB_DIR_USR_BIN, _BB_SUID_DROP, xz))
     457IF_YES(APPLET_NOFORK(yes, yes, _BB_DIR_USR_BIN, _BB_SUID_DROP, yes))
     458IF_GUNZIP(APPLET_ODDNAME(zcat, gunzip, _BB_DIR_BIN, _BB_SUID_DROP, zcat))
     459IF_ZCIP(APPLET(zcip, _BB_DIR_SBIN, _BB_SUID_DROP))
     460
     461#if !defined(PROTOTYPES) && !defined(NAME_MAIN_CNAME) && !defined(MAKE_USAGE)
    375462};
    376463#endif
    377464
    378465#undef APPLET
    379 #undef APPLET_NOUSAGE
    380466#undef APPLET_ODDNAME
    381467#undef APPLET_NOEXEC
  • branches/2.2.9/mindi-busybox/include/busybox.h

    r1765 r2725  
    33 * Busybox main internal header file
    44 *
    5  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
     5 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
    66 */
    7 #ifndef _BB_INTERNAL_H_
    8 #define _BB_INTERNAL_H_    1
     7#ifndef BUSYBOX_H
     8#define BUSYBOX_H 1
    99
    1010#include "libbb.h"
    1111
    12 #if ENABLE_FEATURE_INSTALLER
    13 /* order matters: used as index into "install_dir[]" in busybox.c */
     12PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
     13
     14/* order matters: used as index into "install_dir[]" in appletlib.c */
    1415typedef enum bb_install_loc_t {
    1516    _BB_DIR_ROOT = 0,
    1617    _BB_DIR_BIN,
    1718    _BB_DIR_SBIN,
     19#if ENABLE_INSTALL_NO_USR
     20    _BB_DIR_USR_BIN  = _BB_DIR_BIN,
     21    _BB_DIR_USR_SBIN = _BB_DIR_SBIN,
     22#else
    1823    _BB_DIR_USR_BIN,
    19     _BB_DIR_USR_SBIN
     24    _BB_DIR_USR_SBIN,
     25#endif
    2026} bb_install_loc_t;
     27
     28typedef enum bb_suid_t {
     29    _BB_SUID_DROP = 0,
     30    _BB_SUID_MAYBE,
     31    _BB_SUID_REQUIRE
     32} bb_suid_t;
     33
     34
     35/* Defined in appletlib.c (by including generated applet_tables.h) */
     36/* Keep in sync with applets/applet_tables.c! */
     37extern const char applet_names[];
     38extern int (*const applet_main[])(int argc, char **argv);
     39extern const uint16_t applet_nameofs[];
     40extern const uint8_t applet_install_loc[];
     41
     42#if ENABLE_FEATURE_SUID || ENABLE_FEATURE_PREFER_APPLETS
     43# define APPLET_NAME(i) (applet_names + (applet_nameofs[i] & 0x0fff))
     44#else
     45# define APPLET_NAME(i) (applet_names + applet_nameofs[i])
     46#endif
     47
     48#if ENABLE_FEATURE_PREFER_APPLETS
     49# define APPLET_IS_NOFORK(i) (applet_nameofs[i] & (1 << 12))
     50# define APPLET_IS_NOEXEC(i) (applet_nameofs[i] & (1 << 13))
     51#else
     52# define APPLET_IS_NOFORK(i) 0
     53# define APPLET_IS_NOEXEC(i) 0
    2154#endif
    2255
    2356#if ENABLE_FEATURE_SUID
    24 typedef enum bb_suid_t {
    25     _BB_SUID_NEVER = 0,
    26     _BB_SUID_MAYBE,
    27     _BB_SUID_ALWAYS
    28 } bb_suid_t;
     57# define APPLET_SUID(i) ((applet_nameofs[i] >> 14) & 0x3)
    2958#endif
    3059
    31 struct bb_applet {
    32     const char *name;
    33     int (*main) (int argc, char **argv);
    3460#if ENABLE_FEATURE_INSTALLER
    35     __extension__ enum bb_install_loc_t install_loc:8;
     61#define APPLET_INSTALL_LOC(i) ({ \
     62    unsigned v = (i); \
     63    if (v & 1) v = applet_install_loc[v/2] >> 4; \
     64    else v = applet_install_loc[v/2] & 0xf; \
     65    v; })
    3666#endif
    37 #if ENABLE_FEATURE_SUID
    38     __extension__ enum bb_suid_t need_suid:8;
     67
     68
     69/* Length of these names has effect on size of libbusybox
     70 * and "individual" binaries. Keep them short.
     71 */
     72#if ENABLE_BUILD_LIBBUSYBOX
     73#if ENABLE_FEATURE_SHARED_BUSYBOX
     74int lbb_main(char **argv) EXTERNALLY_VISIBLE;
     75#else
     76int lbb_main(char **argv);
    3977#endif
    40 #if ENABLE_FEATURE_PREFER_APPLETS
    41     /* true if instead of fork(); exec("applet"); waitpid();
    42      * one can do fork(); exit(applet_main(argc,argv)); waitpid(); */
    43     unsigned char noexec;
    44     /* Even nicer */
    45     /* true if instead of fork(); exec("applet"); waitpid();
    46      * one can simply call applet_main(argc,argv); */
    47     unsigned char nofork;
    4878#endif
    49 };
    5079
    51 /* Defined in applet.c */
    52 extern const struct bb_applet applets[];
    53 extern const unsigned short NUM_APPLETS;
     80POP_SAVED_FUNCTION_VISIBILITY
    5481
    55 #endif  /* _BB_INTERNAL_H_ */
     82#endif
  • branches/2.2.9/mindi-busybox/include/dump.h

    r1765 r2725  
    11/* vi: set sw=4 ts=4: */
     2
     3PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
     4
    25#define F_IGNORE    0x01        /* %_A */
    36#define F_SETREP    0x02        /* rep count set, not default */
     
    1417#define F_TEXT      0x400       /* no conversions */
    1518
    16 enum _vflag { ALL, DUP, FIRST, WAIT };  /* -v values */
     19enum dump_vflag_t { ALL, DUP, FIRST, WAIT };    /* -v values */
    1720
    18 typedef struct _pr {
    19     struct _pr *nextpr;     /* next print unit */
    20     unsigned int flags;         /* flag values */
     21typedef struct PR {
     22    struct PR *nextpr;      /* next print unit */
     23    unsigned flags;         /* flag values */
    2124    int bcnt;           /* byte count */
    2225    char *cchar;            /* conversion character */
     
    2528} PR;
    2629
    27 typedef struct _fu {
    28     struct _fu *nextfu;     /* next format unit */
    29     struct _pr *nextpr;     /* next print unit */
    30     unsigned int flags;         /* flag values */
     30typedef struct FU {
     31    struct FU *nextfu;      /* next format unit */
     32    struct PR *nextpr;      /* next print unit */
     33    unsigned flags;         /* flag values */
    3134    int reps;           /* repetition count */
    3235    int bcnt;           /* byte count */
     
    3437} FU;
    3538
    36 typedef struct _fs {            /* format strings */
    37     struct _fs *nextfs;     /* linked list of format strings */
    38     struct _fu *nextfu;     /* linked list of format units */
     39typedef struct FS {         /* format strings */
     40    struct FS *nextfs;      /* linked list of format strings */
     41    struct FU *nextfu;      /* linked list of format units */
    3942    int bcnt;
    4043} FS;
    4144
    42 extern void bb_dump_add(const char *fmt);
    43 extern int bb_dump_dump(char **argv);
    44 extern int bb_dump_size(FS * fs);
     45typedef struct dumper_t {
     46    off_t dump_skip;                /* bytes to skip */
     47    int dump_length;                /* max bytes to read */
     48    smallint dump_vflag;            /*enum dump_vflag_t*/
     49    FS *fshead;
     50} dumper_t;
    4551
    46 extern FS *bb_dump_fshead;      /* head of format strings */
    47 extern int bb_dump_blocksize;               /* data block size */
    48 extern int bb_dump_length;          /* max bytes to read */
    49 extern enum _vflag bb_dump_vflag;
    50 extern off_t bb_dump_skip;                      /* bytes to skip */
     52dumper_t* alloc_dumper(void) FAST_FUNC;
     53extern void bb_dump_add(dumper_t *dumper, const char *fmt) FAST_FUNC;
     54extern int bb_dump_dump(dumper_t *dumper, char **argv) FAST_FUNC;
     55
     56POP_SAVED_FUNCTION_VISIBILITY
  • branches/2.2.9/mindi-busybox/include/grp_.h

    r1765 r2725  
    1616   License along with the GNU C Library; if not, write to the Free
    1717   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    18    02111-1307 USA.  */
     18   02111-1307 USA.
     19 */
     20/*
     21 * POSIX Standard: 9.2.1 Group Database Access  <grp.h>
     22 */
     23#ifndef BB_GRP_H
     24#define BB_GRP_H 1
    1925
    20 /*
    21  *  POSIX Standard: 9.2.1 Group Database Access <grp.h>
     26PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
     27
     28/* This file is #included after #include <grp.h>
     29 * We will use libc-defined structures, but will #define function names
     30 * so that function calls are directed to bb_internal_XXX replacements
    2231 */
    23 
    24 #if !ENABLE_USE_BB_PWD_GRP
    25 
    26 #include <grp.h>
    27 
    28 #else
    29 
    30 #ifndef _GRP_H
    31 #define _GRP_H 1
    32 
    33 /* The group structure.  */
    34 struct group {
    35     char *gr_name;          /* Group name.  */
    36     char *gr_passwd;        /* Password.    */
    37     gid_t gr_gid;           /* Group ID.    */
    38     char **gr_mem;          /* Member list. */
    39 };
    40 
    41 /* We don't reimplement this, just supplying prototype */
    42 /* The function itself is in libc */
    43 /* Set the group set for the current user to GROUPS (N of them).  */
    44 extern int setgroups(size_t __n, __const gid_t *__groups);
    45 
    4632
    4733#define setgrent     bb_internal_setgrent
     
    6147
    6248/* All function names below should be remapped by #defines above
    63  * in order to not collide with libc names.
    64  * In theory it isn't necessary, but I saw weird interactions at link time.
    65  * Let's play safe */
     49 * in order to not collide with libc names. */
    6650
    6751
     
    7256extern void endgrent(void);
    7357
     58#ifdef UNUSED_SINCE_WE_AVOID_STATIC_BUFS
    7459/* Read an entry from the group-file stream, opening it if necessary.  */
    7560extern struct group *getgrent(void);
     
    7964
    8065/* Write the given entry onto the given stream.  */
    81 extern int putgrent(__const struct group *__restrict __p,
     66extern int putgrent(const struct group *__restrict __p,
    8267             FILE *__restrict __f);
     68#endif
    8369
    8470/* Search for an entry with a matching group ID.  */
     
    8672
    8773/* Search for an entry with a matching group name.  */
    88 extern struct group *getgrnam(__const char *__name);
     74extern struct group *getgrnam(const char *__name);
    8975
    9076/* Reentrant versions of some of the functions above.
     
    10692
    10793/* Search for an entry with a matching group name.  */
    108 extern int getgrnam_r(__const char *__restrict __name,
     94extern int getgrnam_r(const char *__restrict __name,
    10995               struct group *__restrict __resultbuf,
    11096               char *__restrict __buffer, size_t __buflen,
     
    121107   *GROUPS.  Also include GROUP.  The actual number of groups found is
    122108   returned in *NGROUPS.  Return -1 if the if *NGROUPS is too small.  */
    123 extern int getgrouplist(__const char *__user, gid_t __group,
     109extern int getgrouplist(const char *__user, gid_t __group,
    124110             gid_t *__groups, int *__ngroups);
    125111
     
    127113   by reading the group database and using all groups
    128114   of which USER is a member.  Also include GROUP.  */
    129 extern int initgroups(__const char *__user, gid_t __group);
     115extern int initgroups(const char *__user, gid_t __group);
    130116
     117POP_SAVED_FUNCTION_VISIBILITY
    131118
    132 #endif /* grp.h  */
    133119#endif
  • branches/2.2.9/mindi-busybox/include/inet_common.h

    r1765 r2725  
    77 *
    88 */
     9#ifndef INET_COMMON_H
     10#define INET_COMMON_H 1
    911
    10 #include "platform.h"
     12PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
    1113
    1214/* hostfirst!=0 If we expect this to be a hostname,
    1315   try hostname database first
    1416 */
    15 int INET_resolve(const char *name, struct sockaddr_in *s_in, int hostfirst);
     17int INET_resolve(const char *name, struct sockaddr_in *s_in, int hostfirst) FAST_FUNC;
    1618
    1719/* numeric: & 0x8000: "default" instead of "*",
     
    2022 */
    2123
    22 int INET6_resolve(const char *name, struct sockaddr_in6 *sin6);
     24int INET6_resolve(const char *name, struct sockaddr_in6 *sin6) FAST_FUNC;
    2325
    2426/* These return malloced string */
    25 char *INET_rresolve(struct sockaddr_in *s_in, int numeric, uint32_t netmask);
    26 char *INET6_rresolve(struct sockaddr_in6 *sin6, int numeric);
     27char *INET_rresolve(struct sockaddr_in *s_in, int numeric, uint32_t netmask) FAST_FUNC;
     28char *INET6_rresolve(struct sockaddr_in6 *sin6, int numeric) FAST_FUNC;
     29
     30POP_SAVED_FUNCTION_VISIBILITY
     31
     32#endif
  • branches/2.2.9/mindi-busybox/include/libbb.h

    r1772 r2725  
    44 *
    55 * Based in part on code from sash, Copyright (c) 1999 by David I. Bell
    6  * Permission has been granted to redistribute this code under the GPL.
     6 * Permission has been granted to redistribute this code under GPL.
    77 *
    8  * Licensed under the GPL version 2, see the file LICENSE in this tarball.
     8 * Licensed under GPLv2, see file LICENSE in this source tree.
    99 */
    10 #ifndef __LIBBUSYBOX_H__
    11 #define __LIBBUSYBOX_H__    1
     10#ifndef LIBBB_H
     11#define LIBBB_H 1
    1212
    1313#include "platform.h"
     
    1818#include <fcntl.h>
    1919#include <inttypes.h>
    20 #include <mntent.h>
    2120#include <netdb.h>
    2221#include <setjmp.h>
    2322#include <signal.h>
     23#include <stdint.h>
    2424#include <stdio.h>
    2525#include <stdlib.h>
     
    2727#include <stddef.h>
    2828#include <string.h>
    29 /* #include <strings.h> - said to be obsolete */
     29#include <sys/poll.h>
    3030#include <sys/ioctl.h>
    3131#include <sys/mman.h>
    3232#include <sys/socket.h>
    3333#include <sys/stat.h>
    34 #include <sys/statfs.h>
    3534#include <sys/time.h>
    3635#include <sys/types.h>
     
    3938#include <time.h>
    4039#include <unistd.h>
    41 #include <utime.h>
    42 
     40#include <sys/param.h>
     41#ifdef HAVE_MNTENT_H
     42# include <mntent.h>
     43#endif
     44#ifdef HAVE_SYS_STATFS_H
     45# include <sys/statfs.h>
     46#endif
    4347#if ENABLE_SELINUX
    44 #include <selinux/selinux.h>
    45 #include <selinux/context.h>
    46 #endif
    47 
     48# include <selinux/selinux.h>
     49# include <selinux/context.h>
     50# include <selinux/flask.h>
     51# include <selinux/av_permissions.h>
     52#endif
    4853#if ENABLE_LOCALE_SUPPORT
    49 #include <locale.h>
    50 #else
    51 #define setlocale(x,y) ((void)0)
    52 #endif
    53 
    54 #include "pwd_.h"
    55 #include "grp_.h"
    56 /* ifdef it out, because it may include <shadow.h> */
    57 /* and we may not even _have_ <shadow.h>! */
     54# include <locale.h>
     55#else
     56# define setlocale(x,y) ((void)0)
     57#endif
     58#ifdef DMALLOC
     59# include <dmalloc.h>
     60#endif
     61#include <pwd.h>
     62#include <grp.h>
    5863#if ENABLE_FEATURE_SHADOWPASSWDS
    59 #include "shadow_.h"
    60 #endif
    61 
    62 /* Try to pull in PATH_MAX */
    63 #include <limits.h>
    64 #include <sys/param.h>
    65 #ifndef PATH_MAX
    66 #define PATH_MAX 256
    67 #endif
    68 
    69 /* Tested to work correctly (IIRC :]) */
    70 #define MAXINT(T) (T)( \
    71     ((T)-1) > 0 \
    72     ? (T)-1 \
    73     : (T)~((T)1 << (sizeof(T)*8-1)) \
    74     )
    75 
    76 #define MININT(T) (T)( \
    77     ((T)-1) > 0 \
    78     ? (T)0 \
    79     : ((T)1 << (sizeof(T)*8-1)) \
    80     )
    81 
    82 /* Large file support */
    83 /* Note that CONFIG_LFS forces bbox to be built with all common ops
    84  * (stat, lseek etc) mapped to "largefile" variants by libc.
    85  * Practically it means that open() automatically has O_LARGEFILE added
    86  * and all filesize/file_offset parameters and struct members are "large"
    87  * (in today's world - signed 64bit). For full support of large files,
    88  * we need a few helper #defines (below) and careful use of off_t
    89  * instead of int/ssize_t. No lseek64(), O_LARGEFILE etc necessary */
    90 #if ENABLE_LFS
    91 /* CONFIG_LFS is on */
    92 # if ULONG_MAX > 0xffffffff
    93 /* "long" is long enough on this system */
    94 #  define XATOOFF(a) xatoul_range(a, 0, LONG_MAX)
    95 /* usage: sz = BB_STRTOOFF(s, NULL, 10); if (errno || sz < 0) die(); */
    96 #  define BB_STRTOOFF bb_strtoul
    97 #  define STRTOOFF strtoul
    98 /* usage: printf("size: %"OFF_FMT"d (%"OFF_FMT"x)\n", sz, sz); */
    99 #  define OFF_FMT "l"
    100 # else
    101 /* "long" is too short, need "long long" */
    102 #  define XATOOFF(a) xatoull_range(a, 0, LLONG_MAX)
    103 #  define BB_STRTOOFF bb_strtoull
    104 #  define STRTOOFF strtoull
    105 #  define OFF_FMT "ll"
     64# if !ENABLE_USE_BB_SHADOW
     65/* If using busybox's shadow implementation, do not include the shadow.h
     66 * header as the toolchain may not provide it at all.
     67 */
     68#  include <shadow.h>
    10669# endif
    107 #else
    108 /* CONFIG_LFS is off */
    109 # if UINT_MAX == 0xffffffff
    110 /* While sizeof(off_t) == sizeof(int), off_t is typedef'ed to long anyway.
    111  * gcc will throw warnings on printf("%d", off_t). Crap... */
    112 #  define XATOOFF(a) xatoi_u(a)
    113 #  define BB_STRTOOFF bb_strtou
    114 #  define STRTOOFF strtol
    115 #  define OFF_FMT "l"
    116 # else
    117 #  define XATOOFF(a) xatoul_range(a, 0, LONG_MAX)
    118 #  define BB_STRTOOFF bb_strtoul
    119 #  define STRTOOFF strtol
    120 #  define OFF_FMT "l"
     70#endif
     71#if defined __FreeBSD__ || defined __OpenBSD__
     72# include <netinet/in.h>
     73# include <arpa/inet.h>
     74#elif defined __APPLE__
     75# include <netinet/in.h>
     76#else
     77# include <arpa/inet.h>
     78# if !defined(__socklen_t_defined) && !defined(_SOCKLEN_T_DECLARED)
     79/* We #define socklen_t *after* includes, otherwise we get
     80 * typedef redefinition errors from system headers
     81 * (in case "is it defined already" detection above failed)
     82 */
     83#  define socklen_t bb_socklen_t
     84   typedef unsigned socklen_t;
    12185# endif
    12286#endif
    123 /* scary. better ideas? (but do *test* them first!) */
    124 #define OFF_T_MAX  ((off_t)~((off_t)1 << (sizeof(off_t)*8-1)))
    125 
    126 /* Some useful definitions */
    127 #undef FALSE
    128 #define FALSE   ((int) 0)
    129 #undef TRUE
    130 #define TRUE    ((int) 1)
    131 #undef SKIP
    132 #define SKIP    ((int) 2)
    133 
    134 /* for mtab.c */
    135 #define MTAB_GETMOUNTPT '1'
    136 #define MTAB_GETDEVICE  '2'
    137 
    138 #define BUF_SIZE        8192
    139 #define EXPAND_ALLOC    1024
    140 
    141 /* Macros for min/max.  */
    142 #ifndef MIN
    143 #define MIN(a,b) (((a)<(b))?(a):(b))
    144 #endif
    145 
    146 #ifndef MAX
    147 #define MAX(a,b) (((a)>(b))?(a):(b))
    148 #endif
    149 
    150 /* buffer allocation schemes */
    151 #if ENABLE_FEATURE_BUFFERS_GO_ON_STACK
    152 #define RESERVE_CONFIG_BUFFER(buffer,len)  char buffer[len]
    153 #define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char buffer[len]
    154 #define RELEASE_CONFIG_BUFFER(buffer)      ((void)0)
    155 #else
    156 #if ENABLE_FEATURE_BUFFERS_GO_IN_BSS
    157 #define RESERVE_CONFIG_BUFFER(buffer,len)  static          char buffer[len]
    158 #define RESERVE_CONFIG_UBUFFER(buffer,len) static unsigned char buffer[len]
    159 #define RELEASE_CONFIG_BUFFER(buffer)      ((void)0)
    160 #else
    161 #define RESERVE_CONFIG_BUFFER(buffer,len)  char *buffer = xmalloc(len)
    162 #define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char *buffer = xmalloc(len)
    163 #define RELEASE_CONFIG_BUFFER(buffer)      free(buffer)
    164 #endif
    165 #endif
    166 
    167 
    168 #if defined(__GLIBC__)
    169 /* glibc uses __errno_location() to get a ptr to errno */
    170 /* We can just memorize it once - no multithreading in busybox :) */
    171 extern int *const bb_errno;
    172 #undef errno
    173 #define errno (*bb_errno)
    174 #endif
    175 
     87
     88
     89/* Some libc's forget to declare these, do it ourself */
     90
     91extern char **environ;
    17692#if defined(__GLIBC__) && __GLIBC__ < 2
    17793int vdprintf(int d, const char *format, va_list ap);
    17894#endif
    179 // This is declared here rather than #including <libgen.h> in order to avoid
    180 // confusing the two versions of basename.  See the dirname/basename man page
    181 // for details.
     95/* klogctl is in libc's klog.h, but we cheat and not #include that */
     96int klogctl(int type, char *b, int len);
     97/* This is declared here rather than #including <libgen.h> in order to avoid
     98 * confusing the two versions of basename.  See the dirname/basename man page
     99 * for details. */
     100#if !defined __FreeBSD__
    182101char *dirname(char *path);
     102#endif
    183103/* Include our own copy of struct sysinfo to avoid binary compatibility
    184104 * problems with Linux 2.4, which changed things.  Grumble, grumble. */
     
    197117    unsigned long freehigh;     /* Available high memory size */
    198118    unsigned int mem_unit;      /* Memory unit size in bytes */
    199     char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
     119    char _f[20 - 2 * sizeof(long) - sizeof(int)]; /* Padding: libc5 uses this.. */
    200120};
    201121int sysinfo(struct sysinfo* info);
    202 
    203 unsigned long long monotonic_us(void);
    204 unsigned monotonic_sec(void);
    205 
    206 extern void chomp(char *s);
    207 extern void trim(char *s);
    208 extern char *skip_whitespace(const char *);
    209 extern char *skip_non_whitespace(const char *);
     122#ifndef PATH_MAX
     123# define PATH_MAX 256
     124#endif
     125#ifndef BUFSIZ
     126# define BUFSIZ 4096
     127#endif
     128
     129
     130/* Make all declarations hidden (-fvisibility flag only affects definitions) */
     131/* (don't include system headers after this until corresponding pop!) */
     132PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
     133
     134
     135#if ENABLE_USE_BB_PWD_GRP
     136# include "pwd_.h"
     137# include "grp_.h"
     138#endif
     139#if ENABLE_FEATURE_SHADOWPASSWDS
     140# if ENABLE_USE_BB_SHADOW
     141#  include "shadow_.h"
     142# endif
     143#endif
     144
     145/* Tested to work correctly with all int types (IIRC :]) */
     146#define MAXINT(T) (T)( \
     147    ((T)-1) > 0 \
     148    ? (T)-1 \
     149    : (T)~((T)1 << (sizeof(T)*8-1)) \
     150    )
     151
     152#define MININT(T) (T)( \
     153    ((T)-1) > 0 \
     154    ? (T)0 \
     155    : ((T)1 << (sizeof(T)*8-1)) \
     156    )
     157
     158/* Large file support */
     159/* Note that CONFIG_LFS=y forces bbox to be built with all common ops
     160 * (stat, lseek etc) mapped to "largefile" variants by libc.
     161 * Practically it means that open() automatically has O_LARGEFILE added
     162 * and all filesize/file_offset parameters and struct members are "large"
     163 * (in today's world - signed 64bit). For full support of large files,
     164 * we need a few helper #defines (below) and careful use of off_t
     165 * instead of int/ssize_t. No lseek64(), O_LARGEFILE etc necessary */
     166#if ENABLE_LFS
     167/* CONFIG_LFS is on */
     168# if ULONG_MAX > 0xffffffff
     169/* "long" is long enough on this system */
     170typedef unsigned long uoff_t;
     171#  define XATOOFF(a) xatoul_range(a, 0, LONG_MAX)
     172/* usage: sz = BB_STRTOOFF(s, NULL, 10); if (errno || sz < 0) die(); */
     173#  define BB_STRTOOFF bb_strtoul
     174#  define STRTOOFF strtoul
     175/* usage: printf("size: %"OFF_FMT"d (%"OFF_FMT"x)\n", sz, sz); */
     176#  define OFF_FMT "l"
     177# else
     178/* "long" is too short, need "long long" */
     179typedef unsigned long long uoff_t;
     180#  define XATOOFF(a) xatoull_range(a, 0, LLONG_MAX)
     181#  define BB_STRTOOFF bb_strtoull
     182#  define STRTOOFF strtoull
     183#  define OFF_FMT "ll"
     184# endif
     185#else
     186/* CONFIG_LFS is off */
     187# if UINT_MAX == 0xffffffff
     188/* While sizeof(off_t) == sizeof(int), off_t is typedef'ed to long anyway.
     189 * gcc will throw warnings on printf("%d", off_t). Crap... */
     190typedef unsigned long uoff_t;
     191#  define XATOOFF(a) xatoi_positive(a)
     192#  define BB_STRTOOFF bb_strtou
     193#  define STRTOOFF strtol
     194#  define OFF_FMT "l"
     195# else
     196typedef unsigned long uoff_t;
     197#  define XATOOFF(a) xatoul_range(a, 0, LONG_MAX)
     198#  define BB_STRTOOFF bb_strtoul
     199#  define STRTOOFF strtol
     200#  define OFF_FMT "l"
     201# endif
     202#endif
     203/* scary. better ideas? (but do *test* them first!) */
     204#define OFF_T_MAX  ((off_t)~((off_t)1 << (sizeof(off_t)*8-1)))
     205
     206/* Some useful definitions */
     207#undef FALSE
     208#define FALSE   ((int) 0)
     209#undef TRUE
     210#define TRUE    ((int) 1)
     211#undef SKIP
     212#define SKIP    ((int) 2)
     213
     214/* for mtab.c */
     215#define MTAB_GETMOUNTPT '1'
     216#define MTAB_GETDEVICE  '2'
     217
     218#define BUF_SIZE        8192
     219#define EXPAND_ALLOC    1024
     220
     221/* Macros for min/max.  */
     222#ifndef MIN
     223#define MIN(a,b) (((a)<(b))?(a):(b))
     224#endif
     225
     226#ifndef MAX
     227#define MAX(a,b) (((a)>(b))?(a):(b))
     228#endif
     229
     230/* buffer allocation schemes */
     231#if ENABLE_FEATURE_BUFFERS_GO_ON_STACK
     232#define RESERVE_CONFIG_BUFFER(buffer,len)  char buffer[len]
     233#define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char buffer[len]
     234#define RELEASE_CONFIG_BUFFER(buffer)      ((void)0)
     235#else
     236#if ENABLE_FEATURE_BUFFERS_GO_IN_BSS
     237#define RESERVE_CONFIG_BUFFER(buffer,len)  static          char buffer[len]
     238#define RESERVE_CONFIG_UBUFFER(buffer,len) static unsigned char buffer[len]
     239#define RELEASE_CONFIG_BUFFER(buffer)      ((void)0)
     240#else
     241#define RESERVE_CONFIG_BUFFER(buffer,len)  char *buffer = xmalloc(len)
     242#define RESERVE_CONFIG_UBUFFER(buffer,len) unsigned char *buffer = xmalloc(len)
     243#define RELEASE_CONFIG_BUFFER(buffer)      free(buffer)
     244#endif
     245#endif
     246
     247#if defined(__GLIBC__)
     248/* glibc uses __errno_location() to get a ptr to errno */
     249/* We can just memorize it once - no multithreading in busybox :) */
     250extern int *const bb_errno;
     251#undef errno
     252#define errno (*bb_errno)
     253#endif
     254
     255#if !(ULONG_MAX > 0xffffffff)
     256/* Only 32-bit CPUs need this, 64-bit ones use inlined version */
     257uint64_t bb_bswap_64(uint64_t x) FAST_FUNC;
     258#endif
     259
     260unsigned long long monotonic_ns(void) FAST_FUNC;
     261unsigned long long monotonic_us(void) FAST_FUNC;
     262unsigned long long monotonic_ms(void) FAST_FUNC;
     263unsigned monotonic_sec(void) FAST_FUNC;
     264
     265extern void chomp(char *s) FAST_FUNC;
     266extern void trim(char *s) FAST_FUNC;
     267extern char *skip_whitespace(const char *) FAST_FUNC;
     268extern char *skip_non_whitespace(const char *) FAST_FUNC;
     269extern char *skip_dev_pfx(const char *tty_name) FAST_FUNC;
     270
     271extern char *strrstr(const char *haystack, const char *needle) FAST_FUNC;
    210272
    211273//TODO: supply a pointer to char[11] buffer (avoid statics)?
    212 extern const char *bb_mode_string(mode_t mode);
    213 extern int is_directory(const char *name, int followLinks, struct stat *statBuf);
    214 extern int remove_file(const char *path, int flags);
    215 extern int copy_file(const char *source, const char *dest, int flags);
     274extern const char *bb_mode_string(mode_t mode) FAST_FUNC;
     275extern int is_directory(const char *name, int followLinks, struct stat *statBuf) FAST_FUNC;
     276enum {  /* DO NOT CHANGE THESE VALUES!  cp.c, mv.c, install.c depend on them. */
     277    FILEUTILS_PRESERVE_STATUS = 1 << 0, /* -p */
     278    FILEUTILS_DEREFERENCE     = 1 << 1, /* !-d */
     279    FILEUTILS_RECUR           = 1 << 2, /* -R */
     280    FILEUTILS_FORCE           = 1 << 3, /* -f */
     281    FILEUTILS_INTERACTIVE     = 1 << 4, /* -i */
     282    FILEUTILS_MAKE_HARDLINK   = 1 << 5, /* -l */
     283    FILEUTILS_MAKE_SOFTLINK   = 1 << 6, /* -s */
     284    FILEUTILS_DEREF_SOFTLINK  = 1 << 7, /* -L */
     285    FILEUTILS_DEREFERENCE_L0  = 1 << 8, /* -H */
     286#if ENABLE_SELINUX
     287    FILEUTILS_PRESERVE_SECURITY_CONTEXT = 1 << 9, /* -c */
     288    FILEUTILS_SET_SECURITY_CONTEXT = 1 << 10,
     289#endif
     290};
     291#define FILEUTILS_CP_OPTSTR "pdRfilsLH" IF_SELINUX("c")
     292extern int remove_file(const char *path, int flags) FAST_FUNC;
     293/* NB: without FILEUTILS_RECUR in flags, it will basically "cat"
     294 * the source, not copy (unless "source" is a directory).
     295 * This makes "cp /dev/null file" and "install /dev/null file" (!!!)
     296 * work coreutils-compatibly. */
     297extern int copy_file(const char *source, const char *dest, int flags) FAST_FUNC;
     298
    216299enum {
    217300    ACTION_RECURSE        = (1 << 0),
     
    220303    ACTION_DEPTHFIRST     = (1 << 3),
    221304    /*ACTION_REVERSE      = (1 << 4), - unused */
    222 };
     305    ACTION_QUIET          = (1 << 5),
     306    ACTION_DANGLING_OK    = (1 << 6),
     307};
     308typedef uint8_t recurse_flags_t;
    223309extern int recursive_action(const char *fileName, unsigned flags,
    224     int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData, int depth),
    225     int (*dirAction) (const char *fileName, struct stat* statbuf, void* userData, int depth),
    226     void* userData, unsigned depth);
    227 extern int device_open(const char *device, int mode);
    228 extern int get_console_fd(void);
    229 extern char *find_block_device(const char *path);
     310    int FAST_FUNC (*fileAction)(const char *fileName, struct stat* statbuf, void* userData, int depth),
     311    int FAST_FUNC (*dirAction)(const char *fileName, struct stat* statbuf, void* userData, int depth),
     312    void* userData, unsigned depth) FAST_FUNC;
     313extern int device_open(const char *device, int mode) FAST_FUNC;
     314enum { GETPTY_BUFSIZE = 16 }; /* more than enough for "/dev/ttyXXX" */
     315extern int xgetpty(char *line) FAST_FUNC;
     316extern int get_console_fd_or_die(void) FAST_FUNC;
     317extern void console_make_active(int fd, const int vt_num) FAST_FUNC;
     318extern char *find_block_device(const char *path) FAST_FUNC;
    230319/* bb_copyfd_XX print read/write errors and return -1 if they occur */
    231 extern off_t bb_copyfd_eof(int fd1, int fd2);
    232 extern off_t bb_copyfd_size(int fd1, int fd2, off_t size);
    233 extern void bb_copyfd_exact_size(int fd1, int fd2, off_t size);
     320extern off_t bb_copyfd_eof(int fd1, int fd2) FAST_FUNC;
     321extern off_t bb_copyfd_size(int fd1, int fd2, off_t size) FAST_FUNC;
     322extern void bb_copyfd_exact_size(int fd1, int fd2, off_t size) FAST_FUNC;
    234323/* "short" copy can be detected by return value < size */
    235324/* this helper yells "short read!" if param is not -1 */
    236 extern void complain_copyfd_and_die(off_t sz) ATTRIBUTE_NORETURN;
    237 extern char bb_process_escape_sequence(const char **ptr);
    238 /* TODO: sometimes modifies its parameter, which
    239  * makes it rather inconvenient at times: */
    240 extern char *bb_get_last_path_component(char *path);
    241 
    242 int ndelay_on(int fd);
    243 int ndelay_off(int fd);
    244 void xdup2(int, int);
    245 void xmove_fd(int, int);
    246 
    247 
    248 DIR *xopendir(const char *path);
    249 DIR *warn_opendir(const char *path);
    250 
    251 /* UNUSED: char *xmalloc_realpath(const char *path); */
    252 char *xmalloc_readlink(const char *path);
    253 char *xmalloc_readlink_or_warn(const char *path);
    254 char *xrealloc_getcwd_or_warn(char *cwd);
    255 
    256 
    257 //TODO: signal(sid, f) is the same? then why?
    258 extern void sig_catch(int,void (*)(int));
    259 //#define sig_ignore(s) (sig_catch((s), SIG_IGN))
    260 //#define sig_uncatch(s) (sig_catch((s), SIG_DFL))
    261 extern void sig_block(int);
    262 extern void sig_unblock(int);
    263 /* UNUSED: extern void sig_blocknone(void); */
    264 extern void sig_pause(void);
    265 
    266 
    267 void xsetgid(gid_t gid);
    268 void xsetuid(uid_t uid);
    269 void xchdir(const char *path);
    270 void xsetenv(const char *key, const char *value);
    271 void xunlink(const char *pathname);
    272 void xstat(const char *pathname, struct stat *buf);
    273 int xopen(const char *pathname, int flags);
    274 int xopen3(const char *pathname, int flags, int mode);
    275 int open_or_warn(const char *pathname, int flags);
    276 int open3_or_warn(const char *pathname, int flags, int mode);
    277 void xpipe(int filedes[2]);
    278 off_t xlseek(int fd, off_t offset, int whence);
    279 off_t fdlength(int fd);
    280 
    281 int xsocket(int domain, int type, int protocol);
    282 void xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
    283 void xlisten(int s, int backlog);
    284 void xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen);
     325extern void complain_copyfd_and_die(off_t sz) NORETURN FAST_FUNC;
     326extern char bb_process_escape_sequence(const char **ptr) FAST_FUNC;
     327char* strcpy_and_process_escape_sequences(char *dst, const char *src) FAST_FUNC;
     328/* xxxx_strip version can modify its parameter:
     329 * "/"        -> "/"
     330 * "abc"      -> "abc"
     331 * "abc/def"  -> "def"
     332 * "abc/def/" -> "def" !!
     333 */
     334extern char *bb_get_last_path_component_strip(char *path) FAST_FUNC;
     335/* "abc/def/" -> "" and it never modifies 'path' */
     336extern char *bb_get_last_path_component_nostrip(const char *path) FAST_FUNC;
     337
     338int ndelay_on(int fd) FAST_FUNC;
     339int ndelay_off(int fd) FAST_FUNC;
     340int close_on_exec_on(int fd) FAST_FUNC;
     341void xdup2(int, int) FAST_FUNC;
     342void xmove_fd(int, int) FAST_FUNC;
     343
     344
     345DIR *xopendir(const char *path) FAST_FUNC;
     346DIR *warn_opendir(const char *path) FAST_FUNC;
     347
     348char *xmalloc_realpath(const char *path) FAST_FUNC RETURNS_MALLOC;
     349char *xmalloc_readlink(const char *path) FAST_FUNC RETURNS_MALLOC;
     350char *xmalloc_readlink_or_warn(const char *path) FAST_FUNC RETURNS_MALLOC;
     351/* !RETURNS_MALLOC: it's a realloc-like function */
     352char *xrealloc_getcwd_or_warn(char *cwd) FAST_FUNC;
     353
     354char *xmalloc_follow_symlinks(const char *path) FAST_FUNC RETURNS_MALLOC;
     355
     356
     357enum {
     358    /* bb_signals(BB_FATAL_SIGS, handler) catches all signals which
     359     * otherwise would kill us, except for those resulting from bugs:
     360     * SIGSEGV, SIGILL, SIGFPE.
     361     * Other fatal signals not included (TODO?):
     362     * SIGBUS   Bus error (bad memory access)
     363     * SIGPOLL  Pollable event. Synonym of SIGIO
     364     * SIGPROF  Profiling timer expired
     365     * SIGSYS   Bad argument to routine
     366     * SIGTRAP  Trace/breakpoint trap
     367     *
     368     * The only known arch with some of these sigs not fitting
     369     * into 32 bits is parisc (SIGXCPU=33, SIGXFSZ=34, SIGSTKFLT=36).
     370     * Dance around with long long to guard against that...
     371     */
     372    BB_FATAL_SIGS = (int)(0
     373        + (1LL << SIGHUP)
     374        + (1LL << SIGINT)
     375        + (1LL << SIGTERM)
     376        + (1LL << SIGPIPE)   // Write to pipe with no readers
     377        + (1LL << SIGQUIT)   // Quit from keyboard
     378        + (1LL << SIGABRT)   // Abort signal from abort(3)
     379        + (1LL << SIGALRM)   // Timer signal from alarm(2)
     380        + (1LL << SIGVTALRM) // Virtual alarm clock
     381        + (1LL << SIGXCPU)   // CPU time limit exceeded
     382        + (1LL << SIGXFSZ)   // File size limit exceeded
     383        + (1LL << SIGUSR1)   // Yes kids, these are also fatal!
     384        + (1LL << SIGUSR2)
     385        + 0),
     386};
     387void bb_signals(int sigs, void (*f)(int)) FAST_FUNC;
     388/* Unlike signal() and bb_signals, sets handler with sigaction()
     389 * and in a way that while signal handler is run, no other signals
     390 * will be blocked; syscalls will not be restarted: */
     391void bb_signals_recursive_norestart(int sigs, void (*f)(int)) FAST_FUNC;
     392/* syscalls like read() will be interrupted with EINTR: */
     393void signal_no_SA_RESTART_empty_mask(int sig, void (*handler)(int)) FAST_FUNC;
     394/* syscalls like read() won't be interrupted (though select/poll will be): */
     395void signal_SA_RESTART_empty_mask(int sig, void (*handler)(int)) FAST_FUNC;
     396void wait_for_any_sig(void) FAST_FUNC;
     397void kill_myself_with_sig(int sig) NORETURN FAST_FUNC;
     398void sig_block(int sig) FAST_FUNC;
     399void sig_unblock(int sig) FAST_FUNC;
     400/* Will do sigaction(signum, act, NULL): */
     401int sigaction_set(int sig, const struct sigaction *act) FAST_FUNC;
     402/* SIG_BLOCK/SIG_UNBLOCK all signals: */
     403int sigprocmask_allsigs(int how) FAST_FUNC;
     404/* Standard handler which just records signo */
     405extern smallint bb_got_signal;
     406void record_signo(int signo); /* not FAST_FUNC! */
     407
     408
     409void xsetgid(gid_t gid) FAST_FUNC;
     410void xsetuid(uid_t uid) FAST_FUNC;
     411void xchdir(const char *path) FAST_FUNC;
     412void xchroot(const char *path) FAST_FUNC;
     413void xsetenv(const char *key, const char *value) FAST_FUNC;
     414void bb_unsetenv(const char *key) FAST_FUNC;
     415void bb_unsetenv_and_free(char *key) FAST_FUNC;
     416void xunlink(const char *pathname) FAST_FUNC;
     417void xstat(const char *pathname, struct stat *buf) FAST_FUNC;
     418void xfstat(int fd, struct stat *buf, const char *errmsg) FAST_FUNC;
     419int xopen(const char *pathname, int flags) FAST_FUNC;
     420int xopen_nonblocking(const char *pathname) FAST_FUNC;
     421int xopen3(const char *pathname, int flags, int mode) FAST_FUNC;
     422int open_or_warn(const char *pathname, int flags) FAST_FUNC;
     423int open3_or_warn(const char *pathname, int flags, int mode) FAST_FUNC;
     424int open_or_warn_stdin(const char *pathname) FAST_FUNC;
     425int xopen_stdin(const char *pathname) FAST_FUNC;
     426void xrename(const char *oldpath, const char *newpath) FAST_FUNC;
     427int rename_or_warn(const char *oldpath, const char *newpath) FAST_FUNC;
     428off_t xlseek(int fd, off_t offset, int whence) FAST_FUNC;
     429int xmkstemp(char *template) FAST_FUNC;
     430off_t fdlength(int fd) FAST_FUNC;
     431
     432uoff_t FAST_FUNC get_volume_size_in_bytes(int fd,
     433                const char *override,
     434                unsigned override_units,
     435                int extend);
     436
     437void xpipe(int filedes[2]) FAST_FUNC;
     438/* In this form code with pipes is much more readable */
     439struct fd_pair { int rd; int wr; };
     440#define piped_pair(pair)  pipe(&((pair).rd))
     441#define xpiped_pair(pair) xpipe(&((pair).rd))
     442
     443/* Useful for having small structure members/global variables */
     444typedef int8_t socktype_t;
     445typedef int8_t family_t;
     446struct BUG_too_small {
     447    char BUG_socktype_t_too_small[(0
     448            | SOCK_STREAM
     449            | SOCK_DGRAM
     450            | SOCK_RDM
     451            | SOCK_SEQPACKET
     452            | SOCK_RAW
     453            ) <= 127 ? 1 : -1];
     454    char BUG_family_t_too_small[(0
     455            | AF_UNSPEC
     456            | AF_INET
     457            | AF_INET6
     458            | AF_UNIX
     459#ifdef AF_PACKET
     460            | AF_PACKET
     461#endif
     462#ifdef AF_NETLINK
     463            | AF_NETLINK
     464#endif
     465            /* | AF_DECnet */
     466            /* | AF_IPX */
     467            ) <= 127 ? 1 : -1];
     468};
     469
     470
     471void parse_datestr(const char *date_str, struct tm *ptm) FAST_FUNC;
     472time_t validate_tm_time(const char *date_str, struct tm *ptm) FAST_FUNC;
     473
     474
     475int xsocket(int domain, int type, int protocol) FAST_FUNC;
     476void xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen) FAST_FUNC;
     477void xlisten(int s, int backlog) FAST_FUNC;
     478void xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen) FAST_FUNC;
    285479ssize_t xsendto(int s, const void *buf, size_t len, const struct sockaddr *to,
    286                 socklen_t tolen);
     480                socklen_t tolen) FAST_FUNC;
    287481/* SO_REUSEADDR allows a server to rebind to an address that is already
    288482 * "in use" by old connections to e.g. previous server instance which is
     
    291485 * regardless of SO_REUSEADDR (unlike some other flavors of Unix).
    292486 * Turn it on before you call bind(). */
    293 void setsockopt_reuseaddr(int fd); /* On Linux this never fails. */
    294 int setsockopt_broadcast(int fd);
     487void setsockopt_reuseaddr(int fd) FAST_FUNC; /* On Linux this never fails. */
     488int setsockopt_broadcast(int fd) FAST_FUNC;
     489int setsockopt_bindtodevice(int fd, const char *iface) FAST_FUNC;
    295490/* NB: returns port in host byte order */
    296 unsigned bb_lookup_port(const char *port, const char *protocol, unsigned default_port);
     491unsigned bb_lookup_port(const char *port, const char *protocol, unsigned default_port) FAST_FUNC;
    297492typedef struct len_and_sockaddr {
    298493    socklen_t len;
     
    303498        struct sockaddr_in6 sin6;
    304499#endif
    305     };
     500    } u;
    306501} len_and_sockaddr;
    307502enum {
     503    LSA_LEN_SIZE = offsetof(len_and_sockaddr, u),
    308504    LSA_SIZEOF_SA = sizeof(
    309505        union {
     
    319515 * (lsa of correct size and lsa->sa.sa_family (AF_INET/AF_INET6))
    320516 * af == AF_UNSPEC will result in trying to create IPv6 socket,
    321  * and if kernel doesn't support it, IPv4.
     517 * and if kernel doesn't support it, fall back to IPv4.
     518 * This is useful if you plan to bind to resulting local lsa.
    322519 */
    323 int xsocket_type(len_and_sockaddr **lsap, USE_FEATURE_IPV6(int af,) int sock_type);
    324 int xsocket_stream(len_and_sockaddr **lsap);
     520#if ENABLE_FEATURE_IPV6
     521int xsocket_type(len_and_sockaddr **lsap, int af, int sock_type) FAST_FUNC;
     522#else
     523int xsocket_type(len_and_sockaddr **lsap, int sock_type) FAST_FUNC;
     524#define xsocket_type(lsap, af, sock_type) xsocket_type((lsap), (sock_type))
     525#endif
     526int xsocket_stream(len_and_sockaddr **lsap) FAST_FUNC;
    325527/* Create server socket bound to bindaddr:port. bindaddr can be NULL,
    326528 * numeric IP ("N.N.N.N") or numeric IPv6 address,
     
    328530 * Only if there is no suffix, port argument is used */
    329531/* NB: these set SO_REUSEADDR before bind */
    330 int create_and_bind_stream_or_die(const char *bindaddr, int port);
    331 int create_and_bind_dgram_or_die(const char *bindaddr, int port);
     532int create_and_bind_stream_or_die(const char *bindaddr, int port) FAST_FUNC;
     533int create_and_bind_dgram_or_die(const char *bindaddr, int port) FAST_FUNC;
    332534/* Create client TCP socket connected to peer:port. Peer cannot be NULL.
    333535 * Peer can be numeric IP ("N.N.N.N"), numeric IPv6 address or hostname,
    334536 * and can have ":PORT" suffix (for IPv6 use "[X:X:...:X]:PORT").
    335537 * If there is no suffix, port argument is used */
    336 int create_and_connect_stream_or_die(const char *peer, int port);
     538int create_and_connect_stream_or_die(const char *peer, int port) FAST_FUNC;
    337539/* Connect to peer identified by lsa */
    338 int xconnect_stream(const len_and_sockaddr *lsa);
     540int xconnect_stream(const len_and_sockaddr *lsa) FAST_FUNC;
     541/* Get local address of bound or accepted socket */
     542len_and_sockaddr *get_sock_lsa(int fd) FAST_FUNC RETURNS_MALLOC;
     543/* Get remote address of connected or accepted socket */
     544len_and_sockaddr *get_peer_lsa(int fd) FAST_FUNC RETURNS_MALLOC;
    339545/* Return malloc'ed len_and_sockaddr with socket address of host:port
    340546 * Currently will return IPv4 or IPv6 sockaddrs only
     
    342548 * UNIX socket address being returned, IPX sockaddr etc...
    343549 * On error does bb_error_msg and returns NULL */
    344 len_and_sockaddr* host2sockaddr(const char *host, int port);
     550len_and_sockaddr* host2sockaddr(const char *host, int port) FAST_FUNC RETURNS_MALLOC;
    345551/* Version which dies on error */
    346 len_and_sockaddr* xhost2sockaddr(const char *host, int port);
    347 len_and_sockaddr* xdotted2sockaddr(const char *host, int port);
    348 #if ENABLE_FEATURE_IPV6
     552len_and_sockaddr* xhost2sockaddr(const char *host, int port) FAST_FUNC RETURNS_MALLOC;
     553len_and_sockaddr* xdotted2sockaddr(const char *host, int port) FAST_FUNC RETURNS_MALLOC;
    349554/* Same, useful if you want to force family (e.g. IPv6) */
    350 len_and_sockaddr* host_and_af2sockaddr(const char *host, int port, sa_family_t af);
    351 len_and_sockaddr* xhost_and_af2sockaddr(const char *host, int port, sa_family_t af);
    352 #else
    353 /* [we evaluate af: think about "host_and_af2sockaddr(..., af++)"] */
    354 #define host_and_af2sockaddr(host, port, af) ((void)(af), host2sockaddr((host), (port)))
    355 #define xhost_and_af2sockaddr(host, port, af) ((void)(af), xhost2sockaddr((host), (port)))
     555#if !ENABLE_FEATURE_IPV6
     556#define host_and_af2sockaddr(host, port, af) host2sockaddr((host), (port))
     557#define xhost_and_af2sockaddr(host, port, af) xhost2sockaddr((host), (port))
     558#else
     559len_and_sockaddr* host_and_af2sockaddr(const char *host, int port, sa_family_t af) FAST_FUNC RETURNS_MALLOC;
     560len_and_sockaddr* xhost_and_af2sockaddr(const char *host, int port, sa_family_t af) FAST_FUNC RETURNS_MALLOC;
    356561#endif
    357562/* Assign sin[6]_port member if the socket is an AF_INET[6] one,
    358563 * otherwise no-op. Useful for ftp.
    359564 * NB: does NOT do htons() internally, just direct assignment. */
    360 void set_nport(len_and_sockaddr *lsa, unsigned port);
     565void set_nport(len_and_sockaddr *lsa, unsigned port) FAST_FUNC;
    361566/* Retrieve sin[6]_port or return -1 for non-INET[6] lsa's */
    362 int get_nport(const struct sockaddr *sa);
     567int get_nport(const struct sockaddr *sa) FAST_FUNC;
    363568/* Reverse DNS. Returns NULL on failure. */
    364 char* xmalloc_sockaddr2host(const struct sockaddr *sa);
     569char* xmalloc_sockaddr2host(const struct sockaddr *sa) FAST_FUNC RETURNS_MALLOC;
    365570/* This one doesn't append :PORTNUM */
    366 char* xmalloc_sockaddr2host_noport(const struct sockaddr *sa);
     571char* xmalloc_sockaddr2host_noport(const struct sockaddr *sa) FAST_FUNC RETURNS_MALLOC;
    367572/* This one also doesn't fall back to dotted IP (returns NULL) */
    368 char* xmalloc_sockaddr2hostonly_noport(const struct sockaddr *sa);
     573char* xmalloc_sockaddr2hostonly_noport(const struct sockaddr *sa) FAST_FUNC RETURNS_MALLOC;
    369574/* inet_[ap]ton on steroids */
    370 char* xmalloc_sockaddr2dotted(const struct sockaddr *sa);
    371 char* xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa);
     575char* xmalloc_sockaddr2dotted(const struct sockaddr *sa) FAST_FUNC RETURNS_MALLOC;
     576char* xmalloc_sockaddr2dotted_noport(const struct sockaddr *sa) FAST_FUNC RETURNS_MALLOC;
    372577// "old" (ipv4 only) API
    373578// users: traceroute.c hostname.c - use _list_ of all IPs
    374 struct hostent *xgethostbyname(const char *name);
     579struct hostent *xgethostbyname(const char *name) FAST_FUNC;
    375580// Also mount.c and inetd.c are using gethostbyname(),
    376581// + inet_common.c has additional IPv4-only stuff
    377582
    378583
    379 void socket_want_pktinfo(int fd);
     584void socket_want_pktinfo(int fd) FAST_FUNC;
    380585ssize_t send_to_from(int fd, void *buf, size_t len, int flags,
    381         const struct sockaddr *from, const struct sockaddr *to,
    382         socklen_t tolen);
     586        const struct sockaddr *to,
     587        const struct sockaddr *from,
     588        socklen_t tolen) FAST_FUNC;
    383589ssize_t recv_from_to(int fd, void *buf, size_t len, int flags,
    384         struct sockaddr *from, struct sockaddr *to,
    385         socklen_t sa_size);
    386 
    387 
    388 extern char *xstrdup(const char *s);
    389 extern char *xstrndup(const char *s, int n);
    390 extern char *safe_strncpy(char *dst, const char *src, size_t size);
    391 extern char *xasprintf(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
     590        struct sockaddr *from,
     591        struct sockaddr *to,
     592        socklen_t sa_size) FAST_FUNC;
     593
     594
     595char *xstrdup(const char *s) FAST_FUNC RETURNS_MALLOC;
     596char *xstrndup(const char *s, int n) FAST_FUNC RETURNS_MALLOC;
     597void overlapping_strcpy(char *dst, const char *src) FAST_FUNC;
     598char *safe_strncpy(char *dst, const char *src, size_t size) FAST_FUNC;
     599char *strncpy_IFNAMSIZ(char *dst, const char *src) FAST_FUNC;
     600/* Guaranteed to NOT be a macro (smallest code). Saves nearly 2k on uclibc.
     601 * But potentially slow, don't use in one-billion-times loops */
     602int bb_putchar(int ch) FAST_FUNC;
     603/* Note: does not use stdio, writes to fd 2 directly */
     604int bb_putchar_stderr(char ch) FAST_FUNC;
     605char *xasprintf(const char *format, ...) __attribute__ ((format(printf, 1, 2))) FAST_FUNC RETURNS_MALLOC;
    392606// gcc-4.1.1 still isn't good enough at optimizing it
    393607// (+200 bytes compared to macro)
     
    402616#define DOT_OR_DOTDOT(s) ((s)[0] == '.' && (!(s)[1] || ((s)[1] == '.' && !(s)[2])))
    403617
     618typedef struct uni_stat_t {
     619    unsigned byte_count;
     620    unsigned unicode_count;
     621    unsigned unicode_width;
     622} uni_stat_t;
     623/* Returns a string with unprintable chars replaced by '?' or
     624 * SUBST_WCHAR. This function is unicode-aware. */
     625const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str);
     626/* Prints unprintable char ch as ^C or M-c to file
     627 * (M-c is used only if ch is ORed with PRINTABLE_META),
     628 * else it is printed as-is (except for ch = 0x9b) */
     629enum { PRINTABLE_META = 0x100 };
     630void fputc_printable(int ch, FILE *file) FAST_FUNC;
     631
    404632/* dmalloc will redefine these to it's own implementation. It is safe
    405633 * to have the prototypes here unconditionally.  */
    406 extern void *malloc_or_warn(size_t size);
    407 extern void *xmalloc(size_t size);
    408 extern void *xzalloc(size_t size);
    409 extern void *xrealloc(void *old, size_t size);
    410 
    411 extern ssize_t safe_read(int fd, void *buf, size_t count);
    412 extern ssize_t full_read(int fd, void *buf, size_t count);
    413 extern void xread(int fd, void *buf, size_t count);
    414 extern unsigned char xread_char(int fd);
    415 // Read one line a-la fgets. Uses one read(), works only on seekable streams
    416 extern char *reads(int fd, char *buf, size_t count);
    417 // Read one line a-la fgets. Reads byte-by-byte.
    418 // Useful when it is important to not read ahead.
    419 extern char *xmalloc_reads(int fd, char *pfx);
    420 extern ssize_t read_close(int fd, void *buf, size_t count);
    421 extern ssize_t open_read_close(const char *filename, void *buf, size_t count);
    422 extern void *xmalloc_open_read_close(const char *filename, size_t *sizep);
    423 
    424 extern ssize_t safe_write(int fd, const void *buf, size_t count);
    425 extern ssize_t full_write(int fd, const void *buf, size_t count);
    426 extern void xwrite(int fd, const void *buf, size_t count);
     634void *malloc_or_warn(size_t size) FAST_FUNC RETURNS_MALLOC;
     635void *xmalloc(size_t size) FAST_FUNC RETURNS_MALLOC;
     636void *xzalloc(size_t size) FAST_FUNC RETURNS_MALLOC;
     637void *xrealloc(void *old, size_t size) FAST_FUNC;
     638/* After xrealloc_vector(v, 4, idx) it's ok to use
     639 * at least v[idx] and v[idx+1], for all idx values.
     640 * shift specifies how many new elements are added (1: 2, 2: 4... 8: 256...)
     641 * when all elements are used up. New elements are zeroed out. */
     642#define xrealloc_vector(vector, shift, idx) \
     643    xrealloc_vector_helper((vector), (sizeof((vector)[0]) << 8) + (shift), (idx))
     644void* xrealloc_vector_helper(void *vector, unsigned sizeof_and_shift, int idx) FAST_FUNC;
     645
     646
     647extern ssize_t safe_read(int fd, void *buf, size_t count) FAST_FUNC;
     648extern ssize_t nonblock_safe_read(int fd, void *buf, size_t count) FAST_FUNC;
     649// NB: will return short read on error, not -1,
     650// if some data was read before error occurred
     651extern ssize_t full_read(int fd, void *buf, size_t count) FAST_FUNC;
     652extern void xread(int fd, void *buf, size_t count) FAST_FUNC;
     653extern unsigned char xread_char(int fd) FAST_FUNC;
     654extern ssize_t read_close(int fd, void *buf, size_t maxsz) FAST_FUNC;
     655extern ssize_t open_read_close(const char *filename, void *buf, size_t maxsz) FAST_FUNC;
     656// Reads one line a-la fgets (but doesn't save terminating '\n').
     657// Reads byte-by-byte. Useful when it is important to not read ahead.
     658// Bytes are appended to pfx (which must be malloced, or NULL).
     659extern char *xmalloc_reads(int fd, char *pfx, size_t *maxsz_p) FAST_FUNC;
     660/* Reads block up to *maxsz_p (default: INT_MAX - 4095) */
     661extern void *xmalloc_read(int fd, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC;
     662/* Returns NULL if file can't be opened (default max size: INT_MAX - 4095) */
     663extern void *xmalloc_open_read_close(const char *filename, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC;
     664/* Autodetects gzip/bzip2 formats. fd may be in the middle of the file! */
     665#if ENABLE_FEATURE_SEAMLESS_LZMA \
     666 || ENABLE_FEATURE_SEAMLESS_BZ2 \
     667 || ENABLE_FEATURE_SEAMLESS_GZ \
     668 /* || ENABLE_FEATURE_SEAMLESS_Z */
     669extern void setup_unzip_on_fd(int fd /*, int fail_if_not_detected*/) FAST_FUNC;
     670#else
     671# define setup_unzip_on_fd(...) ((void)0)
     672#endif
     673/* Autodetects .gz etc */
     674extern int open_zipped(const char *fname) FAST_FUNC;
     675extern void *xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC;
     676/* Never returns NULL */
     677extern void *xmalloc_xopen_read_close(const char *filename, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC;
     678
     679extern ssize_t safe_write(int fd, const void *buf, size_t count) FAST_FUNC;
     680// NB: will return short write on error, not -1,
     681// if some data was written before error occurred
     682extern ssize_t full_write(int fd, const void *buf, size_t count) FAST_FUNC;
     683extern void xwrite(int fd, const void *buf, size_t count) FAST_FUNC;
     684extern void xwrite_str(int fd, const char *str) FAST_FUNC;
     685extern ssize_t full_write1_str(const char *str) FAST_FUNC;
     686extern ssize_t full_write2_str(const char *str) FAST_FUNC;
     687extern void xopen_xwrite_close(const char* file, const char *str) FAST_FUNC;
     688
     689/* Close fd, but check for failures (some types of write errors) */
     690extern void xclose(int fd) FAST_FUNC;
    427691
    428692/* Reads and prints to stdout till eof, then closes FILE. Exits on error: */
    429 extern void xprint_and_close_file(FILE *file);
    430 extern char *xmalloc_fgets(FILE *file);
    431 /* Read up to (and including) TERMINATING_STRING: */
    432 extern char *xmalloc_fgets_str(FILE *file, const char *terminating_string);
     693extern void xprint_and_close_file(FILE *file) FAST_FUNC;
     694
     695extern char *bb_get_chunk_from_file(FILE *file, int *end) FAST_FUNC;
     696extern char *bb_get_chunk_with_continuation(FILE *file, int *end, int *lineno) FAST_FUNC;
     697/* Reads up to (and including) TERMINATING_STRING: */
     698extern char *xmalloc_fgets_str(FILE *file, const char *terminating_string) FAST_FUNC RETURNS_MALLOC;
     699/* Same, with limited max size, and returns the length (excluding NUL): */
     700extern char *xmalloc_fgets_str_len(FILE *file, const char *terminating_string, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC;
     701/* Chops off TERMINATING_STRING from the end: */
     702extern char *xmalloc_fgetline_str(FILE *file, const char *terminating_string) FAST_FUNC RETURNS_MALLOC;
     703/* Reads up to (and including) "\n" or NUL byte: */
     704extern char *xmalloc_fgets(FILE *file) FAST_FUNC RETURNS_MALLOC;
    433705/* Chops off '\n' from the end, unlike fgets: */
    434 extern char *xmalloc_getline(FILE *file);
    435 extern char *bb_get_chunk_from_file(FILE *file, int *end);
    436 extern void die_if_ferror(FILE *file, const char *msg);
    437 extern void die_if_ferror_stdout(void);
    438 extern void xfflush_stdout(void);
    439 extern void fflush_stdout_and_exit(int retval) ATTRIBUTE_NORETURN;
    440 extern int fclose_if_not_stdin(FILE *file);
    441 extern FILE *xfopen(const char *filename, const char *mode);
     706extern char *xmalloc_fgetline(FILE *file) FAST_FUNC RETURNS_MALLOC;
     707/* Same, but doesn't try to conserve space (may have some slack after the end) */
     708/* extern char *xmalloc_fgetline_fast(FILE *file) FAST_FUNC RETURNS_MALLOC; */
     709
     710void die_if_ferror(FILE *file, const char *msg) FAST_FUNC;
     711void die_if_ferror_stdout(void) FAST_FUNC;
     712int fflush_all(void) FAST_FUNC;
     713void fflush_stdout_and_exit(int retval) NORETURN FAST_FUNC;
     714int fclose_if_not_stdin(FILE *file) FAST_FUNC;
     715FILE* xfopen(const char *filename, const char *mode) FAST_FUNC;
    442716/* Prints warning to stderr and returns NULL on failure: */
    443 extern FILE *fopen_or_warn(const char *filename, const char *mode);
     717FILE* fopen_or_warn(const char *filename, const char *mode) FAST_FUNC;
    444718/* "Opens" stdin if filename is special, else just opens file: */
    445 extern FILE *fopen_or_warn_stdin(const char *filename);
     719FILE* xfopen_stdin(const char *filename) FAST_FUNC;
     720FILE* fopen_or_warn_stdin(const char *filename) FAST_FUNC;
     721FILE* fopen_for_read(const char *path) FAST_FUNC;
     722FILE* xfopen_for_read(const char *path) FAST_FUNC;
     723FILE* fopen_for_write(const char *path) FAST_FUNC;
     724FILE* xfopen_for_write(const char *path) FAST_FUNC;
     725FILE* xfdopen_for_read(int fd) FAST_FUNC;
     726FILE* xfdopen_for_write(int fd) FAST_FUNC;
     727
     728int bb_pstrcmp(const void *a, const void *b) /* not FAST_FUNC! */;
     729void qsort_string_vector(char **sv, unsigned count) FAST_FUNC;
     730
     731/* Wrapper which restarts poll on EINTR or ENOMEM.
     732 * On other errors complains [perror("poll")] and returns.
     733 * Warning! May take (much) longer than timeout_ms to return!
     734 * If this is a problem, use bare poll and open-code EINTR/ENOMEM handling */
     735int safe_poll(struct pollfd *ufds, nfds_t nfds, int timeout_ms) FAST_FUNC;
     736
     737char *safe_gethostname(void) FAST_FUNC;
     738char *safe_getdomainname(void) FAST_FUNC;
    446739
    447740/* Convert each alpha char in str to lower-case */
    448 extern char* str_tolower(char *str);
    449 
    450 char *utoa(unsigned n);
    451 char *itoa(int n);
     741char* str_tolower(char *str) FAST_FUNC;
     742
     743char *utoa(unsigned n) FAST_FUNC;
     744char *itoa(int n) FAST_FUNC;
    452745/* Returns a pointer past the formatted number, does NOT null-terminate */
    453 char *utoa_to_buf(unsigned n, char *buf, unsigned buflen);
    454 char *itoa_to_buf(int n, char *buf, unsigned buflen);
    455 void smart_ulltoa5(unsigned long long ul, char buf[5]);
     746char *utoa_to_buf(unsigned n, char *buf, unsigned buflen) FAST_FUNC;
     747char *itoa_to_buf(int n, char *buf, unsigned buflen) FAST_FUNC;
     748/* Intelligent formatters of bignums */
     749void smart_ulltoa4(unsigned long long ul, char buf[4], const char *scale) FAST_FUNC;
     750void smart_ulltoa5(unsigned long long ul, char buf[5], const char *scale) FAST_FUNC;
     751/* If block_size == 0, display size without fractional part,
     752 * else display (size * block_size) with one decimal digit.
     753 * If display_unit == 0, show value no bigger than 1024 with suffix (K,M,G...),
     754 * else divide by display_unit and do not use suffix. */
     755#define HUMAN_READABLE_MAX_WIDTH      7  /* "1024.0G" */
     756#define HUMAN_READABLE_MAX_WIDTH_STR "7"
    456757//TODO: provide pointer to buf (avoid statics)?
    457758const char *make_human_readable_str(unsigned long long size,
    458         unsigned long block_size, unsigned long display_unit);
     759        unsigned long block_size, unsigned long display_unit) FAST_FUNC;
    459760/* Put a string of hex bytes ("1b2e66fe"...), return advanced pointer */
    460 char *bin2hex(char *buf, const char *cp, int count);
     761char *bin2hex(char *buf, const char *cp, int count) FAST_FUNC;
     762/* Reverse */
     763char* hex2bin(char *dst, const char *str, int count) FAST_FUNC;
     764
     765/* Generate a UUID */
     766void generate_uuid(uint8_t *buf) FAST_FUNC;
    461767
    462768/* Last element is marked by mult == 0 */
     
    467773#include "xatonum.h"
    468774/* Specialized: */
     775
    469776/* Using xatoi() instead of naive atoi() is not always convenient -
    470777 * in many places people want *non-negative* values, but store them
    471778 * in signed int. Therefore we need this one:
    472  * dies if input is not in [0, INT_MAX] range. Also will reject '-0' etc */
    473 int xatoi_u(const char *numstr);
     779 * dies if input is not in [0, INT_MAX] range. Also will reject '-0' etc.
     780 * It should really be named xatoi_nonnegative (since it allows 0),
     781 * but that would be too long.
     782 */
     783int xatoi_positive(const char *numstr) FAST_FUNC;
     784
    474785/* Useful for reading port numbers */
    475 uint16_t xatou16(const char *numstr);
     786uint16_t xatou16(const char *numstr) FAST_FUNC;
    476787
    477788
     
    479790 * for BusyBox since we want to avoid using the glibc NSS stuff, which
    480791 * increases target size and is often not needed on embedded systems.  */
    481 long xuname2uid(const char *name);
    482 long xgroup2gid(const char *name);
     792long xuname2uid(const char *name) FAST_FUNC;
     793long xgroup2gid(const char *name) FAST_FUNC;
    483794/* wrapper: allows string to contain numeric uid or gid */
    484 unsigned long get_ug_id(const char *s, long (*xname2id)(const char *));
     795unsigned long get_ug_id(const char *s, long FAST_FUNC (*xname2id)(const char *)) FAST_FUNC;
    485796/* from chpst. Does not die, returns 0 on failure */
    486797struct bb_uidgid_t {
     
    489800};
    490801/* always sets uid and gid */
    491 int get_uidgid(struct bb_uidgid_t*, const char*, int numeric_ok);
     802int get_uidgid(struct bb_uidgid_t*, const char*, int numeric_ok) FAST_FUNC;
     803/* always sets uid and gid, allows numeric; exits on failure */
     804void xget_uidgid(struct bb_uidgid_t*, const char*) FAST_FUNC;
    492805/* chown-like handling of "user[:[group]" */
    493 void parse_chown_usergroup_or_die(struct bb_uidgid_t *u, char *user_group);
    494 /* bb_getpwuid, bb_getgrgid:
    495  * bb_getXXXid(buf, bufsz, id) - copy user/group name or id
    496  *              as a string to buf, return user/group name or NULL
    497  * bb_getXXXid(NULL, 0, id) - return user/group name or NULL
    498  * bb_getXXXid(NULL, -1, id) - return user/group name or exit
    499 */
    500 char *bb_getpwuid(char *name, int bufsize, long uid);
    501 char *bb_getgrgid(char *group, int bufsize, long gid);
     806void parse_chown_usergroup_or_die(struct bb_uidgid_t *u, char *user_group) FAST_FUNC;
     807struct passwd* xgetpwnam(const char *name) FAST_FUNC;
     808struct group* xgetgrnam(const char *name) FAST_FUNC;
     809struct passwd* xgetpwuid(uid_t uid) FAST_FUNC;
     810struct group* xgetgrgid(gid_t gid) FAST_FUNC;
     811char* xuid2uname(uid_t uid) FAST_FUNC;
     812char* xgid2group(gid_t gid) FAST_FUNC;
     813char* uid2uname(uid_t uid) FAST_FUNC;
     814char* gid2group(gid_t gid) FAST_FUNC;
     815char* uid2uname_utoa(long uid) FAST_FUNC;
     816char* gid2group_utoa(long gid) FAST_FUNC;
    502817/* versions which cache results (useful for ps, ls etc) */
    503 const char* get_cached_username(uid_t uid);
    504 const char* get_cached_groupname(gid_t gid);
    505 void clear_username_cache(void);
     818const char* get_cached_username(uid_t uid) FAST_FUNC;
     819const char* get_cached_groupname(gid_t gid) FAST_FUNC;
     820void clear_username_cache(void) FAST_FUNC;
    506821/* internally usernames are saved in fixed-sized char[] buffers */
    507822enum { USERNAME_MAX_SIZE = 16 - sizeof(int) };
    508 
    509 
    510 struct bb_applet;
    511 int execable_file(const char *name);
    512 char *find_execable(const char *filename);
    513 int exists_execable(const char *filename);
    514 
     823#if ENABLE_FEATURE_CHECK_NAMES
     824void die_if_bad_username(const char* name) FAST_FUNC;
     825#else
     826#define die_if_bad_username(name) ((void)(name))
     827#endif
     828
     829#if ENABLE_FEATURE_UTMP
     830void FAST_FUNC write_new_utmp(pid_t pid, int new_type, const char *tty_name, const char *username, const char *hostname);
     831void FAST_FUNC update_utmp(pid_t pid, int new_type, const char *tty_name, const char *username, const char *hostname);
     832#else
     833# define write_new_utmp(pid, new_type, tty_name, username, hostname) ((void)0)
     834# define update_utmp(pid, new_type, tty_name, username, hostname) ((void)0)
     835#endif
     836
     837int execable_file(const char *name) FAST_FUNC;
     838char *find_execable(const char *filename, char **PATHp) FAST_FUNC;
     839int exists_execable(const char *filename) FAST_FUNC;
     840
     841/* BB_EXECxx always execs (it's not doing NOFORK/NOEXEC stuff),
     842 * but it may exec busybox and call applet instead of searching PATH.
     843 */
    515844#if ENABLE_FEATURE_PREFER_APPLETS
    516 int bb_execvp(const char *file, char *const argv[]);
     845int bb_execvp(const char *file, char *const argv[]) FAST_FUNC;
    517846#define BB_EXECVP(prog,cmd) bb_execvp(prog,cmd)
    518847#define BB_EXECLP(prog,cmd,...) \
    519     execlp((find_applet_by_name(prog)) ? CONFIG_BUSYBOX_EXEC_PATH : prog, \
     848    execlp((find_applet_by_name(prog) >= 0) ? CONFIG_BUSYBOX_EXEC_PATH : prog, \
    520849        cmd, __VA_ARGS__)
    521850#else
     
    523852#define BB_EXECLP(prog,cmd,...) execlp(prog,cmd, __VA_ARGS__)
    524853#endif
    525 
    526 /* NOMMU friendy fork+exec */
    527 pid_t spawn(char **argv);
    528 pid_t xspawn(char **argv);
    529 
    530 /* Unlike waitpid, waits ONLY for one process,
     854int BB_EXECVP_or_die(char **argv) NORETURN FAST_FUNC;
     855
     856/* xvfork() can't be a _function_, return after vfork mangles stack
     857 * in the parent. It must be a macro. */
     858#define xvfork() \
     859({ \
     860    pid_t bb__xvfork_pid = vfork(); \
     861    if (bb__xvfork_pid < 0) \
     862        bb_perror_msg_and_die("vfork"); \
     863    bb__xvfork_pid; \
     864})
     865#if BB_MMU
     866pid_t xfork(void) FAST_FUNC;
     867#endif
     868
     869/* NOMMU friendy fork+exec: */
     870pid_t spawn(char **argv) FAST_FUNC;
     871pid_t xspawn(char **argv) FAST_FUNC;
     872
     873pid_t safe_waitpid(pid_t pid, int *wstat, int options) FAST_FUNC;
     874pid_t wait_any_nohang(int *wstat) FAST_FUNC;
     875/* wait4pid: unlike waitpid, waits ONLY for one process.
     876 * Returns sig + 0x180 if child is killed by signal.
    531877 * It's safe to pass negative 'pids' from failed [v]fork -
    532878 * wait4pid will return -1 (and will not clobber [v]fork's errno).
    533879 * IOW: rc = wait4pid(spawn(argv));
    534880 *      if (rc < 0) bb_perror_msg("%s", argv[0]);
    535  *      if (rc > 0) bb_error_msg("exit code: %d", rc);
     881 *      if (rc > 0) bb_error_msg("exit code: %d", rc & 0xff);
    536882 */
    537 int wait4pid(int pid);
    538 int wait_pid(int *wstat, int pid);
    539 int wait_nohang(int *wstat);
    540 #define wait_crashed(w) ((w) & 127)
    541 #define wait_exitcode(w) ((w) >> 8)
    542 #define wait_stopsig(w) ((w) >> 8)
    543 #define wait_stopped(w) (((w) & 127) == 127)
    544 /* wait4pid(spawn(argv)) + NOFORK/NOEXEC (if configured) */
    545 int spawn_and_wait(char **argv);
     883int wait4pid(pid_t pid) FAST_FUNC;
     884/* Same as wait4pid(spawn(argv)), but with NOFORK/NOEXEC if configured: */
     885int spawn_and_wait(char **argv) FAST_FUNC;
    546886struct nofork_save_area {
    547887    jmp_buf die_jmp;
    548     const struct bb_applet *current_applet;
    549     int xfunc_error_retval;
     888    const char *applet_name;
    550889    uint32_t option_mask32;
    551890    int die_sleep;
     891    uint8_t xfunc_error_retval;
    552892    smallint saved;
    553893};
    554 void save_nofork_data(struct nofork_save_area *save);
    555 void restore_nofork_data(struct nofork_save_area *save);
     894void save_nofork_data(struct nofork_save_area *save) FAST_FUNC;
     895void restore_nofork_data(struct nofork_save_area *save) FAST_FUNC;
    556896/* Does NOT check that applet is NOFORK, just blindly runs it */
    557 int run_nofork_applet(const struct bb_applet *a, char **argv);
    558 int run_nofork_applet_prime(struct nofork_save_area *old, const struct bb_applet *a, char **argv);
     897int run_nofork_applet(int applet_no, char **argv) FAST_FUNC;
     898int run_nofork_applet_prime(struct nofork_save_area *old, int applet_no, char **argv) FAST_FUNC;
    559899
    560900/* Helpers for daemonization.
     
    572912 * (will do setsid()).
    573913 *
    574  * forkexit_or_rexec(argv) = bare-bones "fork + parent exits" on MMU,
     914 * fork_or_rexec(argv) = bare-bones fork on MMU,
    575915 *      "vfork + re-exec ourself" on NOMMU. No fd redirection, no setsid().
    576  *      Currently used for openvt. On MMU ignores argv.
     916 *      On MMU ignores argv.
    577917 *
    578918 * Helper for network daemons in foreground mode:
     
    588928};
    589929#if BB_MMU
    590   void forkexit_or_rexec(void);
    591930  enum { re_execed = 0 };
    592 # define forkexit_or_rexec(argv)            forkexit_or_rexec()
     931# define fork_or_rexec(argv)                xfork()
    593932# define bb_daemonize_or_rexec(flags, argv) bb_daemonize_or_rexec(flags)
    594933# define bb_daemonize(flags)                bb_daemonize_or_rexec(flags, bogus)
    595934#else
    596   void re_exec(char **argv) ATTRIBUTE_NORETURN;
    597   void forkexit_or_rexec(char **argv);
    598935  extern bool re_execed;
     936  void re_exec(char **argv) NORETURN FAST_FUNC;
     937  pid_t fork_or_rexec(char **argv) FAST_FUNC;
     938  int  BUG_fork_is_unavailable_on_nommu(void) FAST_FUNC;
     939  int  BUG_daemon_is_unavailable_on_nommu(void) FAST_FUNC;
     940  void BUG_bb_daemonize_is_unavailable_on_nommu(void) FAST_FUNC;
    599941# define fork()          BUG_fork_is_unavailable_on_nommu()
     942# define xfork()         BUG_fork_is_unavailable_on_nommu()
    600943# define daemon(a,b)     BUG_daemon_is_unavailable_on_nommu()
    601944# define bb_daemonize(a) BUG_bb_daemonize_is_unavailable_on_nommu()
    602945#endif
    603 void bb_daemonize_or_rexec(int flags, char **argv);
    604 void bb_sanitize_stdio(void);
    605 
    606 
     946void bb_daemonize_or_rexec(int flags, char **argv) FAST_FUNC;
     947void bb_sanitize_stdio(void) FAST_FUNC;
     948/* Clear dangerous stuff, set PATH. Return 1 if was run by different user. */
     949int sanitize_env_if_suid(void) FAST_FUNC;
     950
     951
     952char* single_argv(char **argv) FAST_FUNC;
     953extern const char *const bb_argv_dash[]; /* "-", NULL */
    607954extern const char *opt_complementary;
    608 #if ENABLE_GETOPT_LONG
     955#if ENABLE_LONG_OPTS || ENABLE_FEATURE_GETOPT_LONG
    609956#define No_argument "\0"
    610957#define Required_argument "\001"
     
    613960#endif
    614961extern uint32_t option_mask32;
    615 extern uint32_t getopt32(char **argv, const char *applet_opts, ...);
     962extern uint32_t getopt32(char **argv, const char *applet_opts, ...) FAST_FUNC;
    616963
    617964
     
    620967    struct llist_t *link;
    621968} llist_t;
    622 void llist_add_to(llist_t **old_head, void *data);
    623 void llist_add_to_end(llist_t **list_head, void *data);
    624 void *llist_pop(llist_t **elm);
    625 void llist_unlink(llist_t **head, llist_t *elm);
    626 void llist_free(llist_t *elm, void (*freeit)(void *data));
    627 llist_t *llist_rev(llist_t *list);
     969void llist_add_to(llist_t **old_head, void *data) FAST_FUNC;
     970void llist_add_to_end(llist_t **list_head, void *data) FAST_FUNC;
     971void *llist_pop(llist_t **elm) FAST_FUNC;
     972void llist_unlink(llist_t **head, llist_t *elm) FAST_FUNC;
     973void llist_free(llist_t *elm, void (*freeit)(void *data)) FAST_FUNC;
     974llist_t *llist_rev(llist_t *list) FAST_FUNC;
     975llist_t *llist_find_str(llist_t *first, const char *str) FAST_FUNC;
    628976/* BTW, surprisingly, changing API to
    629977 *   llist_t *llist_add_to(llist_t *old_head, void *data)
     
    635983/* True only if we created pidfile which is *file*, not /dev/null etc */
    636984extern smallint wrote_pidfile;
    637 void write_pidfile(const char *path);
     985void write_pidfile(const char *path) FAST_FUNC;
    638986#define remove_pidfile(path) do { if (wrote_pidfile) unlink(path); } while (0)
    639987#else
     
    6521000extern smallint logmode;
    6531001extern int die_sleep;
    654 extern int xfunc_error_retval;
     1002extern uint8_t xfunc_error_retval;
    6551003extern jmp_buf die_jmp;
    656 extern void xfunc_die(void) ATTRIBUTE_NORETURN;
    657 extern void bb_show_usage(void) ATTRIBUTE_NORETURN ATTRIBUTE_EXTERNALLY_VISIBLE;
    658 extern void bb_error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
    659 extern void bb_error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2)));
    660 extern void bb_perror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
    661 extern void bb_perror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2)));
    662 extern void bb_herror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
    663 extern void bb_herror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2)));
    664 extern void bb_perror_nomsg_and_die(void) ATTRIBUTE_NORETURN;
    665 extern void bb_perror_nomsg(void);
    666 extern void bb_info_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));
    667 extern void bb_verror_msg(const char *s, va_list p, const char *strerr);
    668 
    669 
    670 /* applets which are useful from another applets */
     1004extern void xfunc_die(void) NORETURN FAST_FUNC;
     1005extern void bb_show_usage(void) NORETURN FAST_FUNC;
     1006extern void bb_error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
     1007extern void bb_error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC;
     1008extern void bb_perror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
     1009extern void bb_simple_perror_msg(const char *s) FAST_FUNC;
     1010extern void bb_perror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC;
     1011extern void bb_simple_perror_msg_and_die(const char *s) NORETURN FAST_FUNC;
     1012extern void bb_herror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
     1013extern void bb_herror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC;
     1014extern void bb_perror_nomsg_and_die(void) NORETURN FAST_FUNC;
     1015extern void bb_perror_nomsg(void) FAST_FUNC;
     1016extern void bb_info_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
     1017extern void bb_verror_msg(const char *s, va_list p, const char *strerr) FAST_FUNC;
     1018
     1019/* We need to export XXX_main from libbusybox
     1020 * only if we build "individual" binaries
     1021 */
     1022#if ENABLE_FEATURE_INDIVIDUAL
     1023#define MAIN_EXTERNALLY_VISIBLE EXTERNALLY_VISIBLE
     1024#else
     1025#define MAIN_EXTERNALLY_VISIBLE
     1026#endif
     1027
     1028
     1029/* Applets which are useful from another applets */
    6711030int bb_cat(char** argv);
    672 int bb_echo(char** argv);
    673 int test_main(int argc, char** argv);
    674 int kill_main(int argc, char **argv);
     1031/* If shell needs them, they exist even if not enabled as applets */
     1032int echo_main(int argc, char** argv) IF_ECHO(MAIN_EXTERNALLY_VISIBLE);
     1033int printf_main(int argc, char **argv) IF_PRINTF(MAIN_EXTERNALLY_VISIBLE);
     1034int test_main(int argc, char **argv) IF_TEST(MAIN_EXTERNALLY_VISIBLE);
     1035int kill_main(int argc, char **argv) IF_KILL(MAIN_EXTERNALLY_VISIBLE);
     1036/* Similar, but used by chgrp, not shell */
     1037int chown_main(int argc, char **argv) IF_CHOWN(MAIN_EXTERNALLY_VISIBLE);
     1038/* Used by ftpd */
     1039int ls_main(int argc, char **argv) IF_LS(MAIN_EXTERNALLY_VISIBLE);
     1040/* Don't need IF_xxx() guard for these */
     1041int gunzip_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     1042int bunzip2_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
     1043
    6751044#if ENABLE_ROUTE
    676 void bb_displayroutes(int noresolve, int netstatfmt);
    677 #endif
    678 int chown_main(int argc, char **argv);
    679 #if ENABLE_GUNZIP
    680 int gunzip_main(int argc, char **argv);
    681 #endif
    682 int bbunpack(char **argv,
    683     char* (*make_new_name)(char *filename),
    684     USE_DESKTOP(long long) int (*unpacker)(void)
    685 );
     1045void bb_displayroutes(int noresolve, int netstatfmt) FAST_FUNC;
     1046#endif
    6861047
    6871048
    6881049/* Networking */
    689 int create_icmp_socket(void);
    690 int create_icmp6_socket(void);
     1050int create_icmp_socket(void) FAST_FUNC;
     1051int create_icmp6_socket(void) FAST_FUNC;
    6911052/* interface.c */
    6921053/* This structure defines protocol families and their handlers. */
     
    6961057    int af;
    6971058    int alen;
    698     char *(*print) (unsigned char *);
    699     const char *(*sprint) (struct sockaddr *, int numeric);
    700     int (*input) (/*int type,*/ const char *bufp, struct sockaddr *);
    701     void (*herror) (char *text);
    702     int (*rprint) (int options);
    703     int (*rinput) (int typ, int ext, char **argv);
    704 
     1059    char*       FAST_FUNC (*print)(unsigned char *);
     1060    const char* FAST_FUNC (*sprint)(struct sockaddr *, int numeric);
     1061    int         FAST_FUNC (*input)(/*int type,*/ const char *bufp, struct sockaddr *);
     1062    void        FAST_FUNC (*herror)(char *text);
     1063    int         FAST_FUNC (*rprint)(int options);
     1064    int         FAST_FUNC (*rinput)(int typ, int ext, char **argv);
    7051065    /* may modify src */
    706     int (*getmask) (char *src, struct sockaddr * mask, char *name);
     1066    int         FAST_FUNC (*getmask)(char *src, struct sockaddr *mask, char *name);
    7071067};
    7081068/* This structure defines hardware protocols and their handlers. */
     
    7121072    int type;
    7131073    int alen;
    714     char *(*print) (unsigned char *);
    715     int (*input) (const char *, struct sockaddr *);
    716     int (*activate) (int fd);
     1074    char* FAST_FUNC (*print)(unsigned char *);
     1075    int   FAST_FUNC (*input)(const char *, struct sockaddr *);
     1076    int   FAST_FUNC (*activate)(int fd);
    7171077    int suppress_null_addr;
    7181078};
    7191079extern smallint interface_opt_a;
    720 int display_interfaces(char *ifname);
    721 const struct aftype *get_aftype(const char *name);
    722 const struct hwtype *get_hwtype(const char *name);
    723 const struct hwtype *get_hwntype(int type);
     1080int display_interfaces(char *ifname) FAST_FUNC;
     1081#if ENABLE_FEATURE_HWIB
     1082int in_ib(const char *bufp, struct sockaddr *sap) FAST_FUNC;
     1083#else
     1084#define in_ib(a, b) 1 /* fail */
     1085#endif
     1086const struct aftype *get_aftype(const char *name) FAST_FUNC;
     1087const struct hwtype *get_hwtype(const char *name) FAST_FUNC;
     1088const struct hwtype *get_hwntype(int type) FAST_FUNC;
    7241089
    7251090
    7261091#ifndef BUILD_INDIVIDUAL
    727 extern const struct bb_applet *find_applet_by_name(const char *name);
     1092extern int find_applet_by_name(const char *name) FAST_FUNC;
    7281093/* Returns only if applet is not found. */
    729 extern void run_applet_and_exit(const char *name, char **argv);
    730 extern void run_current_applet_and_exit(char **argv) ATTRIBUTE_NORETURN;
    731 #endif
    732 
    733 extern int match_fstype(const struct mntent *mt, const char *fstypes);
    734 extern struct mntent *find_mount_point(const char *name, const char *table);
    735 extern void erase_mtab(const char * name);
    736 extern unsigned int tty_baud_to_value(speed_t speed);
    737 extern speed_t tty_value_to_baud(unsigned int value);
    738 extern void bb_warn_ignoring_args(int n);
    739 
    740 extern int get_linux_version_code(void);
    741 
    742 extern char *query_loop(const char *device);
    743 extern int del_loop(const char *device);
     1094extern void run_applet_and_exit(const char *name, char **argv) FAST_FUNC;
     1095extern void run_applet_no_and_exit(int a, char **argv) NORETURN FAST_FUNC;
     1096#endif
     1097
     1098#ifdef HAVE_MNTENT_H
     1099extern int match_fstype(const struct mntent *mt, const char *fstypes) FAST_FUNC;
     1100extern struct mntent *find_mount_point(const char *name, int subdir_too) FAST_FUNC;
     1101#endif
     1102extern void erase_mtab(const char * name) FAST_FUNC;
     1103extern unsigned int tty_baud_to_value(speed_t speed) FAST_FUNC;
     1104extern speed_t tty_value_to_baud(unsigned int value) FAST_FUNC;
     1105#if ENABLE_DESKTOP
     1106extern void bb_warn_ignoring_args(char *arg) FAST_FUNC;
     1107#else
     1108# define bb_warn_ignoring_args(arg) ((void)0)
     1109#endif
     1110
     1111extern int get_linux_version_code(void) FAST_FUNC;
     1112
     1113extern char *query_loop(const char *device) FAST_FUNC;
     1114extern int del_loop(const char *device) FAST_FUNC;
    7441115/* If *devname is not NULL, use that name, otherwise try to find free one,
    7451116 * malloc and return it in *devname.
    7461117 * return value: 1: read-only loopdev was setup, 0: rw, < 0: error */
    747 extern int set_loop(char **devname, const char *file, unsigned long long offset);
    748 
    749 
     1118extern int set_loop(char **devname, const char *file, unsigned long long offset) FAST_FUNC;
     1119
     1120/* Like bb_ask below, but asks on stdin with no timeout.  */
     1121char *bb_ask_stdin(const char * prompt) FAST_FUNC;
    7501122//TODO: pass buf pointer or return allocated buf (avoid statics)?
    751 char *bb_askpass(int timeout, const char * prompt);
    752 int bb_ask_confirmation(void);
    753 int klogctl(int type, char * b, int len);
    754 
    755 extern int bb_parse_mode(const char* s, mode_t* theMode);
    756 
    757 char *concat_path_file(const char *path, const char *filename);
    758 char *concat_subpath_file(const char *path, const char *filename);
    759 const char *bb_basename(const char *name);
     1123char *bb_ask(const int fd, int timeout, const char * prompt) FAST_FUNC;
     1124int bb_ask_confirmation(void) FAST_FUNC;
     1125
     1126int bb_parse_mode(const char* s, mode_t* theMode) FAST_FUNC;
     1127
     1128/*
     1129 * Config file parser
     1130 */
     1131enum {
     1132    PARSE_COLLAPSE  = 0x00010000, // treat consecutive delimiters as one
     1133    PARSE_TRIM      = 0x00020000, // trim leading and trailing delimiters
     1134// TODO: COLLAPSE and TRIM seem to always go in pair
     1135    PARSE_GREEDY    = 0x00040000, // last token takes entire remainder of the line
     1136    PARSE_MIN_DIE   = 0x00100000, // die if < min tokens found
     1137    // keep a copy of current line
     1138    PARSE_KEEP_COPY = 0x00200000 * ENABLE_FEATURE_CROND_D,
     1139//  PARSE_ESCAPE    = 0x00400000, // process escape sequences in tokens
     1140    // NORMAL is:
     1141    // * remove leading and trailing delimiters and collapse
     1142    //   multiple delimiters into one
     1143    // * warn and continue if less than mintokens delimiters found
     1144    // * grab everything into last token
     1145    PARSE_NORMAL    = PARSE_COLLAPSE | PARSE_TRIM | PARSE_GREEDY,
     1146};
     1147typedef struct parser_t {
     1148    FILE *fp;
     1149    char *line;
     1150    char *data;
     1151    int lineno;
     1152} parser_t;
     1153parser_t* config_open(const char *filename) FAST_FUNC;
     1154parser_t* config_open2(const char *filename, FILE* FAST_FUNC (*fopen_func)(const char *path)) FAST_FUNC;
     1155/* delims[0] is a comment char (use '\0' to disable), the rest are token delimiters */
     1156int config_read(parser_t *parser, char **tokens, unsigned flags, const char *delims) FAST_FUNC;
     1157#define config_read(parser, tokens, max, min, str, flags) \
     1158    config_read(parser, tokens, ((flags) | (((min) & 0xFF) << 8) | ((max) & 0xFF)), str)
     1159void config_close(parser_t *parser) FAST_FUNC;
     1160
     1161/* Concatenate path and filename to new allocated buffer.
     1162 * Add "/" only as needed (no duplicate "//" are produced).
     1163 * If path is NULL, it is assumed to be "/".
     1164 * filename should not be NULL. */
     1165char *concat_path_file(const char *path, const char *filename) FAST_FUNC;
     1166char *concat_subpath_file(const char *path, const char *filename) FAST_FUNC;
     1167const char *bb_basename(const char *name) FAST_FUNC;
    7601168/* NB: can violate const-ness (similarly to strchr) */
    761 char *last_char_is(const char *s, int c);
    762 
    763 
    764 USE_DESKTOP(long long) int uncompress(int fd_in, int fd_out);
    765 int inflate(int in, int out);
    766 
    767 
    768 int bb_make_directory(char *path, long mode, int flags);
    769 
    770 int get_signum(const char *name);
    771 const char *get_signame(int number);
    772 
    773 char *bb_simplify_path(const char *path);
     1169char *last_char_is(const char *s, int c) FAST_FUNC;
     1170
     1171
     1172int bb_make_directory(char *path, long mode, int flags) FAST_FUNC;
     1173
     1174int get_signum(const char *name) FAST_FUNC;
     1175const char *get_signame(int number) FAST_FUNC;
     1176void print_signames(void) FAST_FUNC;
     1177
     1178char *bb_simplify_path(const char *path) FAST_FUNC;
     1179/* Returns ptr to NUL */
     1180char *bb_simplify_abs_path_inplace(char *path) FAST_FUNC;
    7741181
    7751182#define FAIL_DELAY 3
    776 extern void bb_do_delay(int seconds);
    777 extern void change_identity(const struct passwd *pw);
    778 extern const char *change_identity_e2str(const struct passwd *pw);
    779 extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args) ATTRIBUTE_NORETURN;
     1183extern void bb_do_delay(int seconds) FAST_FUNC;
     1184extern void change_identity(const struct passwd *pw) FAST_FUNC;
     1185extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args) NORETURN FAST_FUNC;
    7801186#if ENABLE_SELINUX
    781 extern void renew_current_security_context(void);
    782 extern void set_current_security_context(security_context_t sid);
     1187extern void renew_current_security_context(void) FAST_FUNC;
     1188extern void set_current_security_context(security_context_t sid) FAST_FUNC;
    7831189extern context_t set_security_context_component(security_context_t cur_context,
    784                         char *user, char *role, char *type, char *range);
    785 extern void setfscreatecon_or_die(security_context_t scontext);
    786 #endif
    787 extern void selinux_or_die(void);
    788 extern int restricted_shell(const char *shell);
    789 extern void setup_environment(const char *shell, int loginshell, int changeenv, const struct passwd *pw);
    790 extern int correct_password(const struct passwd *pw);
    791 /* Returns a ptr to static storage */
    792 extern char *pw_encrypt(const char *clear, const char *salt);
    793 extern int obscure(const char *old, const char *newval, const struct passwd *pwdp);
    794 extern int index_in_str_array(const char *const string_array[], const char *key);
    795 extern int index_in_strings(const char *strings, const char *key);
    796 extern int index_in_substr_array(const char *const string_array[], const char *key);
    797 extern int index_in_substrings(const char *strings, const char *key);
    798 extern void print_login_issue(const char *issue_file, const char *tty);
    799 extern void print_login_prompt(void);
    800 
     1190                        char *user, char *role, char *type, char *range) FAST_FUNC;
     1191extern void setfscreatecon_or_die(security_context_t scontext) FAST_FUNC;
     1192extern void selinux_preserve_fcontext(int fdesc) FAST_FUNC;
     1193#else
     1194#define selinux_preserve_fcontext(fdesc) ((void)0)
     1195#endif
     1196extern void selinux_or_die(void) FAST_FUNC;
     1197
     1198/* setup_environment:
     1199 * if chdir pw->pw_dir: ok: else if to_tmp == 1: goto /tmp else: goto / or die
     1200 * if clear_env = 1: cd(pw->pw_dir), clear environment, then set
     1201 *   TERM=(old value)
     1202 *   USER=pw->pw_name, LOGNAME=pw->pw_name
     1203 *   PATH=bb_default_[root_]path
     1204 *   HOME=pw->pw_dir
     1205 *   SHELL=shell
     1206 * else if change_env = 1:
     1207 *   if not root (if pw->pw_uid != 0):
     1208 *     USER=pw->pw_name, LOGNAME=pw->pw_name
     1209 *   HOME=pw->pw_dir
     1210 *   SHELL=shell
     1211 * else does nothing
     1212 */
     1213#define SETUP_ENV_CHANGEENV (1 << 0)
     1214#define SETUP_ENV_CLEARENV  (1 << 1)
     1215#define SETUP_ENV_TO_TMP    (1 << 2)
     1216extern void setup_environment(const char *shell, int flags, const struct passwd *pw) FAST_FUNC;
     1217extern int correct_password(const struct passwd *pw) FAST_FUNC;
     1218/* Returns a malloced string */
     1219#if !ENABLE_USE_BB_CRYPT
     1220#define pw_encrypt(clear, salt, cleanup) pw_encrypt(clear, salt)
     1221#endif
     1222extern char *pw_encrypt(const char *clear, const char *salt, int cleanup) FAST_FUNC;
     1223extern int obscure(const char *old, const char *newval, const struct passwd *pwdp) FAST_FUNC;
    8011224/* rnd is additional random input. New one is returned.
    8021225 * Useful if you call crypt_make_salt many times in a row:
     
    8061229 * (otherwise we risk having same salt generated)
    8071230 */
    808 extern int crypt_make_salt(char *p, int cnt, int rnd);
     1231extern int crypt_make_salt(char *p, int cnt, int rnd) FAST_FUNC;
    8091232
    8101233/* Returns number of lines changed, or -1 on error */
    811 extern int update_passwd(const char *filename, const char *username,
    812             const char *new_pw);
    813 
     1234#if !(ENABLE_FEATURE_ADDUSER_TO_GROUP || ENABLE_FEATURE_DEL_USER_FROM_GROUP)
     1235#define update_passwd(filename, username, data, member) \
     1236    update_passwd(filename, username, data)
     1237#endif
     1238extern int update_passwd(const char *filename,
     1239        const char *username,
     1240        const char *data,
     1241        const char *member) FAST_FUNC;
     1242
     1243int index_in_str_array(const char *const string_array[], const char *key) FAST_FUNC;
     1244int index_in_strings(const char *strings, const char *key) FAST_FUNC;
     1245int index_in_substr_array(const char *const string_array[], const char *key) FAST_FUNC;
     1246int index_in_substrings(const char *strings, const char *key) FAST_FUNC;
     1247const char *nth_string(const char *strings, int n) FAST_FUNC;
     1248
     1249extern void print_login_issue(const char *issue_file, const char *tty) FAST_FUNC;
     1250extern void print_login_prompt(void) FAST_FUNC;
     1251
     1252char *xmalloc_ttyname(int fd) FAST_FUNC RETURNS_MALLOC;
    8141253/* NB: typically you want to pass fd 0, not 1. Think 'applet | grep something' */
    815 int get_terminal_width_height(int fd, int *width, int *height);
    816 
    817 int ioctl_or_perror(int fd, int request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5)));
    818 void ioctl_or_perror_and_die(int fd, int request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5)));
     1254int get_terminal_width_height(int fd, unsigned *width, unsigned *height) FAST_FUNC;
     1255
     1256int tcsetattr_stdin_TCSANOW(const struct termios *tp) FAST_FUNC;
     1257
     1258/* NB: "unsigned request" is crucial! "int request" will break some arches! */
     1259int ioctl_or_perror(int fd, unsigned request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5))) FAST_FUNC;
     1260int ioctl_or_perror_and_die(int fd, unsigned request, void *argp, const char *fmt,...) __attribute__ ((format (printf, 4, 5))) FAST_FUNC;
    8191261#if ENABLE_IOCTL_HEX2STR_ERROR
    820 int bb_ioctl_or_warn(int fd, int request, void *argp, const char *ioctl_name);
    821 void bb_xioctl(int fd, int request, void *argp, const char *ioctl_name);
     1262int bb_ioctl_or_warn(int fd, unsigned request, void *argp, const char *ioctl_name) FAST_FUNC;
     1263int bb_xioctl(int fd, unsigned request, void *argp, const char *ioctl_name) FAST_FUNC;
    8221264#define ioctl_or_warn(fd,request,argp) bb_ioctl_or_warn(fd,request,argp,#request)
    8231265#define xioctl(fd,request,argp)        bb_xioctl(fd,request,argp,#request)
    8241266#else
    825 int bb_ioctl_or_warn(int fd, int request, void *argp);
    826 void bb_xioctl(int fd, int request, void *argp);
     1267int bb_ioctl_or_warn(int fd, unsigned request, void *argp) FAST_FUNC;
     1268int bb_xioctl(int fd, unsigned request, void *argp) FAST_FUNC;
    8271269#define ioctl_or_warn(fd,request,argp) bb_ioctl_or_warn(fd,request,argp)
    8281270#define xioctl(fd,request,argp)        bb_xioctl(fd,request,argp)
    8291271#endif
    8301272
    831 char *is_in_ino_dev_hashtable(const struct stat *statbuf);
    832 void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name);
    833 void reset_ino_dev_hashtable(void);
     1273char *is_in_ino_dev_hashtable(const struct stat *statbuf) FAST_FUNC;
     1274void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name) FAST_FUNC;
     1275void reset_ino_dev_hashtable(void) FAST_FUNC;
    8341276#ifdef __GLIBC__
    8351277/* At least glibc has horrendously large inline for this, so wrap it */
    836 unsigned long long bb_makedev(unsigned int major, unsigned int minor);
     1278unsigned long long bb_makedev(unsigned int major, unsigned int minor) FAST_FUNC;
    8371279#undef makedev
    8381280#define makedev(a,b) bb_makedev(a,b)
     
    8401282
    8411283
     1284/* "Keycodes" that report an escape sequence.
     1285 * We use something which fits into signed char,
     1286 * yet doesn't represent any valid Unicode character.
     1287 * Also, -1 is reserved for error indication and we don't use it. */
     1288enum {
     1289    KEYCODE_UP       =  -2,
     1290    KEYCODE_DOWN     =  -3,
     1291    KEYCODE_RIGHT    =  -4,
     1292    KEYCODE_LEFT     =  -5,
     1293    KEYCODE_HOME     =  -6,
     1294    KEYCODE_END      =  -7,
     1295    KEYCODE_INSERT   =  -8,
     1296    KEYCODE_DELETE   =  -9,
     1297    KEYCODE_PAGEUP   = -10,
     1298    KEYCODE_PAGEDOWN = -11,
     1299
     1300    KEYCODE_CTRL_UP    = KEYCODE_UP    & ~0x40,
     1301    KEYCODE_CTRL_DOWN  = KEYCODE_DOWN  & ~0x40,
     1302    KEYCODE_CTRL_RIGHT = KEYCODE_RIGHT & ~0x40,
     1303    KEYCODE_CTRL_LEFT  = KEYCODE_LEFT  & ~0x40,
     1304#if 0
     1305    KEYCODE_FUN1     = -12,
     1306    KEYCODE_FUN2     = -13,
     1307    KEYCODE_FUN3     = -14,
     1308    KEYCODE_FUN4     = -15,
     1309    KEYCODE_FUN5     = -16,
     1310    KEYCODE_FUN6     = -17,
     1311    KEYCODE_FUN7     = -18,
     1312    KEYCODE_FUN8     = -19,
     1313    KEYCODE_FUN9     = -20,
     1314    KEYCODE_FUN10    = -21,
     1315    KEYCODE_FUN11    = -22,
     1316    KEYCODE_FUN12    = -23,
     1317#endif
     1318    KEYCODE_CURSOR_POS = -0x100, /* 0xfff..fff00 */
     1319    /* How long is the longest ESC sequence we know?
     1320     * We want it big enough to be able to contain
     1321     * cursor position sequence "ESC [ 9999 ; 9999 R"
     1322     */
     1323    KEYCODE_BUFFER_SIZE = 16
     1324};
     1325/* Note: fd may be in blocking or non-blocking mode, both make sense.
     1326 * For one, less uses non-blocking mode.
     1327 * Only the first read syscall inside read_key may block indefinitely
     1328 * (unless fd is in non-blocking mode),
     1329 * subsequent reads will time out after a few milliseconds.
     1330 * Return of -1 means EOF or error (errno == 0 on EOF).
     1331 * buffer[0] is used as a counter of buffered chars and must be 0
     1332 * on first call.
     1333 * timeout:
     1334 * -2: do not poll for input;
     1335 * -1: poll(-1) (i.e. block);
     1336 * >=0: poll for TIMEOUT milliseconds, return -1/EAGAIN on timeout
     1337 */
     1338int64_t read_key(int fd, char *buffer, int timeout) FAST_FUNC;
     1339void read_key_ungets(char *buffer, const char *str, unsigned len) FAST_FUNC;
     1340
     1341
    8421342#if ENABLE_FEATURE_EDITING
    8431343/* It's NOT just ENABLEd or disabled. It's a number: */
    844 #ifdef CONFIG_FEATURE_EDITING_HISTORY
    845 #define MAX_HISTORY (CONFIG_FEATURE_EDITING_HISTORY + 0)
    846 #else
    847 #define MAX_HISTORY 0
    848 #endif
     1344# ifdef CONFIG_FEATURE_EDITING_HISTORY
     1345#  define MAX_HISTORY (CONFIG_FEATURE_EDITING_HISTORY + 0)
     1346# else
     1347#  define MAX_HISTORY 0
     1348# endif
    8491349typedef struct line_input_t {
    8501350    int flags;
    8511351    const char *path_lookup;
    852 #if MAX_HISTORY
     1352# if MAX_HISTORY
    8531353    int cnt_history;
    8541354    int cur_history;
    855     USE_FEATURE_EDITING_SAVEHISTORY(const char *hist_file;)
     1355#  if ENABLE_FEATURE_EDITING_SAVEHISTORY
     1356    unsigned cnt_history_in_file;
     1357    const char *hist_file;
     1358#  endif
    8561359    char *history[MAX_HISTORY + 1];
    857 #endif
     1360# endif
    8581361} line_input_t;
    8591362enum {
     
    8661369    FOR_SHELL = DO_HISTORY | SAVE_HISTORY | TAB_COMPLETION | USERNAME_COMPLETION,
    8671370};
    868 line_input_t *new_line_input_t(int flags);
    869 int read_line_input(const char* prompt, char* command, int maxsize, line_input_t *state);
    870 #else
    871 int read_line_input(const char* prompt, char* command, int maxsize);
     1371line_input_t *new_line_input_t(int flags) FAST_FUNC;
     1372/* So far static: void free_line_input_t(line_input_t *n) FAST_FUNC; */
     1373/* maxsize must be >= 2.
     1374 * Returns:
     1375 * -1 on read errors or EOF, or on bare Ctrl-D,
     1376 * 0  on ctrl-C (the line entered is still returned in 'command'),
     1377 * >0 length of input string, including terminating '\n'
     1378 */
     1379int read_line_input(const char* prompt, char* command, int maxsize, line_input_t *state) FAST_FUNC;
     1380#else
     1381#define MAX_HISTORY 0
     1382int read_line_input(const char* prompt, char* command, int maxsize) FAST_FUNC;
    8721383#define read_line_input(prompt, command, maxsize, state) \
    8731384    read_line_input(prompt, command, maxsize)
     
    8761387
    8771388#ifndef COMM_LEN
    878 #ifdef TASK_COMM_LEN
     1389# ifdef TASK_COMM_LEN
    8791390enum { COMM_LEN = TASK_COMM_LEN };
    880 #else
     1391# else
    8811392/* synchronize with sizeof(task_struct.comm) in /usr/include/linux/sched.h */
    8821393enum { COMM_LEN = 16 };
    883 #endif
    884 #endif
    885 typedef struct {
     1394# endif
     1395#endif
     1396
     1397struct smaprec {
     1398    unsigned long mapped_rw;
     1399    unsigned long mapped_ro;
     1400    unsigned long shared_clean;
     1401    unsigned long shared_dirty;
     1402    unsigned long private_clean;
     1403    unsigned long private_dirty;
     1404    unsigned long stack;
     1405    unsigned long smap_pss, smap_swap;
     1406    unsigned long smap_size;
     1407    unsigned long smap_start;
     1408    char smap_mode[5];
     1409    char *smap_name;
     1410};
     1411
     1412#if !ENABLE_PMAP
     1413#define procps_read_smaps(pid, total, cb, data) \
     1414    procps_read_smaps(pid, total)
     1415#endif
     1416int FAST_FUNC procps_read_smaps(pid_t pid, struct smaprec *total,
     1417              void (*cb)(struct smaprec *, void *), void *data);
     1418
     1419typedef struct procps_status_t {
    8861420    DIR *dir;
     1421    IF_FEATURE_SHOW_THREADS(DIR *task_dir;)
     1422    uint8_t shift_pages_to_bytes;
     1423    uint8_t shift_pages_to_kb;
    8871424/* Fields are set to 0/NULL if failed to determine (or not requested) */
    888     /*char *cmd;*/
     1425    uint16_t argv_len;
    8891426    char *argv0;
    890     /*char *exe;*/
    891     USE_SELINUX(char *context;)
     1427    char *exe;
     1428    IF_SELINUX(char *context;)
    8921429    /* Everything below must contain no ptrs to malloc'ed data:
    8931430     * it is memset(0) for each process in procps_scan() */
    894     unsigned vsz, rss; /* we round it to kbytes */
     1431    unsigned long vsz, rss; /* we round it to kbytes */
    8951432    unsigned long stime, utime;
     1433    unsigned long start_time;
    8961434    unsigned pid;
    8971435    unsigned ppid;
     
    9001438    unsigned uid;
    9011439    unsigned gid;
     1440#if ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS
     1441    unsigned ruid;
     1442    unsigned rgid;
     1443    int niceness;
     1444#endif
    9021445    unsigned tty_major,tty_minor;
     1446#if ENABLE_FEATURE_TOPMEM
     1447    struct smaprec smaps;
     1448#endif
    9031449    char state[4];
    9041450    /* basename of executable in exec(2), read from /proc/N/stat
     
    9071453    char comm[COMM_LEN];
    9081454    /* user/group? - use passwd/group parsing functions */
     1455#if ENABLE_FEATURE_TOP_SMP_PROCESS
     1456    int last_seen_on_cpu;
     1457#endif
    9091458} procps_status_t;
     1459/* flag bits for procps_scan(xx, flags) calls */
    9101460enum {
    9111461    PSSCAN_PID      = 1 << 0,
     
    9171467    /* PSSCAN_CMD      = 1 << 6, - use read_cmdline instead */
    9181468    PSSCAN_ARGV0    = 1 << 7,
    919     /* PSSCAN_EXE      = 1 << 8, - not implemented */
     1469    PSSCAN_EXE      = 1 << 8,
    9201470    PSSCAN_STATE    = 1 << 9,
    9211471    PSSCAN_VSZ      = 1 << 10,
     
    9241474    PSSCAN_UTIME    = 1 << 13,
    9251475    PSSCAN_TTY      = 1 << 14,
    926     USE_SELINUX(PSSCAN_CONTEXT  = 1 << 15,)
     1476    PSSCAN_SMAPS    = (1 << 15) * ENABLE_FEATURE_TOPMEM,
     1477    /* NB: used by find_pid_by_name(). Any applet using it
     1478     * needs to be mentioned here. */
     1479    PSSCAN_ARGVN    = (1 << 16) * (ENABLE_KILLALL
     1480                || ENABLE_PGREP || ENABLE_PKILL
     1481                || ENABLE_PIDOF
     1482                || ENABLE_SESTATUS
     1483                ),
     1484    PSSCAN_CONTEXT  = (1 << 17) * ENABLE_SELINUX,
     1485    PSSCAN_START_TIME = 1 << 18,
     1486    PSSCAN_CPU      = (1 << 19) * ENABLE_FEATURE_TOP_SMP_PROCESS,
     1487    PSSCAN_NICE     = (1 << 20) * ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS,
     1488    PSSCAN_RUIDGID  = (1 << 21) * ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS,
     1489    PSSCAN_TASKS    = (1 << 22) * ENABLE_FEATURE_SHOW_THREADS,
    9271490    /* These are all retrieved from proc/NN/stat in one go: */
    9281491    PSSCAN_STAT     = PSSCAN_PPID | PSSCAN_PGID | PSSCAN_SID
    929                     | PSSCAN_COMM | PSSCAN_STATE
    930                     | PSSCAN_VSZ | PSSCAN_RSS
    931             | PSSCAN_STIME | PSSCAN_UTIME
    932             | PSSCAN_TTY,
    933 };
    934 procps_status_t* alloc_procps_scan(int flags);
    935 void free_procps_scan(procps_status_t* sp);
    936 procps_status_t* procps_scan(procps_status_t* sp, int flags);
    937 /* Format cmdline (up to col chars) into char buf[col+1] */
     1492    /**/            | PSSCAN_COMM | PSSCAN_STATE
     1493    /**/            | PSSCAN_VSZ | PSSCAN_RSS
     1494    /**/            | PSSCAN_STIME | PSSCAN_UTIME | PSSCAN_START_TIME
     1495    /**/            | PSSCAN_TTY | PSSCAN_NICE
     1496    /**/            | PSSCAN_CPU
     1497};
     1498//procps_status_t* alloc_procps_scan(void) FAST_FUNC;
     1499void free_procps_scan(procps_status_t* sp) FAST_FUNC;
     1500procps_status_t* procps_scan(procps_status_t* sp, int flags) FAST_FUNC;
     1501/* Format cmdline (up to col chars) into char buf[size] */
    9381502/* Puts [comm] if cmdline is empty (-> process is a kernel thread) */
    939 void read_cmdline(char *buf, int col, unsigned pid, const char *comm);
    940 pid_t *find_pid_by_name(const char* procName);
    941 pid_t *pidlist_reverse(pid_t *pidList);
     1503void read_cmdline(char *buf, int size, unsigned pid, const char *comm) FAST_FUNC;
     1504pid_t *find_pid_by_name(const char* procName) FAST_FUNC;
     1505pid_t *pidlist_reverse(pid_t *pidList) FAST_FUNC;
     1506int starts_with_cpu(const char *str) FAST_FUNC;
     1507unsigned get_cpu_count(void) FAST_FUNC;
    9421508
    9431509
    9441510extern const char bb_uuenc_tbl_base64[];
    9451511extern const char bb_uuenc_tbl_std[];
    946 void bb_uuencode(char *store, const void *s, int length, const char *tbl);
    947 
    948 typedef struct sha1_ctx_t {
    949     uint32_t count[2];
    950     uint32_t hash[5];
    951     uint32_t wbuf[16];
    952 } sha1_ctx_t;
    953 void sha1_begin(sha1_ctx_t *ctx);
    954 void sha1_hash(const void *data, size_t length, sha1_ctx_t *ctx);
    955 void *sha1_end(void *resbuf, sha1_ctx_t *ctx);
     1512void bb_uuencode(char *store, const void *s, int length, const char *tbl) FAST_FUNC;
     1513enum {
     1514    BASE64_FLAG_UU_STOP = 0x100,
     1515    /* Sign-extends to a value which never matches fgetc result: */
     1516    BASE64_FLAG_NO_STOP_CHAR = 0x80,
     1517};
     1518void FAST_FUNC read_base64(FILE *src_stream, FILE *dst_stream, int flags);
    9561519
    9571520typedef struct md5_ctx_t {
    958     uint32_t A;
    959     uint32_t B;
    960     uint32_t C;
    961     uint32_t D;
    962     uint64_t total;
    963     uint32_t buflen;
    964     char buffer[128];
     1521    uint8_t wbuffer[64]; /* always correctly aligned for uint64_t */
     1522    void (*process_block)(struct md5_ctx_t*) FAST_FUNC;
     1523    uint64_t total64;    /* must be directly before hash[] */
     1524    uint32_t hash[8];    /* 4 elements for md5, 5 for sha1, 8 for sha256 */
    9651525} md5_ctx_t;
    966 void md5_begin(md5_ctx_t *ctx);
    967 void md5_hash(const void *data, size_t length, md5_ctx_t *ctx);
    968 void *md5_end(void *resbuf, md5_ctx_t *ctx);
    969 
    970 uint32_t *crc32_filltable(uint32_t *tbl256, int endian);
    971 
    972 
    973 enum {  /* DO NOT CHANGE THESE VALUES!  cp.c, mv.c, install.c depend on them. */
    974     FILEUTILS_PRESERVE_STATUS = 1,
    975     FILEUTILS_DEREFERENCE = 2,
    976     FILEUTILS_RECUR = 4,
    977     FILEUTILS_FORCE = 8,
    978     FILEUTILS_INTERACTIVE = 0x10,
    979     FILEUTILS_MAKE_HARDLINK = 0x20,
    980     FILEUTILS_MAKE_SOFTLINK = 0x40,
    981 #if ENABLE_SELINUX
    982     FILEUTILS_PRESERVE_SECURITY_CONTEXT = 0x80,
    983     FILEUTILS_SET_SECURITY_CONTEXT = 0x100
    984 #endif
    985 };
    986 
    987 #define FILEUTILS_CP_OPTSTR "pdRfils" USE_SELINUX("c")
    988 extern const struct bb_applet *current_applet;
     1526typedef struct md5_ctx_t sha1_ctx_t;
     1527typedef struct md5_ctx_t sha256_ctx_t;
     1528typedef struct sha512_ctx_t {
     1529    uint64_t total64[2];  /* must be directly before hash[] */
     1530    uint64_t hash[8];
     1531    uint8_t wbuffer[128]; /* always correctly aligned for uint64_t */
     1532} sha512_ctx_t;
     1533void md5_begin(md5_ctx_t *ctx) FAST_FUNC;
     1534void md5_hash(md5_ctx_t *ctx, const void *data, size_t length) FAST_FUNC;
     1535void md5_end(md5_ctx_t *ctx, void *resbuf) FAST_FUNC;
     1536void sha1_begin(sha1_ctx_t *ctx) FAST_FUNC;
     1537#define sha1_hash md5_hash
     1538void sha1_end(sha1_ctx_t *ctx, void *resbuf) FAST_FUNC;
     1539void sha256_begin(sha256_ctx_t *ctx) FAST_FUNC;
     1540#define sha256_hash md5_hash
     1541#define sha256_end  sha1_end
     1542void sha512_begin(sha512_ctx_t *ctx) FAST_FUNC;
     1543void sha512_hash(sha512_ctx_t *ctx, const void *buffer, size_t len) FAST_FUNC;
     1544void sha512_end(sha512_ctx_t *ctx, void *resbuf) FAST_FUNC;
     1545
     1546extern uint32_t *global_crc32_table;
     1547uint32_t *crc32_filltable(uint32_t *tbl256, int endian) FAST_FUNC;
     1548uint32_t crc32_block_endian1(uint32_t val, const void *buf, unsigned len, uint32_t *crc_table) FAST_FUNC;
     1549uint32_t crc32_block_endian0(uint32_t val, const void *buf, unsigned len, uint32_t *crc_table) FAST_FUNC;
     1550
     1551typedef struct masks_labels_t {
     1552    const char *labels;
     1553    const int masks[];
     1554} masks_labels_t;
     1555int print_flags_separated(const int *masks, const char *labels,
     1556        int flags, const char *separator) FAST_FUNC;
     1557int print_flags(const masks_labels_t *ml, int flags) FAST_FUNC;
     1558
     1559typedef struct bb_progress_t {
     1560    off_t lastsize;
     1561    unsigned lastupdate_sec;
     1562    unsigned start_sec;
     1563    smallint inited;
     1564} bb_progress_t;
     1565
     1566void bb_progress_init(bb_progress_t *p) FAST_FUNC;
     1567void bb_progress_update(bb_progress_t *p, const char *curfile,
     1568            off_t beg_range, off_t transferred,
     1569            off_t totalsize) FAST_FUNC;
     1570
    9891571extern const char *applet_name;
    990 /* "BusyBox vN.N.N (timestamp or extra_vestion)" */
     1572
     1573/* Some older linkers don't perform string merging, we used to have common strings
     1574 * as global arrays to do it by hand. But:
     1575 * (1) newer linkers do it themselves,
     1576 * (2) however, they DONT merge string constants with global arrays,
     1577 * even if the value is the same (!). Thus global arrays actually
     1578 * increased size a bit: for example, "/etc/passwd" string from libc
     1579 * wasn't merged with bb_path_passwd_file[] array!
     1580 * Therefore now we use #defines.
     1581 */
     1582/* "BusyBox vN.N.N (timestamp or extra_version)" */
    9911583extern const char bb_banner[];
    9921584extern const char bb_msg_memory_exhausted[];
    9931585extern const char bb_msg_invalid_date[];
    994 extern const char bb_msg_read_error[];
    995 extern const char bb_msg_write_error[];
     1586#define bb_msg_read_error "read error"
     1587#define bb_msg_write_error "write error"
    9961588extern const char bb_msg_unknown[];
    9971589extern const char bb_msg_can_not_create_raw_socket[];
    9981590extern const char bb_msg_perm_denied_are_you_root[];
     1591extern const char bb_msg_you_must_be_root[];
    9991592extern const char bb_msg_requires_arg[];
    10001593extern const char bb_msg_invalid_arg[];
     
    10021595extern const char bb_msg_standard_output[];
    10031596
    1004 extern const char bb_str_default[];
    10051597/* NB: (bb_hexdigits_upcase[i] | 0x20) -> lowercase hex digit */
    10061598extern const char bb_hexdigits_upcase[];
    10071599
    1008 extern const char bb_path_mtab_file[];
    1009 extern const char bb_path_passwd_file[];
    1010 extern const char bb_path_shadow_file[];
    1011 extern const char bb_path_gshadow_file[];
    1012 extern const char bb_path_group_file[];
    1013 extern const char bb_path_motd_file[];
    10141600extern const char bb_path_wtmp_file[];
    1015 extern const char bb_dev_null[];
     1601
     1602/* Busybox mount uses either /proc/mounts or /etc/mtab to
     1603 * get the list of currently mounted filesystems */
     1604#define bb_path_mtab_file IF_FEATURE_MTAB_SUPPORT("/etc/mtab")IF_NOT_FEATURE_MTAB_SUPPORT("/proc/mounts")
     1605
     1606#define bb_path_passwd_file "/etc/passwd"
     1607#define bb_path_shadow_file "/etc/shadow"
     1608#define bb_path_gshadow_file "/etc/gshadow"
     1609#define bb_path_group_file "/etc/group"
     1610
     1611#define bb_path_motd_file "/etc/motd"
     1612
     1613#define bb_dev_null "/dev/null"
    10161614extern const char bb_busybox_exec_path[];
    10171615/* util-linux manpage says /sbin:/bin:/usr/sbin:/usr/bin,
     
    10251623
    10261624
    1027 #ifndef BUFSIZ
    1028 #define BUFSIZ 4096
    1029 #endif
    10301625/* Providing hard guarantee on minimum size (think of BUFSIZ == 128) */
    10311626enum { COMMON_BUFSIZE = (BUFSIZ >= 256*sizeof(void*) ? BUFSIZ+1 : 256*sizeof(void*)) };
     
    10361631/* '*const' ptr makes gcc optimize code much better.
    10371632 * Magic prevents ptr_to_globals from going into rodata.
    1038  * If you want to assign a value, use PTR_TO_GLOBALS = xxx */
     1633 * If you want to assign a value, use SET_PTR_TO_GLOBALS(x) */
    10391634extern struct globals *const ptr_to_globals;
    1040 #define PTR_TO_GLOBALS (*(struct globals**)&ptr_to_globals)
    1041 
     1635/* At least gcc 3.4.6 on mipsel system needs optimization barrier */
     1636#define barrier() __asm__ __volatile__("":::"memory")
     1637#define SET_PTR_TO_GLOBALS(x) do { \
     1638    (*(struct globals**)&ptr_to_globals) = (void*)(x); \
     1639    barrier(); \
     1640} while (0)
    10421641
    10431642/* You can change LIBBB_DEFAULT_LOGIN_SHELL, but don't use it,
     
    10451644 * If you change LIBBB_DEFAULT_LOGIN_SHELL,
    10461645 * don't forget to change increment constant. */
    1047 #define LIBBB_DEFAULT_LOGIN_SHELL      "-/bin/sh"
     1646#define LIBBB_DEFAULT_LOGIN_SHELL  "-/bin/sh"
    10481647extern const char bb_default_login_shell[];
    10491648/* "/bin/sh" */
    1050 #define DEFAULT_SHELL     (bb_default_login_shell+1)
     1649#define DEFAULT_SHELL              (bb_default_login_shell+1)
    10511650/* "sh" */
    1052 #define DEFAULT_SHELL_SHORT_NAME     (bb_default_login_shell+6)
    1053 
    1054 
    1055 #if ENABLE_FEATURE_DEVFS
     1651#define DEFAULT_SHELL_SHORT_NAME   (bb_default_login_shell+6)
     1652
     1653/* The following devices are the same on all systems.  */
     1654#define CURRENT_TTY "/dev/tty"
     1655#define DEV_CONSOLE "/dev/console"
     1656
     1657#if defined(__FreeBSD_kernel__)
     1658# define CURRENT_VC CURRENT_TTY
     1659# define VC_1 "/dev/ttyv0"
     1660# define VC_2 "/dev/ttyv1"
     1661# define VC_3 "/dev/ttyv2"
     1662# define VC_4 "/dev/ttyv3"
     1663# define VC_5 "/dev/ttyv4"
     1664# define VC_FORMAT "/dev/ttyv%d"
     1665#elif defined(__GNU__)
     1666# define CURRENT_VC CURRENT_TTY
     1667# define VC_1 "/dev/tty1"
     1668# define VC_2 "/dev/tty2"
     1669# define VC_3 "/dev/tty3"
     1670# define VC_4 "/dev/tty4"
     1671# define VC_5 "/dev/tty5"
     1672# define VC_FORMAT "/dev/tty%d"
     1673#elif ENABLE_FEATURE_DEVFS
     1674/*Linux, obsolete devfs names */
    10561675# define CURRENT_VC "/dev/vc/0"
    10571676# define VC_1 "/dev/vc/1"
     
    10601679# define VC_4 "/dev/vc/4"
    10611680# define VC_5 "/dev/vc/5"
    1062 #if defined(__sh__) || defined(__H8300H__) || defined(__H8300S__)
    1063 /* Yes, this sucks, but both SH (including sh64) and H8 have a SCI(F) for their
    1064    respective serial ports .. as such, we can't use the common device paths for
    1065    these. -- PFM */
    1066 #  define SC_0 "/dev/ttsc/0"
    1067 #  define SC_1 "/dev/ttsc/1"
    1068 #  define SC_FORMAT "/dev/ttsc/%d"
    1069 #else
    1070 #  define SC_0 "/dev/tts/0"
    1071 #  define SC_1 "/dev/tts/1"
    1072 #  define SC_FORMAT "/dev/tts/%d"
    1073 #endif
    10741681# define VC_FORMAT "/dev/vc/%d"
    10751682# define LOOP_FORMAT "/dev/loop/%d"
     
    10781685# define FB_0 "/dev/fb/0"
    10791686#else
     1687/*Linux, normal names */
    10801688# define CURRENT_VC "/dev/tty0"
    10811689# define VC_1 "/dev/tty1"
     
    10841692# define VC_4 "/dev/tty4"
    10851693# define VC_5 "/dev/tty5"
    1086 #if defined(__sh__) || defined(__H8300H__) || defined(__H8300S__)
    1087 #  define SC_0 "/dev/ttySC0"
    1088 #  define SC_1 "/dev/ttySC1"
    1089 #  define SC_FORMAT "/dev/ttySC%d"
    1090 #else
    1091 #  define SC_0 "/dev/ttyS0"
    1092 #  define SC_1 "/dev/ttyS1"
    1093 #  define SC_FORMAT "/dev/ttyS%d"
    1094 #endif
    10951694# define VC_FORMAT "/dev/tty%d"
    10961695# define LOOP_FORMAT "/dev/loop%d"
     
    11001699#endif
    11011700
    1102 /* The following devices are the same on devfs and non-devfs systems.  */
    1103 #define CURRENT_TTY "/dev/tty"
    1104 #define DEV_CONSOLE "/dev/console"
    1105 
    1106 
    1107 #ifndef RB_POWER_OFF
    1108 /* Stop system and switch power off if possible.  */
    1109 #define RB_POWER_OFF   0x4321fedc
    1110 #endif
    1111 
    1112 /* Make sure we call functions instead of macros.  */
     1701
     1702#define ARRAY_SIZE(x) ((unsigned)(sizeof(x) / sizeof((x)[0])))
     1703
     1704
     1705/* We redefine ctype macros. Unicode-correct handling of char types
     1706 * can't be done with such byte-oriented operations anyway,
     1707 * we don't lose anything.
     1708 */
    11131709#undef isalnum
    11141710#undef isalpha
     
    11161712#undef isblank
    11171713#undef iscntrl
     1714#undef isdigit
    11181715#undef isgraph
    11191716#undef islower
     
    11231720#undef isupper
    11241721#undef isxdigit
    1125 
    1126 /* This one is more efficient - we save ~400 bytes */
    1127 #undef isdigit
    1128 #define isdigit(a) ((unsigned)((a) - '0') <= 9)
    1129 
    1130 
    1131 #ifdef DMALLOC
    1132 #include <dmalloc.h>
    1133 #endif
    1134 
    1135 
    1136 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
    1137 
    1138 #endif /* __LIBBUSYBOX_H__ */
     1722#undef toupper
     1723#undef tolower
     1724
     1725/* We save ~500 bytes on isdigit alone.
     1726 * BTW, x86 likes (unsigned char) cast more than (unsigned). */
     1727
     1728/* These work the same for ASCII and Unicode,
     1729 * assuming no one asks "is this a *Unicode* letter?" using isalpha(letter) */
     1730#define isascii(a) ((unsigned char)(a) <= 0x7f)
     1731#define isdigit(a) ((unsigned char)((a) - '0') <= 9)
     1732#define isupper(a) ((unsigned char)((a) - 'A') <= ('Z' - 'A'))
     1733#define islower(a) ((unsigned char)((a) - 'a') <= ('z' - 'a'))
     1734#define isalpha(a) ((unsigned char)(((a)|0x20) - 'a') <= ('z' - 'a'))
     1735#define isblank(a) ({ unsigned char bb__isblank = (a); bb__isblank == ' ' || bb__isblank == '\t'; })
     1736#define iscntrl(a) ({ unsigned char bb__iscntrl = (a); bb__iscntrl < ' ' || bb__iscntrl == 0x7f; })
     1737/* In POSIX/C locale isspace is only these chars: "\t\n\v\f\r" and space.
     1738 * "\t\n\v\f\r" happen to have ASCII codes 9,10,11,12,13.
     1739 */
     1740#define isspace(a) ({ unsigned char bb__isspace = (a) - 9; bb__isspace == (' ' - 9) || bb__isspace <= (13 - 9); })
     1741// Unsafe wrt NUL: #define ispunct(a) (strchr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", (a)) != NULL)
     1742#define ispunct(a) (strchrnul("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", (a))[0])
     1743// Bigger code: #define isalnum(a) ({ unsigned char bb__isalnum = (a) - '0'; bb__isalnum <= 9 || ((bb__isalnum - ('A' - '0')) & 0xdf) <= 25; })
     1744#define isalnum(a) bb_ascii_isalnum(a)
     1745static ALWAYS_INLINE int bb_ascii_isalnum(unsigned char a)
     1746{
     1747    unsigned char b = a - '0';
     1748    if (b <= 9)
     1749        return (b <= 9);
     1750    b = (a|0x20) - 'a';
     1751    return b <= 'z' - 'a';
     1752}
     1753#define isxdigit(a) bb_ascii_isxdigit(a)
     1754static ALWAYS_INLINE int bb_ascii_isxdigit(unsigned char a)
     1755{
     1756    unsigned char b = a - '0';
     1757    if (b <= 9)
     1758        return (b <= 9);
     1759    b = (a|0x20) - 'a';
     1760    return b <= 'f' - 'a';
     1761}
     1762#define toupper(a) bb_ascii_toupper(a)
     1763static ALWAYS_INLINE unsigned char bb_ascii_toupper(unsigned char a)
     1764{
     1765    unsigned char b = a - 'a';
     1766    if (b <= ('z' - 'a'))
     1767        a -= 'a' - 'A';
     1768    return a;
     1769}
     1770#define tolower(a) bb_ascii_tolower(a)
     1771static ALWAYS_INLINE unsigned char bb_ascii_tolower(unsigned char a)
     1772{
     1773    unsigned char b = a - 'A';
     1774    if (b <= ('Z' - 'A'))
     1775        a += 'a' - 'A';
     1776    return a;
     1777}
     1778
     1779/* In ASCII and Unicode, these are likely to be very different.
     1780 * Let's prevent ambiguous usage from the start */
     1781#define isgraph(a) isgraph_is_ambiguous_dont_use(a)
     1782#define isprint(a) isprint_is_ambiguous_dont_use(a)
     1783/* NB: must not treat EOF as isgraph or isprint */
     1784#define isgraph_asciionly(a) ((unsigned)((a) - 0x21) <= 0x7e - 0x21)
     1785#define isprint_asciionly(a) ((unsigned)((a) - 0x20) <= 0x7e - 0x20)
     1786
     1787
     1788POP_SAVED_FUNCTION_VISIBILITY
     1789
     1790#endif
  • branches/2.2.9/mindi-busybox/include/platform.h

    r1765 r2725  
    11/* vi: set sw=4 ts=4: */
    22/*
    3    Copyright 2006, Bernhard Fischer
    4 
    5    Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
    6 */
    7 #ifndef __PLATFORM_H
    8 #define __PLATFORM_H    1
     3 * Copyright 2006, Bernhard Reutner-Fischer
     4 *
     5 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
     6 */
     7#ifndef BB_PLATFORM_H
     8#define BB_PLATFORM_H 1
     9
     10/* Assume all these functions exist by default.  Platforms where it is not
     11 * true will #undef them below.
     12 */
     13#define HAVE_FDPRINTF 1
     14#define HAVE_MEMRCHR 1
     15#define HAVE_MKDTEMP 1
     16#define HAVE_SETBIT 1
     17#define HAVE_STRCASESTR 1
     18#define HAVE_STRCHRNUL 1
     19#define HAVE_STRSEP 1
     20#define HAVE_STRSIGNAL 1
     21#define HAVE_VASPRINTF 1
    922
    1023/* Convenience macros to test the version of gcc. */
     
    1831
    1932/* __restrict is known in EGCS 1.2 and above. */
    20 #if !__GNUC_PREREQ (2,92)
     33#if !__GNUC_PREREQ(2,92)
    2134# ifndef __restrict
    22 #  define __restrict     /* Ignore */
     35#  define __restrict
    2336# endif
    2437#endif
     
    2841   version of gcc in which they are supported.  */
    2942
    30 #if !__GNUC_PREREQ (2,7)
     43#if !__GNUC_PREREQ(2,7)
    3144# ifndef __attribute__
    3245#  define __attribute__(x)
     
    3750#if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L
    3851/* it's a keyword */
    39 #else
    40 # if __GNUC_PREREQ (2,7)
    41 #  define inline __inline__
    42 # else
    43 #  define inline
    44 # endif
     52#elif __GNUC_PREREQ(2,7)
     53# define inline __inline__
     54#else
     55# define inline
    4556#endif
    4657
     
    4960#endif
    5061
    51 # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
    52 # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
    53 # define ATTRIBUTE_PACKED __attribute__ ((__packed__))
    54 # define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m)))
    55 # if __GNUC_PREREQ (3,0)
    56 #  define ALWAYS_INLINE __attribute__ ((always_inline)) inline
    57 #  if !ENABLE_WERROR
    58 #   define ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
    59 #   define ATTRIBUTE_UNUSED_RESULT __attribute__ ((warn_unused_result))
    60 #  else
    61 #   define ATTRIBUTE_DEPRECATED /* n/a */
    62 #   define ATTRIBUTE_UNUSED_RESULT /* n/a */
    63 #  endif
     62#define UNUSED_PARAM __attribute__ ((__unused__))
     63#define NORETURN __attribute__ ((__noreturn__))
     64/* "The malloc attribute is used to tell the compiler that a function
     65 * may be treated as if any non-NULL pointer it returns cannot alias
     66 * any other pointer valid when the function returns. This will often
     67 * improve optimization. Standard functions with this property include
     68 * malloc and calloc. realloc-like functions have this property as long
     69 * as the old pointer is never referred to (including comparing it
     70 * to the new pointer) after the function returns a non-NULL value."
     71 */
     72#define RETURNS_MALLOC __attribute__ ((malloc))
     73#define PACKED __attribute__ ((__packed__))
     74#define ALIGNED(m) __attribute__ ((__aligned__(m)))
     75
     76/* __NO_INLINE__: some gcc's do not honor inlining! :( */
     77#if __GNUC_PREREQ(3,0) && !defined(__NO_INLINE__)
     78# define ALWAYS_INLINE __attribute__ ((always_inline)) inline
     79/* I've seen a toolchain where I needed __noinline__ instead of noinline */
     80# define NOINLINE      __attribute__((__noinline__))
     81# if !ENABLE_WERROR
     82#  define DEPRECATED __attribute__ ((__deprecated__))
     83#  define UNUSED_PARAM_RESULT __attribute__ ((warn_unused_result))
    6484# else
    65 #  define ALWAYS_INLINE inline
    66 #  define ATTRIBUTE_DEPRECATED /* n/a */
    67 #  define ATTRIBUTE_UNUSED_RESULT /* n/a */
    68 # endif
     85#  define DEPRECATED
     86#  define UNUSED_PARAM_RESULT
     87# endif
     88#else
     89# define ALWAYS_INLINE inline
     90# define NOINLINE
     91# define DEPRECATED
     92# define UNUSED_PARAM_RESULT
     93#endif
    6994
    7095/* -fwhole-program makes all symbols local. The attribute externally_visible
    7196   forces a symbol global.  */
    72 # if __GNUC_PREREQ (4,1)
    73 #  define ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__))
    74 # else
    75 #  define ATTRIBUTE_EXTERNALLY_VISIBLE
    76 # endif /* GNUC >= 4.1 */
     97#if __GNUC_PREREQ(4,1)
     98# define EXTERNALLY_VISIBLE __attribute__(( visibility("default") ))
     99//__attribute__ ((__externally_visible__))
     100#else
     101# define EXTERNALLY_VISIBLE
     102#endif
     103
     104/* At 4.4 gcc become much more anal about this, need to use "aliased" types */
     105#if __GNUC_PREREQ(4,4)
     106# define FIX_ALIASING __attribute__((__may_alias__))
     107#else
     108# define FIX_ALIASING
     109#endif
    77110
    78111/* We use __extension__ in some places to suppress -pedantic warnings
    79112   about GCC extensions.  This feature didn't work properly before
    80113   gcc 2.8.  */
    81 #if !__GNUC_PREREQ (2,8)
     114#if !__GNUC_PREREQ(2,8)
    82115# ifndef __extension__
    83116#  define __extension__
     
    86119
    87120/* gcc-2.95 had no va_copy but only __va_copy. */
    88 #if !__GNUC_PREREQ (3,0)
     121#if !__GNUC_PREREQ(3,0)
    89122# include <stdarg.h>
    90123# if !defined va_copy && defined __va_copy
     
    93126#endif
    94127
     128/* FAST_FUNC is a qualifier which (possibly) makes function call faster
     129 * and/or smaller by using modified ABI. It is usually only needed
     130 * on non-static, busybox internal functions. Recent versions of gcc
     131 * optimize statics automatically. FAST_FUNC on static is required
     132 * only if you need to match a function pointer's type */
     133#if __GNUC_PREREQ(3,0) && defined(i386) /* || defined(__x86_64__)? */
     134/* stdcall makes callee to pop arguments from stack, not caller */
     135# define FAST_FUNC __attribute__((regparm(3),stdcall))
     136/* #elif ... - add your favorite arch today! */
     137#else
     138# define FAST_FUNC
     139#endif
     140
     141/* Make all declarations hidden (-fvisibility flag only affects definitions) */
     142/* (don't include system headers after this until corresponding pop!) */
     143#if __GNUC_PREREQ(4,1)
     144# define PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN _Pragma("GCC visibility push(hidden)")
     145# define POP_SAVED_FUNCTION_VISIBILITY              _Pragma("GCC visibility pop")
     146#else
     147# define PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
     148# define POP_SAVED_FUNCTION_VISIBILITY
     149#endif
     150
    95151/* ---- Endian Detection ------------------------------------ */
    96152
    97 #if (defined __digital__ && defined __unix__)
     153#include <limits.h>
     154#if defined(__digital__) && defined(__unix__)
    98155# include <sex.h>
    99 # define __BIG_ENDIAN__ (BYTE_ORDER == BIG_ENDIAN)
    100 # define __BYTE_ORDER BYTE_ORDER
    101 #elif !defined __APPLE__
     156#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \
     157   || defined(__APPLE__)
     158# include <sys/resource.h>  /* rlimit */
     159# include <machine/endian.h>
     160# define bswap_64 __bswap64
     161# define bswap_32 __bswap32
     162# define bswap_16 __bswap16
     163#else
    102164# include <byteswap.h>
    103165# include <endian.h>
    104166#endif
    105167
    106 #ifdef __BIG_ENDIAN__
     168#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN
    107169# define BB_BIG_ENDIAN 1
    108170# define BB_LITTLE_ENDIAN 0
    109 #elif __BYTE_ORDER == __BIG_ENDIAN
     171#elif defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN
     172# define BB_BIG_ENDIAN 0
     173# define BB_LITTLE_ENDIAN 1
     174#elif defined(_BYTE_ORDER) && _BYTE_ORDER == _BIG_ENDIAN
    110175# define BB_BIG_ENDIAN 1
    111176# define BB_LITTLE_ENDIAN 0
    112 #else
     177#elif defined(_BYTE_ORDER) && _BYTE_ORDER == _LITTLE_ENDIAN
    113178# define BB_BIG_ENDIAN 0
    114179# define BB_LITTLE_ENDIAN 1
    115 #endif
    116 
     180#elif defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN
     181# define BB_BIG_ENDIAN 1
     182# define BB_LITTLE_ENDIAN 0
     183#elif defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN
     184# define BB_BIG_ENDIAN 0
     185# define BB_LITTLE_ENDIAN 1
     186#elif defined(__386__)
     187# define BB_BIG_ENDIAN 0
     188# define BB_LITTLE_ENDIAN 1
     189#else
     190# error "Can't determine endianness"
     191#endif
     192
     193#if ULONG_MAX > 0xffffffff
     194# define bb_bswap_64(x) bswap_64(x)
     195#endif
     196
     197/* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */
    117198#if BB_BIG_ENDIAN
    118 #define SWAP_BE16(x) (x)
    119 #define SWAP_BE32(x) (x)
    120 #define SWAP_BE64(x) (x)
    121 #define SWAP_LE16(x) bswap_16(x)
    122 #define SWAP_LE32(x) bswap_32(x)
    123 #define SWAP_LE64(x) bswap_64(x)
    124 #else
    125 #define SWAP_BE16(x) bswap_16(x)
    126 #define SWAP_BE32(x) bswap_32(x)
    127 #define SWAP_BE64(x) bswap_64(x)
    128 #define SWAP_LE16(x) (x)
    129 #define SWAP_LE32(x) (x)
    130 #define SWAP_LE64(x) (x)
    131 #endif
    132 
    133 /* ---- Networking ------------------------------------------ */
    134 #ifndef __APPLE__
    135 # include <arpa/inet.h>
    136 #else
    137 # include <netinet/in.h>
    138 #endif
    139 
    140 #ifndef __socklen_t_defined
    141 typedef int socklen_t;
     199# define SWAP_BE16(x) (x)
     200# define SWAP_BE32(x) (x)
     201# define SWAP_BE64(x) (x)
     202# define SWAP_LE16(x) bswap_16(x)
     203# define SWAP_LE32(x) bswap_32(x)
     204# define SWAP_LE64(x) bb_bswap_64(x)
     205# define IF_BIG_ENDIAN(...) __VA_ARGS__
     206# define IF_LITTLE_ENDIAN(...)
     207#else
     208# define SWAP_BE16(x) bswap_16(x)
     209# define SWAP_BE32(x) bswap_32(x)
     210# define SWAP_BE64(x) bb_bswap_64(x)
     211# define SWAP_LE16(x) (x)
     212# define SWAP_LE32(x) (x)
     213# define SWAP_LE64(x) (x)
     214# define IF_BIG_ENDIAN(...)
     215# define IF_LITTLE_ENDIAN(...) __VA_ARGS__
     216#endif
     217
     218/* ---- Unaligned access ------------------------------------ */
     219
     220/* NB: unaligned parameter should be a pointer, aligned one -
     221 * a lvalue. This makes it more likely to not swap them by mistake
     222 */
     223#if defined(i386) || defined(__x86_64__) || defined(__powerpc__)
     224# include <stdint.h>
     225typedef int      bb__aliased_int      FIX_ALIASING;
     226typedef uint16_t bb__aliased_uint16_t FIX_ALIASING;
     227typedef uint32_t bb__aliased_uint32_t FIX_ALIASING;
     228# define move_from_unaligned_int(v, intp) ((v) = *(bb__aliased_int*)(intp))
     229# define move_from_unaligned16(v, u16p) ((v) = *(bb__aliased_uint16_t*)(u16p))
     230# define move_from_unaligned32(v, u32p) ((v) = *(bb__aliased_uint32_t*)(u32p))
     231# define move_to_unaligned16(u16p, v)   (*(bb__aliased_uint16_t*)(u16p) = (v))
     232# define move_to_unaligned32(u32p, v)   (*(bb__aliased_uint32_t*)(u32p) = (v))
     233/* #elif ... - add your favorite arch today! */
     234#else
     235/* performs reasonably well (gcc usually inlines memcpy here) */
     236# define move_from_unaligned_int(v, intp) (memcpy(&(v), (intp), sizeof(int)))
     237# define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2))
     238# define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4))
     239# define move_to_unaligned16(u16p, v) do { \
     240    uint16_t __t = (v); \
     241    memcpy((u16p), &__t, 4); \
     242} while (0)
     243# define move_to_unaligned32(u32p, v) do { \
     244    uint32_t __t = (v); \
     245    memcpy((u32p), &__t, 4); \
     246} while (0)
    142247#endif
    143248
    144249/* ---- Compiler dependent settings ------------------------- */
    145 #if (defined __digital__ && defined __unix__)
     250
     251#if (defined __digital__ && defined __unix__) \
     252 || defined __APPLE__ \
     253 || defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__
    146254# undef HAVE_MNTENT_H
     255# undef HAVE_SYS_STATFS_H
    147256#else
    148257# define HAVE_MNTENT_H 1
    149 #endif /* ___digital__ && __unix__ */
    150 
    151 /* linux/loop.h relies on __u64. Make sure we have that as a proper type
    152  * until userspace is widely fixed.  */
    153 #ifndef __GNUC__
    154 #if defined __INTEL_COMPILER
    155 __extension__ typedef __signed__ long long __s64;
    156 __extension__ typedef unsigned long long __u64;
    157 #endif /* __INTEL_COMPILER */
    158 #endif /* ifndef __GNUC__ */
     258# define HAVE_SYS_STATFS_H 1
     259#endif
    159260
    160261/*----- Kernel versioning ------------------------------------*/
     262
    161263#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
    162264
    163 /* ---- miscellaneous --------------------------------------- */
    164 
    165 #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \
    166     !defined(__dietlibc__) && \
    167     !defined(_NEWLIB_VERSION) && \
    168     !(defined __digital__ && defined __unix__)
    169 # error "Sorry, this libc version is not supported :("
    170 #endif
    171 
    172 /* Don't perpetuate e2fsck crap into the headers.  Clean up e2fsck instead. */
     265/* ---- Miscellaneous --------------------------------------- */
    173266
    174267#if defined __GLIBC__ || defined __UCLIBC__ \
    175     || defined __dietlibc__ || defined _NEWLIB_VERSION
    176 #include <features.h>
    177 #define HAVE_FEATURES_H
    178 #include <stdint.h>
    179 #define HAVE_STDINT_H
    180 #else
    181 /* Largest integral types.  */
    182 #if __BIG_ENDIAN__
    183 typedef long                intmax_t;
    184 typedef unsigned long       uintmax_t;
    185 #else
    186 __extension__
    187 typedef long long           intmax_t;
    188 __extension__
    189 typedef unsigned long long  uintmax_t;
    190 #endif
     268 || defined __dietlibc__ || defined _NEWLIB_VERSION
     269# include <features.h>
    191270#endif
    192271
     
    205284#if (defined __digital__ && defined __unix__)
    206285/* old system without (proper) C99 support */
    207 #define bool smalluint
     286# define bool smalluint
    208287#else
    209288/* modern system, so use it */
    210 #include <stdbool.h>
     289# include <stdbool.h>
    211290#endif
    212291
    213292/* Try to defeat gcc's alignment of "char message[]"-like data */
    214293#if 1 /* if needed: !defined(arch1) && !defined(arch2) */
    215 #define ALIGN1 __attribute__((aligned(1)))
    216 #define ALIGN2 __attribute__((aligned(2)))
     294# define ALIGN1 __attribute__((aligned(1)))
     295# define ALIGN2 __attribute__((aligned(2)))
     296# define ALIGN4 __attribute__((aligned(4)))
    217297#else
    218298/* Arches which MUST have 2 or 4 byte alignment for everything are here */
    219 #define ALIGN1
    220 #define ALIGN2
     299# define ALIGN1
     300# define ALIGN2
     301# define ALIGN4
    221302#endif
    222303
     
    225306 * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably.
    226307 * For earlier versions there is no reliable way to check if we are building
    227  * for a mmu-less system; the user should pass EXTRA_CFLAGS="-DBB_NOMMU"
    228  * on his own.
    229  */
    230 #if defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \
    231     __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__
    232 #define BB_MMU 0
    233 #define BB_NOMMU 1
    234 #define USE_FOR_NOMMU(...) __VA_ARGS__
    235 #define USE_FOR_MMU(...)
    236 #else
    237 #define BB_MMU 1
    238 /* BB_NOMMU is not defined in this case! */
    239 #define USE_FOR_NOMMU(...)
    240 #define USE_FOR_MMU(...) __VA_ARGS__
    241 #endif
    242 
    243 /* Platforms that haven't got dprintf need to implement fdprintf() in
    244  * libbb.  This would require a platform.c.  It's not going to be cleaned
    245  * out of the tree, so stop saying it should be. */
    246 #if !defined(__dietlibc__)
    247 /* Needed for: glibc */
    248 /* Not needed for: dietlibc */
    249 /* Others: ?? (add as needed) */
    250 #define fdprintf dprintf
     308 * for a mmu-less system.
     309 */
     310#if ENABLE_NOMMU || \
     311    (defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \
     312    __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__)
     313# define BB_MMU 0
     314# define USE_FOR_NOMMU(...) __VA_ARGS__
     315# define USE_FOR_MMU(...)
     316#else
     317# define BB_MMU 1
     318# define USE_FOR_NOMMU(...)
     319# define USE_FOR_MMU(...) __VA_ARGS__
     320#endif
     321
     322/* Don't use lchown with glibc older than 2.1.x */
     323#if defined(__GLIBC__) && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1
     324# define lchown chown
     325#endif
     326
     327#if defined(__digital__) && defined(__unix__)
     328
     329# include <standards.h>
     330# include <inttypes.h>
     331# define PRIu32 "u"
     332/* use legacy setpgrp(pid_t,pid_t) for now.  move to platform.c */
     333# define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me, __me); } while (0)
     334# if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET
     335#  define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET)
     336# endif
     337# if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY
     338#  define ADJ_FREQUENCY MOD_FREQUENCY
     339# endif
     340# if !defined ADJ_TIMECONST && defined MOD_TIMECONST
     341#  define ADJ_TIMECONST MOD_TIMECONST
     342# endif
     343# if !defined ADJ_TICK && defined MOD_CLKB
     344#  define ADJ_TICK MOD_CLKB
     345# endif
     346
     347#else
     348
     349# define bb_setpgrp() setpgrp()
     350
     351#endif
     352
     353#if defined(__GLIBC__)
     354# define fdprintf dprintf
    251355#endif
    252356
    253357#if defined(__dietlibc__)
    254 static ALWAYS_INLINE char* strchrnul(const char *s, char c)
    255 {
    256     while (*s && *s != c) ++s;
    257     return (char*)s;
    258 }
    259 #endif
    260 
    261 /* Don't use lchown with glibc older than 2.1.x ... uClibc lacks it */
    262 #if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \
    263     defined __UC_LIBC__
    264 # define lchown chown
    265 #endif
    266 
    267 /* THIS SHOULD BE CLEANED OUT OF THE TREE ENTIRELY */
    268 /* FIXME: fix tar.c! */
    269 #ifndef FNM_LEADING_DIR
    270 #define FNM_LEADING_DIR 0
    271 #endif
    272 
    273 #if (defined __digital__ && defined __unix__)
    274 #include <standards.h>
    275 #define HAVE_STANDARDS_H
    276 #include <inttypes.h>
    277 #define HAVE_INTTYPES_H
    278 #define PRIu32 "u"
    279 
    280 /* use legacy setpgrp(pid_t,pid_t) for now.  move to platform.c */
    281 #define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me,__me); } while (0)
    282 
    283 #if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET
    284 #define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET)
    285 #endif
    286 #if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY
    287 #define ADJ_FREQUENCY MOD_FREQUENCY
    288 #endif
    289 #if !defined ADJ_TIMECONST && defined MOD_TIMECONST
    290 #define ADJ_TIMECONST MOD_TIMECONST
    291 #endif
    292 #if !defined ADJ_TICK && defined MOD_CLKB
    293 #define ADJ_TICK MOD_CLKB
    294 #endif
    295 
    296 #else
    297 #define bb_setpgrp() setpgrp()
    298 #endif
    299 
    300 #if defined(__linux__)
    301 #include <sys/mount.h>
    302 /* Make sure we have all the new mount flags we actually try to use. */
    303 #ifndef MS_BIND
    304 #define MS_BIND        (1<<12)
    305 #endif
    306 #ifndef MS_MOVE
    307 #define MS_MOVE        (1<<13)
    308 #endif
    309 #ifndef MS_RECURSIVE
    310 #define MS_RECURSIVE   (1<<14)
    311 #endif
    312 #ifndef MS_SILENT
    313 #define MS_SILENT      (1<<15)
    314 #endif
    315 
    316 /* The shared subtree stuff, which went in around 2.6.15. */
    317 #ifndef MS_UNBINDABLE
    318 #define MS_UNBINDABLE  (1<<17)
    319 #endif
    320 #ifndef MS_PRIVATE
    321 #define MS_PRIVATE     (1<<18)
    322 #endif
    323 #ifndef MS_SLAVE
    324 #define MS_SLAVE       (1<<19)
    325 #endif
    326 #ifndef MS_SHARED
    327 #define MS_SHARED      (1<<20)
    328 #endif
    329 
    330 
    331 #if !defined(BLKSSZGET)
    332 #define BLKSSZGET _IO(0x12, 104)
    333 #endif
    334 #if !defined(BLKGETSIZE64)
    335 #define BLKGETSIZE64 _IOR(0x12,114,size_t)
    336 #endif
    337 #endif
    338 
    339 #endif  /* platform.h   */
     358# undef HAVE_STRCHRNUL
     359#endif
     360
     361#if defined(__WATCOMC__)
     362# undef HAVE_FDPRINTF
     363# undef HAVE_MEMRCHR
     364# undef HAVE_MKDTEMP
     365# undef HAVE_SETBIT
     366# undef HAVE_STRCASESTR
     367# undef HAVE_STRCHRNUL
     368# undef HAVE_STRSEP
     369# undef HAVE_STRSIGNAL
     370# undef HAVE_VASPRINTF
     371#endif
     372
     373#if defined(__FreeBSD__)
     374# undef HAVE_STRCHRNUL
     375#endif
     376
     377/*
     378 * Now, define prototypes for all the functions defined in platform.c
     379 * These must come after all the HAVE_* macros are defined (or not)
     380 */
     381
     382#ifndef HAVE_FDPRINTF
     383extern int fdprintf(int fd, const char *format, ...);
     384#endif
     385
     386#ifndef HAVE_MEMRCHR
     387extern void *memrchr(const void *s, int c, size_t n) FAST_FUNC;
     388#endif
     389
     390#ifndef HAVE_MKDTEMP
     391extern char *mkdtemp(char *template) FAST_FUNC;
     392#endif
     393
     394#ifndef HAVE_SETBIT
     395# define setbit(a, b)  ((a)[(b) >> 3] |= 1 << ((b) & 7))
     396# define clrbit(a, b)  ((a)[(b) >> 3] &= ~(1 << ((b) & 7)))
     397#endif
     398
     399#ifndef HAVE_STRCASESTR
     400extern char *strcasestr(const char *s, const char *pattern) FAST_FUNC;
     401#endif
     402
     403#ifndef HAVE_STRCHRNUL
     404extern char *strchrnul(const char *s, int c) FAST_FUNC;
     405#endif
     406
     407#ifndef HAVE_STRSEP
     408extern char *strsep(char **stringp, const char *delim) FAST_FUNC;
     409#endif
     410
     411#ifndef HAVE_STRSIGNAL
     412/* Not exactly the same: instead of "Stopped" it shows "STOP" etc */
     413# define strsignal(sig) get_signame(sig)
     414#endif
     415
     416#ifndef HAVE_VASPRINTF
     417extern int vasprintf(char **string_ptr, const char *format, va_list p) FAST_FUNC;
     418#endif
     419
     420#endif
  • branches/2.2.9/mindi-busybox/include/pwd_.h

    r1765 r2725  
    1919
    2020/*
    21  *  POSIX Standard: 9.2.2 User Database Access  <pwd.h>
     21 * POSIX Standard: 9.2.2 User Database Access   <pwd.h>
    2222 */
    2323
    24 #if !ENABLE_USE_BB_PWD_GRP
     24#ifndef BB_PWD_H
     25#define BB_PWD_H 1
    2526
    26 #include <pwd.h>
     27PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
    2728
    28 #else
    29 
    30 #ifndef _PWD_H
    31 #define _PWD_H 1
    32 
    33 /* The passwd structure.  */
    34 struct passwd {
    35     char *pw_name;          /* Username.  */
    36     char *pw_passwd;        /* Password.  */
    37     uid_t pw_uid;           /* User ID.  */
    38     gid_t pw_gid;           /* Group ID.  */
    39     char *pw_gecos;         /* Real name.  */
    40     char *pw_dir;           /* Home directory.  */
    41     char *pw_shell;         /* Shell program.  */
    42 };
    43 
     29/* This file is #included after #include <pwd.h>
     30 * We will use libc-defined structures, but will #define function names
     31 * so that function calls are directed to bb_internal_XXX replacements
     32 */
    4433
    4534#define setpwent    bb_internal_setpwent
     
    5443#define getpwnam_r  bb_internal_getpwnam_r
    5544#define fgetpwent_r bb_internal_fgetpwent_r
    56 #define getpw       bb_internal_getpw
    5745
    5846
    5947/* All function names below should be remapped by #defines above
    60  * in order to not collide with libc names.
    61  * In theory it isn't necessary, but I saw weird interactions at link time.
    62  * Let's play safe */
     48 * in order to not collide with libc names. */
    6349
    6450
     
    6955extern void endpwent(void);
    7056
     57#ifdef UNUSED_SINCE_WE_AVOID_STATIC_BUFS
    7158/* Read an entry from the password-file stream, opening it if necessary.  */
    7259extern struct passwd *getpwent(void);
     
    7663
    7764/* Write the given entry onto the given stream.  */
    78 extern int putpwent(__const struct passwd *__restrict __p,
     65extern int putpwent(const struct passwd *__restrict __p,
    7966             FILE *__restrict __f);
     67#endif
    8068
    8169/* Search for an entry with a matching user ID.  */
     
    8371
    8472/* Search for an entry with a matching username.  */
    85 extern struct passwd *getpwnam(__const char *__name);
     73extern struct passwd *getpwnam(const char *__name);
    8674
    8775/* Reentrant versions of some of the functions above.
     
    10290               struct passwd **__restrict __result);
    10391
    104 extern int getpwnam_r(__const char *__restrict __name,
     92extern int getpwnam_r(const char *__restrict __name,
    10593               struct passwd *__restrict __resultbuf,
    10694               char *__restrict __buffer, size_t __buflen,
     
    114102            struct passwd **__restrict __result);
    115103
    116 /* Re-construct the password-file line for the given uid
    117    in the given buffer.  This knows the format that the caller
    118    will expect, but this need not be the format of the password file.  */
    119 extern int getpw(uid_t __uid, char *__buffer);
     104POP_SAVED_FUNCTION_VISIBILITY
    120105
    121 #endif /* pwd.h  */
    122106#endif
  • branches/2.2.9/mindi-busybox/include/shadow_.h

    r1765 r2725  
    2020/* Declaration of types and functions for shadow password suite */
    2121
    22 #if !ENABLE_USE_BB_SHADOW
     22#ifndef BB_SHADOW_H
     23#define BB_SHADOW_H 1
    2324
    24 #include <shadow.h>
    25 
    26 #else
    27 
    28 #ifndef _SHADOW_H
    29 #define _SHADOW_H 1
    30 
    31 /* Paths to the user database files */
    32 #ifndef _PATH_SHADOW
    33 #define _PATH_SHADOW "/etc/shadow"
    34 #endif
     25PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
    3526
    3627/* Structure of the password file */
     
    4738};
    4839
     40/* Paths to the user database files */
     41#ifndef _PATH_SHADOW
     42#define _PATH_SHADOW "/etc/shadow"
     43#endif
    4944
    5045#define setspent    bb_internal_setspent
     
    6459
    6560/* All function names below should be remapped by #defines above
    66  * in order to not collide with libc names.
    67  * In theory it isn't necessary, but I saw weird interactions at link time.
    68  * Let's play safe */
     61 * in order to not collide with libc names. */
    6962
    70 
     63#ifdef UNUSED_FOR_NOW
    7164/* Open database for reading */
    7265extern void setspent(void);
     
    7972
    8073/* Get shadow entry matching NAME */
    81 extern struct spwd *getspnam(__const char *__name);
     74extern struct spwd *getspnam(const char *__name);
    8275
    8376/* Read shadow entry from STRING */
    84 extern struct spwd *sgetspent(__const char *__string);
     77extern struct spwd *sgetspent(const char *__string);
    8578
    8679/* Read next shadow entry from STREAM */
     
    8881
    8982/* Write line containing shadow password entry to stream */
    90 extern int putspent(__const struct spwd *__p, FILE *__stream);
     83extern int putspent(const struct spwd *__p, FILE *__stream);
    9184
    9285/* Reentrant versions of some of the functions above */
    9386extern int getspent_r(struct spwd *__result_buf, char *__buffer,
    9487               size_t __buflen, struct spwd **__result);
     88#endif
    9589
    96 extern int getspnam_r(__const char *__name, struct spwd *__result_buf,
     90extern int getspnam_r(const char *__name, struct spwd *__result_buf,
    9791               char *__buffer, size_t __buflen,
    9892               struct spwd **__result);
    9993
    100 extern int sgetspent_r(__const char *__string, struct spwd *__result_buf,
     94#ifdef UNUSED_FOR_NOW
     95extern int sgetspent_r(const char *__string, struct spwd *__result_buf,
    10196            char *__buffer, size_t __buflen,
    10297            struct spwd **__result);
     
    110105/* Unlock password file */
    111106extern int ulckpwdf(void);
     107#endif
     108
     109POP_SAVED_FUNCTION_VISIBILITY
    112110
    113111#endif /* shadow.h */
    114 #endif
  • branches/2.2.9/mindi-busybox/include/usage.h

    r1765 r2725  
     1/* DO NOT EDIT. This file is generated from usage.src.h */
    12/* vi: set sw=8 ts=8: */
    23/*
     
    78 * 3. Start each source line with message as follows:
    89 *    |<7 spaces>"text with tabs"....
     10 * or
     11 *    |<5 spaces>"\ntext with tabs"....
    912 */
    10 
    11 #ifndef __BB_USAGE_H__
    12 #define __BB_USAGE_H__
     13#ifndef BB_USAGE_H
     14#define BB_USAGE_H 1
     15
     16
     17#define NOUSAGE_STR "\b"
     18
     19
     20#define bunzip2_trivial_usage \
     21       "[-cf] [FILE]..." \
     22
     23#define bunzip2_full_usage "\n\n" \
     24       "Decompress FILEs (or stdin)\n" \
     25     "\nOptions:" \
     26     "\n    -c  Write to stdout" \
     27     "\n    -f  Force" \
     28
     29#define bzcat_trivial_usage \
     30       "FILE" \
     31
     32#define bzcat_full_usage "\n\n" \
     33       "Decompress to stdout" \
     34
     35#define tar_trivial_usage \
     36       "-[" IF_FEATURE_TAR_CREATE("c") "xt" IF_FEATURE_SEAMLESS_GZ("z") \
     37    IF_FEATURE_SEAMLESS_BZ2("j") IF_FEATURE_SEAMLESS_LZMA("a") \
     38    IF_FEATURE_SEAMLESS_Z("Z") IF_FEATURE_TAR_NOPRESERVE_TIME("m") "vO] " \
     39    IF_FEATURE_TAR_FROM("[-X FILE] ") \
     40       "[-f TARFILE] [-C DIR] [FILE]..." \
     41
     42#define tar_full_usage "\n\n" \
     43    IF_FEATURE_TAR_CREATE("Create, extract, ") \
     44    IF_NOT_FEATURE_TAR_CREATE("Extract ") \
     45    "or list files from a tar file\n" \
     46     "\nOperation:" \
     47    IF_FEATURE_TAR_CREATE( \
     48     "\n    c   Create" \
     49    ) \
     50     "\n    x   Extract" \
     51     "\n    t   List" \
     52     "\nOptions:" \
     53     "\n    f   Name of TARFILE ('-' for stdin/out)" \
     54     "\n    C   Change to DIR before operation" \
     55     "\n    v   Verbose" \
     56    IF_FEATURE_SEAMLESS_GZ( \
     57     "\n    z   (De)compress using gzip" \
     58    ) \
     59    IF_FEATURE_SEAMLESS_BZ2( \
     60     "\n    j   (De)compress using bzip2" \
     61    ) \
     62    IF_FEATURE_SEAMLESS_LZMA( \
     63     "\n    a   (De)compress using lzma" \
     64    ) \
     65    IF_FEATURE_SEAMLESS_Z( \
     66     "\n    Z   (De)compress using compress" \
     67    ) \
     68     "\n    O   Extract to stdout" \
     69    IF_FEATURE_TAR_CREATE( \
     70     "\n    h   Follow symlinks" \
     71    ) \
     72    IF_FEATURE_TAR_NOPRESERVE_TIME( \
     73     "\n    m   Don't restore mtime" \
     74    ) \
     75    IF_FEATURE_TAR_FROM( \
     76    IF_FEATURE_TAR_LONG_OPTIONS( \
     77     "\n    exclude File to exclude" \
     78    ) \
     79     "\n    X   File with names to exclude" \
     80     "\n    T   File with names to include" \
     81    ) \
     82
     83#define tar_example_usage \
     84       "$ zcat /tmp/tarball.tar.gz | tar -xf -\n" \
     85       "$ tar -cf /tmp/tarball.tar /usr/local\n" \
     86
     87#define date_trivial_usage \
     88       "[OPTIONS] [+FMT] [TIME]" \
     89
     90#define date_full_usage "\n\n" \
     91       "Display time (using +FMT), or set time\n" \
     92     "\nOptions:" \
     93    IF_NOT_LONG_OPTS( \
     94     "\n    [-s] TIME   Set time to TIME" \
     95     "\n    -u      Work in UTC (don't convert to local time)" \
     96     "\n    -R      Output RFC-2822 compliant date string" \
     97    ) IF_LONG_OPTS( \
     98     "\n    [-s,--set] TIME Set time to TIME" \
     99     "\n    -u,--utc    Work in UTC (don't convert to local time)" \
     100     "\n    -R,--rfc-2822   Output RFC-2822 compliant date string" \
     101    ) \
     102    IF_FEATURE_DATE_ISOFMT( \
     103     "\n    -I[SPEC]    Output ISO-8601 compliant date string" \
     104     "\n            SPEC='date' (default) for date only," \
     105     "\n            'hours', 'minutes', or 'seconds' for date and" \
     106     "\n            time to the indicated precision" \
     107    ) \
     108    IF_NOT_LONG_OPTS( \
     109     "\n    -r FILE     Display last modification time of FILE" \
     110     "\n    -d TIME     Display TIME, not 'now'" \
     111    ) IF_LONG_OPTS( \
     112     "\n    -r,--reference FILE Display last modification time of FILE" \
     113     "\n    -d,--date TIME  Display TIME, not 'now'" \
     114    ) \
     115    IF_FEATURE_DATE_ISOFMT( \
     116     "\n    -D FMT      Use FMT for -d TIME conversion" \
     117    ) \
     118     "\n" \
     119     "\nRecognized TIME formats:" \
     120     "\n    hh:mm[:ss]" \
     121     "\n    [YYYY.]MM.DD-hh:mm[:ss]" \
     122     "\n    YYYY-MM-DD hh:mm[:ss]" \
     123     "\n    [[[[[YY]YY]MM]DD]hh]mm[.ss]" \
     124
     125#define date_example_usage \
     126       "$ date\n" \
     127       "Wed Apr 12 18:52:41 MDT 2000\n" \
     128
     129#define mv_trivial_usage \
     130       "[-fin] SOURCE DEST\n" \
     131       "or: mv [-fin] SOURCE... DIRECTORY" \
     132
     133#define mv_full_usage "\n\n" \
     134       "Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY\n" \
     135     "\nOptions:" \
     136     "\n    -f  Don't prompt before overwriting" \
     137     "\n    -i  Interactive, prompt before overwrite" \
     138     "\n    -n  Don't overwrite an existing file" \
     139
     140#define mv_example_usage \
     141       "$ mv /tmp/foo /bin/bar\n" \
     142
     143#define base64_trivial_usage \
     144    "[-d] [FILE]" \
     145
     146#define base64_full_usage "\n\n" \
     147       "Base64 encode or decode FILE to standard output" \
     148     "\nOptions:" \
     149     "\n    -d  Decode data" \
     150
     151#define wc_trivial_usage \
     152       "[-c"IF_UNICODE_SUPPORT("m")"lwL] [FILE]..." \
     153
     154#define wc_full_usage "\n\n" \
     155       "Count lines, words, and bytes for each FILE (or stdin)\n" \
     156     "\nOptions:" \
     157     "\n    -c  Count bytes" \
     158    IF_UNICODE_SUPPORT( \
     159     "\n    -m  Count characters" \
     160    ) \
     161     "\n    -l  Count newlines" \
     162     "\n    -w  Count words" \
     163     "\n    -L  Print longest line length" \
     164
     165#define wc_example_usage \
     166       "$ wc /etc/passwd\n" \
     167       "     31      46    1365 /etc/passwd\n" \
     168
     169#define yes_trivial_usage \
     170       "[STRING]" \
     171
     172#define yes_full_usage "\n\n" \
     173       "Repeatedly output a line with STRING, or 'y'" \
     174
     175#define tune2fs_trivial_usage \
     176       "[-c MOUNT_CNT] " \
     177       "[-i DAYS] " \
     178       "[-L LABEL] " \
     179       "BLOCKDEV" \
     180
     181#define tune2fs_full_usage "\n\n" \
     182       "Adjust filesystem options on ext[23] filesystems" \
     183
     184#define patch_trivial_usage \
     185       "[OPTIONS] [ORIGFILE [PATCHFILE]]" \
     186
     187#define patch_full_usage "\n\n" \
     188    IF_LONG_OPTS( \
     189       "    -p,--strip N        Strip N leading components from file names" \
     190     "\n    -i,--input DIFF     Read DIFF instead of stdin" \
     191     "\n    -R,--reverse        Reverse patch" \
     192     "\n    -N,--forward        Ignore already applied patches" \
     193     "\n    --dry-run       Don't actually change files" \
     194     "\n    -E,--remove-empty-files Remove output files if they become empty" \
     195    ) \
     196    IF_NOT_LONG_OPTS( \
     197       "    -p N    Strip N leading components from file names" \
     198     "\n    -i DIFF Read DIFF instead of stdin" \
     199     "\n    -R  Reverse patch" \
     200     "\n    -N  Ignore already applied patches" \
     201     "\n    -E  Remove output files if they become empty" \
     202    ) \
     203
     204#define patch_example_usage \
     205       "$ patch -p1 < example.diff\n" \
     206       "$ patch -p0 -i example.diff" \
     207
     208#define find_trivial_usage \
     209       "[PATH]... [EXPRESSION]" \
     210
     211#define find_full_usage "\n\n" \
     212       "Search for files. The default PATH is the current directory,\n" \
     213       "default EXPRESSION is '-print'\n" \
     214     "\nEXPRESSION may consist of:" \
     215     "\n    -follow     Follow symlinks" \
     216    IF_FEATURE_FIND_XDEV( \
     217     "\n    -xdev       Don't descend directories on other filesystems" \
     218    ) \
     219    IF_FEATURE_FIND_MAXDEPTH( \
     220     "\n    -maxdepth N Descend at most N levels. -maxdepth 0 applies" \
     221     "\n            tests/actions to command line arguments only" \
     222    ) \
     223     "\n    -mindepth N Don't act on first N levels" \
     224     "\n    -name PATTERN   File name (w/o directory name) matches PATTERN" \
     225     "\n    -iname PATTERN  Case insensitive -name" \
     226    IF_FEATURE_FIND_PATH( \
     227     "\n    -path PATTERN   Path matches PATTERN" \
     228    ) \
     229    IF_FEATURE_FIND_REGEX( \
     230     "\n    -regex PATTERN  Path matches regex PATTERN" \
     231    ) \
     232    IF_FEATURE_FIND_TYPE( \
     233     "\n    -type X     File type is X (X is one of: f,d,l,b,c,...)" \
     234    ) \
     235    IF_FEATURE_FIND_PERM( \
     236     "\n    -perm NNN   Permissions match any of (+NNN), all of (-NNN)," \
     237     "\n            or exactly NNN" \
     238    ) \
     239    IF_FEATURE_FIND_MTIME( \
     240     "\n    -mtime DAYS Modified time is greater than (+N), less than (-N)," \
     241     "\n            or exactly N days" \
     242    ) \
     243    IF_FEATURE_FIND_MMIN( \
     244     "\n    -mmin MINS  Modified time is greater than (+N), less than (-N)," \
     245     "\n            or exactly N minutes" \
     246    ) \
     247    IF_FEATURE_FIND_NEWER( \
     248     "\n    -newer FILE Modified time is more recent than FILE's" \
     249    ) \
     250    IF_FEATURE_FIND_INUM( \
     251     "\n    -inum N     File has inode number N" \
     252    ) \
     253    IF_FEATURE_FIND_USER( \
     254     "\n    -user NAME  File is owned by user NAME (numeric user ID allowed)" \
     255    ) \
     256    IF_FEATURE_FIND_GROUP( \
     257     "\n    -group NAME File belongs to group NAME (numeric group ID allowed)" \
     258    ) \
     259    IF_FEATURE_FIND_DEPTH( \
     260     "\n    -depth      Process directory name after traversing it" \
     261    ) \
     262    IF_FEATURE_FIND_SIZE( \
     263     "\n    -size N[bck]    File size is N (c:bytes,k:kbytes,b:512 bytes(def.))" \
     264     "\n            +/-N: file size is bigger/smaller than N" \
     265    ) \
     266    IF_FEATURE_FIND_LINKS( \
     267     "\n    -links N    Number of links is greater than (+N), less than (-N)," \
     268     "\n            or exactly N" \
     269    ) \
     270     "\n    -print      Print (default and assumed)" \
     271    IF_FEATURE_FIND_PRINT0( \
     272     "\n    -print0     Delimit output with null characters rather than" \
     273     "\n            newlines" \
     274    ) \
     275    IF_FEATURE_FIND_CONTEXT( \
     276     "\n    -context    File has specified security context" \
     277    ) \
     278    IF_FEATURE_FIND_EXEC( \
     279     "\n    -exec CMD ARG ; Run CMD with all instances of {} replaced by the" \
     280     "\n            matching files" \
     281    ) \
     282    IF_FEATURE_FIND_PRUNE( \
     283     "\n    -prune      Stop traversing current subtree" \
     284    ) \
     285    IF_FEATURE_FIND_DELETE( \
     286     "\n    -delete     Delete files, turns on -depth option" \
     287    ) \
     288    IF_FEATURE_FIND_PAREN( \
     289     "\n    (EXPR)      Group an expression" \
     290    ) \
     291
     292#define find_example_usage \
     293       "$ find / -name passwd\n" \
     294       "/etc/passwd\n" \
     295
     296#define grep_trivial_usage \
     297       "[-HhnlLoqvsriw" \
     298       "F" \
     299    IF_FEATURE_GREP_EGREP_ALIAS("E") \
     300    IF_EXTRA_COMPAT("z") \
     301       "] [-m N] " \
     302    IF_FEATURE_GREP_CONTEXT("[-A/B/C N] ") \
     303       "PATTERN/-e PATTERN.../-f FILE [FILE]..." \
     304
     305#define grep_full_usage "\n\n" \
     306       "Search for PATTERN in FILEs (or stdin)\n" \
     307     "\nOptions:" \
     308     "\n    -H  Add 'filename:' prefix" \
     309     "\n    -h  Do not add 'filename:' prefix" \
     310     "\n    -n  Add 'line_no:' prefix" \
     311     "\n    -l  Show only names of files that match" \
     312     "\n    -L  Show only names of files that don't match" \
     313     "\n    -c  Show only count of matching lines" \
     314     "\n    -o  Show only the matching part of line" \
     315     "\n    -q  Quiet. Return 0 if PATTERN is found, 1 otherwise" \
     316     "\n    -v  Select non-matching lines" \
     317     "\n    -s  Suppress open and read errors" \
     318     "\n    -r  Recurse" \
     319     "\n    -i  Ignore case" \
     320     "\n    -w  Match whole words only" \
     321     "\n    -F  PATTERN is a literal (not regexp)" \
     322    IF_FEATURE_GREP_EGREP_ALIAS( \
     323     "\n    -E  PATTERN is an extended regexp" \
     324    ) \
     325    IF_EXTRA_COMPAT( \
     326     "\n    -z  Input is NUL terminated" \
     327    ) \
     328     "\n    -m N    Match up to N times per file" \
     329    IF_FEATURE_GREP_CONTEXT( \
     330     "\n    -A N    Print N lines of trailing context" \
     331     "\n    -B N    Print N lines of leading context" \
     332     "\n    -C N    Same as '-A N -B N'" \
     333    ) \
     334     "\n    -e PTRN Pattern to match" \
     335     "\n    -f FILE Read pattern from file" \
     336
     337#define grep_example_usage \
     338       "$ grep root /etc/passwd\n" \
     339       "root:x:0:0:root:/root:/bin/bash\n" \
     340       "$ grep ^[rR]oo. /etc/passwd\n" \
     341       "root:x:0:0:root:/root:/bin/bash\n" \
     342
     343#define egrep_trivial_usage NOUSAGE_STR \
     344
     345#define egrep_full_usage "" \
     346
     347#define fgrep_trivial_usage NOUSAGE_STR \
     348
     349#define fgrep_full_usage "" \
     350
     351#define xargs_trivial_usage \
     352       "[OPTIONS] [PROG ARGS]" \
     353
     354#define xargs_full_usage "\n\n" \
     355       "Run PROG on every item given by stdin\n" \
     356     "\nOptions:" \
     357    IF_FEATURE_XARGS_SUPPORT_CONFIRMATION( \
     358     "\n    -p  Ask user whether to run each command" \
     359    ) \
     360     "\n    -r  Don't run command if input is empty" \
     361    IF_FEATURE_XARGS_SUPPORT_ZERO_TERM( \
     362     "\n    -0  Input is separated by NUL characters" \
     363    ) \
     364     "\n    -t  Print the command on stderr before execution" \
     365     "\n    -e[STR] STR stops input processing" \
     366     "\n    -n N    Pass no more than N args to PROG" \
     367     "\n    -s N    Pass command line of no more than N bytes" \
     368    IF_FEATURE_XARGS_SUPPORT_TERMOPT( \
     369     "\n    -x  Exit if size is exceeded" \
     370    ) \
     371
     372#define xargs_example_usage \
     373       "$ ls | xargs gzip\n" \
     374       "$ find . -name '*.c' -print | xargs rm\n" \
     375
     376#define bootchartd_trivial_usage \
     377       "start [PROG ARGS]|stop|init" \
     378
     379#define bootchartd_full_usage "\n\n" \
     380       "Create /var/log/bootchart.tgz with boot chart data\n" \
     381     "\nOptions:" \
     382     "\nstart: start background logging; with PROG, run PROG, then kill logging with USR1" \
     383     "\nstop: send USR1 to all bootchartd processes" \
     384     "\ninit: start background logging; stop when getty/xdm is seen (for init scripts)" \
     385     "\nUnder PID 1: as init, then exec $bootchart_init, /init, /sbin/init" \
     386
     387#define halt_trivial_usage \
     388       "[-d DELAY] [-n] [-f]" IF_FEATURE_WTMP(" [-w]") \
     389
     390#define halt_full_usage "\n\n" \
     391       "Halt the system\n" \
     392     "\nOptions:" \
     393     "\n    -d SEC  Delay interval" \
     394     "\n    -n  Do not sync" \
     395     "\n    -f  Force (don't go through init)" \
     396    IF_FEATURE_WTMP( \
     397     "\n    -w  Only write a wtmp record" \
     398    ) \
     399
     400#define poweroff_trivial_usage \
     401       "[-d DELAY] [-n] [-f]" \
     402
     403#define poweroff_full_usage "\n\n" \
     404       "Halt and shut off power\n" \
     405     "\nOptions:" \
     406     "\n    -d SEC  Delay interval" \
     407     "\n    -n  Do not sync" \
     408     "\n    -f  Force (don't go through init)" \
     409
     410#define reboot_trivial_usage \
     411       "[-d DELAY] [-n] [-f]" \
     412
     413#define reboot_full_usage "\n\n" \
     414       "Reboot the system\n" \
     415     "\nOptions:" \
     416     "\n    -d SEC  Delay interval" \
     417     "\n    -n  Do not sync" \
     418     "\n    -f  Force (don't go through init)" \
     419
     420#define linuxrc_trivial_usage NOUSAGE_STR \
     421
     422#define linuxrc_full_usage "" \
     423
     424#define init_trivial_usage \
     425       "" \
     426
     427#define init_full_usage "\n\n" \
     428       "Init is the parent of all processes" \
     429
     430#define init_notes_usage \
     431    "This version of init is designed to be run only by the kernel.\n" \
     432    "\n" \
     433    "BusyBox init doesn't support multiple runlevels. The runlevels field of\n" \
     434    "the /etc/inittab file is completely ignored by BusyBox init. If you want\n" \
     435    "runlevels, use sysvinit.\n" \
     436    "\n" \
     437    "BusyBox init works just fine without an inittab. If no inittab is found,\n" \
     438    "it has the following default behavior:\n" \
     439    "\n" \
     440    "   ::sysinit:/etc/init.d/rcS\n" \
     441    "   ::askfirst:/bin/sh\n" \
     442    "   ::ctrlaltdel:/sbin/reboot\n" \
     443    "   ::shutdown:/sbin/swapoff -a\n" \
     444    "   ::shutdown:/bin/umount -a -r\n" \
     445    "   ::restart:/sbin/init\n" \
     446    "\n" \
     447    "if it detects that /dev/console is _not_ a serial console, it will also run:\n" \
     448    "\n" \
     449    "   tty2::askfirst:/bin/sh\n" \
     450    "   tty3::askfirst:/bin/sh\n" \
     451    "   tty4::askfirst:/bin/sh\n" \
     452    "\n" \
     453    "If you choose to use an /etc/inittab file, the inittab entry format is as follows:\n" \
     454    "\n" \
     455    "   <id>:<runlevels>:<action>:<process>\n" \
     456    "\n" \
     457    "   <id>:\n" \
     458    "\n" \
     459    "       WARNING: This field has a non-traditional meaning for BusyBox init!\n" \
     460    "       The id field is used by BusyBox init to specify the controlling tty for\n" \
     461    "       the specified process to run on. The contents of this field are\n" \
     462    "       appended to \"/dev/\" and used as-is. There is no need for this field to\n" \
     463    "       be unique, although if it isn't you may have strange results. If this\n" \
     464    "       field is left blank, the controlling tty is set to the console. Also\n" \
     465    "       note that if BusyBox detects that a serial console is in use, then only\n" \
     466    "       entries whose controlling tty is either the serial console or /dev/null\n" \
     467    "       will be run. BusyBox init does nothing with utmp. We don't need no\n" \
     468    "       stinkin' utmp.\n" \
     469    "\n" \
     470    "   <runlevels>:\n" \
     471    "\n" \
     472    "       The runlevels field is completely ignored.\n" \
     473    "\n" \
     474    "   <action>:\n" \
     475    "\n" \
     476    "       Valid actions include: sysinit, respawn, askfirst, wait,\n" \
     477    "       once, restart, ctrlaltdel, and shutdown.\n" \
     478    "\n" \
     479    "       The available actions can be classified into two groups: actions\n" \
     480    "       that are run only once, and actions that are re-run when the specified\n" \
     481    "       process exits.\n" \
     482    "\n" \
     483    "       Run only-once actions:\n" \
     484    "\n" \
     485    "           'sysinit' is the first item run on boot. init waits until all\n" \
     486    "           sysinit actions are completed before continuing. Following the\n" \
     487    "           completion of all sysinit actions, all 'wait' actions are run.\n" \
     488    "           'wait' actions, like 'sysinit' actions, cause init to wait until\n" \
     489    "           the specified task completes. 'once' actions are asynchronous,\n" \
     490    "           therefore, init does not wait for them to complete. 'restart' is\n" \
     491    "           the action taken to restart the init process. By default this should\n" \
     492    "           simply run /sbin/init, but can be a script which runs pivot_root or it\n" \
     493    "           can do all sorts of other interesting things. The 'ctrlaltdel' init\n" \
     494    "           actions are run when the system detects that someone on the system\n" \
     495    "           console has pressed the CTRL-ALT-DEL key combination. Typically one\n" \
     496    "           wants to run 'reboot' at this point to cause the system to reboot.\n" \
     497    "           Finally the 'shutdown' action specifies the actions to taken when\n" \
     498    "           init is told to reboot. Unmounting filesystems and disabling swap\n" \
     499    "           is a very good here.\n" \
     500    "\n" \
     501    "       Run repeatedly actions:\n" \
     502    "\n" \
     503    "           'respawn' actions are run after the 'once' actions. When a process\n" \
     504    "           started with a 'respawn' action exits, init automatically restarts\n" \
     505    "           it. Unlike sysvinit, BusyBox init does not stop processes from\n" \
     506    "           respawning out of control. The 'askfirst' actions acts just like\n" \
     507    "           respawn, except that before running the specified process it\n" \
     508    "           displays the line \"Please press Enter to activate this console.\"\n" \
     509    "           and then waits for the user to press enter before starting the\n" \
     510    "           specified process.\n" \
     511    "\n" \
     512    "       Unrecognized actions (like initdefault) will cause init to emit an\n" \
     513    "       error message, and then go along with its business. All actions are\n" \
     514    "       run in the order they appear in /etc/inittab.\n" \
     515    "\n" \
     516    "   <process>:\n" \
     517    "\n" \
     518    "       Specifies the process to be executed and its command line.\n" \
     519    "\n" \
     520    "Example /etc/inittab file:\n" \
     521    "\n" \
     522    "   # This is run first except when booting in single-user mode\n" \
     523    "   #\n" \
     524    "   ::sysinit:/etc/init.d/rcS\n" \
     525    "   \n" \
     526    "   # /bin/sh invocations on selected ttys\n" \
     527    "   #\n" \
     528    "   # Start an \"askfirst\" shell on the console (whatever that may be)\n" \
     529    "   ::askfirst:-/bin/sh\n" \
     530    "   # Start an \"askfirst\" shell on /dev/tty2-4\n" \
     531    "   tty2::askfirst:-/bin/sh\n" \
     532    "   tty3::askfirst:-/bin/sh\n" \
     533    "   tty4::askfirst:-/bin/sh\n" \
     534    "   \n" \
     535    "   # /sbin/getty invocations for selected ttys\n" \
     536    "   #\n" \
     537    "   tty4::respawn:/sbin/getty 38400 tty4\n" \
     538    "   tty5::respawn:/sbin/getty 38400 tty5\n" \
     539    "   \n" \
     540    "   \n" \
     541    "   # Example of how to put a getty on a serial line (for a terminal)\n" \
     542    "   #\n" \
     543    "   #::respawn:/sbin/getty -L ttyS0 9600 vt100\n" \
     544    "   #::respawn:/sbin/getty -L ttyS1 9600 vt100\n" \
     545    "   #\n" \
     546    "   # Example how to put a getty on a modem line\n" \
     547    "   #::respawn:/sbin/getty 57600 ttyS2\n" \
     548    "   \n" \
     549    "   # Stuff to do when restarting the init process\n" \
     550    "   ::restart:/sbin/init\n" \
     551    "   \n" \
     552    "   # Stuff to do before rebooting\n" \
     553    "   ::ctrlaltdel:/sbin/reboot\n" \
     554    "   ::shutdown:/bin/umount -a -r\n" \
     555    "   ::shutdown:/sbin/swapoff -a\n" \
     556
     557#define mesg_trivial_usage \
     558       "[y|n]" \
     559
     560#define mesg_full_usage "\n\n" \
     561       "Control write access to your terminal\n" \
     562       "    y   Allow write access to your terminal\n" \
     563       "    n   Disallow write access to your terminal" \
     564
     565#define add_shell_trivial_usage \
     566       "SHELL..." \
     567
     568#define add_shell_full_usage "\n\n" \
     569       "Add SHELLs to /etc/shells" \
     570
     571#define remove_shell_trivial_usage \
     572       "SHELL..." \
     573
     574#define remove_shell_full_usage "\n\n" \
     575       "Remove SHELLs from /etc/shells" \
     576
     577#define conspy_trivial_usage \
     578    "[-vcsndf] [-x COL] [-y LINE] [CONSOLE_NO]" \
     579
     580#define conspy_full_usage "\n\n" \
     581     "A text-mode VNC like program for Linux virtual consoles." \
     582     "\nTo exit, quickly press ESC 3 times." \
     583     "\n" \
     584     "\nOptions:" \
     585     "\n    -v  Don't send keystrokes to the console" \
     586     "\n    -c  Create missing devices in /dev" \
     587     "\n    -s  Open a SHELL session" \
     588     "\n    -n  Black & white" \
     589     "\n    -d  Dump console to stdout" \
     590     "\n    -f  Follow cursor" \
     591     "\n    -x COL  Starting column" \
     592     "\n    -y LINE Starting line" \
     593
     594#define dc_trivial_usage \
     595       "EXPRESSION..." \
     596
     597#define dc_full_usage "\n\n" \
     598       "Tiny RPN calculator. Operations:\n" \
     599       "+, add, -, sub, *, mul, /, div, %, mod, **, exp, and, or, not, eor,\n" \
     600       "p - print top of the stack (without popping),\n" \
     601       "f - print entire stack,\n" \
     602       "o - pop the value and set output radix (must be 10, 16, 8 or 2).\n" \
     603       "Examples: 'dc 2 2 add' -> 4, 'dc 8 8 * 2 2 + /' -> 16" \
     604
     605#define dc_example_usage \
     606       "$ dc 2 2 + p\n" \
     607       "4\n" \
     608       "$ dc 8 8 \\* 2 2 + / p\n" \
     609       "16\n" \
     610       "$ dc 0 1 and p\n" \
     611       "0\n" \
     612       "$ dc 0 1 or p\n" \
     613       "1\n" \
     614       "$ echo 72 9 div 8 mul p | dc\n" \
     615       "64\n" \
     616
     617#define nandwrite_trivial_usage \
     618    "[-p] [-s ADDR] MTD_DEVICE [FILE]" \
     619
     620#define nandwrite_full_usage "\n\n" \
     621    "Write to the specified MTD device\n" \
     622     "\nOptions:" \
     623     "\n    -p  Pad to page size" \
     624     "\n    -s ADDR Start address" \
     625
     626#define nanddump_trivial_usage \
     627    "[-o] [-b] [-s ADDR] [-f FILE] MTD_DEVICE" \
     628
     629#define nanddump_full_usage "\n\n" \
     630    "Dump the sepcified MTD device\n" \
     631     "\nOptions:" \
     632     "\n    -o  Omit oob data" \
     633     "\n    -b  Omit bad block from the dump" \
     634     "\n    -s ADDR Start address" \
     635     "\n    -l LEN  Length" \
     636     "\n    -f FILE Dump to file ('-' for stdout)" \
     637
     638#define ubiattach_trivial_usage \
     639       "-m MTD_NUM [-d UBI_NUM] UBI_CTRL_DEV" \
     640
     641#define ubiattach_full_usage "\n\n" \
     642       "Attach MTD device to UBI\n" \
     643     "\nOptions:" \
     644     "\n    -m MTD_NUM  MTD device number to attach" \
     645     "\n    -d UBI_NUM  UBI device number to assign" \
     646
     647#define ubidetach_trivial_usage \
     648       "-d UBI_NUM UBI_CTRL_DEV" \
     649
     650#define ubidetach_full_usage "\n\n" \
     651       "Detach MTD device from UBI\n" \
     652     "\nOptions:" \
     653     "\n    -d UBI_NUM  UBI device number" \
     654
     655#if !ENABLE_MODPROBE_SMALL \
     656
     657#define depmod_trivial_usage NOUSAGE_STR \
     658
     659#define depmod_full_usage "" \
     660
     661#endif \
     662
     663#if !ENABLE_MODPROBE_SMALL \
     664
     665#define insmod_trivial_usage \
     666    IF_FEATURE_2_4_MODULES("[OPTIONS] MODULE ") \
     667    IF_NOT_FEATURE_2_4_MODULES("FILE ") \
     668    "[SYMBOL=VALUE]..." \
     669
     670#define insmod_full_usage "\n\n" \
     671       "Load the specified kernel modules into the kernel" \
     672    IF_FEATURE_2_4_MODULES( "\n" \
     673     "\nOptions:" \
     674     "\n    -f  Force module to load into the wrong kernel version" \
     675     "\n    -k  Make module autoclean-able" \
     676     "\n    -v  Verbose" \
     677     "\n    -q  Quiet" \
     678     "\n    -L  Lock: prevent simultaneous loads" \
     679    IF_FEATURE_INSMOD_LOAD_MAP( \
     680     "\n    -m  Output load map to stdout" \
     681    ) \
     682     "\n    -x  Don't export externs" \
     683    ) \
     684
     685#endif \
     686
     687#if !ENABLE_MODPROBE_SMALL \
     688
     689#define lsmod_trivial_usage \
     690       "" \
     691
     692#define lsmod_full_usage "\n\n" \
     693       "List the currently loaded kernel modules" \
     694
     695#endif \
     696
     697#define modinfo_trivial_usage \
     698       "[-adlp0] [-F keyword] MODULE" \
     699
     700#define modinfo_full_usage "\n\n" \
     701       "Options:" \
     702     "\n    -a      Shortcut for '-F author'" \
     703     "\n    -d      Shortcut for '-F description'" \
     704     "\n    -l      Shortcut for '-F license'" \
     705     "\n    -p      Shortcut for '-F parm'" \
     706     "\n    -F keyword  Keyword to look for" \
     707     "\n    -0      Separate output with NULs" \
     708
     709#define modinfo_example_usage \
     710       "$ modinfo -F vermagic loop\n" \
     711
     712#if !ENABLE_MODPROBE_SMALL \
     713
     714#define modprobe_notes_usage \
     715    "modprobe can (un)load a stack of modules, passing each module options (when\n" \
     716    "loading). modprobe uses a configuration file to determine what option(s) to\n" \
     717    "pass each module it loads.\n" \
     718    "\n" \
     719    "The configuration file is searched (in this order):\n" \
     720    "\n" \
     721    "    /etc/modprobe.conf (2.6 only)\n" \
     722    "    /etc/modules.conf\n" \
     723    "    /etc/conf.modules (deprecated)\n" \
     724    "\n" \
     725    "They all have the same syntax (see below). If none is present, it is\n" \
     726    "_not_ an error; each loaded module is then expected to load without\n" \
     727    "options. Once a file is found, the others are tested for.\n" \
     728    "\n" \
     729    "/etc/modules.conf entry format:\n" \
     730    "\n" \
     731    "  alias <alias_name> <mod_name>\n" \
     732    "    Makes it possible to modprobe alias_name, when there is no such module.\n" \
     733    "    It makes sense if your mod_name is long, or you want a more representative\n" \
     734    "    name for that module (eg. 'scsi' in place of 'aha7xxx').\n" \
     735    "    This makes it also possible to use a different set of options (below) for\n" \
     736    "    the module and the alias.\n" \
     737    "    A module can be aliased more than once.\n" \
     738    "\n" \
     739    "  options <mod_name|alias_name> <symbol=value...>\n" \
     740    "    When loading module mod_name (or the module aliased by alias_name), pass\n" \
     741    "    the \"symbol=value\" pairs as option to that module.\n" \
     742    "\n" \
     743    "Sample /etc/modules.conf file:\n" \
     744    "\n" \
     745    "  options tulip irq=3\n" \
     746    "  alias tulip tulip2\n" \
     747    "  options tulip2 irq=4 io=0x308\n" \
     748    "\n" \
     749    "Other functionality offered by 'classic' modprobe is not available in\n" \
     750    "this implementation.\n" \
     751    "\n" \
     752    "If module options are present both in the config file, and on the command line,\n" \
     753    "then the options from the command line will be passed to the module _after_\n" \
     754    "the options from the config file. That way, you can have defaults in the config\n" \
     755    "file, and override them for a specific usage from the command line.\n" \
     756
     757#define modprobe_example_usage \
     758       "(with the above /etc/modules.conf):\n\n" \
     759       "$ modprobe tulip\n" \
     760       "   will load the module 'tulip' with default option 'irq=3'\n\n" \
     761       "$ modprobe tulip irq=5\n" \
     762       "   will load the module 'tulip' with option 'irq=5', thus overriding the default\n\n" \
     763       "$ modprobe tulip2\n" \
     764       "   will load the module 'tulip' with default options 'irq=4 io=0x308',\n" \
     765       "   which are the default for alias 'tulip2'\n\n" \
     766       "$ modprobe tulip2 irq=8\n" \
     767       "   will load the module 'tulip' with default options 'irq=4 io=0x308 irq=8',\n" \
     768       "   which are the default for alias 'tulip2' overridden by the option 'irq=8'\n\n" \
     769       "   from the command line\n\n" \
     770       "$ modprobe tulip2 irq=2 io=0x210\n" \
     771       "   will load the module 'tulip' with default options 'irq=4 io=0x308 irq=4 io=0x210',\n" \
     772       "   which are the default for alias 'tulip2' overridden by the options 'irq=2 io=0x210'\n\n" \
     773       "   from the command line\n" \
     774
     775#define modprobe_trivial_usage \
     776    "[-alrqvs" \
     777    IF_FEATURE_MODPROBE_BLACKLIST("b") \
     778    "] MODULE [symbol=value]..." \
     779
     780#define modprobe_full_usage "\n\n" \
     781       "Options:" \
     782     "\n    -a  Load multiple MODULEs" \
     783     "\n    -l  List (MODULE is a pattern)" \
     784     "\n    -r  Remove MODULE (stacks) or do autoclean" \
     785     "\n    -q  Quiet" \
     786     "\n    -v  Verbose" \
     787     "\n    -s  Log to syslog" \
     788    IF_FEATURE_MODPROBE_BLACKLIST( \
     789     "\n    -b  Apply blacklist to module names too" \
     790    ) \
     791
     792#endif /* !ENABLE_MODPROBE_SMALL */ \
     793
     794#if ENABLE_MODPROBE_SMALL \
     795
     796#define depmod_trivial_usage NOUSAGE_STR \
     797
     798#define depmod_full_usage "" \
     799
     800#define lsmod_trivial_usage \
     801       "" \
     802
     803#define lsmod_full_usage "\n\n" \
     804       "List the currently loaded kernel modules" \
     805
     806#define insmod_trivial_usage \
     807    IF_FEATURE_2_4_MODULES("[OPTIONS] MODULE ") \
     808    IF_NOT_FEATURE_2_4_MODULES("FILE ") \
     809    "[SYMBOL=VALUE]..." \
     810
     811#define insmod_full_usage "\n\n" \
     812       "Load the specified kernel modules into the kernel" \
     813    IF_FEATURE_2_4_MODULES( "\n" \
     814     "\nOptions:" \
     815     "\n    -f  Force module to load into the wrong kernel version" \
     816     "\n    -k  Make module autoclean-able" \
     817     "\n    -v  Verbose" \
     818     "\n    -q  Quiet" \
     819     "\n    -L  Lock: prevent simultaneous loads" \
     820    IF_FEATURE_INSMOD_LOAD_MAP( \
     821     "\n    -m  Output load map to stdout" \
     822    ) \
     823     "\n    -x  Don't export externs" \
     824    ) \
     825
     826#define rmmod_trivial_usage \
     827       "[-wfa] [MODULE]..." \
     828
     829#define rmmod_full_usage "\n\n" \
     830       "Unload kernel modules\n" \
     831     "\nOptions:" \
     832     "\n    -w  Wait until the module is no longer used" \
     833     "\n    -f  Force unload" \
     834     "\n    -a  Remove all unused modules (recursively)" \
     835
     836#define rmmod_example_usage \
     837       "$ rmmod tulip\n" \
     838
     839#define modprobe_trivial_usage \
     840    "[-qfwrsv] MODULE [symbol=value]..." \
     841
     842#define modprobe_full_usage "\n\n" \
     843       "Options:" \
     844     "\n    -r  Remove MODULE (stacks) or do autoclean" \
     845     "\n    -q  Quiet" \
     846     "\n    -v  Verbose" \
     847     "\n    -f  Force" \
     848     "\n    -w  Wait for unload" \
     849     "\n    -s  Report via syslog instead of stderr" \
     850
     851#endif \
     852
     853#if !ENABLE_MODPROBE_SMALL \
     854
     855#define rmmod_trivial_usage \
     856       "[-wfa] [MODULE]..." \
     857
     858#define rmmod_full_usage "\n\n" \
     859       "Unload kernel modules\n" \
     860     "\nOptions:" \
     861     "\n    -w  Wait until the module is no longer used" \
     862     "\n    -f  Force unload" \
     863     "\n    -a  Remove all unused modules (recursively)" \
     864
     865#define rmmod_example_usage \
     866       "$ rmmod tulip\n" \
     867
     868#endif \
     869
     870#define nbdclient_trivial_usage \
     871       "HOST PORT BLOCKDEV" \
     872
     873#define nbdclient_full_usage "\n\n" \
     874       "Connect to HOST and provide a network block device on BLOCKDEV" \
     875
     876#if ENABLE_NC_110_COMPAT \
     877
     878#define nc_trivial_usage \
     879       "[OPTIONS] HOST PORT  - connect" \
     880    IF_NC_SERVER("\n" \
     881       "nc [OPTIONS] -l -p PORT [HOST] [PORT]  - listen" \
     882    ) \
     883
     884#define nc_full_usage "\n\n" \
     885       "Options:" \
     886     "\n    -e PROG Run PROG after connect (must be last)" \
     887    IF_NC_SERVER( \
     888     "\n    -l  Listen mode, for inbound connects" \
     889    ) \
     890     "\n    -p PORT Local port" \
     891     "\n    -s ADDR Local address" \
     892     "\n    -w SEC  Timeout for connects and final net reads" \
     893    IF_NC_EXTRA( \
     894     "\n    -i SEC  Delay interval for lines sent" /* ", ports scanned" */ \
     895    ) \
     896     "\n    -n  Don't do DNS resolution" \
     897     "\n    -u  UDP mode" \
     898     "\n    -v  Verbose" \
     899    IF_NC_EXTRA( \
     900     "\n    -o FILE Hex dump traffic" \
     901     "\n    -z  Zero-I/O mode (scanning)" \
     902    ) \
     903
     904#endif \
     905
     906#if !ENABLE_NC_110_COMPAT \
     907
     908#if ENABLE_NC_SERVER || ENABLE_NC_EXTRA \
     909
     910#define NC_OPTIONS_STR "\n\nOptions:" \
     911
     912#else \
     913
     914#define NC_OPTIONS_STR \
     915
     916#endif \
     917
     918#define nc_trivial_usage \
     919    IF_NC_EXTRA("[-iN] [-wN] ")IF_NC_SERVER("[-l] [-p PORT] ") \
     920       "["IF_NC_EXTRA("-f FILE|")"IPADDR PORT]"IF_NC_EXTRA(" [-e PROG]") \
     921
     922#define nc_full_usage "\n\n" \
     923       "Open a pipe to IP:PORT" IF_NC_EXTRA(" or FILE") \
     924    NC_OPTIONS_STR \
     925    IF_NC_EXTRA( \
     926     "\n    -e PROG Run PROG after connect" \
     927    IF_NC_SERVER( \
     928     "\n    -l  Listen mode, for inbound connects" \
     929    IF_NC_EXTRA( \
     930     "\n        (use -l twice with -e for persistent server)") \
     931     "\n    -p PORT Local port" \
     932    ) \
     933     "\n    -w SEC  Timeout for connect" \
     934     "\n    -i SEC  Delay interval for lines sent" \
     935     "\n    -f FILE Use file (ala /dev/ttyS0) instead of network" \
     936    ) \
     937
     938#define nc_notes_usage "" \
     939    IF_NC_EXTRA( \
     940       "To use netcat as a terminal emulator on a serial port:\n\n" \
     941       "$ stty 115200 -F /dev/ttyS0\n" \
     942       "$ stty raw -echo -ctlecho && nc -f /dev/ttyS0\n" \
     943    ) \
     944
     945#define nc_example_usage \
     946       "$ nc foobar.somedomain.com 25\n" \
     947       "220 foobar ESMTP Exim 3.12 #1 Sat, 15 Apr 2000 00:03:02 -0600\n" \
     948       "help\n" \
     949       "214-Commands supported:\n" \
     950       "214-    HELO EHLO MAIL RCPT DATA AUTH\n" \
     951       "214     NOOP QUIT RSET HELP\n" \
     952       "quit\n" \
     953       "221 foobar closing connection\n" \
     954
     955#endif \
     956
     957#define netstat_trivial_usage \
     958       "[-"IF_ROUTE("r")"al] [-tuwx] [-en"IF_FEATURE_NETSTAT_WIDE("W")IF_FEATURE_NETSTAT_PRG("p")"]" \
     959
     960#define netstat_full_usage "\n\n" \
     961       "Display networking information\n" \
     962     "\nOptions:" \
     963    IF_ROUTE( \
     964     "\n    -r  Routing table" \
     965    ) \
     966     "\n    -a  All sockets" \
     967     "\n    -l  Listening sockets" \
     968     "\n        Else: connected sockets" \
     969     "\n    -t  TCP sockets" \
     970     "\n    -u  UDP sockets" \
     971     "\n    -w  Raw sockets" \
     972     "\n    -x  Unix sockets" \
     973     "\n        Else: all socket types" \
     974     "\n    -e  Other/more information" \
     975     "\n    -n  Don't resolve names" \
     976    IF_FEATURE_NETSTAT_WIDE( \
     977     "\n    -W  Wide display" \
     978    ) \
     979    IF_FEATURE_NETSTAT_PRG( \
     980     "\n    -p  Show PID/program name for sockets" \
     981    ) \
     982
     983#define iostat_trivial_usage \
     984       "[-c] [-d] [-t] [-z] [-k|-m] [ALL|BLOCKDEV...] [INTERVAL [COUNT]]" \
     985
     986#define iostat_full_usage "\n\n" \
     987       "Report CPU and I/O statistics\n" \
     988     "\nOptions:" \
     989     "\n    -c  Show CPU utilization" \
     990     "\n    -d  Show device utilization" \
     991     "\n    -t  Print current time" \
     992     "\n    -z  Omit devices with no activity" \
     993     "\n    -k  Use kb/s" \
     994     "\n    -m  Use Mb/s" \
     995
     996#define mpstat_trivial_usage \
     997       "[-A] [-I SUM|CPU|ALL|SCPU] [-u] [-P num|ALL] [INTERVAL [COUNT]]" \
     998
     999#define mpstat_full_usage "\n\n" \
     1000       "Per-processor statistics\n" \
     1001     "\nOptions:" \
     1002     "\n    -A          Same as -I ALL -u -P ALL" \
     1003     "\n    -I SUM|CPU|ALL|SCPU Report interrupt statistics" \
     1004     "\n    -P num|ALL      Processor to monitor" \
     1005     "\n    -u          Report CPU utilization" \
     1006
     1007#define pmap_trivial_usage \
     1008       "[-x][-q] PID" \
     1009
     1010#define pmap_full_usage "\n\n" \
     1011       "Display detailed precesses' memory usage\n" \
     1012       "\nOptions:" \
     1013       "\n     -x              show details" \
     1014       "\n     -q              quiet" \
     1015
     1016#define powertop_trivial_usage \
     1017       "" \
     1018
     1019#define powertop_full_usage "\n\n" \
     1020       "Analyze power consumption on Intel-based laptops\n" \
     1021
     1022#define smemcap_trivial_usage ">SMEMDATA.TAR" \
     1023
     1024#define smemcap_full_usage "\n\n" \
     1025       "Collect memory usage data in /proc and write it to stdout" \
     1026
     1027#define ash_trivial_usage NOUSAGE_STR \
     1028
     1029#define ash_full_usage "" \
     1030
     1031#define sh_trivial_usage NOUSAGE_STR \
     1032
     1033#define sh_full_usage "" \
     1034
     1035#define bash_trivial_usage NOUSAGE_STR \
     1036
     1037#define bash_full_usage "" \
     1038
     1039#define cttyhack_trivial_usage \
     1040       "PROG ARGS" \
     1041
     1042#define cttyhack_full_usage "\n\n" \
     1043       "Give PROG a controlling tty if possible." \
     1044     "\nExample for /etc/inittab (for busybox init):" \
     1045     "\n    ::respawn:/bin/cttyhack /bin/sh" \
     1046     "\nGiving controlling tty to shell running with PID 1:" \
     1047     "\n    $ exec cttyhack sh" \
     1048     "\nStarting interactive shell from boot shell script:" \
     1049     "\n    setsid cttyhack sh" \
     1050
     1051#define hush_trivial_usage NOUSAGE_STR \
     1052
     1053#define hush_full_usage "" \
     1054
     1055#define msh_trivial_usage NOUSAGE_STR \
     1056
     1057#define msh_full_usage "" \
     1058
     1059#define sh_trivial_usage NOUSAGE_STR \
     1060
     1061#define sh_full_usage "" \
     1062
     1063#define bash_trivial_usage NOUSAGE_STR \
     1064
     1065#define bash_full_usage "" \
     1066
     1067#define blockdev_trivial_usage \
     1068    "OPTION BLOCKDEV" \
     1069
     1070#define blockdev_full_usage "\n\n" \
     1071       "Options:" \
     1072     "\n    --setro     Set ro" \
     1073     "\n    --setrw     Set rw" \
     1074     "\n    --getro     Get ro" \
     1075     "\n    --getss     Get sector size" \
     1076     "\n    --getbsz    Get block size" \
     1077     "\n    --setbsz BYTES  Set block size" \
     1078     "\n    --getsize   Get device size in 512-byte sectors" \
     1079     "\n    --getsize64 Get device size in bytes" \
     1080     "\n    --flushbufs Flush buffers" \
     1081     "\n    --rereadpt  Reread partition table" \
     1082
     1083#define rev_trivial_usage \
     1084    "[FILE]..." \
     1085
     1086#define rev_full_usage "\n\n" \
     1087    "Reverse lines of FILE" \
     1088
     1089#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1 \
     1090
     1091# define IF_UDHCP_VERBOSE(...) __VA_ARGS__ \
     1092
     1093#else \
     1094
     1095# define IF_UDHCP_VERBOSE(...) \
     1096
     1097#endif \
     1098
     1099#define udhcpc_trivial_usage \
     1100       "[-fbnq"IF_UDHCP_VERBOSE("v")"oCR] [-i IFACE] [-r IP] [-s PROG] [-p PIDFILE]\n" \
     1101       "    [-H HOSTNAME] [-V VENDOR] [-x OPT:VAL]... [-O OPT]..." IF_FEATURE_UDHCP_PORT(" [-P N]") \
     1102
     1103#define udhcpc_full_usage "\n" \
     1104    IF_LONG_OPTS( \
     1105     "\n    -i,--interface IFACE    Interface to use (default eth0)" \
     1106     "\n    -p,--pidfile FILE   Create pidfile" \
     1107     "\n    -s,--script PROG    Run PROG at DHCP events (default "CONFIG_UDHCPC_DEFAULT_SCRIPT")" \
     1108     "\n    -t,--retries N      Send up to N discover packets" \
     1109     "\n    -T,--timeout N      Pause between packets (default 3 seconds)" \
     1110     "\n    -A,--tryagain N     Wait N seconds after failure (default 20)" \
     1111     "\n    -f,--foreground     Run in foreground" \
     1112    USE_FOR_MMU( \
     1113     "\n    -b,--background     Background if lease is not obtained" \
     1114    ) \
     1115     "\n    -n,--now        Exit if lease is not obtained" \
     1116     "\n    -q,--quit       Exit after obtaining lease" \
     1117     "\n    -R,--release        Release IP on exit" \
     1118     "\n    -S,--syslog     Log to syslog too" \
     1119    IF_FEATURE_UDHCP_PORT( \
     1120     "\n    -P,--client-port N  Use port N (default 68)" \
     1121    ) \
     1122    IF_FEATURE_UDHCPC_ARPING( \
     1123     "\n    -a,--arping     Use arping to validate offered address" \
     1124    ) \
     1125     "\n    -O,--request-option OPT Request option OPT from server (cumulative)" \
     1126     "\n    -o,--no-default-options Don't request any options (unless -O is given)" \
     1127     "\n    -r,--request IP     Request this IP address" \
     1128     "\n    -x OPT:VAL      Include option OPT in sent packets (cumulative)" \
     1129     "\n                Examples of string, numeric, and hex byte opts:" \
     1130     "\n                -x hostname:bbox - option 12" \
     1131     "\n                -x lease:3600 - option 51 (lease time)" \
     1132     "\n                -x 0x3d:0100BEEFC0FFEE - option 61 (client id)" \
     1133     "\n    -F,--fqdn NAME      Ask server to update DNS mapping for NAME" \
     1134     "\n    -H,-h,--hostname NAME   Send NAME as client hostname (default none)" \
     1135     "\n    -V,--vendorclass VENDOR Vendor identifier (default 'udhcp VERSION')" \
     1136     "\n    -C,--clientid-none  Don't send MAC as client identifier" \
     1137    IF_UDHCP_VERBOSE( \
     1138     "\n    -v          Verbose" \
     1139    ) \
     1140    ) \
     1141    IF_NOT_LONG_OPTS( \
     1142     "\n    -i IFACE    Interface to use (default eth0)" \
     1143     "\n    -p FILE     Create pidfile" \
     1144     "\n    -s PROG     Run PROG at DHCP events (default "CONFIG_UDHCPC_DEFAULT_SCRIPT")" \
     1145     "\n    -t N        Send up to N discover packets" \
     1146     "\n    -T N        Pause between packets (default 3 seconds)" \
     1147     "\n    -A N        Wait N seconds (default 20) after failure" \
     1148     "\n    -f      Run in foreground" \
     1149    USE_FOR_MMU( \
     1150     "\n    -b      Background if lease is not obtained" \
     1151    ) \
     1152     "\n    -n      Exit if lease is not obtained" \
     1153     "\n    -q      Exit after obtaining lease" \
     1154     "\n    -R      Release IP on exit" \
     1155     "\n    -S      Log to syslog too" \
     1156    IF_FEATURE_UDHCP_PORT( \
     1157     "\n    -P N        Use port N (default 68)" \
     1158    ) \
     1159    IF_FEATURE_UDHCPC_ARPING( \
     1160     "\n    -a      Use arping to validate offered address" \
     1161    ) \
     1162     "\n    -O OPT      Request option OPT from server (cumulative)" \
     1163     "\n    -o      Don't request any options (unless -O is given)" \
     1164     "\n    -r IP       Request this IP address" \
     1165     "\n    -x OPT:VAL  Include option OPT in sent packets (cumulative)" \
     1166     "\n            Examples of string, numeric, and hex byte opts:" \
     1167     "\n            -x hostname:bbox - option 12" \
     1168     "\n            -x lease:3600 - option 51 (lease time)" \
     1169     "\n            -x 0x3d:0100BEEFC0FFEE - option 61 (client id)" \
     1170     "\n    -F NAME     Ask server to update DNS mapping for NAME" \
     1171     "\n    -H,-h NAME  Send NAME as client hostname (default none)" \
     1172     "\n    -V VENDOR   Vendor identifier (default 'udhcp VERSION')" \
     1173     "\n    -C      Don't send MAC as client identifier" \
     1174    IF_UDHCP_VERBOSE( \
     1175     "\n    -v      Verbose" \
     1176    ) \
     1177    ) \
     1178
     1179#define acpid_trivial_usage \
     1180       "[-d] [-c CONFDIR] [-l LOGFILE] [-a ACTIONFILE] [-M MAPFILE] [-e PROC_EVENT_FILE] [-p PIDFILE]"
     1181#define acpid_full_usage "\n\n" \
     1182       "Listen to ACPI events and spawn specific helpers on event arrival\n" \
     1183     "\nOptions:" \
     1184     "\n    -c DIR  Config directory [/etc/acpi]" \
     1185     "\n    -d  Don't daemonize, (implies -f)" \
     1186     "\n    -e FILE /proc event file [/proc/acpi/event]" \
     1187     "\n    -f  Run in foreground" \
     1188     "\n    -l FILE Log file [/var/log/acpid.log]" \
     1189     "\n    -p FILE Pid file [/var/run/acpid.pid]" \
     1190     "\n    -a FILE Action file [/etc/acpid.conf]" \
     1191     "\n    -M FILE Map file [/etc/acpi.map]" \
     1192    IF_FEATURE_ACPID_COMPAT( \
     1193     "\n\nAccept and ignore compatibility options -g -m -s -S -v" \
     1194    )
     1195
     1196#define acpid_example_usage \
     1197       "Without -e option, acpid uses all /dev/input/event* files\n" \
     1198       "# acpid\n" \
     1199       "# acpid -l /var/log/my-acpi-log\n" \
     1200       "# acpid -e /proc/acpi/event\n"
    131201
    141202#define addgroup_trivial_usage \
    15        "[-g GID]"USE_FEATURE_ADDUSER_TO_GROUP(" [user_name]")" group_name"
    16 #define addgroup_full_usage \
    17        "Add a group to the system"USE_FEATURE_ADDUSER_TO_GROUP(" or add an user to a group") \
    18        "\n\nOptions:\n" \
    19        "    -g GID  Specify gid"
     1203       "[-g GID] " IF_FEATURE_ADDUSER_TO_GROUP("[USER] ") "GROUP"
     1204#define addgroup_full_usage "\n\n" \
     1205       "Add a group " IF_FEATURE_ADDUSER_TO_GROUP("or add a user to a group") "\n" \
     1206     "\nOptions:" \
     1207     "\n    -g GID  Group id" \
     1208     "\n    -S  Create a system group" \
    201209
    211210#define adduser_trivial_usage \
    22        "[OPTIONS] user_name"
    23 #define adduser_full_usage \
    24        "Add a user to the system" \
    25        "\n\nOptions:\n" \
    26        "    -h DIR      Home directory\n" \
    27        "    -g GECOS    GECOS field\n" \
    28        "    -s SHELL    Login shell\n" \
    29        "    -G GROUP    Add user to existing group\n" \
    30        "    -S      Create a system user (ignored)\n" \
    31        "    -D      Do not assign a password (logins still possible via ssh)\n" \
    32        "    -H      Do not create home directory"
     1211       "[OPTIONS] USER"
     1212#define adduser_full_usage "\n\n" \
     1213       "Add a user\n" \
     1214     "\nOptions:" \
     1215     "\n    -h DIR      Home directory" \
     1216     "\n    -g GECOS    GECOS field" \
     1217     "\n    -s SHELL    Login shell" \
     1218     "\n    -G GRP      Add user to existing group" \
     1219     "\n    -S      Create a system user" \
     1220     "\n    -D      Don't assign a password" \
     1221     "\n    -H      Don't create home directory" \
     1222     "\n    -u UID      User id" \
    331223
    341224#define adjtimex_trivial_usage \
    35        "[-q] [-o offset] [-f frequency] [-p timeconstant] [-t tick]"
    36 #define adjtimex_full_usage \
    37        "Read and optionally set system timebase parameters.\n" \
    38        "See adjtimex(2)." \
    39        "\n\nOptions:\n" \
    40        "    -q      Quiet\n" \
    41        "    -o offset   Time offset, microseconds\n" \
    42        "    -f frequency    Frequency adjust, integer kernel units (65536 is 1ppm)\n" \
    43        "            (positive values make the system clock run faster)\n" \
    44        "    -t tick     Microseconds per tick, usually 10000\n" \
    45        "    -p timeconstant"
     1225       "[-q] [-o OFF] [-f FREQ] [-p TCONST] [-t TICK]"
     1226#define adjtimex_full_usage "\n\n" \
     1227       "Read and optionally set system timebase parameters. See adjtimex(2)\n" \
     1228     "\nOptions:" \
     1229     "\n    -q  Quiet" \
     1230     "\n    -o OFF  Time offset, microseconds" \
     1231     "\n    -f FREQ Frequency adjust, integer kernel units (65536 is 1ppm)" \
     1232     "\n        (positive values make clock run faster)" \
     1233     "\n    -t TICK Microseconds per tick, usually 10000" \
     1234     "\n    -p TCONST" \
    461235
    471236#define ar_trivial_usage \
    481237       "[-o] [-v] [-p] [-t] [-x] ARCHIVE FILES"
    49 #define ar_full_usage \
    50        "Extract or list FILES from an ar archive" \
    51        "\n\nOptions:\n" \
    52        "    -o  Preserve original dates\n" \
    53        "    -p  Extract to stdout\n" \
    54        "    -t  List\n" \
    55        "    -x  Extract\n" \
    56        "    -v  Verbose"
     1238#define ar_full_usage "\n\n" \
     1239       "Extract or list FILES from an ar archive\n" \
     1240     "\nOptions:" \
     1241     "\n    -o  Preserve original dates" \
     1242     "\n    -p  Extract to stdout" \
     1243     "\n    -t  List" \
     1244     "\n    -x  Extract" \
     1245     "\n    -v  Verbose" \
    571246
    581247#define arp_trivial_usage \
    59        "\n" \
    60        "[-vn]   [-H type] [-i if] -a [hostname]\n" \
    61        "[-v]          [-i if] -d hostname [pub]\n" \
    62        "[-v]    [-H type] [-i if] -s hostname hw_addr [temp]\n" \
    63        "[-v]    [-H type] [-i if] -s hostname hw_addr [netmask nm] pub\n" \
    64        "[-v]    [-H type] [-i if] -Ds hostname ifa [netmask nm] pub\n"
    65 #define arp_full_usage \
    66        "Manipulate the system ARP cache" \
    67        "\n\nOptions:" \
     1248     "\n[-vn]   [-H HWTYPE] [-i IF] -a [HOSTNAME]" \
     1249     "\n[-v]            [-i IF] -d HOSTNAME [pub]" \
     1250     "\n[-v]    [-H HWTYPE] [-i IF] -s HOSTNAME HWADDR [temp]" \
     1251     "\n[-v]    [-H HWTYPE] [-i IF] -s HOSTNAME HWADDR [netmask MASK] pub" \
     1252     "\n[-v]    [-H HWTYPE] [-i IF] -Ds HOSTNAME IFACE [netmask MASK] pub"
     1253#define arp_full_usage "\n\n" \
     1254       "Manipulate ARP cache\n" \
     1255     "\nOptions:" \
    681256       "\n  -a      Display (all) hosts" \
    69        "\n  -s      Set a new ARP entry" \
     1257       "\n  -s      Set new ARP entry" \
    701258       "\n  -d      Delete a specified entry" \
    711259       "\n  -v      Verbose" \
    721260       "\n  -n      Don't resolve names" \
    73        "\n  -i if       Specify network interface (e.g. eth0)" \
     1261       "\n  -i IF       Network interface" \
    741262       "\n  -D      Read <hwaddr> from given device" \
    75        "\n  -A, -p      Specify protocol family" \
    76        "\n  -H hwtype   Specify hardware address type"
     1263       "\n  -A,-p AF    Protocol family" \
     1264       "\n  -H HWTYPE   Hardware address type" \
    771265
    781266#define arping_trivial_usage \
    79        "[-fqbDUA] [-c count] [-w timeout] [-i device] [-s sender] target"
    80 #define arping_full_usage \
    81        "Ping hosts by ARP requests/replies" \
    82        "\n\nOptions:\n" \
    83        "    -f      Quit on first ARP reply\n" \
    84        "    -q      Quiet\n" \
    85        "    -b      Keep broadcasting, don't go unicast\n" \
    86        "    -D      Duplicated address detection mode\n" \
    87        "    -U      Unsolicited ARP mode, update your neighbours\n" \
    88        "    -A      ARP answer mode, update your neighbours\n" \
    89        "    -c count    Stop after sending count ARP request packets\n" \
    90        "    -w timeout  Time to wait for ARP reply, in seconds\n" \
    91        "    -I device   Outgoing interface name, default is eth0\n" \
    92        "    -s sender   Set specific sender IP address\n" \
    93        "    target      Target IP address of ARP request"
    94 
    95 #define ash_trivial_usage \
    96        "[FILE]...\n" \
    97        "or: ash -c command [args]..."
    98 #define ash_full_usage \
    99        "The ash shell (command interpreter)"
     1267       "[-fqbDUA] [-c CNT] [-w TIMEOUT] [-I IFACE] [-s SRC_IP] DST_IP"
     1268#define arping_full_usage "\n\n" \
     1269       "Send ARP requests/replies\n" \
     1270     "\nOptions:" \
     1271     "\n    -f      Quit on first ARP reply" \
     1272     "\n    -q      Quiet" \
     1273     "\n    -b      Keep broadcasting, don't go unicast" \
     1274     "\n    -D      Duplicated address detection mode" \
     1275     "\n    -U      Unsolicited ARP mode, update your neighbors" \
     1276     "\n    -A      ARP answer mode, update your neighbors" \
     1277     "\n    -c N        Stop after sending N ARP requests" \
     1278     "\n    -w TIMEOUT  Time to wait for ARP reply, seconds" \
     1279     "\n    -I IFACE    Interface to use (default eth0)" \
     1280     "\n    -s SRC_IP   Sender IP address" \
     1281     "\n    DST_IP      Target IP address" \
    1001282
    1011283#define awk_trivial_usage \
    102        "[OPTION]... [program-text] [FILE ...]"
    103 #define awk_full_usage \
    104        "Options:\n" \
    105        "    -v var=val  Set variable\n" \
    106        "    -F sep      Use 'sep' as field separator\n" \
    107        "    -f filename Read program from file"
     1284       "[OPTIONS] [AWK_PROGRAM] [FILE]..."
     1285#define awk_full_usage "\n\n" \
     1286       "Options:" \
     1287     "\n    -v VAR=VAL  Set variable" \
     1288     "\n    -F SEP      Use SEP as field separator" \
     1289     "\n    -f FILE     Read program from FILE" \
    1081290
    1091291#define basename_trivial_usage \
    1101292       "FILE [SUFFIX]"
    111 #define basename_full_usage \
    112        "Strip directory path and suffixes from FILE.\n" \
    113        "If specified, also remove any trailing SUFFIX."
     1293#define basename_full_usage "\n\n" \
     1294       "Strip directory path and .SUFFIX from FILE\n"
    1141295#define basename_example_usage \
    1151296       "$ basename /usr/local/bin/foo\n" \
     
    1201301       "bar"
    1211302
    122 #define bunzip2_trivial_usage \
    123        "[OPTION]... [FILE]"
    124 #define bunzip2_full_usage \
    125        "Uncompress FILE (or standard input if FILE is '-' or omitted)" \
    126        "\n\nOptions:\n" \
    127        "    -c  Write output to standard output\n" \
    128        "    -f  Force"
     1303#define beep_trivial_usage \
     1304       "-f FREQ -l LEN -d DELAY -r COUNT -n"
     1305#define beep_full_usage "\n\n" \
     1306       "Options:" \
     1307     "\n    -f  Frequency in Hz" \
     1308     "\n    -l  Length in ms" \
     1309     "\n    -d  Delay in ms" \
     1310     "\n    -r  Repetitions" \
     1311     "\n    -n  Start new tone" \
     1312
     1313#define blkid_trivial_usage \
     1314       ""
     1315#define blkid_full_usage "\n\n" \
     1316       "Print UUIDs of all filesystems"
     1317
     1318#define brctl_trivial_usage \
     1319       "COMMAND [BRIDGE [INTERFACE]]"
     1320#define brctl_full_usage "\n\n" \
     1321       "Manage ethernet bridges\n" \
     1322     "\nCommands:" \
     1323    IF_FEATURE_BRCTL_SHOW( \
     1324     "\n    show            Show a list of bridges" \
     1325    ) \
     1326     "\n    addbr BRIDGE        Create BRIDGE" \
     1327     "\n    delbr BRIDGE        Delete BRIDGE" \
     1328     "\n    addif BRIDGE IFACE  Add IFACE to BRIDGE" \
     1329     "\n    delif BRIDGE IFACE  Delete IFACE from BRIDGE" \
     1330    IF_FEATURE_BRCTL_FANCY( \
     1331     "\n    setageing BRIDGE TIME       Set ageing time" \
     1332     "\n    setfd BRIDGE TIME       Set bridge forward delay" \
     1333     "\n    sethello BRIDGE TIME        Set hello time" \
     1334     "\n    setmaxage BRIDGE TIME       Set max message age" \
     1335     "\n    setpathcost BRIDGE COST     Set path cost" \
     1336     "\n    setportprio BRIDGE PRIO     Set port priority" \
     1337     "\n    setbridgeprio BRIDGE PRIO   Set bridge priority" \
     1338     "\n    stp BRIDGE [1/yes/on|0/no/off]  STP on/off" \
     1339    ) \
     1340
     1341#define bzip2_trivial_usage \
     1342       "[OPTIONS] [FILE]..."
     1343#define bzip2_full_usage "\n\n" \
     1344       "Compress FILEs (or stdin) with bzip2 algorithm\n" \
     1345     "\nOptions:" \
     1346     "\n    -1..9   Compression level" \
     1347     "\n    -d  Decompress" \
     1348     "\n    -c  Write to stdout" \
     1349     "\n    -f  Force" \
    1291350
    1301351#define busybox_notes_usage \
    1311352       "Hello world!\n"
    1321353
    133 #define bzcat_trivial_usage \
     1354#define lzop_trivial_usage \
     1355       "[-cfvd123456789CF] [FILE]..."
     1356#define lzop_full_usage "\n\n" \
     1357       "Options:" \
     1358     "\n    -1..9   Compression level" \
     1359     "\n    -d  Decompress" \
     1360     "\n    -c  Write to stdout" \
     1361     "\n    -f  Force" \
     1362     "\n    -v  Verbose" \
     1363     "\n    -F  Don't store or verify checksum" \
     1364     "\n    -C  Also write checksum of compressed block" \
     1365
     1366#define lzopcat_trivial_usage \
     1367       "[-vCF] [FILE]..."
     1368#define lzopcat_full_usage "\n\n" \
     1369       "    -v  Verbose" \
     1370     "\n    -F  Don't store or verify checksum" \
     1371
     1372#define unlzop_trivial_usage \
     1373       "[-cfvCF] [FILE]..."
     1374#define unlzop_full_usage "\n\n" \
     1375       "Options:" \
     1376     "\n    -c  Write to stdout" \
     1377     "\n    -f  Force" \
     1378     "\n    -v  Verbose" \
     1379     "\n    -F  Don't store or verify checksum" \
     1380
     1381#define unlzma_trivial_usage \
     1382       "[-cf] [FILE]..."
     1383#define unlzma_full_usage "\n\n" \
     1384       "Decompress FILE (or stdin)\n" \
     1385     "\nOptions:" \
     1386     "\n    -c  Write to stdout" \
     1387     "\n    -f  Force" \
     1388
     1389#define lzma_trivial_usage \
     1390       "-d [-cf] [FILE]..."
     1391#define lzma_full_usage "\n\n" \
     1392       "Decompress FILE (or stdin)\n" \
     1393     "\nOptions:" \
     1394     "\n    -d  Decompress" \
     1395     "\n    -c  Write to stdout" \
     1396     "\n    -f  Force" \
     1397
     1398#define lzcat_trivial_usage \
    1341399       "FILE"
    135 #define bzcat_full_usage \
    136        "Uncompress to stdout"
    137 
    138 #define unlzma_trivial_usage \
    139        "[OPTION]... [FILE]"
    140 #define unlzma_full_usage \
    141        "Uncompress FILE (or standard input if FILE is '-' or omitted)" \
    142        "\n\nOptions:\n" \
    143        "    -c  Write output to standard output\n" \
    144        "    -f  Force"
    145 
    146 #define lzmacat_trivial_usage \
     1400#define lzcat_full_usage "\n\n" \
     1401       "Decompress to stdout"
     1402
     1403#define unxz_trivial_usage \
     1404       "[-cf] [FILE]..."
     1405#define unxz_full_usage "\n\n" \
     1406       "Decompress FILE (or stdin)\n" \
     1407     "\nOptions:" \
     1408     "\n    -c  Write to stdout" \
     1409     "\n    -f  Force" \
     1410
     1411#define xz_trivial_usage \
     1412       "-d [-cf] [FILE]..."
     1413#define xz_full_usage "\n\n" \
     1414       "Decompress FILE (or stdin)\n" \
     1415     "\nOptions:" \
     1416     "\n    -d  Decompress" \
     1417     "\n    -c  Write to stdout" \
     1418     "\n    -f  Force" \
     1419
     1420#define xzcat_trivial_usage \
    1471421       "FILE"
    148 #define lzmacat_full_usage \
    149        "Uncompress to stdout"
     1422#define xzcat_full_usage "\n\n" \
     1423       "Decompress to stdout"
    1501424
    1511425#define cal_trivial_usage \
    152        "[-jy] [[month] year]"
    153 #define cal_full_usage \
    154        "Display a calendar" \
    155        "\n\nOptions:" \
    156        "\n  -j  Use julian dates" \
    157        "\n  -y  Display the entire year"
     1426       "[-jy] [[MONTH] YEAR]"
     1427#define cal_full_usage "\n\n" \
     1428       "Display a calendar\n" \
     1429     "\nOptions:" \
     1430     "\n    -j  Use julian dates" \
     1431     "\n    -y  Display the entire year" \
    1581432
    1591433#define cat_trivial_usage \
    160        "[-u] [FILE]..."
    161 #define cat_full_usage \
    162        "Concatenate FILE(s) and print them to stdout" \
    163        "\n\nOptions:" \
    164        "\n  -u  Use unbuffered i/o (ignored)"
     1434       "[FILE]..."
     1435#define cat_full_usage "\n\n" \
     1436       "Concatenate FILEs and print them to stdout" \
     1437
    1651438#define cat_example_usage \
    1661439       "$ cat /proc/uptime\n" \
     
    1691442#define catv_trivial_usage \
    1701443       "[-etv] [FILE]..."
    171 #define catv_full_usage \
    172        "Display nonprinting characters as ^x or M-x" \
    173        "\n\nOptions:\n" \
    174        "    -e  End each line with $\n" \
    175        "    -t  Show tabs as ^I\n" \
    176        "    -v  Don't use ^x or M-x escapes"
     1444#define catv_full_usage "\n\n" \
     1445       "Display nonprinting characters as ^x or M-x\n" \
     1446     "\nOptions:" \
     1447     "\n    -e  End each line with $" \
     1448     "\n    -t  Show tabs as ^I" \
     1449     "\n    -v  Don't use ^x or M-x escapes" \
     1450
     1451#define chat_trivial_usage \
     1452       "EXPECT [SEND [EXPECT [SEND...]]]"
     1453#define chat_full_usage "\n\n" \
     1454       "Useful for interacting with a modem connected to stdin/stdout.\n" \
     1455       "A script consists of one or more \"expect-send\" pairs of strings,\n" \
     1456       "each pair is a pair of arguments. Example:\n" \
     1457       "chat '' ATZ OK ATD123456 CONNECT '' ogin: pppuser word: ppppass '~'" \
     1458
    1771459#define chattr_trivial_usage \
    178        "[-R] [-+=AacDdijsStTu] [-v version] files..."
    179 #define chattr_full_usage \
    180        "Change file attributes on an ext2 fs\n\n" \
    181        "Modifiers:\n" \
    182        "    -   Remove attributes\n" \
    183        "    +   Add attributes\n" \
    184        "    =   Set attributes\n" \
    185        "Attributes:\n" \
    186        "    A   Don't track atime\n" \
    187        "    a   Append mode only\n" \
    188        "    c   Enable compress\n" \
    189        "    D   Write dir contents synchronously\n" \
    190        "    d   Do not backup with dump\n" \
    191        "    i   Cannot be modified (immutable)\n" \
    192        "    j   Write all data to journal first\n" \
    193        "    s   Zero disk storage when deleted\n" \
    194        "    S   Write file contents synchronously\n" \
    195        "    t   Disable tail-merging of partial blocks with other files\n" \
    196        "    u   Allow file to be undeleted\n" \
    197        "Options:\n" \
    198        "    -R  Recursively list subdirectories\n" \
    199        "    -v  Set the file's version/generation number"
     1460       "[-R] [-+=AacDdijsStTu] [-v VERSION] [FILE]..."
     1461#define chattr_full_usage "\n\n" \
     1462       "Change file attributes on an ext2 fs\n" \
     1463     "\nModifiers:" \
     1464     "\n    -   Remove attributes" \
     1465     "\n    +   Add attributes" \
     1466     "\n    =   Set attributes" \
     1467     "\nAttributes:" \
     1468     "\n    A   Don't track atime" \
     1469     "\n    a   Append mode only" \
     1470     "\n    c   Enable compress" \
     1471     "\n    D   Write dir contents synchronously" \
     1472     "\n    d   Don't backup with dump" \
     1473     "\n    i   Cannot be modified (immutable)" \
     1474     "\n    j   Write all data to journal first" \
     1475     "\n    s   Zero disk storage when deleted" \
     1476     "\n    S   Write file contents synchronously" \
     1477     "\n    t   Disable tail-merging of partial blocks with other files" \
     1478     "\n    u   Allow file to be undeleted" \
     1479     "\nOptions:" \
     1480     "\n    -R  Recurse" \
     1481     "\n    -v  Set the file's version/generation number" \
    2001482
    2011483#define chcon_trivial_usage \
    202        "[OPTIONS] CONTEXT FILE...\n" \
    203        "    chcon [OPTIONS] [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...\n" \
    204        "    chcon [OPTIONS] --reference=RFILE FILE...\n"
    205 #define chcon_full_usage \
     1484       "[OPTIONS] CONTEXT FILE..." \
     1485       "\n  chcon [OPTIONS] [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE..." \
     1486    IF_FEATURE_CHCON_LONG_OPTIONS( \
     1487       "\n  chcon [OPTIONS] --reference=RFILE FILE..." \
     1488    )
     1489#define chcon_full_usage "\n\n" \
    2061490       "Change the security context of each FILE to CONTEXT\n" \
    207        "\n  -v, --verbose       Verbose" \
    208        "\n  -c, --changes       Report changes made" \
    209        "\n  -h, --no-dereference    Affect symlinks instead of their targets" \
    210        "\n  -f, --silent, --quiet   Suppress most error messages" \
    211        "\n  --reference=RFILE   Use RFILE's group instead of using a CONTEXT value" \
    212        "\n  -u, --user=USER     Set user USER in the target security context" \
    213        "\n  -r, --role=ROLE     Set role ROLE in the target security context" \
    214        "\n  -t, --type=TYPE     Set type TYPE in the target security context" \
    215        "\n  -l, --range=RANGE   Set range RANGE in the target security context" \
    216        "\n  -R, --recursive     Recurse subdirectories" \
     1491    IF_FEATURE_CHCON_LONG_OPTIONS( \
     1492     "\n    -v,--verbose        Verbose" \
     1493     "\n    -c,--changes        Report changes made" \
     1494     "\n    -h,--no-dereference Affect symlinks instead of their targets" \
     1495     "\n    -f,--silent,--quiet Suppress most error messages" \
     1496     "\n    --reference=RFILE   Use RFILE's group instead of using a CONTEXT value" \
     1497     "\n    -u,--user=USER      Set user/role/type/range in the target" \
     1498     "\n    -r,--role=ROLE      security context" \
     1499     "\n    -t,--type=TYPE" \
     1500     "\n    -l,--range=RANGE" \
     1501     "\n    -R,--recursive      Recurse" \
     1502    ) \
     1503    IF_NOT_FEATURE_CHCON_LONG_OPTIONS( \
     1504     "\n    -v  Verbose" \
     1505     "\n    -c  Report changes made" \
     1506     "\n    -h  Affect symlinks instead of their targets" \
     1507     "\n    -f  Suppress most error messages" \
     1508     "\n    -u USER Set user/role/type/range in the target security context" \
     1509     "\n    -r ROLE" \
     1510     "\n    -t TYPE" \
     1511     "\n    -l RNG" \
     1512     "\n    -R  Recurse" \
     1513    )
    2171514
    2181515#define chmod_trivial_usage \
    219        "[-R"USE_DESKTOP("cvf")"] MODE[,MODE]... FILE..."
    220 #define chmod_full_usage \
     1516       "[-R"IF_DESKTOP("cvf")"] MODE[,MODE]... FILE..."
     1517#define chmod_full_usage "\n\n" \
    2211518       "Each MODE is one or more of the letters ugoa, one of the\n" \
    222        "symbols +-= and one or more of the letters rwxst" \
    223        "\n\nOptions:" \
    224        "\n  -R  Recurse directories" \
    225     USE_DESKTOP( \
    226        "\n  -c  List changed files" \
    227        "\n  -v  List all files" \
    228        "\n  -f  Hide errors" \
     1519       "symbols +-= and one or more of the letters rwxst\n" \
     1520     "\nOptions:" \
     1521     "\n    -R  Recurse" \
     1522    IF_DESKTOP( \
     1523     "\n    -c  List changed files" \
     1524     "\n    -v  List all files" \
     1525     "\n    -f  Hide errors" \
    2291526    )
    2301527#define chmod_example_usage \
     
    2391536
    2401537#define chgrp_trivial_usage \
    241        "[-RhLHP"USE_DESKTOP("cvf")"]... GROUP FILE..."
    242 #define chgrp_full_usage \
    243        "Change the group membership of each FILE to GROUP" \
    244        "\n\nOptions:" \
    245        "\n  -R  Recurse directories" \
    246        "\n  -h  Affect symlinks instead of symlink targets" \
    247        "\n  -L  Traverse all symlinks to directories" \
    248        "\n  -H  Traverse symlinks on command line only" \
    249        "\n  -P  Do not traverse symlinks (default)" \
    250     USE_DESKTOP( \
    251        "\n  -c  List changed files" \
    252        "\n  -v  Verbose" \
    253        "\n  -f  Hide errors" \
     1538       "[-RhLHP"IF_DESKTOP("cvf")"]... GROUP FILE..."
     1539#define chgrp_full_usage "\n\n" \
     1540       "Change the group membership of each FILE to GROUP\n" \
     1541     "\nOptions:" \
     1542     "\n    -R  Recurse" \
     1543     "\n    -h  Affect symlinks instead of symlink targets" \
     1544     "\n    -L  Traverse all symlinks to directories" \
     1545     "\n    -H  Traverse symlinks on command line only" \
     1546     "\n    -P  Don't traverse symlinks (default)" \
     1547    IF_DESKTOP( \
     1548     "\n    -c  List changed files" \
     1549     "\n    -v  Verbose" \
     1550     "\n    -f  Hide errors" \
    2541551    )
    2551552#define chgrp_example_usage \
     
    2611558
    2621559#define chown_trivial_usage \
    263        "[-RhLHP"USE_DESKTOP("cvf")"]... OWNER[<.|:>[GROUP]] FILE..."
    264 #define chown_full_usage \
    265        "Change the owner and/or group of each FILE to OWNER and/or GROUP" \
    266        "\n\nOptions:" \
    267        "\n  -R  Recurse directories" \
    268        "\n  -h  Affect symlinks instead of symlink targets" \
    269        "\n  -L  Traverse all symlinks to directories" \
    270        "\n  -H  Traverse symlinks on command line only" \
    271        "\n  -P  Do not traverse symlinks (default)" \
    272     USE_DESKTOP( \
    273        "\n  -c  List changed files" \
    274        "\n  -v  List all files" \
    275        "\n  -f  Hide errors" \
     1560       "[-RhLHP"IF_DESKTOP("cvf")"]... OWNER[<.|:>[GROUP]] FILE..."
     1561#define chown_full_usage "\n\n" \
     1562       "Change the owner and/or group of each FILE to OWNER and/or GROUP\n" \
     1563     "\nOptions:" \
     1564     "\n    -R  Recurse" \
     1565     "\n    -h  Affect symlinks instead of symlink targets" \
     1566     "\n    -L  Traverse all symlinks to directories" \
     1567     "\n    -H  Traverse symlinks on command line only" \
     1568     "\n    -P  Don't traverse symlinks (default)" \
     1569    IF_DESKTOP( \
     1570     "\n    -c  List changed files" \
     1571     "\n    -v  List all files" \
     1572     "\n    -f  Hide errors" \
    2761573    )
    2771574#define chown_example_usage \
     
    2861583
    2871584#define chpst_trivial_usage \
    288        "[-vP012] [-u user[:group]] [-U user[:group]] [-e dir] " \
    289        "[-/ dir] [-n nice] [-m bytes] [-d bytes] [-o files] " \
    290        "[-p processes] [-f bytes] [-c bytes] prog args"
    291 #define chpst_full_usage \
    292        "Change the process state and run specified program" \
    293        "\n\nOptions:\n" \
    294        "    -u user[:grp]   Set uid and gid\n" \
    295        "    -U user[:grp]   Set environment variables UID and GID\n" \
    296        "    -e dir      Set environment variables as specified by files\n" \
    297        "            in the directory: file=1st_line_of_file\n" \
    298        "    -/ dir      Chroot to dir\n" \
    299        "    -n inc      Add inc to nice value\n" \
    300        "    -m bytes    Limit data segment, stack segment, locked physical pages,\n" \
    301        "            and total of all segment per process to bytes bytes each\n" \
    302        "    -d bytes    Limit data segment\n" \
    303        "    -o n        Limit the number of open file descriptors per process to n\n" \
    304        "    -p n        Limit number of processes per uid to n\n" \
    305        "    -f bytes    Limit output file size to bytes bytes\n" \
    306        "    -c bytes    Limit core file size to bytes bytes\n" \
    307        "    -v      Verbose\n" \
    308        "    -P      Run prog in a new process group\n" \
    309        "    -0      Close standard input\n" \
    310        "    -1      Close standard output\n" \
    311        "    -2      Close standard error"
     1585       "[-vP012] [-u USER[:GRP]] [-U USER[:GRP]] [-e DIR]\n" \
     1586       "    [-/ DIR] [-n NICE] [-m BYTES] [-d BYTES] [-o N]\n" \
     1587       "    [-p N] [-f BYTES] [-c BYTES] PROG ARGS"
     1588#define chpst_full_usage "\n\n" \
     1589       "Change the process state, run PROG\n" \
     1590     "\nOptions:" \
     1591     "\n    -u USER[:GRP]   Set uid and gid" \
     1592     "\n    -U USER[:GRP]   Set $UID and $GID in environment" \
     1593     "\n    -e DIR      Set environment variables as specified by files" \
     1594     "\n            in DIR: file=1st_line_of_file" \
     1595     "\n    -/ DIR      Chroot to DIR" \
     1596     "\n    -n NICE     Add NICE to nice value" \
     1597     "\n    -m BYTES    Same as -d BYTES -s BYTES -l BYTES" \
     1598     "\n    -d BYTES    Limit data segment" \
     1599     "\n    -o N        Limit number of open files per process" \
     1600     "\n    -p N        Limit number of processes per uid" \
     1601     "\n    -f BYTES    Limit output file sizes" \
     1602     "\n    -c BYTES    Limit core file size" \
     1603     "\n    -v      Verbose" \
     1604     "\n    -P      Create new process group" \
     1605     "\n    -0      Close stdin" \
     1606     "\n    -1      Close stdout" \
     1607     "\n    -2      Close stderr" \
     1608
    3121609#define setuidgid_trivial_usage \
    313        "account prog args"
    314 #define setuidgid_full_usage \
    315        "Set uid and gid to account's uid and gid, removing all supplementary\n" \
    316        "groups, then run prog"
     1610       "USER PROG ARGS"
     1611#define setuidgid_full_usage "\n\n" \
     1612       "Set uid and gid to USER's uid and gid, drop supplementary group ids,\n" \
     1613       "run PROG"
    3171614#define envuidgid_trivial_usage \
    318        "account prog args"
    319 #define envuidgid_full_usage \
    320        "Set $UID to account's uid and $GID to account's gid, then run prog"
     1615       "USER PROG ARGS"
     1616#define envuidgid_full_usage "\n\n" \
     1617       "Set $UID to USER's uid and $GID to USER's gid, run PROG"
    3211618#define envdir_trivial_usage \
    322        "dir prog args"
    323 #define envdir_full_usage \
     1619       "DIR PROG ARGS"
     1620#define envdir_full_usage "\n\n" \
    3241621       "Set various environment variables as specified by files\n" \
    325        "in the directory dir, then run prog"
     1622       "in the directory DIR, run PROG"
    3261623#define softlimit_trivial_usage \
    327        "[-a allbytes] [-c corebytes] [-d databytes] [-f filebytes] " \
    328        "[-l lockbytes] [-m membytes] [-o openfiles] [-p processes] " \
    329        "[-r residentbytes] [-s stackbytes] [-t cpusecs] prog args"
    330 #define softlimit_full_usage \
    331        "Set soft resource limits, then run prog" \
    332        "\n\nOptions:\n" \
    333        "    -m n    Same as -d n -s n -l n -a n\n" \
    334        "    -d n    Limit the data segment per process to n bytes\n" \
    335        "    -s n    Limit the stack segment per process to n bytes\n" \
    336        "    -l n    Limit the locked physical pages per process to n bytes\n" \
    337        "    -a n    Limit the total of all segments per process to n bytes\n" \
    338        "    -o n    Limit the number of open file descriptors per process to n\n" \
    339        "    -p n    Limit the number of processes per uid to n\n" \
    340        "Options controlling file sizes:\n" \
    341        "    -f n    Limit output file sizes to n bytes\n" \
    342        "    -c n    Limit core file sizes to n bytes\n" \
    343        "Efficiency opts:\n" \
    344        "    -r n    Limit the resident set size to n bytes. This limit is not\n" \
    345        "        enforced unless physical memory is full\n" \
    346        "    -t n    Limit the CPU time to n seconds. This limit is not enforced\n" \
    347        "        except that the process receives a SIGXCPU signal after n seconds\n" \
    348        "\n" \
    349        "Some options may have no effect on some operating systems\n" \
    350        "n may be =, indicating that soft limit should be set equal to hard limit"
     1624       "[-a BYTES] [-m BYTES] [-d BYTES] [-s BYTES] [-l BYTES]\n" \
     1625       "    [-f BYTES] [-c BYTES] [-r BYTES] [-o N] [-p N] [-t N]\n" \
     1626       "    PROG ARGS"
     1627#define softlimit_full_usage "\n\n" \
     1628       "Set soft resource limits, then run PROG\n" \
     1629     "\nOptions:" \
     1630     "\n    -a BYTES    Limit total size of all segments" \
     1631     "\n    -m BYTES    Same as -d BYTES -s BYTES -l BYTES -a BYTES" \
     1632     "\n    -d BYTES    Limit data segment" \
     1633     "\n    -s BYTES    Limit stack segment" \
     1634     "\n    -l BYTES    Limit locked memory size" \
     1635     "\n    -o N        Limit number of open files per process" \
     1636     "\n    -p N        Limit number of processes per uid" \
     1637     "\nOptions controlling file sizes:" \
     1638     "\n    -f BYTES    Limit output file sizes" \
     1639     "\n    -c BYTES    Limit core file size" \
     1640     "\nEfficiency opts:" \
     1641     "\n    -r BYTES    Limit resident set size" \
     1642     "\n    -t N        Limit CPU time, process receives" \
     1643     "\n            a SIGXCPU after N seconds" \
    3511644
    3521645#define chroot_trivial_usage \
    353        "NEWROOT [COMMAND...]"
    354 #define chroot_full_usage \
    355        "Run COMMAND with root directory set to NEWROOT"
     1646       "NEWROOT [PROG ARGS]"
     1647#define chroot_full_usage "\n\n" \
     1648       "Run PROG with root directory set to NEWROOT"
    3561649#define chroot_example_usage \
    3571650       "$ ls -l /bin/ls\n" \
     
    3641657#define chvt_trivial_usage \
    3651658       "N"
    366 #define chvt_full_usage \
     1659#define chvt_full_usage "\n\n" \
    3671660       "Change the foreground virtual terminal to /dev/ttyN"
    3681661
    3691662#define cksum_trivial_usage \
    3701663       "FILES..."
    371 #define cksum_full_usage \
     1664#define cksum_full_usage "\n\n" \
    3721665       "Calculate the CRC32 checksums of FILES"
    3731666
    3741667#define clear_trivial_usage \
    3751668       ""
    376 #define clear_full_usage \
     1669#define clear_full_usage "\n\n" \
    3771670       "Clear screen"
    3781671
    3791672#define cmp_trivial_usage \
    380        "[-l] [-s] FILE1 [FILE2" USE_DESKTOP(" [SKIP1 [SKIP2]") "]]"
    381 #define cmp_full_usage \
    382        "Compares FILE1 vs stdin if FILE2 is not specified" \
    383        "\n\nOptions:\n" \
    384        "    -l  Write the byte numbers (decimal) and values (octal)\n" \
    385        "        for all differing bytes\n" \
    386        "    -s  Quiet"
     1673       "[-l] [-s] FILE1 [FILE2" IF_DESKTOP(" [SKIP1 [SKIP2]]") "]"
     1674#define cmp_full_usage "\n\n" \
     1675       "Compare FILE1 with FILE2 (or stdin)\n" \
     1676     "\nOptions:" \
     1677     "\n    -l  Write the byte numbers (decimal) and values (octal)" \
     1678     "\n        for all differing bytes" \
     1679     "\n    -s  Quiet" \
    3871680
    3881681#define comm_trivial_usage \
    3891682       "[-123] FILE1 FILE2"
    390 #define comm_full_usage \
    391        "Compare FILE1 to FILE2, or to stdin if - is specified" \
    392        "\n\nOptions:\n" \
    393        "    -1  Suppress lines unique to FILE1\n" \
    394        "    -2  Suppress lines unique to FILE2\n" \
    395        "    -3  Suppress lines common to both files"
     1683#define comm_full_usage "\n\n" \
     1684       "Compare FILE1 with FILE2\n" \
     1685     "\nOptions:" \
     1686     "\n    -1  Suppress lines unique to FILE1" \
     1687     "\n    -2  Suppress lines unique to FILE2" \
     1688     "\n    -3  Suppress lines common to both files" \
    3961689
    3971690#define bbconfig_trivial_usage \
    3981691       ""
    399 #define bbconfig_full_usage \
    400        "Print the config file which built busybox"
    401 
    402 #define bbsh_trivial_usage \
    403        "[FILE]...\n" \
    404        "or: bbsh -c command [args]..."
    405 #define bbsh_full_usage \
    406        "The bbsh shell (command interpreter)"
     1692#define bbconfig_full_usage "\n\n" \
     1693       "Print the config file used by busybox build"
    4071694
    4081695#define chrt_trivial_usage \
    409        "[OPTION]... [prio] [pid | command [arg]...]"
    410 #define chrt_full_usage \
    411        "manipulate real-time attributes of a process" \
    412        "\n\nOptions:\n" \
    413        "    -p  operate on pid\n" \
    414        "    -r  set scheduling policy to SCHED_RR\n" \
    415        "    -f  set scheduling policy to SCHED_FIFO\n" \
    416        "    -o  set scheduling policy to SCHED_OTHER\n" \
    417        "    -m  show min and max priorities"
     1696       "[-prfom] [PRIO] [PID | PROG ARGS]"
     1697#define chrt_full_usage "\n\n" \
     1698       "Change scheduling priority and class for a process\n" \
     1699     "\nOptions:" \
     1700     "\n    -p  Operate on PID" \
     1701     "\n    -r  Set SCHED_RR class" \
     1702     "\n    -f  Set SCHED_FIFO class" \
     1703     "\n    -o  Set SCHED_OTHER class" \
     1704     "\n    -m  Show min/max priorities" \
    4181705
    4191706#define chrt_example_usage \
     
    4221709       "You need CAP_SYS_NICE privileges to set scheduling attributes of a process"
    4231710
     1711#define nice_trivial_usage \
     1712       "[-n ADJUST] [PROG ARGS]"
     1713#define nice_full_usage "\n\n" \
     1714       "Change scheduling priority, run PROG\n" \
     1715     "\nOptions:" \
     1716     "\n    -n ADJUST   Adjust priority by ADJUST" \
     1717
     1718#define renice_trivial_usage \
     1719       "{{-n INCREMENT} | PRIORITY} [[-p | -g | -u] ID...]"
     1720#define renice_full_usage "\n\n" \
     1721       "Change scheduling priority for a running process\n" \
     1722     "\nOptions:" \
     1723     "\n    -n  Adjust current nice value (smaller is faster)" \
     1724     "\n    -p  Process id(s) (default)" \
     1725     "\n    -g  Process group id(s)" \
     1726     "\n    -u  Process user name(s) and/or id(s)" \
     1727
     1728#define ionice_trivial_usage \
     1729    "[-c 1-3] [-n 0-7] [-p PID] [PROG]"
     1730#define ionice_full_usage "\n\n" \
     1731       "Change I/O priority and class\n" \
     1732     "\nOptions:" \
     1733     "\n    -c  Class. 1:realtime 2:best-effort 3:idle" \
     1734     "\n    -n  Priority" \
     1735
    4241736#define cp_trivial_usage \
    425        "[OPTION]... SOURCE DEST"
    426 #define cp_full_usage \
    427        "Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY" \
    428        "\n\nOptions:" \
    429        "\n  -a  Same as -dpR" \
    430     USE_SELINUX( \
    431        "\n  -c  Preserves security context" \
    432     ) \
    433        "\n  -d,-P   Preserve links" \
    434        "\n  -H,-L   Dereference all symlinks (default)" \
    435        "\n  -p  Preserve file attributes if possible" \
    436        "\n  -f  Force overwrite" \
    437        "\n  -i  Prompt before overwrite" \
    438        "\n  -R,-r   Recurse directories" \
    439        "\n  -l,-s   Create (sym)links"
     1737       "[OPTIONS] SOURCE DEST"
     1738#define cp_full_usage "\n\n" \
     1739       "Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY\n" \
     1740     "\nOptions:" \
     1741     "\n    -a  Same as -dpR" \
     1742    IF_SELINUX( \
     1743     "\n    -c  Preserve security context" \
     1744    ) \
     1745     "\n    -R,-r   Recurse" \
     1746     "\n    -d,-P   Preserve symlinks (default if -R)" \
     1747     "\n    -L  Follow all symlinks" \
     1748     "\n    -H  Follow symlinks on command line" \
     1749     "\n    -p  Preserve file attributes if possible" \
     1750     "\n    -f  Overwrite" \
     1751     "\n    -i  Prompt before overwrite" \
     1752     "\n    -l,-s   Create (sym)links" \
    4401753
    4411754#define cpio_trivial_usage \
    442        "-[dimtuv][F cpiofile]"
    443 #define cpio_full_usage \
    444        "Extract or list files from a cpio archive\n" \
    445        "Main operation mode:\n" \
    446        "    d   Make leading directories\n" \
    447        "    i   Extract\n" \
    448        "    m   Preserve mtime\n" \
    449        "    t   List\n" \
    450        "    v   Verbose\n" \
    451        "    u   Unconditional overwrite\n" \
    452        "    F   Input from file"
     1755       "[-dmvu] [-F FILE]" IF_FEATURE_CPIO_O(" [-H newc]") \
     1756       " [-ti"IF_FEATURE_CPIO_O("o")"]" IF_FEATURE_CPIO_P(" [-p DIR]")
     1757#define cpio_full_usage "\n\n" \
     1758       "Extract or list files from a cpio archive" \
     1759    IF_FEATURE_CPIO_O(", or" \
     1760     "\ncreate an archive" IF_FEATURE_CPIO_P(" (-o) or copy files (-p)") \
     1761        " using file list on stdin" \
     1762    ) \
     1763     "\n" \
     1764     "\nMain operation mode:" \
     1765     "\n    -t  List" \
     1766     "\n    -i  Extract" \
     1767    IF_FEATURE_CPIO_O( \
     1768     "\n    -o  Create (requires -H newc)" \
     1769    ) \
     1770    IF_FEATURE_CPIO_P( \
     1771     "\n    -p DIR  Copy files to DIR" \
     1772    ) \
     1773     "\nOptions:" \
     1774     "\n    -d  Make leading directories" \
     1775     "\n    -m  Preserve mtime" \
     1776     "\n    -v  Verbose" \
     1777     "\n    -u  Overwrite" \
     1778     "\n    -F FILE Input (-t,-i,-p) or output (-o) file" \
     1779    IF_FEATURE_CPIO_O( \
     1780     "\n    -H newc Archive format" \
     1781    ) \
    4531782
    4541783#define crond_trivial_usage \
    455        "-d[#] -c crondir -f -b"
    456 #define crond_full_usage \
    457        "    -d [#] -l [#] -S -L logfile -f -b -c dir\n" \
    458        "    -d num  Debug level\n" \
    459        "    -l num  Log level (8 - default)\n" \
    460        "    -S  Log to syslogd (default)\n" \
    461        "    -L file Log to file\n" \
    462        "    -f  Run in foreground\n" \
    463        "    -b  Run in background (default)\n" \
    464        "    -c dir  Working dir"
     1784       "-fbS -l N " IF_FEATURE_CROND_D("-d N ") "-L LOGFILE -c DIR"
     1785#define crond_full_usage "\n\n" \
     1786       "    -f  Foreground" \
     1787     "\n    -b  Background (default)" \
     1788     "\n    -S  Log to syslog (default)" \
     1789     "\n    -l  Set log level. 0 is the most verbose, default 8" \
     1790    IF_FEATURE_CROND_D( \
     1791     "\n    -d  Set log level, log to stderr" \
     1792    ) \
     1793     "\n    -L  Log to file" \
     1794     "\n    -c  Working dir" \
    4651795
    4661796#define crontab_trivial_usage \
    467        "[-c dir] {file|-}|[-u|-l|-e|-d user]"
    468 #define crontab_full_usage \
    469        "    file [opts] Replace crontab from file\n" \
    470        "    - [opts]    Replace crontab from stdin\n" \
    471        "    -u user     Specify user\n" \
    472        "    -l [user]   List crontab for user\n" \
    473        "    -e [user]   Edit crontab for user\n" \
    474        "    -d [user]   Delete crontab for user\n" \
    475        "    -c dir      Specify crontab directory"
     1797       "[-c DIR] [-u USER] [-ler]|[FILE]"
     1798#define crontab_full_usage "\n\n" \
     1799       "    -c  Crontab directory" \
     1800     "\n    -u  User" \
     1801     "\n    -l  List crontab" \
     1802     "\n    -e  Edit crontab" \
     1803     "\n    -r  Delete crontab" \
     1804     "\n    FILE    Replace crontab by FILE ('-': stdin)" \
    4761805
    4771806#define cryptpw_trivial_usage \
    478        "[-a des|md5] [string]"
    479 #define cryptpw_full_usage \
    480        "Outputs crypted string.\n" \
    481        "If string isn't supplied on cmdline, reads it from stdin.\n" \
    482        "\nOptions:" \
    483        "\n  -a  Algorithm to use (default: md5)"
     1807       "[OPTIONS] [PASSWORD] [SALT]"
     1808/* We do support -s, we just don't mention it */
     1809#define cryptpw_full_usage "\n\n" \
     1810       "Crypt the PASSWORD using crypt(3)\n" \
     1811     "\nOptions:" \
     1812    IF_LONG_OPTS( \
     1813     "\n    -P,--password-fd=N  Read password from fd N" \
     1814/*   "\n    -s,--stdin      Use stdin; like -P0" */ \
     1815     "\n    -m,--method=TYPE    Encryption method TYPE" \
     1816     "\n    -S,--salt=SALT" \
     1817    ) \
     1818    IF_NOT_LONG_OPTS( \
     1819     "\n    -P N    Read password from fd N" \
     1820/*   "\n    -s  Use stdin; like -P0" */ \
     1821     "\n    -m TYPE Encryption method TYPE" \
     1822     "\n    -S SALT" \
     1823    ) \
     1824
     1825/* mkpasswd is an alias to cryptpw */
     1826
     1827#define mkpasswd_trivial_usage \
     1828       "[OPTIONS] [PASSWORD] [SALT]"
     1829/* We do support -s, we just don't mention it */
     1830#define mkpasswd_full_usage "\n\n" \
     1831       "Crypt the PASSWORD using crypt(3)\n" \
     1832     "\nOptions:" \
     1833    IF_LONG_OPTS( \
     1834     "\n    -P,--password-fd=N  Read password from fd N" \
     1835/*   "\n    -s,--stdin      Use stdin; like -P0" */ \
     1836     "\n    -m,--method=TYPE    Encryption method TYPE" \
     1837     "\n    -S,--salt=SALT" \
     1838    ) \
     1839    IF_NOT_LONG_OPTS( \
     1840     "\n    -P N    Read password from fd N" \
     1841/*   "\n    -s  Use stdin; like -P0" */ \
     1842     "\n    -m TYPE Encryption method TYPE" \
     1843     "\n    -S SALT" \
     1844    ) \
    4841845
    4851846#define cut_trivial_usage \
    486        "[OPTION]... [FILE]..."
    487 #define cut_full_usage \
    488        "Print selected fields from each input FILE to standard output" \
    489        "\n\nOptions:\n" \
    490        "    -b LIST Output only bytes from LIST\n" \
    491        "    -c LIST Output only characters from LIST\n" \
    492        "    -d CHAR Use CHAR instead of tab as the field delimiter\n" \
    493        "    -s  Output only the lines containing delimiter\n" \
    494        "    -f N    Print only these fields\n" \
    495        "    -n  Ignored"
     1847       "[OPTIONS] [FILE]..."
     1848#define cut_full_usage "\n\n" \
     1849       "Print selected fields from each input FILE to stdout\n" \
     1850     "\nOptions:" \
     1851     "\n    -b LIST Output only bytes from LIST" \
     1852     "\n    -c LIST Output only characters from LIST" \
     1853     "\n    -d CHAR Use CHAR instead of tab as the field delimiter" \
     1854     "\n    -s  Output only the lines containing delimiter" \
     1855     "\n    -f N    Print only these fields" \
     1856     "\n    -n  Ignored" \
     1857
    4961858#define cut_example_usage \
    4971859       "$ echo \"Hello world\" | cut -f 1 -d ' '\n" \
     
    5001862       "world\n"
    5011863
    502 #define date_trivial_usage \
    503        "[OPTION]... [MMDDhhmm[[CC]YY][.ss]] [+FORMAT]"
    504 #define date_full_usage \
    505        "Display current time in the given FORMAT, or set system date" \
    506        "\n\nOptions:\n" \
    507        "    -R      Outputs RFC-822 compliant date string\n" \
    508        "    -d STRING   Displays time described by STRING, not 'now'\n" \
    509     USE_FEATURE_DATE_ISOFMT( \
    510        "    -I[TIMESPEC]    Outputs an ISO-8601 compliant date/time string\n" \
    511        "            TIMESPEC='date' (or missing) for date only,\n" \
    512        "            'hours', 'minutes', or 'seconds' for date and,\n" \
    513        "            time to the indicated precision\n" \
    514        "    -D hint     Use 'hint' as date format, via strptime()\n" \
    515     ) \
    516        "    -s      Sets time described by STRING\n" \
    517        "    -r FILE     Displays the last modification time of FILE\n" \
    518        "    -u      Prints or sets Coordinated Universal Time"
    519 #define date_example_usage \
    520        "$ date\n" \
    521        "Wed Apr 12 18:52:41 MDT 2000\n"
    522 
    523 #define dc_trivial_usage \
    524        "expression ..."
    525 #define dc_full_usage \
    526        "This is a Tiny RPN calculator that understands the\n" \
    527        "following operations: +, add, -, sub, *, mul, /, div, %, mod, " \
    528        "**, exp, and, or, not, eor.\n" \
    529        "For example: 'dc 2 2 add' -> 4, and 'dc 8 8 \\* 2 2 + /' -> 16." \
    530        "\n\nOptions:\n" \
    531        "p - Prints the value on the top of the stack, without altering the stack\n" \
    532        "f - Prints the entire contents of the stack without altering anything\n" \
    533        "o - Pops the value off the top of the stack and uses it to set the output radix\n" \
    534        "    Only 10 and 16 are supported"
    535 #define dc_example_usage \
    536        "$ dc 2 2 + p\n" \
    537        "4\n" \
    538        "$ dc 8 8 \\* 2 2 + / p\n" \
    539        "16\n" \
    540        "$ dc 0 1 and p\n" \
    541        "0\n" \
    542        "$ dc 0 1 or p\n" \
    543        "1\n" \
    544        "$ echo 72 9 div 8 mul p | dc\n" \
    545        "64\n"
    546 
    5471864#define dd_trivial_usage \
    548        "[if=FILE] [of=FILE] " USE_FEATURE_DD_IBS_OBS("[ibs=N] [obs=N] ") "[bs=N] [count=N] [skip=N]\n" \
    549        "    [seek=N]" USE_FEATURE_DD_IBS_OBS(" [conv=notrunc|noerror|sync]")
    550 #define dd_full_usage \
    551        "Copy a file with converting and formatting" \
    552        "\n\nOptions:\n" \
    553        "    if=FILE     Read from FILE instead of stdin\n" \
    554        "    of=FILE     Write to FILE instead of stdout\n" \
    555        "    bs=N        Read and write N bytes at a time\n" \
    556     USE_FEATURE_DD_IBS_OBS( \
    557        "    ibs=N       Read N bytes at a time\n") \
    558     USE_FEATURE_DD_IBS_OBS( \
    559        "    obs=N       Write N bytes at a time\n") \
    560        "    count=N     Copy only N input blocks\n" \
    561        "    skip=N      Skip N input blocks\n" \
    562        "    seek=N      Skip N output blocks\n" \
    563     USE_FEATURE_DD_IBS_OBS( \
    564        "    conv=notrunc    Don't truncate output file\n" \
    565        "    conv=noerror    Continue after read errors\n" \
    566        "    conv=sync   Pad blocks with zeros\n") \
    567        "\n" \
    568        "Numbers may be suffixed by c (x1), w (x2), b (x512), kD (x1000), k (x1024),\n" \
    569        "MD (x1000000), M (x1048576), GD (x1000000000) or G (x1073741824)"
     1865       "[if=FILE] [of=FILE] " IF_FEATURE_DD_IBS_OBS("[ibs=N] [obs=N] ") "[bs=N] [count=N] [skip=N]\n" \
     1866       "    [seek=N]" IF_FEATURE_DD_IBS_OBS(" [conv=notrunc|noerror|sync|fsync]")
     1867#define dd_full_usage "\n\n" \
     1868       "Copy a file with converting and formatting\n" \
     1869     "\nOptions:" \
     1870     "\n    if=FILE     Read from FILE instead of stdin" \
     1871     "\n    of=FILE     Write to FILE instead of stdout" \
     1872     "\n    bs=N        Read and write N bytes at a time" \
     1873    IF_FEATURE_DD_IBS_OBS( \
     1874     "\n    ibs=N       Read N bytes at a time" \
     1875    ) \
     1876    IF_FEATURE_DD_IBS_OBS( \
     1877     "\n    obs=N       Write N bytes at a time" \
     1878    ) \
     1879     "\n    count=N     Copy only N input blocks" \
     1880     "\n    skip=N      Skip N input blocks" \
     1881     "\n    seek=N      Skip N output blocks" \
     1882    IF_FEATURE_DD_IBS_OBS( \
     1883     "\n    conv=notrunc    Don't truncate output file" \
     1884     "\n    conv=noerror    Continue after read errors" \
     1885     "\n    conv=sync   Pad blocks with zeros" \
     1886     "\n    conv=fsync  Physically write data out before finishing" \
     1887    ) \
     1888     "\n" \
     1889     "\nNumbers may be suffixed by c (x1), w (x2), b (x512), kD (x1000), k (x1024)," \
     1890     "\nMD (x1000000), M (x1048576), GD (x1000000000) or G (x1073741824)" \
     1891
    5701892#define dd_example_usage \
    5711893       "$ dd if=/dev/zero of=/dev/ram1 bs=1M count=4\n" \
     
    5751897#define deallocvt_trivial_usage \
    5761898       "[N]"
    577 #define deallocvt_full_usage \
     1899#define deallocvt_full_usage "\n\n" \
    5781900       "Deallocate unused virtual terminal /dev/ttyN"
    5791901
    5801902#define delgroup_trivial_usage \
    581     USE_FEATURE_DEL_USER_FROM_GROUP("[USER] ")"GROUP"
    582 #define delgroup_full_usage \
     1903    IF_FEATURE_DEL_USER_FROM_GROUP("[USER] ")"GROUP"
     1904#define delgroup_full_usage "\n\n" \
    5831905       "Delete group GROUP from the system" \
    584     USE_FEATURE_DEL_USER_FROM_GROUP(" or user USER from group GROUP")
     1906    IF_FEATURE_DEL_USER_FROM_GROUP(" or user USER from group GROUP")
    5851907
    5861908#define deluser_trivial_usage \
    5871909       "USER"
    588 #define deluser_full_usage \
    589        "Delete user USER from the system"
     1910#define deluser_full_usage "\n\n" \
     1911       "Delete USER from the system"
     1912
     1913#define devmem_trivial_usage \
     1914    "ADDRESS [WIDTH [VALUE]]"
     1915
     1916#define devmem_full_usage "\n\n" \
     1917       "Read/write from physical address\n" \
     1918     "\n    ADDRESS Address to act upon" \
     1919     "\n    WIDTH   Width (8/16/...)" \
     1920     "\n    VALUE   Data to be written" \
    5901921
    5911922#define devfsd_trivial_usage \
    592        "mntpnt [-v]" \
    593     USE_DEVFSD_FG_NP("[-fg][-np]" )
    594 #define devfsd_full_usage \
    595        "Manage devfs permissions and old device name symlinks" \
    596        "\n\nOptions:" \
    597        "\n  mntpnt  The mount point where devfs is mounted" \
    598        "\n  -v  Print the protocol version numbers for devfsd" \
    599        "\n      and the kernel-side protocol version and exits" \
    600     USE_DEVFSD_FG_NP( \
    601        "\n  -fg Run the daemon in the foreground" \
    602        "\n  -np Exit after parsing the configuration file" \
    603        "\n      and processing synthetic REGISTER events," \
    604        "\n      do not poll for events")
     1923       "mntpnt [-v]" IF_DEVFSD_FG_NP("[-fg][-np]")
     1924#define devfsd_full_usage "\n\n" \
     1925       "Manage devfs permissions and old device name symlinks\n" \
     1926     "\nOptions:" \
     1927     "\n    mntpnt  The mount point where devfs is mounted" \
     1928     "\n    -v  Print the protocol version numbers for devfsd" \
     1929     "\n        and the kernel-side protocol version and exit" \
     1930    IF_DEVFSD_FG_NP( \
     1931     "\n    -fg Run in foreground" \
     1932     "\n    -np Exit after parsing the configuration file" \
     1933     "\n        and processing synthetic REGISTER events," \
     1934     "\n        don't poll for events" \
     1935    )
    6051936
    6061937#define df_trivial_usage \
    607        "[-" USE_FEATURE_HUMAN_READABLE("hm") "k] [FILESYSTEM ...]"
    608 #define df_full_usage \
    609        "Print the filesystem space used and space available" \
    610     USE_FEATURE_HUMAN_READABLE( \
    611        "\n\nOptions control size display:" \
    612        "\n  -h  Human readable (e.g. 1K 243M 2G)" \
    613        "\n  -m  1024*1024 blocks" \
    614        "\n  -k  1024 blocks") \
    615     SKIP_FEATURE_HUMAN_READABLE( \
    616        "\n\nOptions:" \
    617        "\n  -k  Ignored")
     1938    "[-Pk" \
     1939    IF_FEATURE_HUMAN_READABLE("mh") \
     1940    IF_FEATURE_DF_FANCY("ai] [-B SIZE") \
     1941    "] [FILESYSTEM]..."
     1942#define df_full_usage "\n\n" \
     1943       "Print filesystem usage statistics\n" \
     1944     "\nOptions:" \
     1945     "\n    -P  POSIX output format" \
     1946     "\n    -k  1024-byte blocks (default)" \
     1947    IF_FEATURE_HUMAN_READABLE( \
     1948     "\n    -m  1M-byte blocks" \
     1949     "\n    -h  Human readable (e.g. 1K 243M 2G)" \
     1950    ) \
     1951    IF_FEATURE_DF_FANCY( \
     1952     "\n    -a  Show all filesystems" \
     1953     "\n    -i  Inodes" \
     1954     "\n    -B SIZE Blocksize" \
     1955    ) \
     1956
    6181957#define df_example_usage \
    6191958       "$ df\n" \
    620        "Filesystem           1k-blocks      Used Available Use% Mounted on\n" \
     1959       "Filesystem           1K-blocks      Used Available Use% Mounted on\n" \
    6211960       "/dev/sda3              8690864   8553540    137324  98% /\n" \
    6221961       "/dev/sda1                64216     36364     27852  57% /boot\n" \
    6231962       "$ df /dev/sda3\n" \
    624        "Filesystem           1k-blocks      Used Available Use% Mounted on\n" \
    625        "/dev/sda3              8690864   8553540    137324  98% /\n"
     1963       "Filesystem           1K-blocks      Used Available Use% Mounted on\n" \
     1964       "/dev/sda3              8690864   8553540    137324  98% /\n" \
     1965       "$ POSIXLY_CORRECT=sure df /dev/sda3\n" \
     1966       "Filesystem         512B-blocks      Used Available Use% Mounted on\n" \
     1967       "/dev/sda3             17381728  17107080    274648  98% /\n" \
     1968       "$ POSIXLY_CORRECT=yep df -P /dev/sda3\n" \
     1969       "Filesystem          512-blocks      Used Available Capacity Mounted on\n" \
     1970       "/dev/sda3             17381728  17107080    274648      98% /\n"
    6261971
    6271972#define dhcprelay_trivial_usage \
    628        "[client_device_list] [server_device]"
    629 #define dhcprelay_full_usage \
    630        "Relay dhcp requests from client devices to server device"
    631 
    632 #define dhcprelay_trivial_usage \
    633        "[client_device_list] [server_device]"
    634 #define dhcprelay_full_usage \
    635        "Relay dhcp requests from client devices to server device"
     1973       "CLIENT_IFACE[,CLIENT_IFACE2]... SERVER_IFACE [SERVER_IP]"
     1974#define dhcprelay_full_usage "\n\n" \
     1975       "Relay DHCP requests between clients and server" \
    6361976
    6371977#define diff_trivial_usage \
    638        "[-abdiNqrTstw] [-L LABEL] [-S FILE] [-U LINES] FILE1 FILE2"
    639 #define diff_full_usage \
     1978       "[-abBdiNqrTstw] [-L LABEL] [-S FILE] [-U LINES] FILE1 FILE2"
     1979#define diff_full_usage "\n\n" \
    6401980       "Compare files line by line and output the differences between them.\n" \
    641        "This diff implementation only supports unified diffs." \
    642        "\n\nOptions:\n" \
    643        "    -a  Treat all files as text\n" \
    644        "    -b  Ignore changes in the amount of whitespace\n" \
    645        "    -d  Try hard to find a smaller set of changes\n" \
    646        "    -i  Ignore case differences\n" \
    647        "    -L  Use LABEL instead of the filename in the unified header\n" \
    648        "    -N  Treat absent files as empty\n" \
    649        "    -q  Output only whether files differ\n" \
    650        "    -r  Recursively compare subdirectories\n" \
    651        "    -S  Start with FILE when comparing directories\n" \
    652        "    -T  Make tabs line up by prefixing a tab when necessary\n" \
    653        "    -s  Report when two files are the same\n" \
    654        "    -t  Expand tabs to spaces in output\n" \
    655        "    -U  Output LINES lines of context\n" \
    656        "    -w  Ignore all whitespace"
     1981       "This implementation supports unified diffs only.\n" \
     1982     "\nOptions:" \
     1983     "\n    -a  Treat all files as text" \
     1984     "\n    -b  Ignore changes in the amount of whitespace" \
     1985     "\n    -B  Ignore changes whose lines are all blank" \
     1986     "\n    -d  Try hard to find a smaller set of changes" \
     1987     "\n    -i  Ignore case differences" \
     1988     "\n    -L  Use LABEL instead of the filename in the unified header" \
     1989     "\n    -N  Treat absent files as empty" \
     1990     "\n    -q  Output only whether files differ" \
     1991     "\n    -r  Recurse" \
     1992     "\n    -S  Start with FILE when comparing directories" \
     1993     "\n    -T  Make tabs line up by prefixing a tab when necessary" \
     1994     "\n    -s  Report when two files are the same" \
     1995     "\n    -t  Expand tabs to spaces in output" \
     1996     "\n    -U  Output LINES lines of context" \
     1997     "\n    -w  Ignore all whitespace" \
    6571998
    6581999#define dirname_trivial_usage \
    6592000       "FILENAME"
    660 #define dirname_full_usage \
     2001#define dirname_full_usage "\n\n" \
    6612002       "Strip non-directory suffix from FILENAME"
    6622003#define dirname_example_usage \
     
    6682009#define dmesg_trivial_usage \
    6692010       "[-c] [-n LEVEL] [-s SIZE]"
    670 #define dmesg_full_usage \
    671        "Print or control the kernel ring buffer" \
    672        "\n\nOptions:\n" \
    673        "    -c      Clears the ring buffer's contents after printing\n" \
    674        "    -n LEVEL    Sets console logging level\n" \
    675        "    -s SIZE     Use a buffer of size SIZE"
     2011#define dmesg_full_usage "\n\n" \
     2012       "Print or control the kernel ring buffer\n" \
     2013     "\nOptions:" \
     2014     "\n    -c      Clear ring buffer after printing" \
     2015     "\n    -n LEVEL    Set console logging level" \
     2016     "\n    -s SIZE     Buffer size" \
    6762017
    6772018#define dnsd_trivial_usage \
    678        "[-c config] [-t seconds] [-p port] [-i iface-ip] [-d]"
    679 #define dnsd_full_usage \
    680        "Small and static DNS server daemon" \
    681        "\n\nOptions:\n" \
    682        "    -c  Config filename\n" \
    683        "    -t  TTL in seconds\n" \
    684        "    -p  Listening port\n" \
    685        "    -i  Listening ip (default all)\n" \
    686        "    -d  Daemonize"
     2019       "[-dvs] [-c CONFFILE] [-t TTL_SEC] [-p PORT] [-i ADDR]"
     2020#define dnsd_full_usage "\n\n" \
     2021       "Small static DNS server daemon\n" \
     2022     "\nOptions:" \
     2023     "\n    -c FILE Config file" \
     2024     "\n    -t SEC  TTL" \
     2025     "\n    -p PORT Listen on PORT" \
     2026     "\n    -i ADDR Listen on ADDR" \
     2027     "\n    -d  Daemonize" \
     2028     "\n    -v  Verbose" \
     2029     "\n    -s  Send successful replies only. Use this if you want" \
     2030     "\n        to use /etc/resolv.conf with two nameserver lines:" \
     2031     "\n            nameserver DNSD_SERVER" \
     2032     "\n            nameserver NORNAL_DNS_SERVER" \
    6872033
    6882034#define dos2unix_trivial_usage \
    689        "[option] [FILE]"
    690 #define dos2unix_full_usage \
    691        "Convert FILE from dos format to unix format. When no option\n" \
    692        "is given, the input is converted to the opposite output format.\n" \
    693        "When no file is given, use stdin for input and stdout for output." \
    694        "\n\nOptions:\n" \
    695        "    -u  Output will be in UNIX format\n" \
    696        "    -d  Output will be in DOS format"
     2035       "[-ud] [FILE]"
     2036#define dos2unix_full_usage "\n\n" \
     2037       "Convert FILE in-place from DOS to Unix format.\n" \
     2038       "When no file is given, use stdin/stdout.\n" \
     2039     "\nOptions:" \
     2040     "\n    -u  dos2unix" \
     2041     "\n    -d  unix2dos" \
     2042
     2043#define unix2dos_trivial_usage \
     2044       "[-ud] [FILE]"
     2045#define unix2dos_full_usage "\n\n" \
     2046       "Convert FILE in-place from Unix to DOS format.\n" \
     2047       "When no file is given, use stdin/stdout.\n" \
     2048     "\nOptions:" \
     2049     "\n    -u  dos2unix" \
     2050     "\n    -d  unix2dos" \
    6972051
    6982052#define dpkg_trivial_usage \
    699        "[-ilCPru] [-F option] package_name"
    700 #define dpkg_full_usage \
    701        "Install, remove and manage Debian packages" \
    702        "\n\nOptions:\n" \
    703        "    -i      Install the package\n" \
    704        "    -l      List of installed packages\n" \
    705        "    -C      Configure an unpackaged package\n" \
    706        "    -F depends  Ignore dependency problems\n" \
    707        "    -P      Purge all files of a package\n" \
    708        "    -r      Remove all but the configuration files for a package\n" \
    709        "    -u      Unpack a package, but don't configure it"
     2053       "[-ilCPru] [-F OPT] PACKAGE"
     2054#define dpkg_full_usage "\n\n" \
     2055       "Install, remove and manage Debian packages\n" \
     2056     "\nOptions:" \
     2057    IF_LONG_OPTS( \
     2058     "\n    -i,--install    Install the package" \
     2059     "\n    -l,--list   List of installed packages" \
     2060     "\n    --configure Configure an unpackaged package" \
     2061     "\n    -P,--purge  Purge all files of a package" \
     2062     "\n    -r,--remove Remove all but the configuration files for a package" \
     2063     "\n    --unpack    Unpack a package, but don't configure it" \
     2064     "\n    --force-depends Ignore dependency problems" \
     2065     "\n    --force-confnew Overwrite existing config files when installing" \
     2066     "\n    --force-confold Keep old config files when installing" \
     2067    ) \
     2068    IF_NOT_LONG_OPTS( \
     2069     "\n    -i      Install the package" \
     2070     "\n    -l      List of installed packages" \
     2071     "\n    -C      Configure an unpackaged package" \
     2072     "\n    -P      Purge all files of a package" \
     2073     "\n    -r      Remove all but the configuration files for a package" \
     2074     "\n    -u      Unpack a package, but don't configure it" \
     2075     "\n    -F depends  Ignore dependency problems" \
     2076     "\n    -F confnew  Overwrite existing config files when installing" \
     2077     "\n    -F confold  Keep old config files when installing" \
     2078    )
    7102079
    7112080#define dpkg_deb_trivial_usage \
    7122081       "[-cefxX] FILE [argument]"
    713 #define dpkg_deb_full_usage \
    714        "Perform actions on Debian packages (.debs)" \
    715        "\n\nOptions:\n" \
    716        "    -c  List contents of filesystem tree\n" \
    717        "    -e  Extract control files to [argument] directory\n" \
    718        "    -f  Display control field name starting with [argument]\n" \
    719        "    -x  Extract packages filesystem tree to directory\n" \
    720        "    -X  Verbose extract"
     2082#define dpkg_deb_full_usage "\n\n" \
     2083       "Perform actions on Debian packages (.debs)\n" \
     2084     "\nOptions:" \
     2085     "\n    -c  List contents of filesystem tree" \
     2086     "\n    -e  Extract control files to [argument] directory" \
     2087     "\n    -f  Display control field name starting with [argument]" \
     2088     "\n    -x  Extract packages filesystem tree to directory" \
     2089     "\n    -X  Verbose extract" \
     2090
    7212091#define dpkg_deb_example_usage \
    7222092       "$ dpkg-deb -X ./busybox_0.48-1_i386.deb /tmp\n"
    7232093
    7242094#define du_trivial_usage \
    725        "[-aHLdclsx" USE_FEATURE_HUMAN_READABLE("hm") "k] [FILE]..."
    726 #define du_full_usage \
     2095       "[-aHLdclsx" IF_FEATURE_HUMAN_READABLE("hm") "k] [FILE]..."
     2096#define du_full_usage "\n\n" \
    7272097       "Summarize disk space used for each FILE and/or directory.\n" \
    7282098       "Disk space is printed in units of " \
    729     USE_FEATURE_DU_DEFAULT_BLOCKSIZE_1K("1024") \
    730     SKIP_FEATURE_DU_DEFAULT_BLOCKSIZE_1K("512") \
    731        " bytes." \
    732        "\n\nOptions:\n" \
    733        "    -a  Show sizes of files in addition to directories\n" \
    734        "    -H  Follow symlinks that are FILE command line args\n" \
    735        "    -L  Follow all symlinks encountered\n" \
    736        "    -d N    Limit output to directories (and files with -a) of depth < N\n" \
    737        "    -c  Output a grand total\n" \
    738        "    -l  Count sizes many times if hard linked\n" \
    739        "    -s  Display only a total for each argument\n" \
    740        "    -x  Skip directories on different filesystems\n" \
    741     USE_FEATURE_HUMAN_READABLE( \
    742        "    -h  Print sizes in human readable format (e.g., 1K 243M 2G )\n" \
    743        "    -m  Print sizes in megabytes\n" \
    744     ) \
    745        "    -k  Print sizes in kilobytes" \
    746     USE_FEATURE_DU_DEFAULT_BLOCKSIZE_1K("(default)")
     2099    IF_FEATURE_DU_DEFAULT_BLOCKSIZE_1K("1024") \
     2100    IF_NOT_FEATURE_DU_DEFAULT_BLOCKSIZE_1K("512") \
     2101       " bytes.\n" \
     2102     "\nOptions:" \
     2103     "\n    -a  Show file sizes too" \
     2104     "\n    -L  Follow all symlinks" \
     2105     "\n    -H  Follow symlinks on command line" \
     2106     "\n    -d N    Limit output to directories (and files with -a) of depth < N" \
     2107     "\n    -c  Show grand total" \
     2108     "\n    -l  Count sizes many times if hard linked" \
     2109     "\n    -s  Display only a total for each argument" \
     2110     "\n    -x  Skip directories on different filesystems" \
     2111    IF_FEATURE_HUMAN_READABLE( \
     2112     "\n    -h  Sizes in human readable format (e.g., 1K 243M 2G )" \
     2113     "\n    -m  Sizes in megabytes" \
     2114    ) \
     2115     "\n    -k  Sizes in kilobytes" \
     2116            IF_FEATURE_DU_DEFAULT_BLOCKSIZE_1K(" (default)") \
     2117
    7472118#define du_example_usage \
    7482119       "$ du\n" \
     
    7602131#define dumpkmap_trivial_usage \
    7612132       "> keymap"
    762 #define dumpkmap_full_usage \
    763        "Print out a binary keyboard translation table to standard output"
     2133#define dumpkmap_full_usage "\n\n" \
     2134       "Print a binary keyboard translation table to stdout"
    7642135#define dumpkmap_example_usage \
    7652136       "$ dumpkmap > keymap\n"
     
    7672138#define dumpleases_trivial_usage \
    7682139       "[-r|-a] [-f LEASEFILE]"
    769 #define dumpleases_full_usage \
    770        "Display DHCP leases granted by udhcpd" \
    771        "\n\nOptions:\n" \
    772        "    -f, --file=FILENAME Leases file to load\n" \
    773        "    -r, --remaining     Interpret lease times as time remaining\n" \
    774        "    -a, --absolute      Interpret lease times as expire time"
    775 
     2140#define dumpleases_full_usage "\n\n" \
     2141       "Display DHCP leases granted by udhcpd\n" \
     2142     "\nOptions:" \
     2143    IF_LONG_OPTS( \
     2144     "\n    -f,--file=FILE  Lease file" \
     2145     "\n    -r,--remaining  Show remaining time" \
     2146     "\n    -a,--absolute   Show expiration time" \
     2147    ) \
     2148    IF_NOT_LONG_OPTS( \
     2149     "\n    -f FILE Lease file" \
     2150     "\n    -r  Show remaining time" \
     2151     "\n    -a  Show expiration time" \
     2152    )
     2153
     2154/*
    7762155#define e2fsck_trivial_usage \
    7772156       "[-panyrcdfvstDFSV] [-b superblock] [-B blocksize] " \
     
    7792158       "[-l|-L bad_blocks_file] [-C fd] [-j external_journal] " \
    7802159       "[-E extended-options] device"
    781 #define e2fsck_full_usage \
    782        "Check ext2/ext3 file system" \
    783        "\n\nOptions:\n" \
    784        "    -p      Automatic repair (no questions)\n" \
    785        "    -n      Make no changes to the filesystem\n" \
    786        "    -y      Assume 'yes' to all questions\n" \
    787        "    -c      Check for bad blocks and add them to the badblock list\n" \
    788        "    -f      Force checking even if filesystem is marked clean\n" \
    789        "    -v      Verbose\n" \
    790        "    -b superblock   Use alternative superblock\n" \
    791        "    -B blocksize    Force blocksize when looking for superblock\n" \
    792        "    -j journal  Set location of the external journal\n" \
    793        "    -l file     Add to badblocks list\n" \
    794        "    -L file     Set badblocks list"
     2160#define e2fsck_full_usage "\n\n" \
     2161       "Check ext2/ext3 file system\n" \
     2162     "\nOptions:" \
     2163     "\n    -p      Automatic repair (no questions)" \
     2164     "\n    -n      Make no changes to the filesystem" \
     2165     "\n    -y      Assume 'yes' to all questions" \
     2166     "\n    -c      Check for bad blocks and add them to the badblock list" \
     2167     "\n    -f      Force checking even if filesystem is marked clean" \
     2168     "\n    -v      Verbose" \
     2169     "\n    -b superblock   Use alternative superblock" \
     2170     "\n    -B blocksize    Force blocksize when looking for superblock" \
     2171     "\n    -j journal  Set location of the external journal" \
     2172     "\n    -l file     Add to badblocks list" \
     2173     "\n    -L file     Set badblocks list" \
     2174*/
    7952175
    7962176#define echo_trivial_usage \
    797     USE_FEATURE_FANCY_ECHO("[-neE] ") "[ARG ...]"
    798 #define echo_full_usage \
     2177    IF_FEATURE_FANCY_ECHO("[-neE] ") "[ARG]..."
     2178#define echo_full_usage "\n\n" \
    7992179       "Print the specified ARGs to stdout" \
    800     USE_FEATURE_FANCY_ECHO( \
    801        "\n\nOptions:\n" \
    802        "    -n  Suppress trailing newline\n" \
    803        "    -e  Interpret backslash-escaped characters (i.e., \\t=tab)\n" \
    804        "    -E  Disable interpretation of backslash-escaped characters" \
     2180    IF_FEATURE_FANCY_ECHO( "\n" \
     2181     "\nOptions:" \
     2182     "\n    -n  Suppress trailing newline" \
     2183     "\n    -e  Interpret backslash escapes (i.e., \\t=tab)" \
     2184     "\n    -E  Don't interpret backslash escapes (default)" \
    8052185    )
    8062186#define echo_example_usage \
    8072187       "$ echo \"Erik is cool\"\n" \
    8082188       "Erik is cool\n" \
    809     USE_FEATURE_FANCY_ECHO("$ echo -e \"Erik\\nis\\ncool\"\n" \
     2189    IF_FEATURE_FANCY_ECHO("$ echo -e \"Erik\\nis\\ncool\"\n" \
    8102190       "Erik\n" \
    8112191       "is\n" \
     
    8162196#define eject_trivial_usage \
    8172197       "[-t] [-T] [DEVICE]"
    818 #define eject_full_usage \
    819        "Eject specified DEVICE (or default /dev/cdrom)" \
    820        "\n\nOptions:\n" \
    821        "    -t  Close tray\n" \
    822        "    -T  Open/close tray (toggle)"
     2198#define eject_full_usage "\n\n" \
     2199       "Eject DEVICE or default /dev/cdrom\n" \
     2200     "\nOptions:" \
     2201    IF_FEATURE_EJECT_SCSI( \
     2202     "\n    -s  SCSI device" \
     2203    ) \
     2204     "\n    -t  Close tray" \
     2205     "\n    -T  Open/close tray (toggle)" \
    8232206
    8242207#define ed_trivial_usage ""
     
    8262209
    8272210#define env_trivial_usage \
    828        "[-iu] [-] [name=value]... [command]"
    829 #define env_full_usage \
    830        "Print the current environment or run a program after setting\n" \
    831        "up the specified environment" \
    832        "\n\nOptions:\n" \
    833        "    -, -i   Start with an empty environment\n" \
    834        "    -u  Remove variable from the environment"
     2211       "[-iu] [-] [name=value]... [PROG ARGS]"
     2212#define env_full_usage "\n\n" \
     2213       "Print the current environment or run PROG after setting up\n" \
     2214       "the specified environment\n" \
     2215     "\nOptions:" \
     2216     "\n    -, -i   Start with an empty environment" \
     2217     "\n    -u  Remove variable from the environment" \
    8352218
    8362219#define ether_wake_trivial_usage \
    8372220       "[-b] [-i iface] [-p aa:bb:cc:dd[:ee:ff]] MAC"
    838 #define ether_wake_full_usage \
     2221#define ether_wake_full_usage "\n\n" \
    8392222       "Send a magic packet to wake up sleeping machines.\n" \
    8402223       "MAC must be a station address (00:11:22:33:44:55) or\n" \
    841        "a hostname with a known 'ethers' entry." \
    842        "\n\nOptions:\n" \
    843        "    -b      Send wake-up packet to the broadcast address\n" \
    844        "    -i iface    Use interface ifname instead of the default \"eth0\"\n" \
    845        "    -p pass     Append the four or six byte password PW to the packet"
     2224       "a hostname with a known 'ethers' entry.\n" \
     2225     "\nOptions:" \
     2226     "\n    -b      Send wake-up packet to the broadcast address" \
     2227     "\n    -i iface    Interface to use (default eth0)" \
     2228     "\n    -p pass     Append four or six byte password PW to the packet" \
    8462229
    8472230#define expand_trivial_usage \
    848        "[-i] [-t NUM] [FILE|-]"
    849 #define expand_full_usage \
    850        "Convert tabs to spaces, writing to standard output." \
    851        "\n\nOptions:" \
    852        "\n  -i" USE_FEATURE_EXPAND_LONG_OPTIONS(",--initial") \
    853        "    Do not convert tabs after non blanks" \
    854        "\n  -t" USE_FEATURE_EXPAND_LONG_OPTIONS(",--tabs=N") \
    855        "    Tabstops every N chars"
     2231       "[-i] [-t N] [FILE]..."
     2232#define expand_full_usage "\n\n" \
     2233       "Convert tabs to spaces, writing to stdout\n" \
     2234     "\nOptions:" \
     2235    IF_FEATURE_EXPAND_LONG_OPTIONS( \
     2236     "\n    -i,--initial    Don't convert tabs after non blanks" \
     2237     "\n    -t,--tabs=N Tabstops every N chars" \
     2238    ) \
     2239    IF_NOT_FEATURE_EXPAND_LONG_OPTIONS( \
     2240     "\n    -i  Don't convert tabs after non blanks" \
     2241     "\n    -t  Tabstops every N chars" \
     2242    )
    8562243
    8572244#define expr_trivial_usage \
    8582245       "EXPRESSION"
    859 #define expr_full_usage \
    860        "Print the value of EXPRESSION to standard output.\n\n" \
     2246#define expr_full_usage "\n\n" \
     2247       "Print the value of EXPRESSION to stdout\n" \
     2248    "\n" \
    8612249       "EXPRESSION may be:\n" \
    862        "    ARG1 |  ARG2    ARG1 if it is neither null nor 0, otherwise ARG2\n" \
    863        "    ARG1 &  ARG2    ARG1 if neither argument is null or 0, otherwise 0\n" \
    864        "    ARG1 <  ARG2    ARG1 is less than ARG2\n" \
    865        "    ARG1 <= ARG2    ARG1 is less than or equal to ARG2\n" \
    866        "    ARG1 =  ARG2    ARG1 is equal to ARG2\n" \
    867        "    ARG1 != ARG2    ARG1 is unequal to ARG2\n" \
    868        "    ARG1 >= ARG2    ARG1 is greater than or equal to ARG2\n" \
    869        "    ARG1 >  ARG2    ARG1 is greater than ARG2\n" \
    870        "    ARG1 +  ARG2    Sum of ARG1 and ARG2\n" \
    871        "    ARG1 -  ARG2    Difference of ARG1 and ARG2\n" \
    872        "    ARG1 *  ARG2    Product of ARG1 and ARG2\n" \
    873        "    ARG1 /  ARG2    Quotient of ARG1 divided by ARG2\n" \
    874        "    ARG1 %  ARG2    Remainder of ARG1 divided by ARG2\n" \
     2250       "    ARG1 | ARG2 ARG1 if it is neither null nor 0, otherwise ARG2\n" \
     2251       "    ARG1 & ARG2 ARG1 if neither argument is null or 0, otherwise 0\n" \
     2252       "    ARG1 < ARG2 1 if ARG1 is less than ARG2, else 0. Similarly:\n" \
     2253       "    ARG1 <= ARG2\n" \
     2254       "    ARG1 = ARG2\n" \
     2255       "    ARG1 != ARG2\n" \
     2256       "    ARG1 >= ARG2\n" \
     2257       "    ARG1 > ARG2\n" \
     2258       "    ARG1 + ARG2 Sum of ARG1 and ARG2. Similarly:\n" \
     2259       "    ARG1 - ARG2\n" \
     2260       "    ARG1 * ARG2\n" \
     2261       "    ARG1 / ARG2\n" \
     2262       "    ARG1 % ARG2\n" \
    8752263       "    STRING : REGEXP     Anchored pattern match of REGEXP in STRING\n" \
    8762264       "    match STRING REGEXP Same as STRING : REGEXP\n" \
     
    8812269       "                it is a keyword like 'match' or an\n" \
    8822270       "                operator like '/'\n" \
    883        "    (EXPRESSION)        Value of EXPRESSION\n\n" \
     2271       "    (EXPRESSION)        Value of EXPRESSION\n" \
     2272       "\n" \
    8842273       "Beware that many operators need to be escaped or quoted for shells.\n" \
    8852274       "Comparisons are arithmetic if both ARGs are numbers, else\n" \
     
    8902279#define fakeidentd_trivial_usage \
    8912280       "[-fiw] [-b ADDR] [STRING]"
    892 #define fakeidentd_full_usage \
    893        "Provide fake ident (auth) service" \
    894        "\n\nOptions:" \
    895        "\n  -f  Run in foreground" \
    896        "\n  -i  Inetd mode" \
    897        "\n  -w  Inetd 'wait' mode" \
    898        "\n  -b ADDR Bind to specified address" \
    899        "\n  STRING  Ident answer string (default is 'nobody')"
     2281#define fakeidentd_full_usage "\n\n" \
     2282       "Provide fake ident (auth) service\n" \
     2283     "\nOptions:" \
     2284     "\n    -f  Run in foreground" \
     2285     "\n    -i  Inetd mode" \
     2286     "\n    -w  Inetd 'wait' mode" \
     2287     "\n    -b ADDR Bind to specified address" \
     2288     "\n    STRING  Ident answer string (default: nobody)" \
    9002289
    9012290#define false_trivial_usage \
    9022291       ""
    903 #define false_full_usage \
     2292#define false_full_usage "\n\n" \
    9042293       "Return an exit code of FALSE (1)"
     2294
    9052295#define false_example_usage \
    9062296       "$ false\n" \
     
    9082298       "1\n"
    9092299
     2300#define fbsplash_trivial_usage \
     2301       "-s IMGFILE [-c] [-d DEV] [-i INIFILE] [-f CMD]"
     2302#define fbsplash_full_usage "\n\n" \
     2303       "Options:" \
     2304     "\n    -s  Image" \
     2305     "\n    -c  Hide cursor" \
     2306     "\n    -d  Framebuffer device (default /dev/fb0)" \
     2307     "\n    -i  Config file (var=value):" \
     2308     "\n            BAR_LEFT,BAR_TOP,BAR_WIDTH,BAR_HEIGHT" \
     2309     "\n            BAR_R,BAR_G,BAR_B" \
     2310     "\n    -f  Control pipe (else exit after drawing image)" \
     2311     "\n            commands: 'NN' (% for progress bar) or 'exit'" \
     2312
    9102313#define fbset_trivial_usage \
    911        "[options] [mode]"
    912 #define fbset_full_usage \
     2314       "[OPTIONS] [MODE]"
     2315#define fbset_full_usage "\n\n" \
    9132316       "Show and modify frame buffer settings"
     2317
    9142318#define fbset_example_usage \
    9152319       "$ fbset\n" \
     
    9242328#define fdflush_trivial_usage \
    9252329       "DEVICE"
    926 #define fdflush_full_usage \
     2330#define fdflush_full_usage "\n\n" \
    9272331       "Force floppy disk drive to detect disk change"
    9282332
    9292333#define fdformat_trivial_usage \
    9302334       "[-n] DEVICE"
    931 #define fdformat_full_usage \
    932        "Format floppy disk" \
    933        "\n\nOptions:\n" \
    934        "    -n  Don't verify after format"
     2335#define fdformat_full_usage "\n\n" \
     2336       "Format floppy disk\n" \
     2337     "\nOptions:" \
     2338     "\n    -n  Don't verify after format" \
     2339
     2340/* Looks like someone forgot to add this to config system */
     2341#ifndef ENABLE_FEATURE_FDISK_BLKSIZE
     2342# define ENABLE_FEATURE_FDISK_BLKSIZE 0
     2343# define IF_FEATURE_FDISK_BLKSIZE(a)
     2344#endif
    9352345
    9362346#define fdisk_trivial_usage \
    937        "[-luv] [-C CYLINDERS] [-H HEADS] [-S SECTORS] [-b SSZ] DISK"
    938 #define fdisk_full_usage \
    939        "Change partition table" \
    940        "\n\nOptions:\n" \
    941        "    -l      List partition table(s)\n" \
    942        "    -u      Give Start and End in sector (instead of cylinder) units\n" \
    943        "    -s PARTITION    Give partition size(s) in blocks\n" \
    944        "    -b 2048     (for certain MO disks) use 2048-byte sectors\n" \
    945        "    -C CYLINDERS    Set the number of cylinders\n" \
    946        "    -H HEADS    Set the number of heads\n" \
    947        "    -S SECTORS  Set the number of sectors\n" \
    948        "    -v      Give fdisk version"
    949 
    950 #define find_trivial_usage \
    951        "[PATH...] [EXPRESSION]"
    952 #define find_full_usage \
    953        "Search for files in a directory hierarchy. The default PATH is\n" \
    954        "the current directory, default EXPRESSION is '-print'\n" \
    955      "\nEXPRESSION may consist of:" \
    956      "\n    -follow     Dereference symlinks" \
    957     USE_FEATURE_FIND_XDEV( \
    958      "\n    -xdev       Don't descend directories on other filesystems") \
    959     USE_FEATURE_FIND_MAXDEPTH( \
    960      "\n    -maxdepth N Descend at most N levels. -maxdepth 0 applies" \
    961      "\n            tests/actions to command line arguments only") \
    962      "\n    -name PATTERN   File name (w/o directory name) matches PATTERN" \
    963     USE_FEATURE_FIND_PATH( \
    964      "\n    -path PATTERN   Path matches PATTERN") \
    965     USE_FEATURE_FIND_REGEX( \
    966      "\n    -regex PATTERN  Path matches regex PATTERN") \
    967     USE_FEATURE_FIND_TYPE( \
    968      "\n    -type X     File type is X (X is one of: f,d,l,b,c,...)") \
    969     USE_FEATURE_FIND_PERM( \
    970      "\n    -perm NNN   Permissions match any of (+NNN), all of (-NNN)," \
    971      "\n            or exactly (NNN)") \
    972     USE_FEATURE_FIND_MTIME( \
    973      "\n    -mtime DAYS Modified time is greater than (+N), less than (-N)," \
    974      "\n            or exactly (N) days") \
    975     USE_FEATURE_FIND_MMIN( \
    976      "\n    -mmin MINS  Modified time is greater than (+N), less than (-N)," \
    977      "\n            or exactly (N) minutes") \
    978     USE_FEATURE_FIND_NEWER( \
    979      "\n    -newer FILE Modified time is more recent than FILE's") \
    980     USE_FEATURE_FIND_INUM( \
    981      "\n    -inum N     File has inode number N") \
    982     USE_FEATURE_FIND_USER( \
    983      "\n    -user NAME  File is owned by user NAME (numeric user ID allowed)") \
    984     USE_FEATURE_FIND_GROUP( \
    985      "\n    -group NAME File belongs to group NAME (numeric group ID allowed)") \
    986     USE_FEATURE_FIND_DEPTH( \
    987      "\n    -depth      Process directory name after traversing it") \
    988     USE_FEATURE_FIND_SIZE( \
    989      "\n    -size N[bck]    File size is N (c:bytes,k:kbytes,b:512 bytes(def.))." \
    990      "\n            +/-N: file size is bigger/smaller than N") \
    991      "\n    -print      Print (default and assumed)" \
    992     USE_FEATURE_FIND_PRINT0( \
    993      "\n    -print0     Delimit output with null characters rather than" \
    994      "\n            newlines") \
    995     USE_FEATURE_FIND_CONTEXT ( \
    996      "\n    -context    File has specified security context") \
    997     USE_FEATURE_FIND_EXEC( \
    998      "\n    -exec CMD ARG ; Execute CMD with all instances of {} replaced by the" \
    999      "\n            matching files") \
    1000     USE_FEATURE_FIND_PRUNE( \
    1001      "\n    -prune      Stop traversing current subtree") \
    1002     USE_FEATURE_FIND_DELETE( \
    1003      "\n    -delete     Delete files, turns on -depth option") \
    1004     USE_FEATURE_FIND_PAREN( \
    1005      "\n    (EXPR)      Group an expression") \
    1006 
    1007 #define find_example_usage \
    1008        "$ find / -name passwd\n" \
    1009        "/etc/passwd\n"
     2347       "[-ul" IF_FEATURE_FDISK_BLKSIZE("s") "] " \
     2348       "[-C CYLINDERS] [-H HEADS] [-S SECTORS] [-b SSZ] DISK"
     2349#define fdisk_full_usage "\n\n" \
     2350       "Change partition table\n" \
     2351     "\nOptions:" \
     2352     "\n    -u      Start and End are in sectors (instead of cylinders)" \
     2353     "\n    -l      Show partition table for each DISK, then exit" \
     2354    IF_FEATURE_FDISK_BLKSIZE( \
     2355     "\n    -s      Show partition sizes in kb for each DISK, then exit" \
     2356    ) \
     2357     "\n    -b 2048     (for certain MO disks) use 2048-byte sectors" \
     2358     "\n    -C CYLINDERS    Set number of cylinders/heads/sectors" \
     2359     "\n    -H HEADS" \
     2360     "\n    -S SECTORS" \
     2361
     2362#define fgconsole_trivial_usage \
     2363    ""
     2364#define fgconsole_full_usage "\n\n" \
     2365    "Get active console"
     2366
     2367#define findfs_trivial_usage \
     2368       "LABEL=label or UUID=uuid"
     2369#define findfs_full_usage "\n\n" \
     2370       "Find a filesystem device based on a label or UUID"
     2371#define findfs_example_usage \
     2372       "$ findfs LABEL=MyDevice"
     2373
     2374#define flash_lock_trivial_usage \
     2375       "MTD_DEVICE OFFSET SECTORS"
     2376#define flash_lock_full_usage "\n\n" \
     2377       "Lock part or all of an MTD device. If SECTORS is -1, then all sectors\n" \
     2378       "will be locked, regardless of the value of OFFSET"
     2379
     2380#define flash_unlock_trivial_usage \
     2381       "MTD_DEVICE"
     2382#define flash_unlock_full_usage "\n\n" \
     2383       "Unlock an MTD device"
     2384
     2385#define flash_eraseall_trivial_usage \
     2386       "[-jq] MTD_DEVICE"
     2387#define flash_eraseall_full_usage "\n\n" \
     2388       "Erase an MTD device\n" \
     2389     "\nOptions:" \
     2390     "\n    -j  Format the device for jffs2" \
     2391     "\n    -q  Don't display progress messages" \
     2392
     2393#define flashcp_trivial_usage \
     2394       "-v FILE MTD_DEVICE"
     2395#define flashcp_full_usage "\n\n" \
     2396       "Copy an image to MTD device\n" \
     2397     "\nOptions:" \
     2398     "\n    -v  Verbose" \
     2399
     2400#define flock_trivial_usage \
     2401       "[-sxun] FD|{FILE [-c] PROG ARGS}"
     2402#define flock_full_usage "\n\n" \
     2403       "[Un]lock file descriptor, or lock FILE, run PROG\n" \
     2404     "\nOptions:" \
     2405     "\n    -s  Shared lock" \
     2406     "\n    -x  Exclusive lock (default)" \
     2407     "\n    -u  Unlock FD" \
     2408     "\n    -n  Fail rather than wait" \
    10102409
    10112410#define fold_trivial_usage \
    1012        "[-bs] [-w WIDTH] [FILE]"
    1013 #define fold_full_usage \
    1014        "Wrap input lines in each FILE (standard input by default), writing to\n" \
    1015        "standard output" \
    1016        "\n\nOptions:\n" \
    1017        "    -b  Count bytes rather than columns\n" \
    1018        "    -s  Break at spaces\n" \
    1019        "    -w  Use WIDTH columns instead of 80"
     2411       "[-bs] [-w WIDTH] [FILE]..."
     2412#define fold_full_usage "\n\n" \
     2413       "Wrap input lines in each FILE (or stdin), writing to stdout\n" \
     2414     "\nOptions:" \
     2415     "\n    -b  Count bytes rather than columns" \
     2416     "\n    -s  Break at spaces" \
     2417     "\n    -w  Use WIDTH columns instead of 80" \
    10202418
    10212419#define free_trivial_usage \
    1022        ""
    1023 #define free_full_usage \
     2420       "" IF_DESKTOP("[-b/k/m/g]")
     2421#define free_full_usage "\n\n" \
    10242422       "Display the amount of free and used system memory"
    10252423#define free_example_usage \
     
    10322430#define freeramdisk_trivial_usage \
    10332431       "DEVICE"
    1034 #define freeramdisk_full_usage \
     2432#define freeramdisk_full_usage "\n\n" \
    10352433       "Free all memory used by the specified ramdisk"
    10362434#define freeramdisk_example_usage \
     
    10382436
    10392437#define fsck_trivial_usage \
    1040        "[-ANPRTV] [-C fd] [-t fstype] [fs-options] [filesys ...]"
    1041 #define fsck_full_usage \
    1042        "Check and repair filesystems" \
    1043        "\n\nOptions:\n" \
    1044        "    -A  Walk /etc/fstab and check all filesystems\n" \
    1045        "    -N  Don't execute, just show what would be done\n" \
    1046        "    -P  When using -A, check filesystems in parallel\n" \
    1047        "    -R  When using -A, skip the root filesystem\n" \
    1048        "    -T  Don't show title on startup\n" \
    1049        "    -V  Verbose\n" \
    1050        "    -C n    Write status information to specified filedescriptor\n" \
    1051        "    -t type List of filesystem types to check"
     2438       "[-ANPRTV] [-C FD] [-t FSTYPE] [FS_OPTS] [BLOCKDEV]..."
     2439#define fsck_full_usage "\n\n" \
     2440       "Check and repair filesystems\n" \
     2441     "\nOptions:" \
     2442     "\n    -A  Walk /etc/fstab and check all filesystems" \
     2443     "\n    -N  Don't execute, just show what would be done" \
     2444     "\n    -P  With -A, check filesystems in parallel" \
     2445     "\n    -R  With -A, skip the root filesystem" \
     2446     "\n    -T  Don't show title on startup" \
     2447     "\n    -V  Verbose" \
     2448     "\n    -C n    Write status information to specified filedescriptor" \
     2449     "\n    -t TYPE List of filesystem types to check" \
    10522450
    10532451#define fsck_minix_trivial_usage \
    1054        "[-larvsmf] /dev/name"
    1055 #define fsck_minix_full_usage \
    1056        "Perform a consistency check for MINIX filesystems" \
    1057        "\n\nOptions:\n" \
    1058        "    -l  Lists all filenames\n" \
    1059        "    -r  Perform interactive repairs\n" \
    1060        "    -a  Perform automatic repairs\n" \
    1061        "    -v  Verbose\n" \
    1062        "    -s  Outputs super-block information\n" \
    1063        "    -m  Activates MINIX-like \"mode not cleared\" warnings\n" \
    1064        "    -f  Force file system check"
     2452       "[-larvsmf] BLOCKDEV"
     2453#define fsck_minix_full_usage "\n\n" \
     2454       "Check MINIX filesystem\n" \
     2455     "\nOptions:" \
     2456     "\n    -l  List all filenames" \
     2457     "\n    -r  Perform interactive repairs" \
     2458     "\n    -a  Perform automatic repairs" \
     2459     "\n    -v  Verbose" \
     2460     "\n    -s  Output superblock information" \
     2461     "\n    -m  Show \"mode not cleared\" warnings" \
     2462     "\n    -f  Force file system check" \
     2463
     2464#define ftpd_trivial_usage \
     2465       "[-wvS] [-t N] [-T N] [DIR]"
     2466#define ftpd_full_usage "\n\n" \
     2467       "Anonymous FTP server\n" \
     2468       "\n" \
     2469       "ftpd should be used as an inetd service.\n" \
     2470       "ftpd's line for inetd.conf:\n" \
     2471       "    21 stream tcp nowait root ftpd ftpd /files/to/serve\n" \
     2472       "It also can be ran from tcpsvd:\n" \
     2473       "    tcpsvd -vE 0.0.0.0 21 ftpd /files/to/serve\n" \
     2474     "\nOptions:" \
     2475     "\n    -w  Allow upload" \
     2476     "\n    -v  Log to stderr" \
     2477     "\n    -S  Log to syslog" \
     2478     "\n    -t,-T   Idle and absolute timeouts" \
     2479     "\n    DIR Change root to this directory" \
    10652480
    10662481#define ftpget_trivial_usage \
    1067        "[options] remote-host local-file remote-file"
    1068 #define ftpget_full_usage \
    1069        "Retrieve a remote file via FTP" \
    1070        "\n\nOptions:\n" \
    1071        "    -c, --continue  Continue a previous transfer\n" \
    1072        "    -v, --verbose   Verbose\n" \
    1073        "    -u, --username  Username to be used\n" \
    1074        "    -p, --password  Password to be used\n" \
    1075        "    -P, --port  Port number to be used"
     2482       "[OPTIONS] HOST [LOCAL_FILE] REMOTE_FILE"
     2483#define ftpget_full_usage "\n\n" \
     2484       "Retrieve a remote file via FTP\n" \
     2485     "\nOptions:" \
     2486    IF_FEATURE_FTPGETPUT_LONG_OPTIONS( \
     2487     "\n    -c,--continue   Continue previous transfer" \
     2488     "\n    -v,--verbose    Verbose" \
     2489     "\n    -u,--username   Username" \
     2490     "\n    -p,--password   Password" \
     2491     "\n    -P,--port   Port number" \
     2492    ) \
     2493    IF_NOT_FEATURE_FTPGETPUT_LONG_OPTIONS( \
     2494     "\n    -c  Continue previous transfer" \
     2495     "\n    -v  Verbose" \
     2496     "\n    -u  Username" \
     2497     "\n    -p  Password" \
     2498     "\n    -P  Port number" \
     2499    )
    10762500
    10772501#define ftpput_trivial_usage \
    1078        "[options] remote-host remote-file local-file"
    1079 #define ftpput_full_usage \
    1080        "Store a local file on a remote machine via FTP" \
    1081        "\n\nOptions:\n" \
    1082        "    -v, --verbose   Verbose\n" \
    1083        "    -u, --username  Username to be used\n" \
    1084        "    -p, --password  Password to be used\n" \
    1085        "    -P, --port  Port number to be used"
     2502       "[OPTIONS] HOST [REMOTE_FILE] LOCAL_FILE"
     2503#define ftpput_full_usage "\n\n" \
     2504       "Store a local file on a remote machine via FTP\n" \
     2505     "\nOptions:" \
     2506    IF_FEATURE_FTPGETPUT_LONG_OPTIONS( \
     2507     "\n    -v,--verbose    Verbose" \
     2508     "\n    -u,--username   Username" \
     2509     "\n    -p,--password   Password" \
     2510     "\n    -P,--port   Port number" \
     2511    ) \
     2512    IF_NOT_FEATURE_FTPGETPUT_LONG_OPTIONS( \
     2513     "\n    -v  Verbose" \
     2514     "\n    -u  Username" \
     2515     "\n    -p  Password" \
     2516     "\n    -P  Port number" \
     2517    )
    10862518
    10872519#define fuser_trivial_usage \
    1088        "[options] file OR port/proto"
    1089 #define fuser_full_usage \
    1090        "Options:\n" \
    1091        "    -m  Show all processes on the same mounted fs\n" \
    1092        "    -k  Kill all processes that match\n" \
    1093        "    -s  Don't print or kill anything\n" \
    1094        "    -4  When using port/proto only search IPv4 space\n" \
    1095        "    -6  When using port/proto only search IPv6 space\n" \
    1096        "    -SIGNAL When used with -k, this signal will be used to kill"
    1097 
    1098 #define getenforce_trivial_usage
    1099 #define getenforce_full_usage
     2520       "[OPTIONS] FILE or PORT/PROTO"
     2521#define fuser_full_usage "\n\n" \
     2522       "Find processes which use FILEs or PORTs\n" \
     2523     "\nOptions:" \
     2524     "\n    -m  Find processes which use same fs as FILEs" \
     2525     "\n    -4,-6   Search only IPv4/IPv6 space" \
     2526     "\n    -s  Don't display PIDs" \
     2527     "\n    -k  Kill found processes" \
     2528     "\n    -SIGNAL Signal to send (default: KILL)" \
     2529
     2530#define getenforce_trivial_usage NOUSAGE_STR
     2531#define getenforce_full_usage ""
    11002532
    11012533#define getopt_trivial_usage \
    1102        "[OPTIONS]..."
    1103 #define getopt_full_usage \
    1104        "Parse command options\n" \
    1105        "    -a, --alternative       Allow long options starting with single -\n" \
    1106        "    -l, --longoptions=longopts  Long options to be recognized\n" \
    1107        "    -n, --name=progname     The name under which errors are reported\n" \
    1108        "    -o, --options=optstring     Short options to be recognized\n" \
    1109        "    -q, --quiet         Disable error reporting by getopt(3)\n" \
    1110        "    -Q, --quiet-output      No normal output\n" \
    1111        "    -s, --shell=shell       Set shell quoting conventions\n" \
    1112        "    -T, --test          Test for getopt(1) version\n" \
    1113        "    -u, --unquoted          Do not quote the output"
     2534       "[OPTIONS]"
     2535#define getopt_full_usage "\n\n" \
     2536       "Options:" \
     2537    IF_LONG_OPTS( \
     2538     "\n    -a,--alternative        Allow long options starting with single -" \
     2539     "\n    -l,--longoptions=longopts   Long options to be recognized" \
     2540     "\n    -n,--name=progname      The name under which errors are reported" \
     2541     "\n    -o,--options=optstring      Short options to be recognized" \
     2542     "\n    -q,--quiet          Disable error reporting by getopt(3)" \
     2543     "\n    -Q,--quiet-output       No normal output" \
     2544     "\n    -s,--shell=shell        Set shell quoting conventions" \
     2545     "\n    -T,--test           Test for getopt(1) version" \
     2546     "\n    -u,--unquoted           Don't quote the output" \
     2547    ) \
     2548    IF_NOT_LONG_OPTS( \
     2549     "\n    -a      Allow long options starting with single -" \
     2550     "\n    -l longopts Long options to be recognized" \
     2551     "\n    -n progname The name under which errors are reported" \
     2552     "\n    -o optstring    Short options to be recognized" \
     2553     "\n    -q      Disable error reporting by getopt(3)" \
     2554     "\n    -Q      No normal output" \
     2555     "\n    -s shell    Set shell quoting conventions" \
     2556     "\n    -T      Test for getopt(1) version" \
     2557     "\n    -u      Don't quote the output" \
     2558    )
    11142559#define getopt_example_usage \
    11152560       "$ cat getopt.test\n" \
     
    11172562       "GETOPT=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \\\n" \
    11182563       "       -n 'example.busybox' -- \"$@\"`\n" \
    1119        "if [ $? != 0 ]; then  exit 1; fi\n" \
     2564       "if [ $? != 0 ]; then exit 1; fi\n" \
    11202565       "eval set -- \"$GETOPT\"\n" \
    11212566       "while true; do\n" \
     
    11352580#define getsebool_trivial_usage \
    11362581       "-a or getsebool boolean..."
    1137 #define getsebool_full_usage \
    1138        "    -a  Show all SELinux booleans"
     2582#define getsebool_full_usage "\n\n" \
     2583       "    -a  Show all selinux booleans"
    11392584
    11402585#define getty_trivial_usage \
    1141        "[OPTIONS]... baud_rate,... line [termtype]"
    1142 #define getty_full_usage \
    1143        "Open a tty, prompt for a login name, then invoke /bin/login" \
    1144        "\n\nOptions:\n" \
    1145        "    -h      Enable hardware (RTS/CTS) flow control\n" \
    1146        "    -i      Do not display /etc/issue before running login\n" \
    1147        "    -L      Local line, so do not do carrier detect\n" \
    1148        "    -m      Get baud rate from modem's CONNECT status message\n" \
    1149        "    -w      Wait for a CR or LF before sending /etc/issue\n" \
    1150        "    -n      Do not prompt the user for a login name\n" \
    1151        "    -f issue_file   Display issue_file instead of /etc/issue\n" \
    1152        "    -l login_app    Invoke login_app instead of /bin/login\n" \
    1153        "    -t timeout  Terminate after timeout if no username is read\n" \
    1154        "    -I initstring   Sets the init string to send before anything else\n" \
    1155        "    -H login_host   Log login_host into the utmp file as the hostname"
    1156 
    1157 #define grep_trivial_usage \
    1158        "[-HhrilLnqvso" \
    1159     USE_DESKTOP("w") \
    1160        "eF" \
    1161     USE_FEATURE_GREP_EGREP_ALIAS("E") \
    1162     USE_FEATURE_GREP_CONTEXT("ABC") \
    1163        "] PATTERN [FILEs...]"
    1164 #define grep_full_usage \
    1165        "Search for PATTERN in each FILE or standard input" \
    1166        "\n\nOptions:" \
    1167        "\n  -H  Prefix output lines with filename where match was found" \
    1168        "\n  -h  Suppress the prefixing filename on output" \
    1169        "\n  -r  Recurse subdirectories" \
    1170        "\n  -i  Ignore case distinctions" \
    1171        "\n  -l  List names of files that match" \
    1172        "\n  -L  List names of files that do not match" \
    1173        "\n  -n  Print line number with output lines" \
    1174        "\n  -q  Quiet. Returns 0 if PATTERN was found, 1 otherwise" \
    1175        "\n  -v  Select non-matching lines" \
    1176        "\n  -s  Suppress file open/read error messages" \
    1177        "\n  -c  Only print count of matching lines" \
    1178        "\n  -o  Show only the part of a line that matches PATTERN" \
    1179        "\n  -m MAX  Match up to MAX times per file" \
    1180     USE_DESKTOP( \
    1181        "\n  -w  Match whole words only") \
    1182        "\n  -F  PATTERN is a set of newline-separated strings" \
    1183     USE_FEATURE_GREP_EGREP_ALIAS( \
    1184        "\n  -E  PATTERN is an extended regular expression") \
    1185        "\n  -e PTRN Pattern to match" \
    1186        "\n  -f FILE Read pattern from file" \
    1187     USE_FEATURE_GREP_CONTEXT( \
    1188        "\n  -A  Print NUM lines of trailing context" \
    1189        "\n  -B  Print NUM lines of leading context" \
    1190        "\n  -C  Print NUM lines of output context") \
    1191 
    1192 #define grep_example_usage \
    1193        "$ grep root /etc/passwd\n" \
    1194        "root:x:0:0:root:/root:/bin/bash\n" \
    1195        "$ grep ^[rR]oo. /etc/passwd\n" \
    1196        "root:x:0:0:root:/root:/bin/bash\n"
     2586       "[OPTIONS] BAUD_RATE TTY [TERMTYPE]"
     2587#define getty_full_usage "\n\n" \
     2588       "Open a tty, prompt for a login name, then invoke /bin/login\n" \
     2589     "\nOptions:" \
     2590     "\n    -h      Enable hardware (RTS/CTS) flow control" \
     2591     "\n    -i      Don't display /etc/issue before running login" \
     2592     "\n    -L      Local line, don't do carrier detect" \
     2593     "\n    -m      Get baud rate from modem's CONNECT status message" \
     2594     "\n    -w      Wait for a CR or LF before sending /etc/issue" \
     2595     "\n    -n      Don't prompt the user for a login name" \
     2596     "\n    -f ISSUE_FILE   Display ISSUE_FILE instead of /etc/issue" \
     2597     "\n    -l LOGIN    Invoke LOGIN instead of /bin/login" \
     2598     "\n    -t SEC      Terminate after SEC if no username is read" \
     2599     "\n    -I INITSTR  Send INITSTR before anything else" \
     2600     "\n    -H HOST     Log HOST into the utmp file as the hostname" \
    11972601
    11982602#define gunzip_trivial_usage \
    1199        "[OPTION]... FILE"
    1200 #define gunzip_full_usage \
    1201        "Uncompress FILE (or standard input if FILE is '-')" \
    1202        "\n\nOptions:\n" \
    1203        "    -c  Write output to standard output\n" \
    1204        "    -f  Force read when source is a terminal\n" \
    1205        "    -t  Test compressed file integrity"
     2603       "[-cft] [FILE]..."
     2604#define gunzip_full_usage "\n\n" \
     2605       "Decompress FILEs (or stdin)\n" \
     2606     "\nOptions:" \
     2607     "\n    -c  Write to stdout" \
     2608     "\n    -f  Force" \
     2609     "\n    -t  Test file integrity" \
     2610
    12062611#define gunzip_example_usage \
    12072612       "$ ls -la /tmp/BusyBox*\n" \
     
    12122617
    12132618#define gzip_trivial_usage \
    1214        "[OPTION]... [FILE]..."
    1215 #define gzip_full_usage \
    1216        "Compress FILE(s) with maximum compression.\n" \
    1217        "When FILE is '-' or unspecified, reads standard input. Implies -c." \
    1218        "\n\nOptions:\n" \
    1219        "    -c  Write output to standard output instead of FILE.gz\n" \
    1220        "    -d  Decompress\n" \
    1221        "    -f  Force write when destination is a terminal"
     2619       "[-cfd] [FILE]..."
     2620#define gzip_full_usage "\n\n" \
     2621       "Compress FILEs (or stdin)\n" \
     2622     "\nOptions:" \
     2623     "\n    -d  Decompress" \
     2624     "\n    -c  Write to stdout" \
     2625     "\n    -f  Force" \
     2626
    12222627#define gzip_example_usage \
    12232628       "$ ls -la /tmp/busybox*\n" \
     
    12272632       "-rw-rw-r--    1 andersen andersen   554058 Apr 14 17:49 /tmp/busybox.tar.gz\n"
    12282633
    1229 #define halt_trivial_usage \
    1230        "[-d delay] [-n] [-f]"
    1231 #define halt_full_usage \
    1232        "Halt the system" \
    1233        "\n\nOptions:\n" \
    1234        "    -d  Delay interval for halting\n" \
    1235        "    -n  No call to sync()\n" \
    1236        "    -f  Force halt (don't go through init)"
    1237 
    12382634#define hdparm_trivial_usage \
    1239        "[options] [device] .."
    1240 #define hdparm_full_usage \
    1241     USE_FEATURE_HDPARM_GET_IDENTITY( \
    1242        "If no device name is specified try to read from stdin.\n\n") \
    1243        "Options:\n" \
    1244        "    -a  Get/set fs readahead\n" \
    1245        "    -A  Set drive read-lookahead flag (0/1)\n" \
    1246        "    -b  Get/set bus state (0 == off, 1 == on, 2 == tristate)\n" \
    1247        "    -B  Set Advanced Power Management setting (1-255)\n" \
    1248        "    -c  Get/set IDE 32-bit IO setting\n" \
    1249        "    -C  Check IDE power mode status\n" \
    1250     USE_FEATURE_HDPARM_HDIO_GETSET_DMA( \
    1251        "    -d  Get/set using_dma flag\n") \
    1252        "    -D  Enable/disable drive defect-mgmt\n" \
    1253        "    -f  Flush buffer cache for device on exit\n" \
    1254        "    -g  Display drive geometry\n" \
    1255        "    -h  Display terse usage information\n" \
    1256     USE_FEATURE_HDPARM_GET_IDENTITY( \
    1257        "    -i  Display drive identification\n") \
    1258     USE_FEATURE_HDPARM_GET_IDENTITY( \
    1259        "    -I  Detailed/current information directly from drive\n") \
    1260        "    -k  Get/set keep_settings_over_reset flag (0/1)\n" \
    1261        "    -K  Set drive keep_features_over_reset flag (0/1)\n" \
    1262        "    -L  Set drive doorlock (0/1) (removable harddisks only)\n" \
    1263        "    -m  Get/set multiple sector count\n" \
    1264        "    -n  Get/set ignore-write-errors flag (0/1)\n" \
    1265        "    -p  Set PIO mode on IDE interface chipset (0,1,2,3,4,...)\n" \
    1266        "    -P  Set drive prefetch count\n" \
    1267        "    -q  Change next setting quietly\n" \
    1268        "    -Q  Get/set DMA tagged-queuing depth (if supported)\n" \
    1269        "    -r  Get/set readonly flag (DANGEROUS to set)\n" \
    1270     USE_FEATURE_HDPARM_HDIO_SCAN_HWIF( \
    1271        "    -R  Register an IDE interface (DANGEROUS)\n") \
    1272        "    -S  Set standby (spindown) timeout\n" \
    1273        "    -t  Perform device read timings\n" \
    1274        "    -T  Perform cache read timings\n" \
    1275        "    -u  Get/set unmaskirq flag (0/1)\n" \
    1276     USE_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF( \
    1277        "    -U  Un-register an IDE interface (DANGEROUS)\n") \
    1278        "    -v  Defaults; same as -mcudkrag for IDE drives\n" \
    1279        "    -V  Display program version and exit immediately\n" \
    1280     USE_FEATURE_HDPARM_HDIO_DRIVE_RESET( \
    1281        "    -w  Perform device reset (DANGEROUS)\n") \
    1282        "    -W  Set drive write-caching flag (0/1) (DANGEROUS)\n" \
    1283     USE_FEATURE_HDPARM_HDIO_TRISTATE_HWIF( \
    1284        "    -x  Tristate device for hotswap (0/1) (DANGEROUS)\n") \
    1285        "    -X  Set IDE xfer mode (DANGEROUS)\n" \
    1286        "    -y  Put IDE drive in standby mode\n" \
    1287        "    -Y  Put IDE drive to sleep\n" \
    1288        "    -Z  Disable Seagate auto-powersaving mode\n" \
    1289        "    -z  Re-read partition table"
     2635       "[OPTIONS] [DEVICE]"
     2636#define hdparm_full_usage "\n\n" \
     2637       "Options:" \
     2638     "\n    -a  Get/set fs readahead" \
     2639     "\n    -A  Set drive read-lookahead flag (0/1)" \
     2640     "\n    -b  Get/set bus state (0 == off, 1 == on, 2 == tristate)" \
     2641     "\n    -B  Set Advanced Power Management setting (1-255)" \
     2642     "\n    -c  Get/set IDE 32-bit IO setting" \
     2643     "\n    -C  Check IDE power mode status" \
     2644    IF_FEATURE_HDPARM_HDIO_GETSET_DMA( \
     2645     "\n    -d  Get/set using_dma flag") \
     2646     "\n    -D  Enable/disable drive defect-mgmt" \
     2647     "\n    -f  Flush buffer cache for device on exit" \
     2648     "\n    -g  Display drive geometry" \
     2649     "\n    -h  Display terse usage information" \
     2650    IF_FEATURE_HDPARM_GET_IDENTITY( \
     2651     "\n    -i  Display drive identification") \
     2652    IF_FEATURE_HDPARM_GET_IDENTITY( \
     2653     "\n    -I  Detailed/current information directly from drive") \
     2654     "\n    -k  Get/set keep_settings_over_reset flag (0/1)" \
     2655     "\n    -K  Set drive keep_features_over_reset flag (0/1)" \
     2656     "\n    -L  Set drive doorlock (0/1) (removable harddisks only)" \
     2657     "\n    -m  Get/set multiple sector count" \
     2658     "\n    -n  Get/set ignore-write-errors flag (0/1)" \
     2659     "\n    -p  Set PIO mode on IDE interface chipset (0,1,2,3,4,...)" \
     2660     "\n    -P  Set drive prefetch count" \
     2661/*   "\n    -q  Change next setting quietly" - not supported ib bbox */ \
     2662     "\n    -Q  Get/set DMA tagged-queuing depth (if supported)" \
     2663     "\n    -r  Get/set readonly flag (DANGEROUS to set)" \
     2664    IF_FEATURE_HDPARM_HDIO_SCAN_HWIF( \
     2665     "\n    -R  Register an IDE interface (DANGEROUS)") \
     2666     "\n    -S  Set standby (spindown) timeout" \
     2667     "\n    -t  Perform device read timings" \
     2668     "\n    -T  Perform cache read timings" \
     2669     "\n    -u  Get/set unmaskirq flag (0/1)" \
     2670    IF_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF( \
     2671     "\n    -U  Unregister an IDE interface (DANGEROUS)") \
     2672     "\n    -v  Defaults; same as -mcudkrag for IDE drives" \
     2673     "\n    -V  Display program version and exit immediately" \
     2674    IF_FEATURE_HDPARM_HDIO_DRIVE_RESET( \
     2675     "\n    -w  Perform device reset (DANGEROUS)") \
     2676     "\n    -W  Set drive write-caching flag (0/1) (DANGEROUS)" \
     2677    IF_FEATURE_HDPARM_HDIO_TRISTATE_HWIF( \
     2678     "\n    -x  Tristate device for hotswap (0/1) (DANGEROUS)") \
     2679     "\n    -X  Set IDE xfer mode (DANGEROUS)" \
     2680     "\n    -y  Put IDE drive in standby mode" \
     2681     "\n    -Y  Put IDE drive to sleep" \
     2682     "\n    -Z  Disable Seagate auto-powersaving mode" \
     2683     "\n    -z  Reread partition table" \
    12902684
    12912685#define head_trivial_usage \
    1292        "[OPTION]... [FILE]..."
    1293 #define head_full_usage \
    1294        "Print first 10 lines of each FILE to standard output.\n" \
    1295        "With more than one FILE, precede each with a header giving the\n" \
    1296        "file name. With no FILE, or when FILE is -, read standard input." \
    1297        "\n\nOptions:" \
    1298        "\n  -n NUM  Print first NUM lines instead of first 10" \
    1299     USE_FEATURE_FANCY_HEAD( \
    1300        "\n  -c NUM  Output the first NUM bytes" \
    1301        "\n  -q  Never output headers giving file names" \
    1302        "\n  -v  Always output headers giving file names")
     2686       "[OPTIONS] [FILE]..."
     2687#define head_full_usage "\n\n" \
     2688       "Print first 10 lines of each FILE (or stdin) to stdout.\n" \
     2689       "With more than one FILE, precede each with a filename header.\n" \
     2690     "\nOptions:" \
     2691     "\n    -n N[kbm]   Print first N lines" \
     2692    IF_FEATURE_FANCY_HEAD( \
     2693     "\n    -c N[kbm]   Print first N bytes" \
     2694     "\n    -q      Never print headers" \
     2695     "\n    -v      Always print headers" \
     2696    ) \
     2697     "\n" \
     2698     "\nN may be suffixed by k (x1024), b (x512), or m (x1024^2)." \
     2699
    13032700#define head_example_usage \
    13042701       "$ head -n 2 /etc/passwd\n" \
     
    13062703       "daemon:x:1:1:daemon:/usr/sbin:/bin/sh\n"
    13072704
     2705#define tail_trivial_usage \
     2706       "[OPTIONS] [FILE]..."
     2707#define tail_full_usage "\n\n" \
     2708       "Print last 10 lines of each FILE (or stdin) to stdout.\n" \
     2709       "With more than one FILE, precede each with a filename header.\n" \
     2710     "\nOptions:" \
     2711     "\n    -f      Print data as file grows" \
     2712    IF_FEATURE_FANCY_TAIL( \
     2713     "\n    -s SECONDS  Wait SECONDS between reads with -f" \
     2714    ) \
     2715     "\n    -n N[kbm]   Print last N lines" \
     2716    IF_FEATURE_FANCY_TAIL( \
     2717     "\n    -c N[kbm]   Print last N bytes" \
     2718     "\n    -q      Never print headers" \
     2719     "\n    -v      Always print headers" \
     2720     "\n" \
     2721     "\nN may be suffixed by k (x1024), b (x512), or m (x1024^2)." \
     2722     "\nIf N starts with a '+', output begins with the Nth item from the start" \
     2723     "\nof each file, not from the end." \
     2724    ) \
     2725
     2726#define tail_example_usage \
     2727       "$ tail -n 1 /etc/resolv.conf\n" \
     2728       "nameserver 10.0.0.1\n"
     2729
    13082730#define hexdump_trivial_usage \
    1309        "[-[bcCdefnosvx]] [OPTION] FILE"
    1310 #define hexdump_full_usage \
    1311        "Display file(s) or standard input in a user specified format" \
    1312        "\n\nOptions:\n" \
    1313        "    -b      One-byte octal display\n" \
    1314        "    -c      One-byte character display\n" \
    1315        "    -C      Canonical hex+ASCII, 16 bytes per line\n" \
    1316        "    -d      Two-byte decimal display\n" \
    1317        "    -e FORMAT STRING\n" \
    1318        "    -f FORMAT FILE\n" \
    1319        "    -n LENGTH   Interpret only length bytes of input\n" \
    1320        "    -o      Two-byte octal display\n" \
    1321        "    -s OFFSET   Skip offset bytes\n" \
    1322        "    -v      Display all input data\n" \
    1323        "    -x      Two-byte hexadecimal display"
     2731       "[-bcCdefnosvx" IF_FEATURE_HEXDUMP_REVERSE("R") "] [FILE]..."
     2732#define hexdump_full_usage "\n\n" \
     2733       "Display FILEs (or stdin) in a user specified format\n" \
     2734     "\nOptions:" \
     2735     "\n    -b      One-byte octal display" \
     2736     "\n    -c      One-byte character display" \
     2737     "\n    -C      Canonical hex+ASCII, 16 bytes per line" \
     2738     "\n    -d      Two-byte decimal display" \
     2739     "\n    -e FORMAT STRING" \
     2740     "\n    -f FORMAT FILE" \
     2741     "\n    -n LENGTH   Interpret only LENGTH bytes of input" \
     2742     "\n    -o      Two-byte octal display" \
     2743     "\n    -s OFFSET   Skip OFFSET bytes" \
     2744     "\n    -v      Display all input data" \
     2745     "\n    -x      Two-byte hexadecimal display" \
     2746    IF_FEATURE_HEXDUMP_REVERSE( \
     2747     "\n    -R      Reverse of 'hexdump -Cv'") \
     2748
     2749#define hd_trivial_usage \
     2750       "FILE..."
     2751#define hd_full_usage "\n\n" \
     2752       "hd is an alias for hexdump -C"
    13242753
    13252754#define hostid_trivial_usage \
    13262755       ""
    1327 #define hostid_full_usage \
     2756#define hostid_full_usage "\n\n" \
    13282757       "Print out a unique 32-bit identifier for the machine"
    13292758
    13302759#define hostname_trivial_usage \
    1331        "[OPTION] {hostname | -F FILE}"
    1332 #define hostname_full_usage \
    1333        "Get or set the hostname or DNS domain name. If a hostname is given\n" \
    1334        "(or FILE with the -F parameter), the host name will be set." \
    1335        "\n\nOptions:\n" \
    1336        "    -s  Short\n" \
    1337        "    -i  Addresses for the hostname\n" \
    1338        "    -d  DNS domain name\n" \
    1339        "    -f  Fully qualified domain name\n" \
    1340        "    -F FILE Use the contents of FILE to specify the hostname"
     2760       "[OPTIONS] [HOSTNAME | -F FILE]"
     2761#define hostname_full_usage "\n\n" \
     2762       "Get or set hostname or DNS domain name\n" \
     2763     "\nOptions:" \
     2764     "\n    -s  Short" \
     2765     "\n    -i  Addresses for the hostname" \
     2766     "\n    -d  DNS domain name" \
     2767     "\n    -f  Fully qualified domain name" \
     2768     "\n    -F FILE Use FILE's content as hostname" \
     2769
    13412770#define hostname_example_usage \
    13422771       "$ hostname\n" \
    13432772       "sage\n"
    13442773
     2774#define dnsdomainname_trivial_usage NOUSAGE_STR
     2775#define dnsdomainname_full_usage ""
     2776
    13452777#define httpd_trivial_usage \
    1346        "[-c conffile]" \
    1347        " [-p [ip:]port]" \
    1348        " [-i] [-f] [-v[v]]" \
    1349     USE_FEATURE_HTTPD_SETUID(" [-u user[:grp]]") \
    1350     USE_FEATURE_HTTPD_BASIC_AUTH(" [-r realm]") \
    1351     USE_FEATURE_HTTPD_AUTH_MD5(" [-m pass]") \
    1352        " [-h home]" \
    1353        " [-d/-e string]"
    1354 #define httpd_full_usage \
    1355        "Listen for incoming HTTP requests" \
    1356        "\n\nOptions:" \
    1357        "\n  -c FILE     Configuration file (default httpd.conf)" \
    1358        "\n  -p [IP:]PORT    Bind to ip:port (default *:80)" \
    1359        "\n  -i      Inetd mode" \
    1360        "\n  -f      Do not daemonize" \
    1361        "\n  -v[v]       Verbose" \
    1362     USE_FEATURE_HTTPD_SETUID( \
    1363        "\n  -u USER[:GRP]   Set uid/gid after binding to port") \
    1364     USE_FEATURE_HTTPD_BASIC_AUTH( \
    1365        "\n  -r REALM    Authentication Realm for Basic Authentication") \
    1366     USE_FEATURE_HTTPD_AUTH_MD5( \
    1367        "\n  -m PASS     Crypt PASS with md5 algorithm") \
    1368        "\n  -h HOME     Home directory (default .)" \
    1369        "\n  -e STRING   HTML encode STRING" \
    1370        "\n  -d STRING   URL decode STRING" \
     2778       "[-ifv[v]]" \
     2779       " [-c CONFFILE]" \
     2780       " [-p [IP:]PORT]" \
     2781    IF_FEATURE_HTTPD_SETUID(" [-u USER[:GRP]]") \
     2782    IF_FEATURE_HTTPD_BASIC_AUTH(" [-r REALM]") \
     2783       " [-h HOME]\n" \
     2784       "or httpd -d/-e" IF_FEATURE_HTTPD_AUTH_MD5("/-m") " STRING"
     2785#define httpd_full_usage "\n\n" \
     2786       "Listen for incoming HTTP requests\n" \
     2787     "\nOptions:" \
     2788     "\n    -i      Inetd mode" \
     2789     "\n    -f      Don't daemonize" \
     2790     "\n    -v[v]       Verbose" \
     2791     "\n    -p [IP:]PORT    Bind to IP:PORT (default *:80)" \
     2792    IF_FEATURE_HTTPD_SETUID( \
     2793     "\n    -u USER[:GRP]   Set uid/gid after binding to port") \
     2794    IF_FEATURE_HTTPD_BASIC_AUTH( \
     2795     "\n    -r REALM    Authentication Realm for Basic Authentication") \
     2796     "\n    -h HOME     Home directory (default .)" \
     2797     "\n    -c FILE     Configuration file (default {/etc,HOME}/httpd.conf)" \
     2798    IF_FEATURE_HTTPD_AUTH_MD5( \
     2799     "\n    -m STRING   MD5 crypt STRING") \
     2800     "\n    -e STRING   HTML encode STRING" \
     2801     "\n    -d STRING   URL decode STRING" \
    13712802
    13722803#define hwclock_trivial_usage \
     2804    IF_FEATURE_HWCLOCK_LONG_OPTIONS( \
    13732805       "[-r|--show] [-s|--hctosys] [-w|--systohc]" \
    13742806       " [-l|--localtime] [-u|--utc]" \
    1375        " [-f FILE]"
    1376 #define hwclock_full_usage \
    1377        "Query and set a hardware clock (RTC)" \
    1378        "\n\nOptions:\n" \
    1379        "    -r  Read hardware clock and print result\n" \
    1380        "    -s  Set the system time from the hardware clock\n" \
    1381        "    -w  Set the hardware clock to the current system time\n" \
    1382        "    -u  The hardware clock is kept in coordinated universal time\n" \
    1383        "    -l  The hardware clock is kept in local time\n" \
    1384        "    -f FILE Use the specified clock (e.g. /dev/rtc2)"
     2807       " [-f FILE]" \
     2808    ) \
     2809    IF_NOT_FEATURE_HWCLOCK_LONG_OPTIONS( \
     2810       "[-r] [-s] [-w] [-l] [-u] [-f FILE]" \
     2811    )
     2812#define hwclock_full_usage "\n\n" \
     2813       "Query and set hardware clock (RTC)\n" \
     2814     "\nOptions:" \
     2815     "\n    -r  Show hardware clock time" \
     2816     "\n    -s  Set system time from hardware clock" \
     2817     "\n    -w  Set hardware clock to system time" \
     2818     "\n    -u  Hardware clock is in UTC" \
     2819     "\n    -l  Hardware clock is in local time" \
     2820     "\n    -f FILE Use specified device (e.g. /dev/rtc2)" \
    13852821
    13862822#define id_trivial_usage \
    1387        "[OPTIONS]... [USERNAME]"
    1388 #define id_full_usage \
    1389        "Print information for USERNAME or the current user" \
    1390        "\n\nOptions:\n" \
    1391     USE_SELINUX( \
    1392        "    -Z  prints only the security context\n" \
    1393     ) \
    1394        "    -g  Prints only the group ID\n" \
    1395        "    -u  Prints only the user ID\n" \
    1396        "    -n  Print a name instead of a number\n" \
    1397        "    -r  Prints the real user ID instead of the effective ID"
     2823       "[OPTIONS] [USER]"
     2824#define id_full_usage "\n\n" \
     2825       "Print information about USER or the current user\n" \
     2826     "\nOptions:" \
     2827    IF_SELINUX( \
     2828     "\n    -Z  Security context" \
     2829    ) \
     2830     "\n    -u  User ID" \
     2831     "\n    -g  Group ID" \
     2832     "\n    -G  Supplementary group IDs" \
     2833     "\n    -n  Print names instead of numbers" \
     2834     "\n    -r  Print real ID instead of effective ID" \
     2835
    13982836#define id_example_usage \
    13992837       "$ id\n" \
     
    14012839
    14022840#define ifconfig_trivial_usage \
    1403     USE_FEATURE_IFCONFIG_STATUS("[-a]") " interface [address]"
    1404 #define ifconfig_full_usage \
    1405        "Configure a network interface" \
    1406        "\n\nOptions:\n" \
    1407     USE_FEATURE_IPV6( \
     2841    IF_FEATURE_IFCONFIG_STATUS("[-a]") " interface [address]"
     2842#define ifconfig_full_usage "\n\n" \
     2843       "Configure a network interface\n" \
     2844     "\nOptions:" \
     2845     "\n" \
     2846    IF_FEATURE_IPV6( \
    14082847       "    [add ADDRESS[/PREFIXLEN]]\n") \
    1409     USE_FEATURE_IPV6( \
     2848    IF_FEATURE_IPV6( \
    14102849       "    [del ADDRESS[/PREFIXLEN]]\n") \
    14112850       "    [[-]broadcast [ADDRESS]] [[-]pointopoint [ADDRESS]]\n" \
    14122851       "    [netmask ADDRESS] [dstaddr ADDRESS]\n" \
    1413     USE_FEATURE_IFCONFIG_SLIP( \
     2852    IF_FEATURE_IFCONFIG_SLIP( \
    14142853       "    [outfill NN] [keepalive NN]\n") \
    1415        "    " USE_FEATURE_IFCONFIG_HW("[hw ether ADDRESS] ") "[metric NN] [mtu NN]\n" \
     2854       "    " IF_FEATURE_IFCONFIG_HW("[hw ether" IF_FEATURE_HWIB("|infiniband")" ADDRESS] ") "[metric NN] [mtu NN]\n" \
    14162855       "    [[-]trailers] [[-]arp] [[-]allmulti]\n" \
    14172856       "    [multicast] [[-]promisc] [txqueuelen NN] [[-]dynamic]\n" \
    1418     USE_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ( \
     2857    IF_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ( \
    14192858       "    [mem_start NN] [io_addr NN] [irq NN]\n") \
    14202859       "    [up|down] ..."
    14212860
     2861#define ifenslave_trivial_usage \
     2862       "[-cdf] MASTER_IFACE SLAVE_IFACE..."
     2863#define ifenslave_full_usage "\n\n" \
     2864       "Configure network interfaces for parallel routing\n" \
     2865     "\nOptions:" \
     2866     "\n    -c,--change-active  Change active slave" \
     2867     "\n    -d,--detach     Remove slave interface from bonding device" \
     2868     "\n    -f,--force      Force, even if interface is not Ethernet" \
     2869/*   "\n    -r,--receive-slave  Create a receive-only slave" */
     2870
     2871#define ifenslave_example_usage \
     2872       "To create a bond device, simply follow these three steps:\n" \
     2873       "- ensure that the required drivers are properly loaded:\n" \
     2874       "  # modprobe bonding ; modprobe <3c59x|eepro100|pcnet32|tulip|...>\n" \
     2875       "- assign an IP address to the bond device:\n" \
     2876       "  # ifconfig bond0 <addr> netmask <mask> broadcast <bcast>\n" \
     2877       "- attach all the interfaces you need to the bond device:\n" \
     2878       "  # ifenslave bond0 eth0 eth1 eth2\n" \
     2879       "  If bond0 didn't have a MAC address, it will take eth0's. Then, all\n" \
     2880       "  interfaces attached AFTER this assignment will get the same MAC addr.\n\n" \
     2881       "  To detach a dead interface without setting the bond device down:\n" \
     2882       "  # ifenslave -d bond0 eth1\n\n" \
     2883       "  To set the bond device down and automatically release all the slaves:\n" \
     2884       "  # ifconfig bond0 down\n\n" \
     2885       "  To change active slave:\n" \
     2886       "  # ifenslave -c bond0 eth0\n" \
     2887
     2888#define ifplugd_trivial_usage \
     2889       "[OPTIONS]"
     2890#define ifplugd_full_usage "\n\n" \
     2891       "Network interface plug detection daemon\n" \
     2892     "\nOptions:" \
     2893     "\n    -n      Don't daemonize" \
     2894     "\n    -s      Don't log to syslog" \
     2895     "\n    -i IFACE    Interface" \
     2896     "\n    -f/-F       Treat link detection error as link down/link up" \
     2897     "\n            (otherwise exit on error)" \
     2898     "\n    -a      Don't up interface at each link probe" \
     2899     "\n    -M      Monitor creation/destruction of interface" \
     2900     "\n            (otherwise it must exist)" \
     2901     "\n    -r PROG     Script to run" \
     2902     "\n    -x ARG      Extra argument for script" \
     2903     "\n    -I      Don't exit on nonzero exit code from script" \
     2904     "\n    -p      Don't run script on daemon startup" \
     2905     "\n    -q      Don't run script on daemon quit" \
     2906     "\n    -l      Run script on startup even if no cable is detected" \
     2907     "\n    -t SECS     Poll time in seconds" \
     2908     "\n    -u SECS     Delay before running script after link up" \
     2909     "\n    -d SECS     Delay after link down" \
     2910     "\n    -m MODE     API mode (mii, priv, ethtool, wlan, iff, auto)" \
     2911     "\n    -k      Kill running daemon" \
     2912
    14222913#define ifup_trivial_usage \
    1423        "[-ahinv] ifaces..."
    1424 #define ifup_full_usage \
    1425        "Options:\n" \
    1426        "    -a  De/configure all interfaces automatically\n" \
    1427        "    -i FILE Use FILE for interface definitions\n" \
    1428        "    -n  Print out what would happen, but don't do it\n" \
    1429        "        (note that this option doesn't disable mappings)\n" \
    1430        "    -v  Print out what would happen before doing it\n" \
    1431        "    -m  Don't run any mappings\n" \
    1432        "    -f  Force de/configuration"
     2914       "[-an"IF_FEATURE_IFUPDOWN_MAPPING("m")"vf] [-i FILE] IFACE..."
     2915#define ifup_full_usage "\n\n" \
     2916       "Options:" \
     2917     "\n    -a  De/configure all interfaces automatically" \
     2918     "\n    -i FILE Use FILE for interface definitions" \
     2919     "\n    -n  Print out what would happen, but don't do it" \
     2920    IF_FEATURE_IFUPDOWN_MAPPING( \
     2921     "\n        (note: doesn't disable mappings)" \
     2922     "\n    -m  Don't run any mappings" \
     2923    ) \
     2924     "\n    -v  Print out what would happen before doing it" \
     2925     "\n    -f  Force de/configuration" \
    14332926
    14342927#define ifdown_trivial_usage \
    1435        "[-ahinv] ifaces..."
    1436 #define ifdown_full_usage \
    1437        "Options:\n" \
    1438        "    -a  De/configure all interfaces automatically\n" \
    1439        "    -i FILE Use FILE for interface definitions\n" \
    1440        "    -n  Print out what would happen, but don't do it\n" \
    1441        "        (note that this option doesn't disable mappings)\n" \
    1442        "    -v  Print out what would happen before doing it\n" \
    1443        "    -m  Don't run any mappings\n" \
    1444        "    -f  Force de/configuration"
     2928       "[-an"IF_FEATURE_IFUPDOWN_MAPPING("m")"vf] [-i FILE] IFACE..."
     2929#define ifdown_full_usage "\n\n" \
     2930       "Options:" \
     2931     "\n    -a  De/configure all interfaces automatically" \
     2932     "\n    -i FILE Use FILE for interface definitions" \
     2933     "\n    -n  Print out what would happen, but don't do it" \
     2934    IF_FEATURE_IFUPDOWN_MAPPING( \
     2935     "\n        (note: doesn't disable mappings)" \
     2936     "\n    -m  Don't run any mappings" \
     2937    ) \
     2938     "\n    -v  Print out what would happen before doing it" \
     2939     "\n    -f  Force de/configuration" \
    14452940
    14462941#define inetd_trivial_usage \
    1447        "[-f] [-q len] [conf]"
    1448 #define inetd_full_usage \
    1449        "Listen for network connections and launch programs" \
    1450        "\n\nOptions:\n" \
    1451        "    -f  Run in foreground\n" \
    1452        "    -q N    Set the size of the socket listen queue to N\n" \
    1453        "        (default: 128)"
    1454 
    1455 #define init_trivial_usage \
    1456        ""
    1457 #define init_full_usage \
    1458        "Init is the parent of all processes"
    1459 #define init_notes_usage \
    1460 "This version of init is designed to be run only by the kernel.\n" \
    1461 "\n" \
    1462 "BusyBox init doesn't support multiple runlevels. The runlevels field of\n" \
    1463 "the /etc/inittab file is completely ignored by BusyBox init. If you want\n" \
    1464 "runlevels, use sysvinit.\n" \
    1465 "\n" \
    1466 "BusyBox init works just fine without an inittab. If no inittab is found,\n" \
    1467 "it has the following default behavior:\n" \
    1468 "\n" \
    1469 "   ::sysinit:/etc/init.d/rcS\n" \
    1470 "   ::askfirst:/bin/sh\n" \
    1471 "   ::ctrlaltdel:/sbin/reboot\n" \
    1472 "   ::shutdown:/sbin/swapoff -a\n" \
    1473 "   ::shutdown:/bin/umount -a -r\n" \
    1474 "   ::restart:/sbin/init\n" \
    1475 "\n" \
    1476 "if it detects that /dev/console is _not_ a serial console, it will also run:\n" \
    1477 "\n" \
    1478 "   tty2::askfirst:/bin/sh\n" \
    1479 "   tty3::askfirst:/bin/sh\n" \
    1480 "   tty4::askfirst:/bin/sh\n" \
    1481 "\n" \
    1482 "If you choose to use an /etc/inittab file, the inittab entry format is as follows:\n" \
    1483 "\n" \
    1484 "   <id>:<runlevels>:<action>:<process>\n" \
    1485 "\n" \
    1486 "   <id>:\n" \
    1487 "\n" \
    1488 "       WARNING: This field has a non-traditional meaning for BusyBox init!\n" \
    1489 "       The id field is used by BusyBox init to specify the controlling tty for\n" \
    1490 "       the specified process to run on. The contents of this field are\n" \
    1491 "       appended to \"/dev/\" and used as-is. There is no need for this field to\n" \
    1492 "       be unique, although if it isn't you may have strange results. If this\n" \
    1493 "       field is left blank, the controlling tty is set to the console. Also\n" \
    1494 "       note that if BusyBox detects that a serial console is in use, then only\n" \
    1495 "       entries whose controlling tty is either the serial console or /dev/null\n" \
    1496 "       will be run. BusyBox init does nothing with utmp. We don't need no\n" \
    1497 "       stinkin' utmp.\n" \
    1498 "\n" \
    1499 "   <runlevels>:\n" \
    1500 "\n" \
    1501 "       The runlevels field is completely ignored.\n" \
    1502 "\n" \
    1503 "   <action>:\n" \
    1504 "\n" \
    1505 "       Valid actions include: sysinit, respawn, askfirst, wait,\n" \
    1506 "       once, restart, ctrlaltdel, and shutdown.\n" \
    1507 "\n" \
    1508 "       The available actions can be classified into two groups: actions\n" \
    1509 "       that are run only once, and actions that are re-run when the specified\n" \
    1510 "       process exits.\n" \
    1511 "\n" \
    1512 "       Run only-once actions:\n" \
    1513 "\n" \
    1514 "           'sysinit' is the first item run on boot. init waits until all\n" \
    1515 "           sysinit actions are completed before continuing. Following the\n" \
    1516 "           completion of all sysinit actions, all 'wait' actions are run.\n" \
    1517 "           'wait' actions, like 'sysinit' actions, cause init to wait until\n" \
    1518 "           the specified task completes. 'once' actions are asynchronous,\n" \
    1519 "           therefore, init does not wait for them to complete. 'restart' is\n" \
    1520 "           the action taken to restart the init process. By default this should\n" \
    1521 "           simply run /sbin/init, but can be a script which runs pivot_root or it\n" \
    1522 "           can do all sorts of other interesting things. The 'ctrlaltdel' init\n" \
    1523 "           actions are run when the system detects that someone on the system\n" \
    1524 "           console has pressed the CTRL-ALT-DEL key combination. Typically one\n" \
    1525 "           wants to run 'reboot' at this point to cause the system to reboot.\n" \
    1526 "           Finally the 'shutdown' action specifies the actions to taken when\n" \
    1527 "           init is told to reboot. Unmounting filesystems and disabling swap\n" \
    1528 "           is a very good here.\n" \
    1529 "\n" \
    1530 "       Run repeatedly actions:\n" \
    1531 "\n" \
    1532 "           'respawn' actions are run after the 'once' actions. When a process\n" \
    1533 "           started with a 'respawn' action exits, init automatically restarts\n" \
    1534 "           it. Unlike sysvinit, BusyBox init does not stop processes from\n" \
    1535 "           respawning out of control. The 'askfirst' actions acts just like\n" \
    1536 "           respawn, except that before running the specified process it\n" \
    1537 "           displays the line \"Please press Enter to activate this console.\"\n" \
    1538 "           and then waits for the user to press enter before starting the\n" \
    1539 "           specified process.\n" \
    1540 "\n" \
    1541 "       Unrecognized actions (like initdefault) will cause init to emit an\n" \
    1542 "       error message, and then go along with its business. All actions are\n" \
    1543 "       run in the order they appear in /etc/inittab.\n" \
    1544 "\n" \
    1545 "   <process>:\n" \
    1546 "\n" \
    1547 "       Specifies the process to be executed and its command line.\n" \
    1548 "\n" \
    1549 "Example /etc/inittab file:\n" \
    1550 "\n" \
    1551 "   # This is run first except when booting in single-user mode\n" \
    1552 "   #\n" \
    1553 "   ::sysinit:/etc/init.d/rcS\n" \
    1554 "   \n" \
    1555 "   # /bin/sh invocations on selected ttys\n" \
    1556 "   #\n" \
    1557 "   # Start an \"askfirst\" shell on the console (whatever that may be)\n" \
    1558 "   ::askfirst:-/bin/sh\n" \
    1559 "   # Start an \"askfirst\" shell on /dev/tty2-4\n" \
    1560 "   tty2::askfirst:-/bin/sh\n" \
    1561 "   tty3::askfirst:-/bin/sh\n" \
    1562 "   tty4::askfirst:-/bin/sh\n" \
    1563 "   \n" \
    1564 "   # /sbin/getty invocations for selected ttys\n" \
    1565 "   #\n" \
    1566 "   tty4::respawn:/sbin/getty 38400 tty4\n" \
    1567 "   tty5::respawn:/sbin/getty 38400 tty5\n" \
    1568 "   \n" \
    1569 "   \n" \
    1570 "   # Example of how to put a getty on a serial line (for a terminal)\n" \
    1571 "   #\n" \
    1572 "   #::respawn:/sbin/getty -L ttyS0 9600 vt100\n" \
    1573 "   #::respawn:/sbin/getty -L ttyS1 9600 vt100\n" \
    1574 "   #\n" \
    1575 "   # Example how to put a getty on a modem line\n" \
    1576 "   #::respawn:/sbin/getty 57600 ttyS2\n" \
    1577 "   \n" \
    1578 "   # Stuff to do when restarting the init process\n" \
    1579 "   ::restart:/sbin/init\n" \
    1580 "   \n" \
    1581 "   # Stuff to do before rebooting\n" \
    1582 "   ::ctrlaltdel:/sbin/reboot\n" \
    1583 "   ::shutdown:/bin/umount -a -r\n" \
    1584 "   ::shutdown:/sbin/swapoff -a\n"
    1585 
    1586 #define insmod_trivial_usage \
    1587        "[OPTION]... MODULE [symbol=value]..."
    1588 #define insmod_full_usage \
    1589        "Load the specified kernel modules into the kernel" \
    1590        "\n\nOptions:\n" \
    1591        "    -f  Force module to load into the wrong kernel version\n" \
    1592        "    -k  Make module autoclean-able\n" \
    1593        "    -v  Verbose\n" \
    1594        "    -q  Quiet\n" \
    1595        "    -L  Lock to prevent simultaneous loads of a module\n" \
    1596     USE_FEATURE_INSMOD_LOAD_MAP( \
    1597        "    -m  Output load map to stdout\n") \
    1598        "    -o NAME Set internal module name to NAME\n" \
    1599        "    -x  Do not export externs"
    1600 
     2942       "[-fe] [-q N] [-R N] [CONFFILE]"
     2943#define inetd_full_usage "\n\n" \
     2944       "Listen for network connections and launch programs\n" \
     2945     "\nOptions:" \
     2946     "\n    -f  Run in foreground" \
     2947     "\n    -e  Log to stderr" \
     2948     "\n    -q N    Socket listen queue (default: 128)" \
     2949     "\n    -R N    Pause services after N connects/min" \
     2950     "\n        (default: 0 - disabled)" \
     2951
     2952#define inotifyd_trivial_usage \
     2953    "PROG FILE1[:MASK]..."
     2954#define inotifyd_full_usage "\n\n" \
     2955       "Run PROG on filesystem changes." \
     2956     "\nWhen a filesystem event matching MASK occurs on FILEn," \
     2957     "\nPROG ACTUAL_EVENTS FILEn [SUBFILE] is run." \
     2958     "\nEvents:" \
     2959     "\n    a   File is accessed" \
     2960     "\n    c   File is modified" \
     2961     "\n    e   Metadata changed" \
     2962     "\n    w   Writable file is closed" \
     2963     "\n    0   Unwritable file is closed" \
     2964     "\n    r   File is opened" \
     2965     "\n    D   File is deleted" \
     2966     "\n    M   File is moved" \
     2967     "\n    u   Backing fs is unmounted" \
     2968     "\n    o   Event queue overflowed" \
     2969     "\n    x   File can't be watched anymore" \
     2970     "\nIf watching a directory:" \
     2971     "\n    m   Subfile is moved into dir" \
     2972     "\n    y   Subfile is moved out of dir" \
     2973     "\n    n   Subfile is created" \
     2974     "\n    d   Subfile is deleted" \
     2975     "\n" \
     2976     "\ninotifyd waits for PROG to exit." \
     2977     "\nWhen x event happens for all FILEs, inotifyd exits." \
     2978
     2979/* -v, -b, -c are ignored */
    16012980#define install_trivial_usage \
    1602        "[-cgmops] [sources] dest|directory"
    1603 #define install_full_usage \
    1604        "Copy files and set attributes" \
    1605        "\n\nOptions:\n" \
    1606        "    -c  Copy the file, default\n" \
    1607        "    -d  Create directories\n" \
    1608        "    -g  Set group ownership\n" \
    1609        "    -m  Set permission modes\n" \
    1610        "    -o  Set ownership\n" \
    1611        "    -p  Preserve date\n" \
    1612        "    -s  Strip symbol tables" \
    1613     USE_SELINUX( \
    1614        "\n  -Z  Set security context of copy" \
     2981    "[-cdDsp] [-o USER] [-g GRP] [-m MODE] [SOURCE]... DEST"
     2982#define install_full_usage "\n\n" \
     2983       "Copy files and set attributes\n" \
     2984     "\nOptions:" \
     2985     "\n    -c  Just copy (default)" \
     2986     "\n    -d  Create directories" \
     2987     "\n    -D  Create leading target directories" \
     2988     "\n    -s  Strip symbol table" \
     2989     "\n    -p  Preserve date" \
     2990     "\n    -o USER Set ownership" \
     2991     "\n    -g GRP  Set group ownership" \
     2992     "\n    -m MODE Set permissions" \
     2993    IF_SELINUX( \
     2994     "\n    -Z  Set security context" \
    16152995    )
    1616 /* would need to make the " | " optional depending on more than one selected */
     2996
     2997/* would need to make the " | " optional depending on more than one selected: */
    16172998#define ip_trivial_usage \
    16182999       "[OPTIONS] {" \
    1619     USE_FEATURE_IP_ADDRESS("address | ") \
    1620     USE_FEATURE_IP_ROUTE("route | ") \
    1621     USE_FEATURE_IP_LINK("link | ") \
    1622     USE_FEATURE_IP_TUNNEL("tunnel | ") \
    1623     USE_FEATURE_IP_RULE("rule") \
     3000    IF_FEATURE_IP_ADDRESS("address | ") \
     3001    IF_FEATURE_IP_ROUTE("route | ") \
     3002    IF_FEATURE_IP_LINK("link | ") \
     3003    IF_FEATURE_IP_TUNNEL("tunnel | ") \
     3004    IF_FEATURE_IP_RULE("rule") \
    16243005       "} {COMMAND}"
    1625 #define ip_full_usage \
     3006#define ip_full_usage "\n\n" \
    16263007       "ip [OPTIONS] OBJECT {COMMAND}\n" \
    16273008       "where OBJECT := {" \
    1628     USE_FEATURE_IP_ADDRESS("address | ") \
    1629     USE_FEATURE_IP_ROUTE("route | ") \
    1630     USE_FEATURE_IP_LINK("link | ") \
    1631     USE_FEATURE_IP_TUNNEL("tunnel | ") \
    1632     USE_FEATURE_IP_RULE("rule") \
     3009    IF_FEATURE_IP_ADDRESS("address | ") \
     3010    IF_FEATURE_IP_ROUTE("route | ") \
     3011    IF_FEATURE_IP_LINK("link | ") \
     3012    IF_FEATURE_IP_TUNNEL("tunnel | ") \
     3013    IF_FEATURE_IP_RULE("rule") \
    16333014       "}\n" \
    1634        "OPTIONS := { -f[amily] { inet | inet6 | link } | -o[neline] }"
     3015       "OPTIONS := { -f[amily] { inet | inet6 | link } | -o[neline] }" \
    16353016
    16363017#define ipaddr_trivial_usage \
    16373018       "{ {add|del} IFADDR dev STRING | {show|flush}\n" \
    16383019       "        [dev STRING] [to PREFIX] }"
    1639 #define ipaddr_full_usage \
     3020#define ipaddr_full_usage "\n\n" \
    16403021       "ipaddr {add|delete} IFADDR dev STRING\n" \
    16413022       "ipaddr {show|flush} [dev STRING] [scope SCOPE-ID]\n" \
     
    16443025       "    [broadcast ADDR] [anycast ADDR]\n" \
    16453026       "    [label STRING] [scope SCOPE-ID]\n" \
    1646        "    SCOPE-ID := [host | link | global | NUMBER]"
     3027       "    SCOPE-ID := [host | link | global | NUMBER]" \
    16473028
    16483029#define ipcalc_trivial_usage \
    1649        "[OPTION]... ADDRESS[[/]NETMASK] [NETMASK]"
    1650 #define ipcalc_full_usage \
    1651        "Calculate IP network settings from a IP address" \
    1652        "\n\nOptions:" \
    1653        "\n  -b  --broadcast Display calculated broadcast address" \
    1654        "\n  -n  --network   Display calculated network address" \
    1655        "\n  -m  --netmask   Display default netmask for IP" \
    1656     USE_FEATURE_IPCALC_FANCY( \
    1657        "\n  -p  --prefix    Display the prefix for IP/NETMASK" \
    1658        "\n  -h  --hostname  Display first resolved host name" \
    1659        "\n  -s  --silent    Don't ever display error messages")
     3030       "[OPTIONS] ADDRESS[[/]NETMASK] [NETMASK]"
     3031#define ipcalc_full_usage "\n\n" \
     3032       "Calculate IP network settings from a IP address\n" \
     3033     "\nOptions:" \
     3034    IF_FEATURE_IPCALC_LONG_OPTIONS( \
     3035     "\n    -b,--broadcast  Display calculated broadcast address" \
     3036     "\n    -n,--network    Display calculated network address" \
     3037     "\n    -m,--netmask    Display default netmask for IP" \
     3038    IF_FEATURE_IPCALC_FANCY( \
     3039     "\n    -p,--prefix Display the prefix for IP/NETMASK" \
     3040     "\n    -h,--hostname   Display first resolved host name" \
     3041     "\n    -s,--silent Don't ever display error messages" \
     3042    ) \
     3043    ) \
     3044    IF_NOT_FEATURE_IPCALC_LONG_OPTIONS( \
     3045     "\n    -b  Display calculated broadcast address" \
     3046     "\n    -n  Display calculated network address" \
     3047     "\n    -m  Display default netmask for IP" \
     3048    IF_FEATURE_IPCALC_FANCY( \
     3049     "\n    -p  Display the prefix for IP/NETMASK" \
     3050     "\n    -h  Display first resolved host name" \
     3051     "\n    -s  Don't ever display error messages" \
     3052    ) \
     3053    )
    16603054
    16613055#define ipcrm_trivial_usage \
    1662        "[-[MQS] key] [-[mqs] id]"
    1663 #define ipcrm_full_usage \
    1664        "The upper-case options MQS are used to remove a shared memory segment by a\n" \
    1665        "segment by a shmkey value. The lower-case options mqs are used\n" \
    1666        "to remove a segment by shmid value.\n" \
    1667        "\n\nOptions:\n" \
    1668        "    -[mM]   Remove the memory segment after the last detach\n" \
    1669        "    -[qQ]   Remove the message queue\n" \
    1670        "    -[sS]   Remove the semaphore"
     3056       "[-MQS key] [-mqs id]"
     3057#define ipcrm_full_usage "\n\n" \
     3058       "Upper-case options MQS remove an object by shmkey value.\n" \
     3059       "Lower-case options remove an object by shmid value.\n" \
     3060     "\nOptions:" \
     3061     "\n    -mM Remove memory segment after last detach" \
     3062     "\n    -qQ Remove message queue" \
     3063     "\n    -sS Remove semaphore" \
    16713064
    16723065#define ipcs_trivial_usage \
    16733066       "[[-smq] -i shmid] | [[-asmq] [-tcplu]]"
    1674 #define ipcs_full_usage \
    1675        "    -i  Specify a specific resource id\n" \
    1676        "Resource specification:\n" \
    1677        "    -m  Shared memory segments\n" \
    1678        "    -q  Message queues\n" \
    1679        "    -s  Semaphore arrays\n" \
    1680        "    -a  All (default)\n" \
    1681        "Output format:\n" \
    1682        "    -t  Time\n" \
    1683        "    -c  Creator\n" \
    1684        "    -p  Pid\n" \
    1685        "    -l  Limits\n" \
    1686        "    -u  Summary"
     3067#define ipcs_full_usage "\n\n" \
     3068       "    -i  Show specific resource" \
     3069     "\nResource specification:" \
     3070     "\n    -m  Shared memory segments" \
     3071     "\n    -q  Message queues" \
     3072     "\n    -s  Semaphore arrays" \
     3073     "\n    -a  All (default)" \
     3074     "\nOutput format:" \
     3075     "\n    -t  Time" \
     3076     "\n    -c  Creator" \
     3077     "\n    -p  Pid" \
     3078     "\n    -l  Limits" \
     3079     "\n    -u  Summary" \
    16873080
    16883081#define iplink_trivial_usage \
    16893082       "{ set DEVICE { up | down | arp { on | off } | show [DEVICE] }"
    1690 #define iplink_full_usage \
     3083#define iplink_full_usage "\n\n" \
    16913084       "iplink set DEVICE { up | down | arp | multicast { on | off } |\n" \
    16923085       "            dynamic { on | off } |\n" \
    16933086       "            mtu MTU }\n" \
    1694        "iplink show [DEVICE]"
     3087       "iplink show [DEVICE]" \
    16953088
    16963089#define iproute_trivial_usage \
    16973090       "{ list | flush | { add | del | change | append |\n" \
    16983091       "        replace | monitor } ROUTE }"
    1699 #define iproute_full_usage \
     3092#define iproute_full_usage "\n\n" \
    17003093       "iproute { list | flush } SELECTOR\n" \
    17013094       "iproute get ADDRESS [from ADDRESS iif STRING]\n" \
     
    17033096       "iproute { add | del | change | append | replace | monitor } ROUTE\n" \
    17043097       "            SELECTOR := [root PREFIX] [match PREFIX] [proto RTPROTO]\n" \
    1705        "            ROUTE := [TYPE] PREFIX [tos TOS] [proto RTPROTO]"
     3098       "            ROUTE := [TYPE] PREFIX [tos TOS] [proto RTPROTO]\n" \
     3099       "                [metric METRIC]" \
    17063100
    17073101#define iprule_trivial_usage \
    17083102       "{[list | add | del] RULE}"
    1709 #define iprule_full_usage \
     3103#define iprule_full_usage "\n\n" \
    17103104       "iprule [list | add | del] SELECTOR ACTION\n" \
    17113105       "    SELECTOR := [from PREFIX] [to PREFIX] [tos TOS] [fwmark FWMARK]\n" \
     
    17143108       "            [prohibit | reject | unreachable]\n" \
    17153109       "            [realms [SRCREALM/]DSTREALM]\n" \
    1716        "    TABLE_ID := [local | main | default | NUMBER]"
     3110       "    TABLE_ID := [local | main | default | NUMBER]" \
    17173111
    17183112#define iptunnel_trivial_usage \
     
    17203114       "    [mode { ipip | gre | sit }]\n" \
    17213115       "    [remote ADDR] [local ADDR] [ttl TTL]"
    1722 #define iptunnel_full_usage \
     3116#define iptunnel_full_usage "\n\n" \
    17233117       "iptunnel { add | change | del | show } [NAME]\n" \
    17243118       "    [mode { ipip | gre | sit }] [remote ADDR] [local ADDR]\n" \
    17253119       "    [[i|o]seq] [[i|o]key KEY] [[i|o]csum]\n" \
    1726        "    [ttl TTL] [tos TOS] [[no]pmtudisc] [dev PHYS_DEV]"
     3120       "    [ttl TTL] [tos TOS] [[no]pmtudisc] [dev PHYS_DEV]" \
     3121
     3122#define kbd_mode_trivial_usage \
     3123       "[-a|k|s|u] [-C TTY]"
     3124#define kbd_mode_full_usage "\n\n" \
     3125       "Report or set the keyboard mode\n" \
     3126     "\nOptions:" \
     3127     "\n    -a  Default (ASCII)" \
     3128     "\n    -k  Medium-raw (keyboard)" \
     3129     "\n    -s  Raw (scancode)" \
     3130     "\n    -u  Unicode (utf-8)" \
     3131     "\n    -C TTY  Affect TTY instead of /dev/tty" \
    17273132
    17283133#define kill_trivial_usage \
    1729        "[-l] [-signal] process-id [process-id ...]"
    1730 #define kill_full_usage \
    1731        "Send a signal (default is TERM) to the specified process(es)" \
    1732        "\n\nOptions:\n" \
    1733        "    -l  List all signal names and numbers"
     3134       "[-l] [-SIG] PID..."
     3135#define kill_full_usage "\n\n" \
     3136       "Send a signal (default: TERM) to given PIDs\n" \
     3137     "\nOptions:" \
     3138     "\n    -l  List all signal names and numbers" \
     3139/*   "\n    -s SIG  Yet another way of specifying SIG" */ \
     3140
    17343141#define kill_example_usage \
    17353142       "$ ps | grep apache\n" \
     
    17433150
    17443151#define killall_trivial_usage \
    1745        "[-l] [-q] [-signal] process-name [process-name ...]"
    1746 #define killall_full_usage \
    1747        "Send a signal (default is TERM) to the specified process(es)" \
    1748        "\n\nOptions:\n" \
    1749        "    -l  List all signal names and numbers\n" \
    1750        "    -q  Do not complain if no processes were killed"
     3152       "[-l] [-q] [-SIG] PROCESS_NAME..."
     3153#define killall_full_usage "\n\n" \
     3154       "Send a signal (default: TERM) to given processes\n" \
     3155     "\nOptions:" \
     3156     "\n    -l  List all signal names and numbers" \
     3157/*   "\n    -s SIG  Yet another way of specifying SIG" */ \
     3158     "\n    -q  Don't complain if no processes were killed" \
     3159
    17513160#define killall_example_usage \
    17523161       "$ killall apache\n"
    17533162
    17543163#define killall5_trivial_usage \
    1755        "[-l] [-signal]"
    1756 #define killall5_full_usage \
    1757        "Send a signal (default is TERM) to all processes outside current session" \
    1758        "\n\nOptions:\n" \
    1759        "    -l  List all signal names and numbers\n" \
     3164       "[-l] [-SIG] [-o PID]..."
     3165#define killall5_full_usage "\n\n" \
     3166       "Send a signal (default: TERM) to all processes outside current session\n" \
     3167     "\nOptions:" \
     3168     "\n    -l  List all signal names and numbers" \
     3169     "\n    -o PID  Don't signal this PID" \
     3170/*   "\n    -s SIG  Yet another way of specifying SIG" */ \
    17603171
    17613172#define klogd_trivial_usage \
    1762        "[-c n] [-n]"
    1763 #define klogd_full_usage \
    1764        "Kernel logger" \
    1765        "\n\nOptions:\n" \
    1766        "    -c n    Sets the default log level of console messages to n\n" \
    1767        "    -n  Run as foreground process"
     3173       "[-c N] [-n]"
     3174#define klogd_full_usage "\n\n" \
     3175       "Kernel logger\n" \
     3176     "\nOptions:" \
     3177     "\n    -c N    Only messages with level < N are printed to console" \
     3178     "\n    -n  Run in foreground" \
    17683179
    17693180#define length_trivial_usage \
    17703181       "STRING"
    1771 #define length_full_usage \
    1772        "Print out the length of the specified STRING"
     3182#define length_full_usage "\n\n" \
     3183       "Print STRING's length"
     3184
    17733185#define length_example_usage \
    17743186       "$ length Hello\n" \
     
    17763188
    17773189#define less_trivial_usage \
    1778        "[-EMNmh~?] FILE1 FILE2..."
    1779 #define less_full_usage \
    1780        "View a file or list of files. The position within files can be\n" \
    1781        "changed, and files can be manipulated in various ways." \
    1782        "\n\nOptions:\n" \
    1783        "    -E  Quit once the end of a file is reached\n" \
    1784        "    -M  Display a status line containing the current line numbers\n" \
    1785        "        and the percentage through the file\n" \
    1786        "    -N  Prefix line numbers to each line\n" \
    1787        "    -m  Display a status line containing the percentage through the\n" \
    1788        "        file\n" \
    1789        "    -~  Suppress ~s displayed when input past the end of the file is\n" \
    1790        "        reached"
     3190       "[-EMNmh~I?] [FILE]..."
     3191#define less_full_usage "\n\n" \
     3192       "View FILE (or stdin) one screenful at a time\n" \
     3193     "\nOptions:" \
     3194     "\n    -E  Quit once the end of a file is reached" \
     3195     "\n    -M,-m   Display status line with line numbers" \
     3196     "\n        and percentage through the file" \
     3197     "\n    -N  Prefix line number to each line" \
     3198     "\n    -I  Ignore case in all searches" \
     3199     "\n    -~  Suppress ~s displayed past the end of the file" \
     3200
     3201#define linux32_trivial_usage NOUSAGE_STR
     3202#define linux32_full_usage ""
     3203#define linux64_trivial_usage NOUSAGE_STR
     3204#define linux64_full_usage ""
    17913205
    17923206#define setarch_trivial_usage \
    1793        "personality program [args ...]"
    1794 #define setarch_full_usage \
     3207       "personality PROG ARGS"
     3208#define setarch_full_usage "\n\n" \
    17953209       "Personality may be:\n" \
    17963210       "    linux32     Set 32bit uname emulation\n" \
    1797        "    linux64     Set 64bit uname emulation"
     3211       "    linux64     Set 64bit uname emulation" \
    17983212
    17993213#define ln_trivial_usage \
    1800        "[OPTION] TARGET... LINK_NAME|DIRECTORY"
    1801 #define ln_full_usage \
    1802        "Create a link named LINK_NAME or DIRECTORY to the specified TARGET.\n" \
    1803        "You may use '--' to indicate that all following arguments are non-options." \
    1804        "\n\nOptions:\n" \
    1805        "    -s  Make symlinks instead of hardlinks\n" \
    1806        "    -f  Remove existing destination files\n" \
    1807        "    -n  No dereference symlinks - treat like normal file\n" \
    1808        "    -b  Make a backup of the target (if exists) before link operation\n" \
    1809        "    -S suf  Use suffix instead of ~ when making backup files"
     3214       "[OPTIONS] TARGET... LINK|DIR"
     3215#define ln_full_usage "\n\n" \
     3216       "Create a link LINK or DIR/TARGET to the specified TARGET(s)\n" \
     3217     "\nOptions:" \
     3218     "\n    -s  Make symlinks instead of hardlinks" \
     3219     "\n    -f  Remove existing destinations" \
     3220     "\n    -n  Don't dereference symlinks - treat like normal file" \
     3221     "\n    -b  Make a backup of the target (if exists) before link operation" \
     3222     "\n    -S suf  Use suffix instead of ~ when making backup files" \
     3223
    18103224#define ln_example_usage \
    18113225       "$ ln -s BusyBox /tmp/ls\n" \
     
    18133227       "lrwxrwxrwx    1 root     root            7 Apr 12 18:39 ls -> BusyBox*\n"
    18143228
    1815 #define load_policy_trivial_usage \
    1816        "[FILE]"
    1817 #define load_policy_full_usage
     3229#define load_policy_trivial_usage NOUSAGE_STR
     3230#define load_policy_full_usage ""
    18183231
    18193232#define loadfont_trivial_usage \
    18203233       "< font"
    1821 #define loadfont_full_usage \
    1822        "Load a console font from standard input"
     3234#define loadfont_full_usage "\n\n" \
     3235       "Load a console font from stdin" \
     3236/*   "\n    -C TTY  Affect TTY instead of /dev/tty" */ \
     3237
    18233238#define loadfont_example_usage \
    18243239       "$ loadfont < /etc/i18n/fontname\n"
     
    18263241#define loadkmap_trivial_usage \
    18273242       "< keymap"
    1828 #define loadkmap_full_usage \
    1829        "Load a binary keyboard translation table from standard input"
     3243#define loadkmap_full_usage "\n\n" \
     3244       "Load a binary keyboard translation table from stdin\n" \
     3245/*   "\n    -C TTY  Affect TTY instead of /dev/tty" */ \
     3246
    18303247#define loadkmap_example_usage \
    18313248       "$ loadkmap < /etc/i18n/lang-keymap\n"
    18323249
    18333250#define logger_trivial_usage \
    1834        "[OPTION]... [MESSAGE]"
    1835 #define logger_full_usage \
    1836        "Write MESSAGE to the system log. If MESSAGE is omitted, log stdin." \
    1837        "\n\nOptions:\n" \
    1838        "    -s  Log to stderr as well as the system log\n" \
    1839        "    -t TAG  Log using the specified tag (defaults to user name)\n" \
    1840        "    -p PRIO Enter the message with the specified priority.\n" \
    1841        "        This may be numerical or a 'facility.level' pair."
     3251       "[OPTIONS] [MESSAGE]"
     3252#define logger_full_usage "\n\n" \
     3253       "Write MESSAGE (or stdin) to syslog\n" \
     3254     "\nOptions:" \
     3255     "\n    -s  Log to stderr as well as the system log" \
     3256     "\n    -t TAG  Log using the specified tag (defaults to user name)" \
     3257     "\n    -p PRIO Priority (numeric or facility.level pair)" \
     3258
    18423259#define logger_example_usage \
    18433260       "$ logger \"hello\"\n"
    18443261
    18453262#define login_trivial_usage \
    1846        "[OPTION]... [username] [ENV=VAR ...]"
    1847 #define login_full_usage \
    1848        "Begin a new session on the system" \
    1849        "\n\nOptions:\n" \
    1850        "    -f  Do not authenticate (user already authenticated)\n" \
    1851        "    -h  Name of the remote host for this login\n" \
    1852        "    -p  Preserve environment"
     3263       "[-p] [-h HOST] [[-f] USER]"
     3264#define login_full_usage "\n\n" \
     3265       "Begin a new session on the system\n" \
     3266     "\nOptions:" \
     3267     "\n    -f  Don't authenticate (user already authenticated)" \
     3268     "\n    -h  Name of the remote host" \
     3269     "\n    -p  Preserve environment" \
    18533270
    18543271#define logname_trivial_usage \
    18553272       ""
    1856 #define logname_full_usage \
     3273#define logname_full_usage "\n\n" \
    18573274       "Print the name of the current user"
    18583275#define logname_example_usage \
     
    18613278
    18623279#define logread_trivial_usage \
    1863        "[OPTION]..."
    1864 #define logread_full_usage \
    1865        "Show the messages from syslogd (using circular buffer)" \
    1866        "\n\nOptions:\n" \
    1867        "    -f  Output data as the log grows"
     3280       "[-f]"
     3281#define logread_full_usage "\n\n" \
     3282       "Show messages in syslogd's circular buffer\n" \
     3283     "\nOptions:" \
     3284     "\n    -f  Output data as log grows" \
    18683285
    18693286#define losetup_trivial_usage \
    1870        "[-o OFFSET] [-d] LOOPDEVICE [FILE]]"
    1871 #define losetup_full_usage \
    1872        "(Dis)associate LOOPDEVICE with FILE, or display current associations" \
    1873        "\n\nOptions:\n" \
    1874        "    -d      Disassociate LOOPDEVICE\n" \
    1875        "    -o OFFSET   Start OFFSET bytes into FILE"
     3287       "[-o OFS] LOOPDEV FILE - associate loop devices\n" \
     3288       "    losetup -d LOOPDEV - disassociate\n" \
     3289       "    losetup [-f] - show"
     3290#define losetup_full_usage "\n\n" \
     3291       "Options:" \
     3292     "\n    -o OFS  Start OFS bytes into FILE" \
     3293     "\n    -f  Show first free loop device" \
     3294
    18763295#define losetup_notes_usage \
    18773296       "No arguments will display all current associations.\n" \
     
    18803299       "and filename of the file the loop device is currently bound to.\n\n" \
    18813300       "Two arguments (losetup /dev/loop1 file.img) create a new association,\n" \
    1882        "with an optional offset (-o 12345). Encryption is not yet supported.\n\n"
     3301       "with an optional offset (-o 12345). Encryption is not yet supported.\n" \
     3302       "losetup -f will show the first loop free loop device\n\n"
     3303
     3304#define lpd_trivial_usage \
     3305       "SPOOLDIR [HELPER [ARGS]]"
     3306#define lpd_full_usage "\n\n" \
     3307       "SPOOLDIR must contain (symlinks to) device nodes or directories" \
     3308     "\nwith names matching print queue names. In the first case, jobs are" \
     3309     "\nsent directly to the device. Otherwise each job is stored in queue" \
     3310     "\ndirectory and HELPER program is called. Name of file to print" \
     3311     "\nis passed in $DATAFILE variable." \
     3312     "\nExample:" \
     3313     "\n    tcpsvd -E 0 515 softlimit -m 999999 lpd /var/spool ./print" \
     3314
     3315#define lpq_trivial_usage \
     3316       "[-P queue[@host[:port]]] [-U USERNAME] [-d JOBID]... [-fs]"
     3317#define lpq_full_usage "\n\n" \
     3318       "Options:" \
     3319     "\n    -P  lp service to connect to (else uses $PRINTER)" \
     3320     "\n    -d  Delete jobs" \
     3321     "\n    -f  Force any waiting job to be printed" \
     3322     "\n    -s  Short display" \
     3323
     3324#define lpr_trivial_usage \
     3325       "-P queue[@host[:port]] -U USERNAME -J TITLE -Vmh [FILE]..."
     3326/* -C CLASS exists too, not shown.
     3327 * CLASS is supposed to be printed on banner page, if one is requested */
     3328#define lpr_full_usage "\n\n" \
     3329       "Options:" \
     3330     "\n    -P  lp service to connect to (else uses $PRINTER)"\
     3331     "\n    -m  Send mail on completion" \
     3332     "\n    -h  Print banner page too" \
     3333     "\n    -V  Verbose" \
    18833334
    18843335#define ls_trivial_usage \
    1885        "[-1Aa" USE_FEATURE_LS_TIMESTAMPS("c") "Cd" \
    1886     USE_FEATURE_LS_TIMESTAMPS("e") USE_FEATURE_LS_FILETYPES("F") "iln" \
    1887     USE_FEATURE_LS_FILETYPES("p") USE_FEATURE_LS_FOLLOWLINKS("L") \
    1888     USE_FEATURE_LS_RECURSIVE("R") USE_FEATURE_LS_SORTFILES("rS") "s" \
    1889     USE_FEATURE_AUTOWIDTH("T") USE_FEATURE_LS_TIMESTAMPS("tu") \
    1890     USE_FEATURE_LS_SORTFILES("v") USE_FEATURE_AUTOWIDTH("w") "x" \
    1891     USE_FEATURE_LS_SORTFILES("X") USE_FEATURE_HUMAN_READABLE("h") "k" \
    1892     USE_SELINUX("K") "] [filenames...]"
    1893 #define ls_full_usage \
    1894        "List directory contents" \
    1895        "\n\nOptions:" \
    1896        "\n  -1  List files in a single column" \
    1897        "\n  -A  Do not list implied . and .." \
    1898        "\n  -a  Do not hide entries starting with ." \
    1899        "\n  -C  List entries by columns" \
    1900     USE_FEATURE_LS_TIMESTAMPS( \
    1901        "\n  -c  With -l: show ctime") \
    1902     USE_FEATURE_LS_COLOR( \
    1903        "\n  --color[={always,never,auto}]   Control coloring") \
    1904        "\n  -d  List directory entries instead of contents" \
    1905     USE_FEATURE_LS_TIMESTAMPS( \
    1906        "\n  -e  List both full date and full time") \
    1907     USE_FEATURE_LS_FILETYPES( \
    1908        "\n  -F  Append indicator (one of */=@|) to entries") \
    1909        "\n  -i  List the i-node for each file" \
    1910        "\n  -l  Use a long listing format" \
    1911        "\n  -n  List numeric UIDs and GIDs instead of names" \
    1912     USE_FEATURE_LS_FILETYPES( \
    1913        "\n  -p  Append indicator (one of /=@|) to entries") \
    1914     USE_FEATURE_LS_FOLLOWLINKS( \
    1915        "\n  -L  List entries pointed to by symlinks") \
    1916     USE_FEATURE_LS_RECURSIVE( \
    1917        "\n  -R  List subdirectories recursively") \
    1918     USE_FEATURE_LS_SORTFILES( \
    1919        "\n  -r  Sort the listing in reverse order") \
    1920     USE_FEATURE_LS_SORTFILES( \
    1921        "\n  -S  Sort the listing by file size") \
    1922        "\n  -s  List the size of each file, in blocks" \
    1923     USE_FEATURE_AUTOWIDTH( \
    1924        "\n  -T NUM  Assume Tabstop every NUM columns") \
    1925     USE_FEATURE_LS_TIMESTAMPS( \
    1926        "\n  -t  With -l: show modification time") \
    1927     USE_FEATURE_LS_TIMESTAMPS( \
    1928        "\n  -u  With -l: show access time") \
    1929     USE_FEATURE_LS_SORTFILES( \
    1930        "\n  -v  Sort the listing by version") \
    1931     USE_FEATURE_AUTOWIDTH( \
    1932        "\n  -w NUM  Assume the terminal is NUM columns wide") \
    1933        "\n  -x  List entries by lines instead of by columns" \
    1934     USE_FEATURE_LS_SORTFILES( \
    1935        "\n  -X  Sort the listing by extension") \
    1936     USE_FEATURE_HUMAN_READABLE( \
    1937        "\n  -h  Print sizes in human readable format (e.g., 1K 243M 2G)") \
    1938     USE_SELINUX( \
    1939        "\n  -k  Print security context") \
    1940     USE_SELINUX( \
    1941        "\n  -K  Print security context in long format") \
    1942     USE_SELINUX( \
    1943        "\n  -Z  Print security context and permission")
     3336       "[-1Aa" IF_FEATURE_LS_TIMESTAMPS("c") "Cd" \
     3337    IF_FEATURE_LS_TIMESTAMPS("e") IF_FEATURE_LS_FILETYPES("F") "iln" \
     3338    IF_FEATURE_LS_FILETYPES("p") IF_FEATURE_LS_FOLLOWLINKS("L") \
     3339    IF_FEATURE_LS_RECURSIVE("R") IF_FEATURE_LS_SORTFILES("rS") "s" \
     3340    IF_FEATURE_AUTOWIDTH("T") IF_FEATURE_LS_TIMESTAMPS("tu") \
     3341    IF_FEATURE_LS_SORTFILES("v") IF_FEATURE_AUTOWIDTH("w") "x" \
     3342    IF_FEATURE_LS_SORTFILES("X") IF_FEATURE_HUMAN_READABLE("h") "k" \
     3343    IF_SELINUX("K") "] [FILE]..."
     3344#define ls_full_usage "\n\n" \
     3345       "List directory contents\n" \
     3346     "\nOptions:" \
     3347     "\n    -1  List in a single column" \
     3348     "\n    -A  Don't list . and .." \
     3349     "\n    -a  Don't hide entries starting with ." \
     3350     "\n    -C  List by columns" \
     3351    IF_FEATURE_LS_TIMESTAMPS( \
     3352     "\n    -c  With -l: sort by ctime") \
     3353    IF_FEATURE_LS_COLOR( \
     3354     "\n    --color[={always,never,auto}]   Control coloring") \
     3355     "\n    -d  List directory entries instead of contents" \
     3356    IF_FEATURE_LS_TIMESTAMPS( \
     3357     "\n    -e  List full date and time") \
     3358    IF_FEATURE_LS_FILETYPES( \
     3359     "\n    -F  Append indicator (one of */=@|) to entries") \
     3360     "\n    -i  List inode numbers" \
     3361     "\n    -l  Long listing format" \
     3362     "\n    -n  List numeric UIDs and GIDs instead of names" \
     3363    IF_FEATURE_LS_FILETYPES( \
     3364     "\n    -p  Append indicator (one of /=@|) to entries") \
     3365    IF_FEATURE_LS_FOLLOWLINKS( \
     3366     "\n    -L  List entries pointed to by symlinks") \
     3367    IF_FEATURE_LS_RECURSIVE( \
     3368     "\n    -R  Recurse") \
     3369    IF_FEATURE_LS_SORTFILES( \
     3370     "\n    -r  Sort in reverse order") \
     3371    IF_FEATURE_LS_SORTFILES( \
     3372     "\n    -S  Sort by file size") \
     3373     "\n    -s  List the size of each file, in blocks" \
     3374    IF_FEATURE_AUTOWIDTH( \
     3375     "\n    -T N    Assume tabstop every N columns") \
     3376    IF_FEATURE_LS_TIMESTAMPS( \
     3377     "\n    -t  With -l: sort by modification time") \
     3378    IF_FEATURE_LS_TIMESTAMPS( \
     3379     "\n    -u  With -l: sort by access time") \
     3380    IF_FEATURE_LS_SORTFILES( \
     3381     "\n    -v  Sort by version") \
     3382    IF_FEATURE_AUTOWIDTH( \
     3383     "\n    -w N    Assume the terminal is N columns wide") \
     3384     "\n    -x  List by lines" \
     3385    IF_FEATURE_LS_SORTFILES( \
     3386     "\n    -X  Sort by extension") \
     3387    IF_FEATURE_HUMAN_READABLE( \
     3388     "\n    -h  List sizes in human readable format (1K 243M 2G)") \
     3389    IF_SELINUX( \
     3390     "\n    -k  List security context") \
     3391    IF_SELINUX( \
     3392     "\n    -K  List security context in long format") \
     3393    IF_SELINUX( \
     3394     "\n    -Z  List security context and permission") \
    19443395
    19453396#define lsattr_trivial_usage \
    1946        "[-Radlv] [files...]"
    1947 #define lsattr_full_usage \
    1948        "List file attributes on an ext2 fs" \
    1949        "\n\nOptions:\n" \
    1950        "    -R  Recursively list subdirectories\n" \
    1951        "    -a  Do not hide entries starting with .\n" \
    1952        "    -d  List directory entries instead of contents\n" \
    1953        "    -l  Print long flag names\n" \
    1954        "    -v  List the file's version/generation number"
    1955 
    1956 #define lsmod_trivial_usage \
    1957        ""
    1958 #define lsmod_full_usage \
    1959        "List the currently loaded kernel modules"
     3397       "[-Radlv] [FILE]..."
     3398#define lsattr_full_usage "\n\n" \
     3399       "List file attributes on an ext2 fs\n" \
     3400     "\nOptions:" \
     3401     "\n    -R  Recurse" \
     3402     "\n    -a  Don't hide entries starting with ." \
     3403     "\n    -d  List directory entries instead of contents" \
     3404     "\n    -l  List long flag names" \
     3405     "\n    -v  List the file's version/generation number" \
     3406
     3407#define lspci_trivial_usage \
     3408       "[-mk]"
     3409#define lspci_full_usage "\n\n" \
     3410       "List all PCI devices" \
     3411     "\n" \
     3412     "\n    -m  Parseable output" \
     3413     "\n    -k  Show driver" \
     3414
     3415#define lsusb_trivial_usage NOUSAGE_STR
     3416#define lsusb_full_usage ""
    19603417
    19613418#if ENABLE_FEATURE_MAKEDEVS_LEAF
    19623419#define makedevs_trivial_usage \
    19633420       "NAME TYPE MAJOR MINOR FIRST LAST [s]"
    1964 #define makedevs_full_usage \
    1965        "Create a range of block or character special files\n\n" \
    1966        "TYPEs include:\n" \
    1967        "    b:  Make a block (buffered) device\n" \
    1968        "    c or u: Make a character (un-buffered) device\n" \
    1969        "    p:  Make a named pipe. MAJOR and MINOR are ignored for named pipes\n" \
    1970        "\n" \
    1971        "FIRST specifies the number appended to NAME to create the first device.\n" \
    1972        "LAST specifies the number of the last item that should be created\n" \
    1973        "If 's' is the last argument, the base device is created as well.\n\n" \
    1974        "For example:\n" \
    1975        "    makedevs /dev/ttyS c 4 66 2 63   ->  ttyS2-ttyS63\n" \
    1976        "    makedevs /dev/hda b 3 0 0 8 s    ->  hda,hda1-hda8"
     3421#define makedevs_full_usage "\n\n" \
     3422       "Create a range of block or character special files" \
     3423     "\n" \
     3424     "\nTYPE is:" \
     3425     "\n    b   Block device" \
     3426     "\n    c   Character device" \
     3427     "\n    f   FIFO, MAJOR and MINOR are ignored" \
     3428     "\n" \
     3429     "\nFIRST..LAST specify numbers appended to NAME." \
     3430     "\nIf 's' is the last argument, the base device is created as well." \
     3431     "\n" \
     3432     "\nExamples:" \
     3433     "\n    makedevs /dev/ttyS c 4 66 2 63   ->  ttyS2-ttyS63" \
     3434     "\n    makedevs /dev/hda b 3 0 0 8 s    ->  hda,hda1-hda8"
    19773435#define makedevs_example_usage \
    19783436       "# makedevs /dev/ttyS c 4 66 2 63\n" \
     
    19853443#define makedevs_trivial_usage \
    19863444       "[-d device_table] rootdir"
    1987 #define makedevs_full_usage \
     3445#define makedevs_full_usage "\n\n" \
    19883446       "Create a range of special files as specified in a device table.\n" \
    19893447       "Device table entries take the form of:\n" \
    19903448       "<type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count>\n" \
    19913449       "Where name is the file name, type can be one of:\n" \
    1992        "    f   A regular file\n" \
     3450       "    f   Regular file\n" \
    19933451       "    d   Directory\n" \
    1994        "    c   Character special device file\n" \
    1995        "    b   Block special device file\n" \
     3452       "    c   Character device\n" \
     3453       "    b   Block device\n" \
    19963454       "    p   Fifo (named pipe)\n" \
    19973455       "uid is the user id for the target file, gid is the group id for the\n" \
     
    20163474#endif
    20173475
     3476#define makemime_trivial_usage \
     3477       "[OPTIONS] [FILE]..."
     3478#define makemime_full_usage "\n\n" \
     3479       "Create multipart MIME-encoded message from FILEs\n" \
     3480/*     "Transfer encoding is base64, disposition is inline (not attachment)\n" */ \
     3481     "\nOptions:" \
     3482     "\n    -o FILE Output. Default: stdout" \
     3483     "\n    -a HDR  Add header. Examples:" \
     3484     "\n        \"From: user@host.org\", \"Date: `date -R`\"" \
     3485     "\n    -c CT   Content type. Default: text/plain" \
     3486     "\n    -C CS   Charset. Default: " CONFIG_FEATURE_MIME_CHARSET \
     3487/*   "\n    -e ENC  Transfer encoding. Ignored. base64 is assumed" */ \
     3488     "\n" \
     3489     "\nOther options are silently ignored" \
     3490
     3491#define man_trivial_usage \
     3492       "[-aw] [MANPAGE]..."
     3493#define man_full_usage "\n\n" \
     3494       "Format and display manual page\n" \
     3495     "\nOptions:" \
     3496     "\n    -a      Display all pages" \
     3497     "\n    -w  Show page locations" \
     3498
    20183499#define matchpathcon_trivial_usage \
    20193500       "[-n] [-N] [-f file_contexts_file] [-p prefix] [-V]"
    2020 #define matchpathcon_full_usage \
    2021        "    -n  Do not display path" \
    2022        "\n  -N  Do not use translations" \
    2023        "\n  -f  Use alternate file_context file" \
    2024        "\n  -p  Use prefix to speed translations" \
    2025        "\n  -V  Verify file context on disk matches defaults"
     3501#define matchpathcon_full_usage "\n\n" \
     3502       "    -n  Don't display path" \
     3503     "\n    -N  Don't use translations" \
     3504     "\n    -f  Use alternate file_context file" \
     3505     "\n    -p  Use prefix to speed translations" \
     3506     "\n    -V  Verify file context on disk matches defaults" \
    20263507
    20273508#define md5sum_trivial_usage \
    2028        "[OPTION] [FILEs...]" \
    2029     USE_FEATURE_MD5_SHA1_SUM_CHECK("\n   or: md5sum [OPTION] -c [FILE]")
    2030 #define md5sum_full_usage \
    2031        "Print" USE_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " MD5 checksums" \
    2032        "\n\nOptions:\n" \
    2033        "With no FILE, or when FILE is -, read standard input." \
    2034     USE_FEATURE_MD5_SHA1_SUM_CHECK("\n\n" \
    2035        "    -c  Check MD5 sums against given list\n" \
    2036        "\nThe following two options are useful only when verifying checksums:\n" \
    2037        "    -s  Don't output anything, status code shows success\n" \
    2038        "    -w  Warn about improperly formatted MD5 checksum lines")
     3509       "[FILE]..." \
     3510    IF_FEATURE_MD5_SHA1_SUM_CHECK("\n   or: md5sum -c [-sw] [FILE]")
     3511#define md5sum_full_usage "\n\n" \
     3512       "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " MD5 checksums" \
     3513    IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" \
     3514     "\nOptions:" \
     3515     "\n    -c  Check sums against given list" \
     3516     "\n    -s  Don't output anything, status code shows success" \
     3517     "\n    -w  Warn about improperly formatted checksum lines" \
     3518    )
     3519
    20393520#define md5sum_example_usage \
    20403521       "$ md5sum < busybox\n" \
     
    20473528       "^D\n"
    20483529
     3530#define sha1sum_trivial_usage \
     3531       "[FILE]..." \
     3532    IF_FEATURE_MD5_SHA1_SUM_CHECK("\n   or: sha1sum -c [-sw] [FILE]")
     3533#define sha1sum_full_usage "\n\n" \
     3534       "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA1 checksums" \
     3535    IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" \
     3536     "\nOptions:" \
     3537     "\n    -c  Check sums against given list" \
     3538     "\n    -s  Don't output anything, status code shows success" \
     3539     "\n    -w  Warn about improperly formatted checksum lines" \
     3540    )
     3541
     3542#define sha256sum_trivial_usage \
     3543       "[FILE]..." \
     3544    IF_FEATURE_MD5_SHA1_SUM_CHECK("\n   or: sha256sum -c [-sw] [FILE]")
     3545#define sha256sum_full_usage "\n\n" \
     3546       "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA256 checksums" \
     3547    IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" \
     3548     "\nOptions:" \
     3549     "\n    -c  Check sums against given list" \
     3550     "\n    -s  Don't output anything, status code shows success" \
     3551     "\n    -w  Warn about improperly formatted checksum lines" \
     3552    )
     3553
     3554#define sha512sum_trivial_usage \
     3555       "[FILE]..." \
     3556    IF_FEATURE_MD5_SHA1_SUM_CHECK("\n   or: sha512sum -c [-sw] [FILE]")
     3557#define sha512sum_full_usage "\n\n" \
     3558       "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA512 checksums" \
     3559    IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" \
     3560     "\nOptions:" \
     3561     "\n    -c  Check sums against given list" \
     3562     "\n    -s  Don't output anything, status code shows success" \
     3563     "\n    -w  Warn about improperly formatted checksum lines" \
     3564    )
     3565
    20493566#define mdev_trivial_usage \
    20503567       "[-s]"
    2051 #define mdev_full_usage \
    2052        "    -s  Scan /sys and populate /dev during system boot\n\n" \
    2053        "Called with no options (via hotplug) it uses environment variables\n" \
    2054        "to determine which device to add/remove."
     3568#define mdev_full_usage "\n\n" \
     3569       "    -s  Scan /sys and populate /dev during system boot\n" \
     3570       "\n" \
     3571       "It can be run by kernel as a hotplug helper. To activate it:\n" \
     3572       " echo /sbin/mdev > /proc/sys/kernel/hotplug\n" \
     3573    IF_FEATURE_MDEV_CONF( \
     3574       "It uses /etc/mdev.conf with lines\n" \
     3575       "[-]DEVNAME UID:GID PERM" \
     3576            IF_FEATURE_MDEV_RENAME(" [>|=PATH]") \
     3577            IF_FEATURE_MDEV_EXEC(" [@|$|*PROG]") \
     3578    ) \
     3579
    20553580#define mdev_notes_usage "" \
    2056     USE_FEATURE_MDEV_CONFIG( \
     3581    IF_FEATURE_MDEV_CONFIG( \
    20573582       "The mdev config file contains lines that look like:\n" \
    20583583       "  hd[a-z][0-9]* 0:3 660\n\n" \
    20593584       "That's device name (with regex match), uid:gid, and permissions.\n\n" \
    2060     USE_FEATURE_MDEV_EXEC( \
     3585    IF_FEATURE_MDEV_EXEC( \
    20613586       "Optionally, that can be followed (on the same line) by a special character\n" \
    20623587       "and a command line to run after creating/before deleting the corresponding\n" \
     
    20683593       "the /dev directory, and use system() which calls /bin/sh.\n\n" \
    20693594    ) \
    2070        "Config file parsing stops on the first matching line. If no config\n"\
    2071        "entry is matched, devices are created with default 0:0 660. (Make\n"\
     3595       "Config file parsing stops on the first matching line. If no config\n" \
     3596       "entry is matched, devices are created with default 0:0 660. (Make\n" \
    20723597       "the last line match .* to override this.)\n\n" \
    20733598    )
    20743599
    2075 #define mesg_trivial_usage \
    2076        "[y|n]"
    2077 #define mesg_full_usage \
    2078        "Control write access to your terminal\n" \
    2079        "    y   Allow write access to your terminal\n" \
    2080        "    n   Disallow write access to your terminal"
     3600#define microcom_trivial_usage \
     3601       "[-d DELAY] [-t TIMEOUT] [-s SPEED] [-X] TTY"
     3602#define microcom_full_usage "\n\n" \
     3603       "Copy bytes for stdin to TTY and from TTY to stdout\n" \
     3604     "\nOptions:" \
     3605     "\n    -d  Wait up to DELAY ms for TTY output before sending every" \
     3606     "\n        next byte to it" \
     3607     "\n    -t  Exit if both stdin and TTY are silent for TIMEOUT ms" \
     3608     "\n    -s  Set serial line to SPEED" \
     3609     "\n    -X  Disable special meaning of NUL and Ctrl-X from stdin" \
    20813610
    20823611#define mkdir_trivial_usage \
    2083        "[OPTION] DIRECTORY..."
    2084 #define mkdir_full_usage \
    2085        "Create the DIRECTORY(ies) if they do not already exist" \
    2086        "\n\nOptions:\n" \
    2087        "    -m  Set permission mode (as in chmod), not rwxrwxrwx - umask\n" \
    2088        "    -p  No error if existing, make parent directories as needed" \
    2089     USE_SELINUX( \
    2090        "\n  -Z  Set security context" \
     3612       "[OPTIONS] DIRECTORY..."
     3613#define mkdir_full_usage "\n\n" \
     3614       "Create DIRECTORY\n" \
     3615     "\nOptions:" \
     3616     "\n    -m MODE Mode" \
     3617     "\n    -p  No error if exists; make parent directories as needed" \
     3618    IF_SELINUX( \
     3619     "\n    -Z  Set security context" \
    20913620    )
    20923621
     
    20993628       "$ mkdir -p /tmp/foo/bar/baz\n"
    21003629
    2101 #define mke2fs_trivial_usage \
    2102        "[-c|-l filename] [-b block-size] [-f fragment-size] [-g blocks-per-group] " \
    2103        "[-i bytes-per-inode] [-j] [-J journal-options] [-N number-of-inodes] [-n] " \
    2104        "[-m reserved-blocks-percentage] [-o creator-os] [-O feature[,...]] [-q] " \
    2105        "[r fs-revision-level] [-E extended-options] [-v] [-F] [-L volume-label] " \
    2106        "[-M last-mounted-directory] [-S] [-T filesystem-type] " \
    2107        "device [blocks-count]"
    2108 #define mke2fs_full_usage \
    2109        "    -b size     Block size in bytes\n" \
    2110        "    -c      Check for bad blocks before creating\n" \
    2111        "    -E opts     Set extended options\n" \
    2112        "    -f size     Fragment size in bytes\n" \
    2113        "    -F      Force (ignore sanity checks)\n" \
    2114        "    -g num      Number of blocks in a block group\n" \
    2115        "    -i ratio    The bytes/inode ratio\n" \
    2116        "    -j      Create a journal (ext3)\n" \
    2117        "    -J opts     Set journal options (size/device)\n" \
    2118        "    -l file     Read bad blocks list from file\n" \
    2119        "    -L lbl      Set the volume label\n" \
    2120        "    -m percent  Percent of fs blocks to reserve for admin\n" \
    2121        "    -M dir      Set last mounted directory\n" \
    2122        "    -n      Do not actually create anything\n" \
    2123        "    -N num      Number of inodes to create\n" \
    2124        "    -o os       Set the 'creator os' field\n" \
    2125        "    -O features Dir_index/filetype/has_journal/journal_dev/sparse_super\n" \
    2126        "    -q      Quiet\n" \
    2127        "    -r rev      Set filesystem revision\n" \
    2128        "    -S      Write superblock and group descriptors only\n" \
    2129        "    -T fs-type  Set usage type (news/largefile/largefile4)\n" \
    2130        "    -v      Verbose"
    2131 
    21323630#define mkfifo_trivial_usage \
    2133        "[OPTIONS] name"
    2134 #define mkfifo_full_usage \
    2135        "Create a named pipe (identical to 'mknod name p')" \
    2136        "\n\nOptions:\n" \
    2137        "    -m  Create the pipe using the specified mode (default a=rw)" \
    2138     USE_SELINUX( \
    2139        "\n  -Z  Set security context" \
     3631       "[-m MODE] " IF_SELINUX("[-Z] ") "NAME"
     3632#define mkfifo_full_usage "\n\n" \
     3633       "Create named pipe\n" \
     3634     "\nOptions:" \
     3635     "\n    -m MODE Mode (default a=rw)" \
     3636    IF_SELINUX( \
     3637     "\n    -Z  Set security context" \
    21403638    )
    21413639
     3640#define mkfs_ext2_trivial_usage \
     3641       "[-Fn] " \
     3642       /* "[-c|-l filename] " */ \
     3643       "[-b BLK_SIZE] " \
     3644       /* "[-f fragment-size] [-g blocks-per-group] " */ \
     3645       "[-i INODE_RATIO] [-I INODE_SIZE] " \
     3646       /* "[-j] [-J journal-options] [-N number-of-inodes] " */ \
     3647       "[-m RESERVED_PERCENT] " \
     3648       /* "[-o creator-os] [-O feature[,...]] [-q] " */ \
     3649       /* "[r fs-revision-level] [-E extended-options] [-v] [-F] " */ \
     3650       "[-L LABEL] " \
     3651       /* "[-M last-mounted-directory] [-S] [-T filesystem-type] " */ \
     3652       "BLOCKDEV [KBYTES]"
     3653#define mkfs_ext2_full_usage "\n\n" \
     3654       "    -b BLK_SIZE Block size, bytes" \
     3655/*   "\n    -c      Check device for bad blocks" */ \
     3656/*   "\n    -E opts     Set extended options" */ \
     3657/*   "\n    -f size     Fragment size in bytes" */ \
     3658     "\n    -F      Force" \
     3659/*   "\n    -g N        Number of blocks in a block group" */ \
     3660     "\n    -i RATIO    Max number of files is filesystem_size / RATIO" \
     3661     "\n    -I BYTES    Inode size (min 128)" \
     3662/*   "\n    -j      Create a journal (ext3)" */ \
     3663/*   "\n    -J opts     Set journal options (size/device)" */ \
     3664/*   "\n    -l file     Read bad blocks list from file" */ \
     3665     "\n    -L LBL      Volume label" \
     3666     "\n    -m PERCENT  Percent of blocks to reserve for admin" \
     3667/*   "\n    -M dir      Set last mounted directory" */ \
     3668     "\n    -n      Dry run" \
     3669/*   "\n    -N N        Number of inodes to create" */ \
     3670/*   "\n    -o os       Set the 'creator os' field" */ \
     3671/*   "\n    -O features Dir_index/filetype/has_journal/journal_dev/sparse_super" */ \
     3672/*   "\n    -q      Quiet" */ \
     3673/*   "\n    -r rev      Set filesystem revision" */ \
     3674/*   "\n    -S      Write superblock and group descriptors only" */ \
     3675/*   "\n    -T fs-type  Set usage type (news/largefile/largefile4)" */ \
     3676/*   "\n    -v      Verbose" */ \
     3677
    21423678#define mkfs_minix_trivial_usage \
    2143        "[-c | -l filename] [-nXX] [-iXX] /dev/name [blocks]"
    2144 #define mkfs_minix_full_usage \
    2145        "Make a MINIX filesystem" \
    2146        "\n\nOptions:\n" \
    2147        "    -c      Check the device for bad blocks\n" \
    2148        "    -n [14|30]  Specify the maximum length of filenames\n" \
    2149        "    -i INODES   Specify the number of inodes for the filesystem\n" \
    2150        "    -l FILENAME Read the bad blocks list from FILENAME\n" \
    2151        "    -v      Make a Minix version 2 filesystem"
     3679       "[-c | -l FILE] [-nXX] [-iXX] BLOCKDEV [KBYTES]"
     3680#define mkfs_minix_full_usage "\n\n" \
     3681       "Make a MINIX filesystem\n" \
     3682     "\nOptions:" \
     3683     "\n    -c      Check device for bad blocks" \
     3684     "\n    -n [14|30]  Maximum length of filenames" \
     3685     "\n    -i INODES   Number of inodes for the filesystem" \
     3686     "\n    -l FILE     Read bad blocks list from FILE" \
     3687     "\n    -v      Make version 2 filesystem" \
     3688
     3689#define mkfs_reiser_trivial_usage \
     3690       "[-f] [-l LABEL] BLOCKDEV [4K-BLOCKS]"
     3691
     3692#define mkfs_reiser_full_usage "\n\n" \
     3693       "Make a ReiserFS V3 filesystem\n" \
     3694     "\nOptions:" \
     3695     "\n    -f  Force" \
     3696     "\n    -l LBL  Volume label" \
     3697
     3698#define mkfs_vfat_trivial_usage \
     3699       "[-v] [-n LABEL] BLOCKDEV [KBYTES]"
     3700/* Accepted but ignored:
     3701       "[-c] [-C] [-I] [-l bad-block-file] [-b backup-boot-sector] "
     3702       "[-m boot-msg-file] [-i volume-id] "
     3703       "[-s sectors-per-cluster] [-S logical-sector-size] [-f number-of-FATs] "
     3704       "[-h hidden-sectors] [-F fat-size] [-r root-dir-entries] [-R reserved-sectors] "
     3705*/
     3706#define mkfs_vfat_full_usage "\n\n" \
     3707       "Make a FAT32 filesystem\n" \
     3708     "\nOptions:" \
     3709/*   "\n    -c  Check device for bad blocks" */ \
     3710     "\n    -v  Verbose" \
     3711/*   "\n    -I  Allow to use entire disk device (e.g. /dev/hda)" */ \
     3712     "\n    -n LBL  Volume label" \
    21523713
    21533714#define mknod_trivial_usage \
    2154        "[OPTIONS] NAME TYPE MAJOR MINOR"
    2155 #define mknod_full_usage \
    2156        "Create a special file (block, character, or pipe)" \
    2157        "\n\nOptions:\n" \
    2158        "    -m  Create the special file using the specified mode (default a=rw)" \
    2159        "\n\nTYPEs include:\n" \
    2160        "    b:  Make a block (buffered) device\n" \
    2161        "    c or u: Make a character (un-buffered) device\n" \
    2162        "    p:  Make a named pipe. MAJOR and MINOR are ignored for named pipes" \
    2163     USE_SELINUX( \
    2164        "\n  -Z  Set security context" \
    2165     )
     3715       "[-m MODE] " IF_SELINUX("[-Z] ") "NAME TYPE MAJOR MINOR"
     3716#define mknod_full_usage "\n\n" \
     3717       "Create a special file (block, character, or pipe)\n" \
     3718     "\nOptions:" \
     3719     "\n    -m MODE Creation mode (default a=rw)" \
     3720    IF_SELINUX( \
     3721     "\n    -Z  Set security context" \
     3722    ) \
     3723     "\nTYPE:" \
     3724     "\n    b   Block device" \
     3725     "\n    c or u  Character device" \
     3726     "\n    p   Named pipe (MAJOR and MINOR are ignored)" \
    21663727
    21673728#define mknod_example_usage \
     
    21703731
    21713732#define mkswap_trivial_usage \
    2172        "[-c] [-v0|-v1] device [block-count]"
    2173 #define mkswap_full_usage \
    2174        "Prepare a disk partition to be used as swap partition" \
    2175        "\n\nOptions:\n" \
    2176        "    -c      Check for read-ability\n" \
    2177        "    -v0     Make version 0 swap [max 128 Megs]\n" \
    2178        "    -v1     Make version 1 swap [big!] (default for kernels > 2.1.117)\n" \
    2179        "    block-count Number of block to use (default is entire partition)"
     3733       "[-L LBL] BLOCKDEV [KBYTES]"
     3734#define mkswap_full_usage "\n\n" \
     3735       "Prepare BLOCKDEV to be used as swap partition\n" \
     3736     "\nOptions:" \
     3737     "\n    -L LBL  Label" \
    21803738
    21813739#define mktemp_trivial_usage \
    2182        "[-dq] TEMPLATE"
    2183 #define mktemp_full_usage \
    2184        "Create a temporary file with its name based on TEMPLATE.\n" \
    2185        "TEMPLATE is any name with six 'Xs' (i.e., /tmp/temp.XXXXXX)." \
    2186        "\n\nOptions:\n" \
    2187        "    -d  Make a directory instead of a file\n" \
    2188        "    -q  Fail silently if an error occurs"
     3740       "[-dt] [-p DIR] [TEMPLATE]"
     3741#define mktemp_full_usage "\n\n" \
     3742       "Create a temporary file with name based on TEMPLATE and print its name.\n" \
     3743       "TEMPLATE must end with XXXXXX (e.g. [/dir/]nameXXXXXX).\n" \
     3744     "\nOptions:" \
     3745     "\n    -d  Make a directory instead of a file" \
     3746/*   "\n    -q  Fail silently if an error occurs" - we ignore it */ \
     3747     "\n    -t  Generate a path rooted in temporary directory" \
     3748     "\n    -p DIR  Use DIR as a temporary directory (implies -t)" \
     3749     "\n" \
     3750     "\nFor -t or -p, directory is chosen as follows:" \
     3751     "\n$TMPDIR if set, else -p DIR, else /tmp" \
     3752
    21893753#define mktemp_example_usage \
    21903754       "$ mktemp /tmp/temp.XXXXXX\n" \
     
    21933757       "-rw-------    1 andersen andersen        0 Apr 25 17:10 /tmp/temp.mWiLjM\n"
    21943758
    2195 #define modprobe_trivial_usage \
    2196        "[-knqrsv] MODULE [symbol=value ...]"
    2197 #define modprobe_full_usage \
    2198        "Options:\n" \
    2199        "    -k  Make module autoclean-able\n" \
    2200        "    -n  Just show what would be done\n" \
    2201        "    -q  Quiet\n" \
    2202        "    -r  Remove module (stacks) or do autoclean\n" \
    2203        "    -s  Report via syslog instead of stderr\n" \
    2204        "    -v  Verbose"
    2205 #define modprobe_notes_usage \
    2206 "modprobe can (un)load a stack of modules, passing each module options (when\n" \
    2207 "loading). modprobe uses a configuration file to determine what option(s) to\n" \
    2208 "pass each module it loads.\n" \
    2209 "\n" \
    2210 "The configuration file is searched (in order) amongst:\n" \
    2211 "\n" \
    2212 "    /etc/modprobe.conf (2.6 only)\n" \
    2213 "    /etc/modules.conf\n" \
    2214 "    /etc/conf.modules (deprecated)\n" \
    2215 "\n" \
    2216 "They all have the same syntax (see below). If none is present, it is\n" \
    2217 "_not_ an error; each loaded module is then expected to load without\n" \
    2218 "options. Once a file is found, the others are tested for.\n" \
    2219 "\n" \
    2220 "/etc/modules.conf entry format:\n" \
    2221 "\n" \
    2222 "  alias <alias_name> <mod_name>\n" \
    2223 "    Makes it possible to modprobe alias_name, when there is no such module.\n" \
    2224 "    It makes sense if your mod_name is long, or you want a more representative\n" \
    2225 "    name for that module (eg. 'scsi' in place of 'aha7xxx').\n" \
    2226 "    This makes it also possible to use a different set of options (below) for\n" \
    2227 "    the module and the alias.\n" \
    2228 "    A module can be aliased more than once.\n" \
    2229 "\n" \
    2230 "  options <mod_name|alias_name> <symbol=value ...>\n" \
    2231 "    When loading module mod_name (or the module aliased by alias_name), pass\n" \
    2232 "    the \"symbol=value\" pairs as option to that module.\n" \
    2233 "\n" \
    2234 "Sample /etc/modules.conf file:\n" \
    2235 "\n" \
    2236 "  options tulip irq=3\n" \
    2237 "  alias tulip tulip2\n" \
    2238 "  options tulip2 irq=4 io=0x308\n" \
    2239 "\n" \
    2240 "Other functionality offered by 'classic' modprobe is not available in\n" \
    2241 "this implementation.\n" \
    2242 "\n" \
    2243 "If module options are present both in the config file, and on the command line,\n" \
    2244 "then the options from the command line will be passed to the module _after_\n" \
    2245 "the options from the config file. That way, you can have defaults in the config\n" \
    2246 "file, and override them for a specific usage from the command line.\n"
    2247 #define modprobe_example_usage \
    2248        "(with the above /etc/modules.conf):\n\n" \
    2249        "$ modprobe tulip\n" \
    2250        "   will load the module 'tulip' with default option 'irq=3'\n\n" \
    2251        "$ modprobe tulip irq=5\n" \
    2252        "   will load the module 'tulip' with option 'irq=5', thus overriding the default\n\n" \
    2253        "$ modprobe tulip2\n" \
    2254        "   will load the module 'tulip' with default options 'irq=4 io=0x308',\n" \
    2255        "   which are the default for alias 'tulip2'\n\n" \
    2256        "$ modprobe tulip2 irq=8\n" \
    2257        "   will load the module 'tulip' with default options 'irq=4 io=0x308 irq=8',\n" \
    2258        "   which are the default for alias 'tulip2' overridden by the option 'irq=8'\n\n" \
    2259        "   from the command line\n\n" \
    2260        "$ modprobe tulip2 irq=2 io=0x210\n" \
    2261        "   will load the module 'tulip' with default options 'irq=4 io=0x308 irq=4 io=0x210',\n" \
    2262        "   which are the default for alias 'tulip2' overridden by the options 'irq=2 io=0x210'\n\n" \
    2263        "   from the command line\n"
    2264 
    22653759#define more_trivial_usage \
    2266        "[FILE ...]"
    2267 #define more_full_usage \
    2268        "View FILE or standard input one screenful at a time"
     3760       "[FILE]..."
     3761#define more_full_usage "\n\n" \
     3762       "View FILE (or stdin) one screenful at a time"
     3763
    22693764#define more_example_usage \
    22703765       "$ dmesg | more\n"
    22713766
    22723767#define mount_trivial_usage \
    2273        "[flags] DEVICE NODE [-o options,more-options]"
    2274 #define mount_full_usage \
    2275        "Mount a filesystem. Filesystem autodetection requires /proc be mounted." \
    2276        "\n\nOptions:\n" \
    2277        "    -a      Mount all filesystems in fstab\n" \
    2278     USE_FEATURE_MTAB_SUPPORT( \
    2279        "    -f      \"Fake\" Add entry to mount table but don't mount it\n" \
    2280        "    -n      Don't write a mount table entry\n" \
    2281     ) \
    2282        "    -o option   One of many filesystem options, listed below\n" \
    2283        "    -r      Mount the filesystem read-only\n" \
    2284        "    -t fs-type  Specify the filesystem type\n" \
    2285        "    -w      Mount for reading and writing (default)\n" \
    2286        "\n" \
    2287        "Options for use with the \"-o\" flag:\n" \
    2288     USE_FEATURE_MOUNT_LOOP( \
    2289        "    loop        Ignored (loop devices are autodetected)\n" \
    2290     ) \
    2291     USE_FEATURE_MOUNT_FLAGS( \
    2292        "    [a]sync     Writes are asynchronous / synchronous\n" \
    2293        "    [no]atime   Disable / enable updates to inode access times\n" \
    2294        "    [no]diratime    Disable / enable atime updates to directories\n" \
    2295        "    [no]dev     Allow use of special device files / disallow them\n" \
    2296        "    [no]exec    Allow use of executable files / disallow them\n" \
    2297        "    [no]suid    Allow set-user-id-root programs / disallow them\n" \
    2298        "    [r]shared   Convert [recursively] to a shared subtree\n" \
    2299        "    [r]slave    Convert [recursively] to a slave subtree\n" \
    2300        "    [r]private  Convert [recursively] to a private subtree\n" \
    2301        "    [un]bindable    Make mount point [un]able to be bind mounted\n" \
    2302        "    bind        Bind a directory to an additional location\n" \
    2303        "    move        Relocate an existing mount point\n" \
    2304     ) \
    2305        "    remount     Remount a mounted filesystem, changing its flags\n" \
    2306        "    ro/rw       Mount for read-only / read-write\n" \
    2307        "\n" \
    2308        "There are EVEN MORE flags that are specific to each filesystem\n" \
    2309        "You'll have to see the written documentation for those filesystems"
     3768       "[OPTIONS] [-o OPTS] DEVICE NODE"
     3769#define mount_full_usage "\n\n" \
     3770       "Mount a filesystem. Filesystem autodetection requires /proc.\n" \
     3771     "\nOptions:" \
     3772     "\n    -a      Mount all filesystems in fstab" \
     3773    IF_FEATURE_MOUNT_FAKE( \
     3774    IF_FEATURE_MTAB_SUPPORT( \
     3775     "\n    -f      Update /etc/mtab, but don't mount" \
     3776    ) \
     3777    IF_NOT_FEATURE_MTAB_SUPPORT( \
     3778     "\n    -f      Dry run" \
     3779    ) \
     3780    ) \
     3781    IF_FEATURE_MOUNT_HELPERS( \
     3782     "\n    -i      Don't run mount helper" \
     3783    ) \
     3784    IF_FEATURE_MTAB_SUPPORT( \
     3785     "\n    -n      Don't update /etc/mtab" \
     3786    ) \
     3787     "\n    -r      Read-only mount" \
     3788     "\n    -w      Read-write mount (default)" \
     3789     "\n    -t FSTYPE   Filesystem type" \
     3790     "\n    -O OPT      Mount only filesystems with option OPT (-a only)" \
     3791     "\n-o OPT:" \
     3792    IF_FEATURE_MOUNT_LOOP( \
     3793     "\n    loop        Ignored (loop devices are autodetected)" \
     3794    ) \
     3795    IF_FEATURE_MOUNT_FLAGS( \
     3796     "\n    [a]sync     Writes are [a]synchronous" \
     3797     "\n    [no]atime   Disable/enable updates to inode access times" \
     3798     "\n    [no]diratime    Disable/enable atime updates to directories" \
     3799     "\n    [no]relatime    Disable/enable atime updates relative to modification time" \
     3800     "\n    [no]dev     (Dis)allow use of special device files" \
     3801     "\n    [no]exec    (Dis)allow use of executable files" \
     3802     "\n    [no]suid    (Dis)allow set-user-id-root programs" \
     3803     "\n    [r]shared   Convert [recursively] to a shared subtree" \
     3804     "\n    [r]slave    Convert [recursively] to a slave subtree" \
     3805     "\n    [r]private  Convert [recursively] to a private subtree" \
     3806     "\n    [un]bindable    Make mount point [un]able to be bind mounted" \
     3807     "\n    bind        Bind a file or directory to another location" \
     3808     "\n    move        Relocate an existing mount point" \
     3809    ) \
     3810     "\n    remount     Remount a mounted filesystem, changing flags" \
     3811     "\n    ro/rw       Same as -r/-w" \
     3812     "\n" \
     3813     "\nThere are filesystem-specific -o flags." \
     3814
    23103815#define mount_example_usage \
    23113816       "$ mount\n" \
     
    23203825
    23213826#define mountpoint_trivial_usage \
    2322        "[-q] <[-d] DIR | -x DEVICE>"
    2323 #define mountpoint_full_usage \
    2324        "mountpoint checks if the directory is a mountpoint" \
    2325        "\n\nOptions:\n" \
    2326        "    -q  Quiet\n" \
    2327        "    -d  Print major/minor device number of the filesystem\n" \
    2328        "    -x  Print major/minor device number of the blockdevice"
     3827       "[-q] <[-dn] DIR | -x DEVICE>"
     3828#define mountpoint_full_usage "\n\n" \
     3829       "Check if the directory is a mountpoint\n" \
     3830     "\nOptions:" \
     3831     "\n    -q  Quiet" \
     3832     "\n    -d  Print major/minor device number of the filesystem" \
     3833     "\n    -n  Print device name of the filesystem" \
     3834     "\n    -x  Print major/minor device number of the blockdevice" \
     3835
    23293836#define mountpoint_example_usage \
    23303837       "$ mountpoint /proc\n" \
     
    23353842#define mt_trivial_usage \
    23363843       "[-f device] opcode value"
    2337 #define mt_full_usage \
     3844#define mt_full_usage "\n\n" \
    23383845       "Control magnetic tape drive operation\n" \
    2339        "\nAvailable Opcodes:\n\n" \
     3846       "\n" \
     3847       "Available Opcodes:\n" \
     3848       "\n" \
    23403849       "bsf bsfm bsr bss datacompression drvbuffer eof eom erase\n" \
    23413850       "fsf fsfm fsr fss load lock mkpart nop offline ras1 ras2\n" \
    23423851       "ras3 reset retension rewind rewoffline seek setblk setdensity\n" \
    2343        "setpart tell unload unlock weof wset"
    2344 
    2345 #define mv_trivial_usage \
    2346        "[OPTION]... SOURCE DEST\n" \
    2347        "or: mv [OPTION]... SOURCE... DIRECTORY"
    2348 #define mv_full_usage \
    2349        "Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY" \
    2350        "\n\nOptions:\n" \
    2351        "    -f  Don't prompt before overwriting\n" \
    2352        "    -i  Interactive, prompt before overwrite"
    2353 #define mv_example_usage \
    2354        "$ mv /tmp/foo /bin/bar\n"
     3852       "setpart tell unload unlock weof wset" \
    23553853
    23563854#define nameif_trivial_usage \
    23573855       "[-s] [-c FILE] [{IFNAME MACADDR}]"
    2358 #define nameif_full_usage \
    2359        "Rename network interface while it in the down state" \
    2360        "\n\nOptions:\n" \
    2361        "    -c FILE     Use configuration file (default is /etc/mactab)\n" \
    2362        "    -s      Use syslog (LOCAL0 facility)\n" \
    2363        "    IFNAME MACADDR  new_interface_name interface_mac_address"
     3856#define nameif_full_usage "\n\n" \
     3857       "Rename network interface while it in the down state\n" \
     3858     "\nOptions:" \
     3859     "\n    -c FILE     Use configuration file (default: /etc/mactab)" \
     3860     "\n    -s      Use syslog (LOCAL0 facility)" \
     3861     "\n    IFNAME MACADDR  new_interface_name interface_mac_address" \
     3862
    23643863#define nameif_example_usage \
    23653864       "$ nameif -s dmz0 00:A0:C9:8C:F6:3F\n" \
     
    23673866       "$ nameif -c /etc/my_mactab_file\n" \
    23683867
    2369 #if !ENABLE_DESKTOP
    2370 
    2371 #if ENABLE_NC_SERVER || ENABLE_NC_EXTRA
    2372 #define NC_OPTIONS_STR "\n\nOptions:"
    2373 #else
    2374 #define NC_OPTIONS_STR
    2375 #endif
    2376 
    2377 #define nc_trivial_usage \
    2378     USE_NC_EXTRA("[-iN] [-wN] ")USE_NC_SERVER("[-l] [-p PORT] ") \
    2379        "["USE_NC_EXTRA("-f FILENAME|")"IPADDR PORTNUM]"USE_NC_EXTRA(" [-e COMMAND]")
    2380 #define nc_full_usage \
    2381        "Open a pipe to IP:port" USE_NC_EXTRA(" or file") \
    2382     NC_OPTIONS_STR \
    2383     USE_NC_EXTRA( \
    2384        "\n  -e  Exec rest of command line after connect" \
    2385        "\n  -i SECS Delay interval for lines sent" \
    2386        "\n  -w SECS Timeout for connect" \
    2387        "\n  -f FILE Use file (ala /dev/ttyS0) instead of network" \
    2388     ) \
    2389     USE_NC_SERVER( \
    2390        "\n  -l  Listen mode, for inbound connects" \
    2391     USE_NC_EXTRA( \
    2392        "\n      (use -l twice with -e for persistent server)") \
    2393        "\n  -p PORT Local port number" \
    2394     )
    2395 
    2396 #define nc_notes_usage "" \
    2397     USE_NC_EXTRA( \
    2398        "To use netcat as a terminal emulator on a serial port:\n\n" \
    2399        "$ stty 115200 -F /dev/ttyS0\n" \
    2400        "$ stty raw -echo -ctlecho && nc -f /dev/ttyS0\n" \
    2401     )
    2402 
    2403 #define nc_example_usage \
    2404        "$ nc foobar.somedomain.com 25\n" \
    2405        "220 foobar ESMTP Exim 3.12 #1 Sat, 15 Apr 2000 00:03:02 -0600\n" \
    2406        "help\n" \
    2407        "214-Commands supported:\n" \
    2408        "214-    HELO EHLO MAIL RCPT DATA AUTH\n" \
    2409        "214     NOOP QUIT RSET HELP\n" \
    2410        "quit\n" \
    2411        "221 foobar closing connection\n"
    2412 
    2413 #else /* DESKTOP nc - much more compatible with nc 1.10 */
    2414 
    2415 #define nc_trivial_usage \
    2416        "[-options] hostname port  - connect" \
    2417     USE_NC_SERVER("\nnc [-options] -l -p port [hostname] [port]  - listen")
    2418 #define nc_full_usage \
    2419     USE_NC_SERVER( \
    2420        "-l      Listen mode, for inbound connects\n" \
    2421     ) \
    2422        "-n      Do not do DNS resolution" \
    2423      "\n-s addr     Local address" \
    2424      "\n-p port     Local port" \
    2425      "\n-u      UDP mode" \
    2426      "\n-v      Verbose (cumulative: -vv)" \
    2427      "\n-w secs     Timeout for connects and final net reads" \
    2428     USE_NC_EXTRA( \
    2429      "\n-i sec      Delay interval for lines sent" /* ", ports scanned" */ \
    2430      "\n-o file     Hex dump of traffic" \
    2431      "\n-z      Zero-I/O mode (scanning)" \
    2432     ) \
    2433      "\n-e prog [args]  Program to exec after connect (must be last)" \
    2434 /*   "\n-r      Randomize local and remote ports" */
    2435 /*   "\n-g gateway  Source-routing hop point[s], up to 8" */
    2436 /*   "\n-G num      Source-routing pointer: 4, 8, 12, ..." */
    2437 /*   "\nport numbers can be individual or ranges: lo-hi [inclusive]" */
    2438 
    2439 #endif
    2440 
    2441 #define netstat_trivial_usage \
    2442        "[-laentuwxr"USE_FEATURE_NETSTAT_WIDE("W")"]"
    2443 #define netstat_full_usage \
    2444        "Display networking information" \
    2445      "\n\nOptions:" \
    2446      "\n    -l  Display listening server sockets" \
    2447      "\n    -a  Display all sockets (default: connected)" \
    2448      "\n    -e  Display other/more information" \
    2449      "\n    -n  Don't resolve names" \
    2450      "\n    -t  Tcp sockets" \
    2451      "\n    -u  Udp sockets" \
    2452      "\n    -w  Raw sockets" \
    2453      "\n    -x  Unix sockets" \
    2454      "\n    -r  Display routing table" \
    2455     USE_FEATURE_NETSTAT_WIDE( \
    2456      "\n    -W  Display with no column truncation" \
    2457     )
    2458 
    2459 #define nice_trivial_usage \
    2460        "[-n ADJUST] [COMMAND [ARG] ...]"
    2461 #define nice_full_usage \
    2462        "Run a program with modified scheduling priority" \
    2463        "\n\nOptions:\n" \
    2464        "    -n ADJUST   Adjust the scheduling priority by ADJUST"
    2465 
    24663868#define nmeter_trivial_usage \
    24673869       "format_string"
    2468 #define nmeter_full_usage \
     3870#define nmeter_full_usage "\n\n" \
    24693871       "Monitor system in real time\n\n" \
    24703872       "Format specifiers:\n" \
    2471        "%Nc or %[cN]    Monitor CPU. N - bar size, default 10\n" \
     3873       " %Nc or %[cN]   Monitor CPU. N - bar size, default 10\n" \
    24723874       "        (displays: S:system U:user N:niced D:iowait I:irq i:softirq)\n" \
    2473        "%[niface]   Monitor network interface 'iface'\n" \
    2474        "%m      Monitor allocated memory\n" \
    2475        "%[mf]       Monitor free memory\n" \
    2476        "%[mt]       Monitor total memory\n" \
    2477        "%s      Monitor allocated swap\n" \
    2478        "%f      Monitor number of used file descriptors\n" \
    2479        "%Ni     Monitor total/specific IRQ rate\n" \
    2480        "%x      Monitor context switch rate\n" \
    2481        "%p      Monitor forks\n" \
    2482        "%[pn]       Monitor # of processes\n" \
    2483        "%b      Monitor block io\n" \
    2484        "%Nt     Show time (with N decimal points)\n" \
    2485        "%Nd     Milliseconds between updates (default=1000)\n" \
    2486        "%r      Print <cr> instead of <lf> at EOL"
     3875       " %[niface]  Monitor network interface 'iface'\n" \
     3876       " %m     Monitor allocated memory\n" \
     3877       " %[mf]      Monitor free memory\n" \
     3878       " %[mt]      Monitor total memory\n" \
     3879       " %s     Monitor allocated swap\n" \
     3880       " %f     Monitor number of used file descriptors\n" \
     3881       " %Ni        Monitor total/specific IRQ rate\n" \
     3882       " %x     Monitor context switch rate\n" \
     3883       " %p     Monitor forks\n" \
     3884       " %[pn]      Monitor # of processes\n" \
     3885       " %b     Monitor block io\n" \
     3886       " %Nt        Show time (with N decimal points)\n" \
     3887       " %Nd        Milliseconds between updates (default:1000)\n" \
     3888       " %r     Print <cr> instead of <lf> at EOL" \
     3889
    24873890#define nmeter_example_usage \
    24883891       "nmeter '%250d%t %20c int %i bio %b mem %m forks%p'"
    24893892
    24903893#define nohup_trivial_usage \
    2491        "COMMAND [ARGS]"
    2492 #define nohup_full_usage \
    2493        "Run a command immune to hangups, with output to a non-tty"
     3894       "PROG ARGS"
     3895#define nohup_full_usage "\n\n" \
     3896       "Run PROG immune to hangups, with output to a non-tty"
    24943897#define nohup_example_usage \
    24953898       "$ nohup make &"
     
    24973900#define nslookup_trivial_usage \
    24983901       "[HOST] [SERVER]"
    2499 #define nslookup_full_usage \
     3902#define nslookup_full_usage "\n\n" \
    25003903       "Query the nameserver for the IP address of the given HOST\n" \
    25013904       "optionally using a specified DNS server"
     
    25083911       "Address:    127.0.0.1\n"
    25093912
     3913#define ntpd_trivial_usage \
     3914    "[-dnqNw"IF_FEATURE_NTPD_SERVER("l")"] [-S PROG] [-p PEER]..."
     3915#define ntpd_full_usage "\n\n" \
     3916       "NTP client/server\n" \
     3917     "\nOptions:" \
     3918     "\n    -d  Verbose" \
     3919     "\n    -n  Do not daemonize" \
     3920     "\n    -q  Quit after clock is set" \
     3921     "\n    -N  Run at high priority" \
     3922     "\n    -w  Do not set time (only query peers), implies -n" \
     3923    IF_FEATURE_NTPD_SERVER( \
     3924     "\n    -l  Run as server on port 123" \
     3925    ) \
     3926     "\n    -S PROG Run PROG after stepping time, stratum change, and every 11 mins" \
     3927     "\n    -p PEER Obtain time from PEER (may be repeated)" \
     3928
    25103929#define od_trivial_usage \
    2511        "[-aBbcDdeFfHhIiLlOovXx] [FILE]"
    2512 #define od_full_usage \
     3930       "[-aBbcDdeFfHhIiLlOovXx] " IF_DESKTOP("[-t TYPE] ") "[FILE]"
     3931#define od_full_usage "\n\n" \
    25133932       "Write an unambiguous representation, octal bytes by default, of FILE\n" \
    2514        "to standard output. With no FILE, or when FILE is -, read standard input."
     3933       "(or stdin) to stdout"
    25153934
    25163935#define openvt_trivial_usage \
    2517        "VTNUM COMMAND [ARGS...]"
    2518 #define openvt_full_usage \
    2519        "Start a command on a new virtual terminal"
     3936       "[-c N] [-sw] [PROG ARGS]"
     3937#define openvt_full_usage "\n\n" \
     3938       "Start PROG on a new virtual terminal\n" \
     3939     "\nOptions:" \
     3940     "\n    -c N    Use specified VT" \
     3941     "\n    -s  Switch to the VT" \
     3942/*   "\n    -l  Run PROG as login shell (by prepending '-')" */ \
     3943     "\n    -w  Wait for PROG to exit" \
     3944
    25203945#define openvt_example_usage \
    25213946       "openvt 2 /bin/ash\n"
    25223947
     3948/*
     3949#define parse_trivial_usage \
     3950       "[-n MAXTOKENS] [-m MINTOKENS] [-d DELIMS] [-f FLAGS] FILE..."
     3951#define parse_full_usage ""
     3952*/
     3953
    25233954#define passwd_trivial_usage \
    2524        "[OPTION] [name]"
    2525 #define passwd_full_usage \
    2526        "Change a user password. If no name is specified,\n" \
    2527        "changes the password for the current user." \
    2528        "\n\nOptions:\n" \
    2529        "    -a  Define which algorithm shall be used for the password\n" \
    2530        "        (choices: des, md5)\n" /* ", sha1)" */ \
    2531        "    -d  Delete the password for the specified user account\n" \
    2532        "    -l  Locks (disables) the specified user account\n" \
    2533        "    -u  Unlocks (re-enables) the specified user account"
     3955       "[OPTIONS] [USER]"
     3956#define passwd_full_usage "\n\n" \
     3957       "Change USER's password. If no USER is specified,\n" \
     3958       "changes the password for the current user.\n" \
     3959     "\nOptions:" \
     3960     "\n    -a ALG  Algorithm to use for password (des, md5)" /* ", sha1)" */ \
     3961     "\n    -d  Delete password for the account" \
     3962     "\n    -l  Lock (disable) account" \
     3963     "\n    -u  Unlock (re-enable) account" \
    25343964
    25353965#define chpasswd_trivial_usage \
    2536        "[--md5|--encrypt]"
    2537 #define chpasswd_full_usage \
    2538        "Read user:password information from stdin\n" \
    2539        "and update /etc/passwd accordingly." \
    2540        "\n\nOptions:" \
    2541        "\n  -e, --encrypt   Supplied passwords are in encrypted form" \
    2542        "\n  -m, --md5   Use MD5 encryption instead of DES"
    2543 
    2544 #define patch_trivial_usage \
    2545        "[-p num] [-i diff]"
    2546 #define patch_full_usage \
    2547        "    -p NUM  Strip NUM leading components from file names\n" \
    2548        "    -i DIFF Read DIFF instead of stdin"
    2549 #define patch_example_usage \
    2550        "$ patch -p1 < example.diff\n" \
    2551        "$ patch -p0 -i example.diff"
     3966    IF_LONG_OPTS("[--md5|--encrypted]") IF_NOT_LONG_OPTS("[-m|-e]")
     3967#define chpasswd_full_usage "\n\n" \
     3968       "Read user:password from stdin and update /etc/passwd\n" \
     3969     "\nOptions:" \
     3970    IF_LONG_OPTS( \
     3971     "\n    -e,--encrypted  Supplied passwords are in encrypted form" \
     3972     "\n    -m,--md5    Use MD5 encryption instead of DES" \
     3973    ) \
     3974    IF_NOT_LONG_OPTS( \
     3975     "\n    -e  Supplied passwords are in encrypted form" \
     3976     "\n    -m  Use MD5 encryption instead of DES" \
     3977    )
     3978
     3979#define pgrep_trivial_usage \
     3980       "[-flnovx] [-s SID|-P PPID|PATTERN]"
     3981#define pgrep_full_usage "\n\n" \
     3982       "Display process(es) selected by regex PATTERN\n" \
     3983     "\nOptions:" \
     3984     "\n    -l  Show command name too" \
     3985     "\n    -f  Match against entire command line" \
     3986     "\n    -n  Show the newest process only" \
     3987     "\n    -o  Show the oldest process only" \
     3988     "\n    -v  Negate the match" \
     3989     "\n    -x  Match whole name (not substring)" \
     3990     "\n    -s  Match session ID (0 for current)" \
     3991     "\n    -P  Match parent process ID" \
    25523992
    25533993#if (ENABLE_FEATURE_PIDOF_SINGLE || ENABLE_FEATURE_PIDOF_OMIT)
    2554 #define USAGE_PIDOF "Options:"
     3994#define pidof_trivial_usage \
     3995       "[OPTIONS] [NAME]..."
     3996#define USAGE_PIDOF "\n\nOptions:"
    25553997#else
    2556 #define USAGE_PIDOF "\nThis version of pidof accepts no options."
     3998#define pidof_trivial_usage \
     3999       "[NAME]..."
     4000#define USAGE_PIDOF /* none */
    25574001#endif
    2558 
    2559 #define pidof_trivial_usage \
    2560        "process-name [OPTION] [process-name ...]"
    2561 
    2562 #define pidof_full_usage \
    2563        "List the PIDs of all processes with names that match the\n" \
    2564        "names on the command line\n" \
     4002#define pidof_full_usage "\n\n" \
     4003       "List PIDs of all processes with names that match NAMEs" \
    25654004    USAGE_PIDOF \
    2566     USE_FEATURE_PIDOF_SINGLE( \
    2567        "\n  -s  Display only a single PID") \
    2568     USE_FEATURE_PIDOF_OMIT( \
    2569        "\n  -o PID  Omit given pid") \
    2570     USE_FEATURE_PIDOF_OMIT( \
    2571        "\n      Use %PPID to omit the parent pid of pidof itself")
     4005    IF_FEATURE_PIDOF_SINGLE( \
     4006     "\n    -s  Show only one PID" \
     4007    ) \
     4008    IF_FEATURE_PIDOF_OMIT( \
     4009     "\n    -o PID  Omit given pid" \
     4010     "\n        Use %PPID to omit pid of pidof's parent" \
     4011    ) \
     4012
    25724013#define pidof_example_usage \
    25734014       "$ pidof init\n" \
    25744015       "1\n" \
    2575     USE_FEATURE_PIDOF_OMIT( \
     4016    IF_FEATURE_PIDOF_OMIT( \
    25764017       "$ pidof /bin/sh\n20351 5973 5950\n") \
    2577     USE_FEATURE_PIDOF_OMIT( \
     4018    IF_FEATURE_PIDOF_OMIT( \
    25784019       "$ pidof /bin/sh -o %PPID\n20351 5950")
    25794020
     
    25814022#define ping_trivial_usage \
    25824023       "host"
    2583 #define ping_full_usage \
     4024#define ping_full_usage "\n\n" \
    25844025       "Send ICMP ECHO_REQUEST packets to network hosts"
    25854026#define ping6_trivial_usage \
    25864027       "host"
    2587 #define ping6_full_usage \
     4028#define ping6_full_usage "\n\n" \
    25884029       "Send ICMP ECHO_REQUEST packets to network hosts"
    25894030#else
    25904031#define ping_trivial_usage \
    2591        "[OPTION]... host"
    2592 #define ping_full_usage \
    2593        "Send ICMP ECHO_REQUEST packets to network hosts" \
    2594        "\n\nOptions:\n" \
    2595        "    -4, -6      Force IPv4 or IPv6 hostname resolution\n" \
    2596        "    -c CNT      Send only CNT pings\n" \
    2597        "    -s SIZE     Send SIZE data bytes in packets (default=56)\n" \
    2598        "    -I iface/IP Use interface or IP address as source\n" \
    2599        "    -q      Quiet, only displays output at start\n" \
    2600        "            and when finished"
     4032       "[OPTIONS] HOST"
     4033#define ping_full_usage "\n\n" \
     4034       "Send ICMP ECHO_REQUEST packets to network hosts\n" \
     4035     "\nOptions:" \
     4036     "\n    -4,-6       Force IP or IPv6 name resolution" \
     4037     "\n    -c CNT      Send only CNT pings" \
     4038     "\n    -s SIZE     Send SIZE data bytes in packets (default:56)" \
     4039     "\n    -I IFACE/IP Use interface or IP address as source" \
     4040     "\n    -W SEC      Seconds to wait for the first response (default:10)" \
     4041     "\n            (after all -c CNT packets are sent)" \
     4042     "\n    -w SEC      Seconds until ping exits (default:infinite)" \
     4043     "\n            (can exit earlier with -c CNT)" \
     4044     "\n    -q      Quiet, only displays output at start" \
     4045     "\n            and when finished" \
     4046
    26014047#define ping6_trivial_usage \
    2602        "[OPTION]... host"
    2603 #define ping6_full_usage \
    2604        "Send ICMP ECHO_REQUEST packets to network hosts" \
    2605        "\n\nOptions:\n" \
    2606        "    -c CNT      Send only CNT pings\n" \
    2607        "    -s SIZE     Send SIZE data bytes in packets (default=56)\n" \
    2608        "    -I iface/IP Use interface or IP address as source\n" \
    2609        "    -q      Quiet, only displays output at start\n" \
    2610        "            and when finished"
     4048       "[OPTIONS] HOST"
     4049#define ping6_full_usage "\n\n" \
     4050       "Send ICMP ECHO_REQUEST packets to network hosts\n" \
     4051     "\nOptions:" \
     4052     "\n    -c CNT      Send only CNT pings" \
     4053     "\n    -s SIZE     Send SIZE data bytes in packets (default:56)" \
     4054     "\n    -I IFACE/IP Use interface or IP address as source" \
     4055     "\n    -q      Quiet, only displays output at start" \
     4056     "\n            and when finished" \
     4057
    26114058#endif
    26124059#define ping_example_usage \
     
    26274074       "round-trip min/avg/max = 20.1/20.1/20.1 ms\n"
    26284075
     4076#define pipe_progress_trivial_usage NOUSAGE_STR
     4077#define pipe_progress_full_usage ""
     4078
    26294079#define pivot_root_trivial_usage \
    26304080       "NEW_ROOT PUT_OLD"
    2631 #define pivot_root_full_usage \
     4081#define pivot_root_full_usage "\n\n" \
    26324082       "Move the current root file system to PUT_OLD and make NEW_ROOT\n" \
    26334083       "the new root file system"
    26344084
    2635 #define poweroff_trivial_usage \
    2636        "[-d delay] [-n] [-f]"
    2637 #define poweroff_full_usage \
    2638        "Halt and shut off power" \
    2639        "\n\nOptions:\n" \
    2640        "    -d  Delay interval for halting\n" \
    2641        "    -n  No call to sync()\n" \
    2642        "    -f  Force power off (don't go through init)"
     4085#define pkill_trivial_usage \
     4086       "[-l|-SIGNAL] [-fnovx] [-s SID|-P PPID|PATTERN]"
     4087#define pkill_full_usage "\n\n" \
     4088       "Send a signal to process(es) selected by regex PATTERN\n" \
     4089     "\nOptions:" \
     4090     "\n    -l  List all signals" \
     4091     "\n    -f  Match against entire command line" \
     4092     "\n    -n  Signal the newest process only" \
     4093     "\n    -o  Signal the oldest process only" \
     4094     "\n    -v  Negate the match" \
     4095     "\n    -x  Match whole name (not substring)" \
     4096     "\n    -s  Match session ID (0 for current)" \
     4097     "\n    -P  Match parent process ID" \
     4098
     4099#define popmaildir_trivial_usage \
     4100       "[OPTIONS] MAILDIR [CONN_HELPER ARGS]"
     4101#define popmaildir_full_usage "\n\n" \
     4102       "Fetch content of remote mailbox to local maildir\n" \
     4103     "\nOptions:" \
     4104/*   "\n    -b      Binary mode. Ignored" */ \
     4105/*   "\n    -d      Debug. Ignored" */ \
     4106/*   "\n    -m      Show used memory. Ignored" */ \
     4107/*   "\n    -V      Show version. Ignored" */ \
     4108/*   "\n    -c      Use tcpclient. Ignored" */ \
     4109/*   "\n    -a      Use APOP protocol. Implied. If server supports APOP -> use it" */ \
     4110     "\n    -s      Skip authorization" \
     4111     "\n    -T      Get messages with TOP instead of RETR" \
     4112     "\n    -k      Keep retrieved messages on the server" \
     4113     "\n    -t SEC      Network timeout" \
     4114    IF_FEATURE_POPMAILDIR_DELIVERY( \
     4115     "\n    -F \"PROG ARGS\"    Filter program (may be repeated)" \
     4116     "\n    -M \"PROG ARGS\"    Delivery program" \
     4117    ) \
     4118     "\n" \
     4119     "\nFetch from plain POP3 server:" \
     4120     "\npopmaildir -k DIR nc pop3.server.com 110 <user_and_pass.txt" \
     4121     "\nFetch from SSLed POP3 server and delete fetched emails:" \
     4122     "\npopmaildir DIR -- openssl s_client -quiet -connect pop3.server.com:995 <user_and_pass.txt"
     4123/*   "\n    -R BYTES    Remove old messages on the server >= BYTES. Ignored" */
     4124/*   "\n    -Z N1-N2    Remove messages from N1 to N2 (dangerous). Ignored" */
     4125/*   "\n    -L BYTES    Don't retrieve new messages >= BYTES. Ignored" */
     4126/*   "\n    -H LINES    Type first LINES of a message. Ignored" */
     4127#define popmaildir_example_usage \
     4128       "$ popmaildir -k ~/Maildir -- nc pop.drvv.ru 110 [<password_file]\n" \
     4129       "$ popmaildir ~/Maildir -- openssl s_client -quiet -connect pop.gmail.com:995 [<password_file]\n"
    26434130
    26444131#define printenv_trivial_usage \
    2645        "[VARIABLES...]"
    2646 #define printenv_full_usage \
    2647        "Print all or part of environment.\n" \
    2648        "If no environment VARIABLE specified, print them all."
     4132       "[VARIABLE]..."
     4133#define printenv_full_usage "\n\n" \
     4134       "Print environment VARIABLEs.\n" \
     4135       "If no VARIABLE specified, print all."
    26494136
    26504137#define printf_trivial_usage \
    2651        "FORMAT [ARGUMENT...]"
    2652 #define printf_full_usage \
     4138       "FORMAT [ARGUMENT]..."
     4139#define printf_full_usage "\n\n" \
    26534140       "Format and print ARGUMENT(s) according to FORMAT,\n" \
    26544141       "where FORMAT controls the output exactly as in C printf"
     
    26614148
    26624149#define ps_trivial_usage \
    2663        ""
    2664 #define ps_full_usage \
    2665        "Report process status" \
    2666        "\n\nOptions:" \
    2667        "\n  -o col1,col2=header Select columns for display" \
     4150       "[-o COL1,COL2=HEADER]" IF_FEATURE_SHOW_THREADS(" [-T]")
     4151#define ps_full_usage "\n\n" \
     4152       "Show list of processes\n" \
     4153     "\nOptions:" \
     4154     "\n    -o COL1,COL2=HEADER Select columns for display" \
     4155    IF_FEATURE_SHOW_THREADS( \
     4156     "\n    -T          Show threads" \
     4157    )
    26684158
    26694159#else /* !ENABLE_DESKTOP */
    26704160
    2671 #if !defined CONFIG_SELINUX && !ENABLE_FEATURE_PS_WIDE
     4161#if !ENABLE_SELINUX && !ENABLE_FEATURE_PS_WIDE
    26724162#define USAGE_PS "\nThis version of ps accepts no options"
    26734163#else
     
    26774167#define ps_trivial_usage \
    26784168       ""
    2679 #define ps_full_usage \
    2680        "Report process status\n" \
     4169#define ps_full_usage "\n\n" \
     4170       "Show list of processes\n" \
    26814171    USAGE_PS \
    2682     USE_SELINUX( \
    2683        "\n  -Z  Show SE Linux context") \
    2684     USE_FEATURE_PS_WIDE( \
    2685        "\n  w   Wide output")
     4172    IF_SELINUX( \
     4173     "\n    -Z  Show selinux context" \
     4174    ) \
     4175    IF_FEATURE_PS_WIDE( \
     4176     "\n    w   Wide output" \
     4177    )
    26864178
    26874179#endif /* ENABLE_DESKTOP */
     
    26984190       "  743 andersen andersen S -bash\n" \
    26994191       "  745 root     root     S [getty]\n" \
    2700        " 2990 andersen andersen R ps\n"
     4192       " 2990 andersen andersen R ps\n" \
    27014193
    27024194#define pscan_trivial_usage \
    2703        "[-p MIN_PORT] [-P MAX_PORT] [-t TIMEOUT] [-T MIN_RTT] HOST"
    2704 #define pscan_full_usage \
    2705        "Scan a host, print all open ports" \
    2706        "\n\nOptions:" \
     4195       "[-cb] [-p MIN_PORT] [-P MAX_PORT] [-t TIMEOUT] [-T MIN_RTT] HOST"
     4196#define pscan_full_usage "\n\n" \
     4197       "Scan a host, print all open ports\n" \
     4198     "\nOptions:" \
     4199     "\n    -c  Show closed ports too" \
     4200     "\n    -b  Show blocked ports too" \
    27074201     "\n    -p  Scan from this port (default 1)" \
    27084202     "\n    -P  Scan up to this port (default 1024)" \
     
    27124206#define pwd_trivial_usage \
    27134207       ""
    2714 #define pwd_full_usage \
     4208#define pwd_full_usage "\n\n" \
    27154209       "Print the full filename of the current working directory"
    27164210#define pwd_example_usage \
     
    27204214#define raidautorun_trivial_usage \
    27214215       "DEVICE"
    2722 #define raidautorun_full_usage \
     4216#define raidautorun_full_usage "\n\n" \
    27234217       "Tell the kernel to automatically search and start RAID arrays"
    27244218#define raidautorun_example_usage \
     
    27274221#define rdate_trivial_usage \
    27284222       "[-sp] HOST"
    2729 #define rdate_full_usage \
    2730        "Get and possibly set the system date and time from a remote HOST" \
    2731        "\n\nOptions:\n" \
    2732        "    -s  Set the system date and time (default)\n" \
    2733        "    -p  Print the date and time"
     4223#define rdate_full_usage "\n\n" \
     4224       "Get and possibly set the system date and time from a remote HOST\n" \
     4225     "\nOptions:" \
     4226     "\n    -s  Set the system date and time (default)" \
     4227     "\n    -p  Print the date and time" \
     4228
     4229#define rdev_trivial_usage \
     4230       ""
     4231#define rdev_full_usage "\n\n" \
     4232       "Print the device node associated with the filesystem mounted at '/'"
     4233#define rdev_example_usage \
     4234       "$ rdev\n" \
     4235       "/dev/mtdblock9 /\n"
    27344236
    27354237#define readahead_trivial_usage \
    27364238       "[FILE]..."
    2737 #define readahead_full_usage \
    2738        "Preload FILE(s) in RAM cache so that subsequent reads for those" \
    2739        "files do not block on disk I/O"
     4239#define readahead_full_usage "\n\n" \
     4240       "Preload FILEs to RAM"
    27404241
    27414242#define readlink_trivial_usage \
    2742     USE_FEATURE_READLINK_FOLLOW("[-f] ") "FILE"
    2743 #define readlink_full_usage \
     4243    IF_FEATURE_READLINK_FOLLOW("[-fnv] ") "FILE"
     4244#define readlink_full_usage "\n\n" \
    27444245       "Display the value of a symlink" \
    2745     USE_FEATURE_READLINK_FOLLOW( \
    2746        "\n\nOptions:\n" \
    2747        "    -f  Canonicalize by following all symlinks")
     4246    IF_FEATURE_READLINK_FOLLOW( "\n" \
     4247     "\nOptions:" \
     4248     "\n    -f  Canonicalize by following all symlinks" \
     4249     "\n    -n  Don't add newline" \
     4250     "\n    -v  Verbose" \
     4251    ) \
    27484252
    27494253#define readprofile_trivial_usage \
    2750        "[OPTIONS]..."
    2751 #define readprofile_full_usage \
    2752        "Options:\n" \
    2753        "    -m mapfile  (Default: /boot/System.map)\n" \
    2754        "    -p profile  (Default: /proc/profile)\n" \
    2755        "    -M mult     Set the profiling multiplier to mult\n" \
    2756        "    -i      Print only info about the sampling step\n" \
    2757        "    -v      Verbose\n" \
    2758        "    -a      Print all symbols, even if count is 0\n" \
    2759        "    -b      Print individual histogram-bin counts\n" \
    2760        "    -s      Print individual counters within functions\n" \
    2761        "    -r      Reset all the counters (root only)\n" \
    2762        "    -n      Disable byte order auto-detection"
     4254       "[OPTIONS]"
     4255#define readprofile_full_usage "\n\n" \
     4256       "Options:" \
     4257     "\n    -m mapfile  (Default: /boot/System.map)" \
     4258     "\n    -p profile  (Default: /proc/profile)" \
     4259     "\n    -M NUM      Set the profiling multiplier to NUM" \
     4260     "\n    -i      Print only info about the sampling step" \
     4261     "\n    -v      Verbose" \
     4262     "\n    -a      Print all symbols, even if count is 0" \
     4263     "\n    -b      Print individual histogram-bin counts" \
     4264     "\n    -s      Print individual counters within functions" \
     4265     "\n    -r      Reset all the counters (root only)" \
     4266     "\n    -n      Disable byte order auto-detection" \
    27634267
    27644268#define realpath_trivial_usage \
    2765        "pathname ..."
    2766 #define realpath_full_usage \
    2767        "Return the absolute pathnames of given argument"
    2768 
    2769 #define reboot_trivial_usage \
    2770        "[-d delay] [-n] [-f]"
    2771 #define reboot_full_usage \
    2772        "Reboot the system" \
    2773        "\n\nOptions:\n" \
    2774        "    -d  Delay interval for rebooting\n" \
    2775        "    -n  No call to sync()\n" \
    2776        "    -f  Force reboot (don't go through init)"
    2777 
    2778 #define renice_trivial_usage \
    2779        "{{-n INCREMENT} | PRIORITY} [[-p | -g | -u] ID ...]"
    2780 #define renice_full_usage \
    2781        "Change priority of running processes" \
    2782        "\n\nOptions:\n" \
    2783        "    -n  Adjusts current nice value (smaller is faster)\n" \
    2784        "    -p  Process id(s) (default)\n" \
    2785        "    -g  Process group id(s)\n" \
    2786        "    -u  Process user name(s) and/or id(s)"
     4269       "FILE..."
     4270#define realpath_full_usage "\n\n" \
     4271       "Return the absolute pathnames of given FILE"
     4272
     4273#define reformime_trivial_usage \
     4274       "[OPTIONS] [FILE]..."
     4275#define reformime_full_usage "\n\n" \
     4276       "Parse MIME-encoded message\n" \
     4277     "\nOptions:" \
     4278     "\n    -x PREFIX   Extract content of MIME sections to files" \
     4279     "\n    -X PROG ARGS    Filter content of MIME sections through PROG" \
     4280     "\n            Must be the last option" \
     4281     "\n" \
     4282     "\nOther options are silently ignored" \
     4283
     4284#define scriptreplay_trivial_usage \
     4285       "timingfile [typescript [divisor]]"
     4286#define scriptreplay_full_usage "\n\n" \
     4287       "Play back typescripts, using timing information"
    27874288
    27884289#define reset_trivial_usage \
    27894290       ""
    2790 #define reset_full_usage \
     4291#define reset_full_usage "\n\n" \
    27914292       "Reset the screen"
    27924293
    27934294#define resize_trivial_usage \
    27944295       ""
    2795 #define resize_full_usage \
     4296#define resize_full_usage "\n\n" \
    27964297       "Resize the screen"
    27974298
    27984299#define restorecon_trivial_usage \
    2799        "[-iFnrRv] [-e excludedir]... [-o filename] [-f filename | pathname]"
    2800 #define restorecon_full_usage \
     4300       "[-iFnRv] [-e EXCLUDEDIR]... [-o FILE] [-f FILE]"
     4301#define restorecon_full_usage "\n\n" \
    28014302       "Reset security contexts of files in pathname\n" \
    2802        "\n  -i      Ignore files that do not exist" \
    2803        "\n  -f filename File with list of files to process. Use - for stdin" \
    2804        "\n  -e directory    Directory to exclude" \
    2805        "\n  -R,-r       Recurse directories" \
    2806        "\n  -n      Don't change any file labels" \
    2807        "\n  -o filename Save list of files with incorrect context" \
    2808        "\n  -v      Verbose" \
    2809        "\n  -vv     Show changed labels" \
    2810        "\n  -F      Force reset of context to match file_context" \
    2811        "\n          for customizable files, or the user section," \
    2812        "\n          if it has changed"
     4303     "\n    -i  Ignore files that don't exist" \
     4304     "\n    -f FILE File with list of files to process" \
     4305     "\n    -e DIR  Directory to exclude" \
     4306     "\n    -R,-r   Recurse" \
     4307     "\n    -n  Don't change any file labels" \
     4308     "\n    -o FILE Save list of files with incorrect context" \
     4309     "\n    -v  Verbose" \
     4310     "\n    -vv Show changed labels" \
     4311     "\n    -F  Force reset of context to match file_context" \
     4312     "\n        for customizable files, or the user section," \
     4313     "\n        if it has changed" \
     4314
     4315#define rfkill_trivial_usage \
     4316       "COMMAND [INDEX|TYPE]"
     4317#define rfkill_full_usage "\n\n" \
     4318       "Enable/disable wireless devices\n" \
     4319       "\nCommands:" \
     4320     "\n    list [INDEX|TYPE]   List current state" \
     4321     "\n    block INDEX|TYPE    Disable device" \
     4322     "\n    unblock INDEX|TYPE  Enable device" \
     4323     "\n" \
     4324     "\n    TYPE: all, wlan(wifi), bluetooth, uwb(ultrawideband)," \
     4325     "\n        wimax, wwan, gps, fm" \
    28134326
    28144327#define rm_trivial_usage \
    2815        "[OPTION]... FILE..."
    2816 #define rm_full_usage \
    2817        "Remove (unlink) the FILE(s). You may use '--' to\n" \
    2818        "indicate that all following arguments are non-options." \
    2819        "\n\nOptions:\n" \
    2820        "    -i  Always prompt before removing each destination\n" \
    2821        "    -f  Remove existing destinations, never prompt\n" \
    2822        "    -r,-R   Remove the contents of directories recursively"
     4328       "[-irf] FILE..."
     4329#define rm_full_usage "\n\n" \
     4330       "Remove (unlink) FILEs\n" \
     4331     "\nOptions:" \
     4332     "\n    -i  Always prompt before removing" \
     4333     "\n    -f  Never prompt" \
     4334     "\n    -R,-r   Recurse" \
     4335
    28234336#define rm_example_usage \
    28244337       "$ rm -rf /tmp/foo\n"
    28254338
    28264339#define rmdir_trivial_usage \
    2827        "[OPTION]... DIRECTORY..."
    2828 #define rmdir_full_usage \
    2829        "Remove the DIRECTORY, if it is empty"
     4340       "[OPTIONS] DIRECTORY..."
     4341#define rmdir_full_usage "\n\n" \
     4342       "Remove DIRECTORY if it is empty\n" \
     4343     "\nOptions:" \
     4344    IF_FEATURE_RMDIR_LONG_OPTIONS( \
     4345     "\n    -p|--parents    Include parents" \
     4346     "\n    --ignore-fail-on-non-empty" \
     4347    ) \
     4348    IF_NOT_FEATURE_RMDIR_LONG_OPTIONS( \
     4349     "\n    -p  Include parents" \
     4350    )
     4351
    28304352#define rmdir_example_usage \
    28314353       "# rmdir /tmp/foo\n"
    28324354
    2833 #define rmmod_trivial_usage \
    2834        "[OPTION]... [MODULE]..."
    2835 #define rmmod_full_usage \
    2836        "Unload the specified kernel modules from the kernel" \
    2837        "\n\nOptions:\n" \
    2838        "    -a  Remove all unused modules (recursively)"
    2839 #define rmmod_example_usage \
    2840        "$ rmmod tulip\n"
    2841 
    28424355#define route_trivial_usage \
    28434356       "[{add|del|delete}]"
    2844 #define route_full_usage \
    2845        "Edit the kernel's routing tables" \
    2846        "\n\nOptions:\n" \
    2847        "    -n  Dont resolve names\n" \
    2848        "    -e  Display other/more information\n" \
    2849        "    -A inet" USE_FEATURE_IPV6("{6}") "  Select address family"
     4357#define route_full_usage "\n\n" \
     4358       "Edit kernel routing tables\n" \
     4359     "\nOptions:" \
     4360     "\n    -n  Don't resolve names" \
     4361     "\n    -e  Display other/more information" \
     4362     "\n    -A inet" IF_FEATURE_IPV6("{6}") "   Select address family" \
    28504363
    28514364#define rpm_trivial_usage \
    2852        "-i -q[ildc]p package.rpm"
    2853 #define rpm_full_usage \
    2854        "Manipulate RPM packages" \
    2855        "\n\nOptions:" \
    2856        "\n  -i  Install package" \
    2857        "\n  -q  Query package" \
    2858        "\n  -p  Query uninstalled package" \
    2859        "\n  -i  Show information" \
    2860        "\n  -l  List contents" \
    2861        "\n  -d  List documents" \
    2862        "\n  -c  List config files"
     4365       "-i PACKAGE.rpm; rpm -qp[ildc] PACKAGE.rpm"
     4366#define rpm_full_usage "\n\n" \
     4367       "Manipulate RPM packages\n" \
     4368     "\nCommands:" \
     4369     "\n    -i  Install package" \
     4370     "\n    -qp Query package" \
     4371     "\nOptions:" \
     4372     "\n    -i  Show information" \
     4373     "\n    -l  List contents" \
     4374     "\n    -d  List documents" \
     4375     "\n    -c  List config files" \
    28634376
    28644377#define rpm2cpio_trivial_usage \
    28654378       "package.rpm"
    2866 #define rpm2cpio_full_usage \
     4379#define rpm2cpio_full_usage "\n\n" \
    28674380       "Output a cpio archive of the rpm file"
    28684381
     4382#define rtcwake_trivial_usage \
     4383       "[-a | -l | -u] [-d DEV] [-m MODE] [-s SEC | -t TIME]"
     4384#define rtcwake_full_usage "\n\n" \
     4385       "Enter a system sleep state until specified wakeup time\n" \
     4386    IF_LONG_OPTS( \
     4387     "\n    -a,--auto   Read clock mode from adjtime" \
     4388     "\n    -l,--local  Clock is set to local time" \
     4389     "\n    -u,--utc    Clock is set to UTC time" \
     4390     "\n    -d,--device=DEV Specify the RTC device" \
     4391     "\n    -m,--mode=MODE  Set the sleep state (default: standby)" \
     4392     "\n    -s,--seconds=SEC Set the timeout in SEC seconds from now" \
     4393     "\n    -t,--time=TIME  Set the timeout to TIME seconds from epoch" \
     4394    ) \
     4395    IF_NOT_LONG_OPTS( \
     4396     "\n    -a  Read clock mode from adjtime" \
     4397     "\n    -l  Clock is set to local time" \
     4398     "\n    -u  Clock is set to UTC time" \
     4399     "\n    -d DEV  Specify the RTC device" \
     4400     "\n    -m MODE Set the sleep state (default: standby)" \
     4401     "\n    -s SEC  Set the timeout in SEC seconds from now" \
     4402     "\n    -t TIME Set the timeout to TIME seconds from epoch" \
     4403    )
     4404
    28694405#define runcon_trivial_usage \
    2870        "[-c] [-u USER] [-r ROLE] [-t TYPE] [-l RANGE] COMMAND [args]\n" \
    2871        "    runcon CONTEXT COMMAND [args]"
    2872 #define runcon_full_usage \
    2873        "runcon [-c] [-u USER] [-r ROLE] [-t TYPE] [-l RANGE] COMMAND [args]\n" \
    2874        "runcon CONTEXT COMMAND [args]\n" \
    2875        "Run a program in a different security context\n\n" \
    2876        "    CONTEXT     Complete security context\n" \
    2877        "    -c, --compute   Compute process transition context before modifying\n" \
    2878        "    -t, --type=TYPE Type (for same role as parent)\n" \
    2879        "    -u, --user=USER User identity\n" \
    2880        "    -r, --role=ROLE Role\n" \
    2881        "    -l, --range=RNG Levelrange" \
     4406       "[-c] [-u USER] [-r ROLE] [-t TYPE] [-l RANGE] PROG ARGS\n" \
     4407       "runcon CONTEXT PROG ARGS"
     4408#define runcon_full_usage "\n\n" \
     4409       "Run PROG in a different security context\n" \
     4410     "\n    CONTEXT     Complete security context\n" \
     4411    IF_FEATURE_RUNCON_LONG_OPTIONS( \
     4412     "\n    -c,--compute    Compute process transition context before modifying" \
     4413     "\n    -t,--type=TYPE  Type (for same role as parent)" \
     4414     "\n    -u,--user=USER  User identity" \
     4415     "\n    -r,--role=ROLE  Role" \
     4416     "\n    -l,--range=RNG  Levelrange" \
     4417    ) \
     4418    IF_NOT_FEATURE_RUNCON_LONG_OPTIONS( \
     4419     "\n    -c  Compute process transition context before modifying" \
     4420     "\n    -t TYPE Type (for same role as parent)" \
     4421     "\n    -u USER User identity" \
     4422     "\n    -r ROLE Role" \
     4423     "\n    -l RNG  Levelrange" \
     4424    )
    28824425
    28834426#define run_parts_trivial_usage \
    2884        "[-t] "USE_FEATURE_RUN_PARTS_FANCY("[-l] ")"[-a ARG] [-u MASK] DIRECTORY"
    2885 #define run_parts_full_usage \
    2886        "Run a bunch of scripts in a directory" \
    2887        "\n\nOptions:\n" \
    2888        "    -t  Prints what would be run, but does not actually run anything\n" \
    2889        "    -a ARG  Pass ARG as an argument for every program invoked\n" \
    2890        "    -u MASK Set the umask to MASK before executing every program" \
    2891 USE_FEATURE_RUN_PARTS_FANCY("\n -l  Prints names of all matching files even when they are not executable")
     4427       "[-t] "IF_FEATURE_RUN_PARTS_FANCY("[-l] ")"[-a ARG] [-u MASK] DIRECTORY"
     4428#define run_parts_full_usage "\n\n" \
     4429       "Run a bunch of scripts in DIRECTORY\n" \
     4430     "\nOptions:" \
     4431     "\n    -t  Print what would be run, but don't actually run anything" \
     4432     "\n    -a ARG  Pass ARG as argument for every program" \
     4433     "\n    -u MASK Set the umask to MASK before running every program" \
     4434    IF_FEATURE_RUN_PARTS_FANCY( \
     4435     "\n    -l  Print names of all matching files even if they are not executable" \
     4436    )
    28924437
    28934438#define run_parts_example_usage \
     
    29064451
    29074452#define runlevel_trivial_usage \
    2908        "[utmp]"
    2909 #define runlevel_full_usage \
    2910        "Find the current and previous system runlevel.\n\n" \
    2911        "If no utmp file exists or if no runlevel record can be found,\n" \
     4453       "[FILE]"
     4454#define runlevel_full_usage "\n\n" \
     4455       "Find the current and previous system runlevel\n" \
     4456       "\n" \
     4457       "If no utmp FILE exists or if no runlevel record can be found,\n" \
    29124458       "print \"unknown\""
    29134459#define runlevel_example_usage \
     
    29164462
    29174463#define runsv_trivial_usage \
    2918        "dir"
    2919 #define runsv_full_usage \
     4464       "DIR"
     4465#define runsv_full_usage "\n\n" \
    29204466       "Start and monitor a service and optionally an appendant log service"
    29214467
    29224468#define runsvdir_trivial_usage \
    2923        "[-P] dir"
    2924 #define runsvdir_full_usage \
    2925        "Start a runsv process for each subdirectory"
     4469       "[-P] [-s SCRIPT] DIR"
     4470#define runsvdir_full_usage "\n\n" \
     4471       "Start a runsv process for each subdirectory. If it exits, restart it.\n" \
     4472     "\n    -P      Put each runsv in a new session" \
     4473     "\n    -s SCRIPT   Run SCRIPT <signo> after signal is processed" \
    29264474
    29274475#define rx_trivial_usage \
    29284476       "FILE"
    2929 #define rx_full_usage \
     4477#define rx_full_usage "\n\n" \
    29304478       "Receive a file using the xmodem protocol"
    29314479#define rx_example_usage \
    29324480       "$ rx /tmp/foo\n"
    29334481
     4482#define script_trivial_usage \
     4483       "[-afq" IF_SCRIPTREPLAY("t") "] [-c PROG] [OUTFILE]"
     4484#define script_full_usage "\n\n" \
     4485       "Options:" \
     4486     "\n    -a  Append output" \
     4487     "\n    -c PROG Run PROG, not shell" \
     4488     "\n    -f  Flush output after each write" \
     4489     "\n    -q  Quiet" \
     4490    IF_SCRIPTREPLAY( \
     4491     "\n    -t  Send timing to stderr" \
     4492    )
     4493
    29344494#define sed_trivial_usage \
    2935        "[-efinr] pattern [files...]"
    2936 #define sed_full_usage \
    2937        "Options:\n" \
    2938        "    -e script   Add the script to the commands to be executed\n" \
    2939        "    -f scriptfile   Add script-file contents to the\n" \
    2940        "            commands to be executed\n" \
    2941        "    -i      Edit files in-place\n" \
    2942        "    -n      Suppress automatic printing of pattern space\n" \
    2943        "    -r      Use extended regular expression syntax\n" \
    2944        "\n" \
    2945        "If no -e or -f is given, the first non-option argument is taken as the sed\n" \
    2946        "script to interpret. All remaining arguments are names of input files; if no\n" \
    2947        "input files are specified, then the standard input is read. Source files\n" \
    2948        "will not be modified unless -i option is given."
     4495       "[-efinr] SED_CMD [FILE]..."
     4496#define sed_full_usage "\n\n" \
     4497       "Options:" \
     4498     "\n    -e CMD  Add CMD to sed commands to be executed" \
     4499     "\n    -f FILE Add FILE contents to sed commands to be executed" \
     4500     "\n    -i  Edit files in-place (else sends result to stdout)" \
     4501     "\n    -n  Suppress automatic printing of pattern space" \
     4502     "\n    -r  Use extended regex syntax" \
     4503     "\n" \
     4504     "\nIf no -e or -f, the first non-option argument is the sed command string." \
     4505     "\nRemaining arguments are input files (stdin if none)."
    29494506
    29504507#define sed_example_usage \
     
    29524509       "bar\n"
    29534510
    2954 #define selinuxenabled_trivial_usage
    2955 #define selinuxenabled_full_usage
     4511#define selinuxenabled_trivial_usage NOUSAGE_STR
     4512#define selinuxenabled_full_usage ""
     4513
     4514#define sendmail_trivial_usage \
     4515       "[OPTIONS] [RECIPIENT_EMAIL]..."
     4516#define sendmail_full_usage "\n\n" \
     4517       "Read email from stdin and send it\n" \
     4518     "\nStandard options:" \
     4519     "\n    -t      Read additional recipients from message body" \
     4520     "\n    -f sender   Sender (required)" \
     4521     "\n    -o options  Various options. -oi implied, others are ignored" \
     4522     "\n    -i      -oi synonym. implied and ignored" \
     4523     "\n" \
     4524     "\nBusybox specific options:" \
     4525     "\n    -w seconds  Network timeout" \
     4526     "\n    -H 'PROG ARGS'  Run connection helper" \
     4527     "\n            Examples:" \
     4528     "\n            -H 'exec openssl s_client -quiet -tls1 -starttls smtp" \
     4529     "\n                -connect smtp.gmail.com:25' <email.txt" \
     4530     "\n                [4<username_and_passwd.txt | -au<username> -ap<password>]" \
     4531     "\n            -H 'exec openssl s_client -quiet -tls1" \
     4532     "\n                -connect smtp.gmail.com:465' <email.txt" \
     4533     "\n                [4<username_and_passwd.txt | -au<username> -ap<password>]" \
     4534     "\n    -S server[:port] Server" \
     4535     "\n    -au<username>   Username for AUTH LOGIN" \
     4536     "\n    -ap<password>   Password for AUTH LOGIN" \
     4537     "\n    -am<method> Authentication method. Ignored. LOGIN is implied" \
     4538     "\n" \
     4539     "\nOther options are silently ignored; -oi -t is implied" \
     4540    IF_MAKEMIME( \
     4541     "\nUse makemime applet to create message with attachments" \
     4542    )
    29564543
    29574544#define seq_trivial_usage \
    2958        "[first [increment]] last"
    2959 #define seq_full_usage \
    2960        "Print numbers from FIRST to LAST, in steps of INCREMENT.\n" \
    2961        "FIRST, INCREMENT default to 1" \
    2962        "\n\nArguments:\n" \
    2963        "    LAST\n" \
    2964        "    FIRST LAST\n" \
    2965        "    FIRST INCREMENT LAST"
     4545       "[-w] [-s SEP] [FIRST [INC]] LAST"
     4546#define seq_full_usage "\n\n" \
     4547       "Print numbers from FIRST to LAST, in steps of INC.\n" \
     4548       "FIRST, INC default to 1.\n" \
     4549     "\nOptions:" \
     4550     "\n    -w  Pad to last with leading zeros" \
     4551     "\n    -s SEP  String separator" \
     4552
     4553#define sestatus_trivial_usage \
     4554       "[-vb]"
     4555#define sestatus_full_usage "\n\n" \
     4556       "    -v  Verbose" \
     4557     "\n    -b  Display current state of booleans" \
    29664558
    29674559#define setconsole_trivial_usage \
    2968        "[-r|--reset] [DEVICE]"
    2969 #define setconsole_full_usage \
    2970        "Redirect system console output to DEVICE (default: /dev/tty)" \
    2971        "\n\nOptions:\n" \
    2972        "    -r  Reset output to /dev/console"
     4560       "[-r" IF_FEATURE_SETCONSOLE_LONG_OPTIONS("|--reset") "] [DEVICE]"
     4561#define setconsole_full_usage "\n\n" \
     4562       "Redirect system console output to DEVICE (default: /dev/tty)\n" \
     4563     "\nOptions:" \
     4564     "\n    -r  Reset output to /dev/console" \
    29734565
    29744566#define setenforce_trivial_usage \
    29754567       "[Enforcing | Permissive | 1 | 0]"
    2976 #define setenforce_full_usage
     4568#define setenforce_full_usage ""
    29774569
    29784570#define setfiles_trivial_usage \
    2979        "[-dnpqsvW] [-e dir]... [-o filename] [-r alt_root_path]" \
    2980     USE_FEATURE_SETFILES_CHECK_OPTION( \
     4571       "[-dnpqsvW] [-e DIR]... [-o FILE] [-r alt_root_path]" \
     4572    IF_FEATURE_SETFILES_CHECK_OPTION( \
    29814573       " [-c policyfile] spec_file" \
    29824574    ) \
    29834575       " pathname"
    2984 
    2985 #define setfiles_full_usage \
    2986        "Reset file contexts under pathname according to spec_file" \
    2987     USE_FEATURE_SETFILES_CHECK_OPTION( \
    2988        "\n  -c file Check the validity of the contexts against the specified binary policy" \
    2989     ) \
    2990        "\n  -d  Show which specification matched each file" \
    2991        "\n  -l  Log changes in file labels to syslog" \
    2992        "\n  -n  Don't change any file labels" \
    2993        "\n  -q  Suppress warnings" \
    2994        "\n  -r dir  Use an altenate root path" \
    2995        "\n  -e dir  Exclude directory" \
    2996        "\n  -F  Force reset of context to match file_context for customizable files" \
    2997        "\n  -o file Save list of files with incorrect context" \
    2998        "\n  -s  Take a list of files from standard input (instead of command line)" \
    2999        "\n  -v  Show changes in file labels, if type or role are changing" \
    3000        "\n  -vv Show changes in file labels, if type, role, or user are changing" \
    3001        "\n  -W  Display warnings about entries that had no matching files"
     4576#define setfiles_full_usage "\n\n" \
     4577       "Reset file contexts under pathname according to spec_file\n" \
     4578    IF_FEATURE_SETFILES_CHECK_OPTION( \
     4579     "\n    -c FILE Check the validity of the contexts against the specified binary policy" \
     4580    ) \
     4581     "\n    -d  Show which specification matched each file" \
     4582     "\n    -l  Log changes in file labels to syslog" \
     4583     "\n    -n  Don't change any file labels" \
     4584     "\n    -q  Suppress warnings" \
     4585     "\n    -r DIR  Use an alternate root path" \
     4586     "\n    -e DIR  Exclude DIR" \
     4587     "\n    -F  Force reset of context to match file_context for customizable files" \
     4588     "\n    -o FILE Save list of files with incorrect context" \
     4589     "\n    -s  Take a list of files from stdin (instead of command line)" \
     4590     "\n    -v  Show changes in file labels, if type or role are changing" \
     4591     "\n    -vv Show changes in file labels, if type, role, or user are changing" \
     4592     "\n    -W  Display warnings about entries that had no matching files" \
     4593
     4594#define setfont_trivial_usage \
     4595       "FONT [-m MAPFILE] [-C TTY]"
     4596#define setfont_full_usage "\n\n" \
     4597       "Load a console font\n" \
     4598     "\nOptions:" \
     4599     "\n    -m MAPFILE  Load console screen map" \
     4600     "\n    -C TTY      Affect TTY instead of /dev/tty" \
     4601
     4602#define setfont_example_usage \
     4603       "$ setfont -m koi8-r /etc/i18n/fontname\n"
    30024604
    30034605#define setkeycodes_trivial_usage \
    3004        "SCANCODE KEYCODE ..."
    3005 #define setkeycodes_full_usage \
     4606       "SCANCODE KEYCODE..."
     4607#define setkeycodes_full_usage "\n\n" \
    30064608       "Set entries into the kernel's scancode-to-keycode map,\n" \
    30074609       "allowing unusual keyboards to generate usable keycodes.\n\n" \
    30084610       "SCANCODE may be either xx or e0xx (hexadecimal),\n" \
    3009        "and KEYCODE is given in decimal"
     4611       "and KEYCODE is given in decimal." \
     4612
    30104613#define setkeycodes_example_usage \
    30114614       "$ setkeycodes e030 127\n"
     
    30134616#define setlogcons_trivial_usage \
    30144617       "N"
    3015 #define setlogcons_full_usage \
     4618#define setlogcons_full_usage "\n\n" \
    30164619       "Redirect the kernel output to console N (0 for current)"
    30174620
     4621#define setsebool_trivial_usage \
     4622       "boolean value"
     4623
     4624#define setsebool_full_usage "\n\n" \
     4625       "Change boolean setting"
     4626
    30184627#define setsid_trivial_usage \
    3019        "program [arg ...]"
    3020 #define setsid_full_usage \
    3021        "Run any program in a new session by calling setsid() before\n" \
    3022        "exec'ing the rest of its arguments. See setsid(2) for details."
    3023 
    3024 #define lash_trivial_usage \
    3025        "[FILE]...\n" \
    3026        "or: sh -c command [args]..."
    3027 #define lash_full_usage \
    3028        "The BusyBox LAme SHell (command interpreter)"
    3029 #define lash_notes_usage \
    3030        "This command does not yet have proper documentation.\n\n" \
    3031        "Use lash just as you would use any other shell. It properly handles pipes,\n" \
    3032        "redirects, job control, can be used as the shell for scripts, and has a\n" \
    3033        "sufficient set of builtins to do what is needed. It does not (yet) support\n" \
    3034        "Bourne Shell syntax. If you need things like \"if-then-else\", \"while\", and such\n" \
    3035        "use ash or bash. If you just need a very simple and extremely small shell,\n" \
    3036        "this will do the job."
     4628       "PROG ARGS"
     4629#define setsid_full_usage "\n\n" \
     4630       "Run PROG in a new session. PROG will have no controlling terminal\n" \
     4631       "and will not be affected by keyboard signals (Ctrl-C etc).\n" \
     4632       "See setsid(2) for details." \
    30374633
    30384634#define last_trivial_usage \
    3039        ""
    3040 #define last_full_usage \
    3041        "Show listing of the last users that logged into the system"
    3042 
    3043 #define sha1sum_trivial_usage \
    3044        "[OPTION] [FILEs...]" \
    3045     USE_FEATURE_MD5_SHA1_SUM_CHECK("\n   or: sha1sum [OPTION] -c [FILE]")
    3046 #define sha1sum_full_usage \
    3047        "Print" USE_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA1 checksums.\n" \
    3048        "With no FILE, or when FILE is -, read standard input." \
    3049        "\n\nOptions:\n" \
    3050     USE_FEATURE_MD5_SHA1_SUM_CHECK( \
    3051        "    -c  Check SHA1 sums against given list\n" \
    3052        "\nThe following two options are useful only when verifying checksums:\n" \
    3053        "    -s  Don't output anything, status code shows success\n" \
    3054        "    -w  Warn about improperly formatted SHA1 checksum lines")
     4635       ""IF_FEATURE_LAST_FANCY("[-HW] [-f FILE]")
     4636#define last_full_usage "\n\n" \
     4637       "Show listing of the last users that logged into the system" \
     4638    IF_FEATURE_LAST_FANCY( "\n" \
     4639     "\nOptions:" \
     4640/*   "\n    -H  Show header line" */ \
     4641     "\n    -W  Display with no host column truncation" \
     4642     "\n    -f FILE Read from FILE instead of /var/log/wtmp" \
     4643    )
     4644
     4645#define showkey_trivial_usage \
     4646       "[-a | -k | -s]"
     4647#define showkey_full_usage "\n\n" \
     4648       "Show keys pressed\n" \
     4649     "\nOptions:" \
     4650     "\n    -a  Display decimal/octal/hex values of the keys" \
     4651     "\n    -k  Display interpreted keycodes (default)" \
     4652     "\n    -s  Display raw scan-codes" \
    30554653
    30564654#define slattach_trivial_usage \
    3057        "[-cehmLF] [-s speed] [-p protocol] DEVICEs"
    3058 #define slattach_full_usage \
     4655       "[-cehmLF] [-s SPEED] [-p PROTOCOL] DEVICE"
     4656#define slattach_full_usage "\n\n" \
    30594657       "Attach network interface(s) to serial line(s)\n" \
    30604658     "\nOptions:" \
    3061      "\n    -p  Set protocol (slip, cslip, slip6, clisp6 or adaptive)" \
    3062      "\n    -s  Set line speed" \
     4659     "\n    -p PROT Set protocol (slip, cslip, slip6, clisp6 or adaptive)" \
     4660     "\n    -s SPD  Set line speed" \
    30634661     "\n    -e  Exit after initializing device" \
    30644662     "\n    -h  Exit when the carrier is lost" \
    3065      "\n    -c  Execute a command when the line is hung up" \
     4663     "\n    -c PROG Run PROG when the line is hung up" \
    30664664     "\n    -m  Do NOT initialize the line in raw 8 bits mode" \
    30674665     "\n    -L  Enable 3-wire operation" \
     
    30694667
    30704668#define sleep_trivial_usage \
    3071     USE_FEATURE_FANCY_SLEEP("[") "N" USE_FEATURE_FANCY_SLEEP("]...")
    3072 #define sleep_full_usage \
    3073     SKIP_FEATURE_FANCY_SLEEP("Pause for N seconds") \
    3074     USE_FEATURE_FANCY_SLEEP( \
     4669    IF_FEATURE_FANCY_SLEEP("[") "N" IF_FEATURE_FANCY_SLEEP("]...")
     4670#define sleep_full_usage "\n\n" \
     4671    IF_NOT_FEATURE_FANCY_SLEEP("Pause for N seconds") \
     4672    IF_FEATURE_FANCY_SLEEP( \
    30754673       "Pause for a time equal to the total of the args given, where each arg can\n" \
    30764674       "have an optional suffix of (s)econds, (m)inutes, (h)ours, or (d)ays")
     
    30784676       "$ sleep 2\n" \
    30794677       "[2 second delay results]\n" \
    3080     USE_FEATURE_FANCY_SLEEP( \
     4678    IF_FEATURE_FANCY_SLEEP( \
    30814679       "$ sleep 1d 3h 22m 8s\n" \
    30824680       "[98528 second delay results]\n")
     
    30844682#define sort_trivial_usage \
    30854683       "[-nru" \
    3086     USE_FEATURE_SORT_BIG("gMcszbdfimSTokt] [-o outfile] [-k start[.offset][opts][,end[.offset][opts]] [-t char") \
     4684    IF_FEATURE_SORT_BIG("gMcszbdfimSTokt] [-o FILE] [-k start[.offset][opts][,end[.offset][opts]] [-t CHAR") \
    30874685       "] [FILE]..."
    3088 #define sort_full_usage \
    3089        "Sort lines of text in the specified files" \
    3090        "\n\nOptions:\n" \
    3091     USE_FEATURE_SORT_BIG( \
    3092        "    -b  Ignore leading blanks\n" \
    3093        "    -c  Check whether input is sorted\n" \
    3094        "    -d  Dictionary order (blank or alphanumeric only)\n" \
    3095        "    -f  Ignore case\n" \
    3096        "    -g  General numerical sort\n" \
    3097        "    -i  Ignore unprintable characters\n" \
    3098        "    -k  Specify sort key\n" \
    3099        "    -M  Sort month\n") \
    3100        "    -n  Sort numbers\n" \
    3101     USE_FEATURE_SORT_BIG( \
    3102        "    -o  Output to file\n" \
    3103        "    -k  Sort by key\n" \
    3104        "    -t  Use key separator other than whitespace\n") \
    3105        "    -r  Reverse sort order\n" \
    3106     USE_FEATURE_SORT_BIG( \
    3107        "    -s  Stable (don't sort ties alphabetically)\n") \
    3108        "    -u  Suppress duplicate lines" \
    3109     USE_FEATURE_SORT_BIG( \
    3110        "\n  -z  Input terminated by nulls, not newlines\n") \
    3111     USE_FEATURE_SORT_BIG( \
    3112        "    -mST    Ignored for GNU compatibility") \
    3113        ""
     4686#define sort_full_usage "\n\n" \
     4687       "Sort lines of text\n" \
     4688     "\nOptions:" \
     4689    IF_FEATURE_SORT_BIG( \
     4690     "\n    -b  Ignore leading blanks" \
     4691     "\n    -c  Check whether input is sorted" \
     4692     "\n    -d  Dictionary order (blank or alphanumeric only)" \
     4693     "\n    -f  Ignore case" \
     4694     "\n    -g  General numerical sort" \
     4695     "\n    -i  Ignore unprintable characters" \
     4696     "\n    -k  Sort key" \
     4697     "\n    -M  Sort month" \
     4698    ) \
     4699     "\n    -n  Sort numbers" \
     4700    IF_FEATURE_SORT_BIG( \
     4701     "\n    -o  Output to file" \
     4702     "\n    -k  Sort by key" \
     4703     "\n    -t CHAR Key separator" \
     4704    ) \
     4705     "\n    -r  Reverse sort order" \
     4706    IF_FEATURE_SORT_BIG( \
     4707     "\n    -s  Stable (don't sort ties alphabetically)" \
     4708    ) \
     4709     "\n    -u  Suppress duplicate lines" \
     4710    IF_FEATURE_SORT_BIG( \
     4711     "\n    -z  Lines are terminated by NUL, not newline" \
     4712     "\n    -mST    Ignored for GNU compatibility") \
     4713
    31144714#define sort_example_usage \
    31154715       "$ echo -e \"e\\nf\\nb\\nd\\nc\\na\" | sort\n" \
     
    31204720       "e\n" \
    31214721       "f\n" \
    3122     USE_FEATURE_SORT_BIG( \
     4722    IF_FEATURE_SORT_BIG( \
    31234723        "$ echo -e \"c 3\\nb 2\\nd 2\" | $SORT -k 2,2n -k 1,1r\n" \
    31244724        "d 2\n" \
     
    31294729
    31304730#define split_trivial_usage \
    3131        "[OPTION] [INPUT [PREFIX]]"
    3132 #define split_full_usage \
     4731       "[OPTIONS] [INPUT [PREFIX]]"
     4732#define split_full_usage "\n\n" \
    31334733       "Options:" \
    3134        "\n  -b n[k|m]   Split by bytes" \
    3135        "\n  -l n        Split by lines" \
    3136        "\n  -a n        Use n letters as suffix"
     4734     "\n    -b N[k|m]   Split by N (kilo|mega)bytes" \
     4735     "\n    -l N        Split by N lines" \
     4736     "\n    -a N        Use N letters as suffix" \
     4737
    31374738#define split_example_usage \
    31384739       "$ split TODO foo\n" \
     
    31404741
    31414742#define start_stop_daemon_trivial_usage \
    3142        "[OPTIONS] [--start|--stop] ... [-- arguments...]"
    3143 #define start_stop_daemon_full_usage \
    3144        "Start and stop services" \
    3145        "\n\nOptions:" \
    3146        "\n  -S|--start          Start" \
    3147        "\n  -K|--stop           Stop" \
    3148        "\n  -a|--startas pathname       Starts process specified by pathname" \
    3149        "\n  -b|--background         Force process into background" \
    3150        "\n  -u|--user username|uid      Stop this user's processes" \
    3151        "\n  -x|--exec executable        Program to either start or check" \
    3152        "\n  -m|--make-pidfile       Create the -p file and enter pid in it" \
    3153        "\n  -n|--name process-name      Stop processes with this name" \
    3154        "\n  -p|--pidfile pid-file       Save or load pid using a pid-file" \
    3155        "\n  -q|--quiet          Quiet" \
    3156     USE_FEATURE_START_STOP_DAEMON_FANCY( \
    3157        "\n  -o|--oknodo         Exit status 0 if nothing done" \
    3158        "\n  -v|--verbose            Verbose" \
    3159        "\n  -N|--nicelevel N        Add N to process's nice level" \
    3160     ) \
    3161        "\n  -s|--signal signal      Signal to send (default TERM)" \
    3162        "\n  -c|--chuid user[:[group]]   Change to specified user/group"
     4743       "[OPTIONS] [-S|-K] ... [-- ARGS...]"
     4744#define start_stop_daemon_full_usage "\n\n" \
     4745       "Search for matching processes, and then\n" \
     4746       "-K: stop all matching processes.\n" \
     4747       "-S: start a process unless a matching process is found.\n" \
     4748    IF_FEATURE_START_STOP_DAEMON_LONG_OPTIONS( \
     4749     "\nProcess matching:" \
     4750     "\n    -u,--user USERNAME|UID  Match only this user's processes" \
     4751     "\n    -n,--name NAME      Match processes with NAME" \
     4752     "\n                in comm field in /proc/PID/stat" \
     4753     "\n    -x,--exec EXECUTABLE    Match processes with this command" \
     4754     "\n                in /proc/PID/cmdline" \
     4755     "\n    -p,--pidfile FILE   Match a process with PID from the file" \
     4756     "\n    All specified conditions must match" \
     4757     "\n-S only:" \
     4758     "\n    -x,--exec EXECUTABLE    Program to run" \
     4759     "\n    -a,--startas NAME   Zeroth argument" \
     4760     "\n    -b,--background     Background" \
     4761    IF_FEATURE_START_STOP_DAEMON_FANCY( \
     4762     "\n    -N,--nicelevel N    Change nice level" \
     4763    ) \
     4764     "\n    -c,--chuid USER[:[GRP]] Change to user/group" \
     4765     "\n    -m,--make-pidfile   Write PID to the pidfile specified by -p" \
     4766     "\n-K only:" \
     4767     "\n    -s,--signal SIG     Signal to send" \
     4768     "\n    -t,--test       Match only, exit with 0 if a process is found" \
     4769     "\nOther:" \
     4770    IF_FEATURE_START_STOP_DAEMON_FANCY( \
     4771     "\n    -o,--oknodo     Exit with status 0 if nothing is done" \
     4772     "\n    -v,--verbose        Verbose" \
     4773    ) \
     4774     "\n    -q,--quiet      Quiet" \
     4775    ) \
     4776    IF_NOT_FEATURE_START_STOP_DAEMON_LONG_OPTIONS( \
     4777     "\nProcess matching:" \
     4778     "\n    -u USERNAME|UID Match only this user's processes" \
     4779     "\n    -n NAME     Match processes with NAME" \
     4780     "\n            in comm field in /proc/PID/stat" \
     4781     "\n    -x EXECUTABLE   Match processes with this command" \
     4782     "\n            command in /proc/PID/cmdline" \
     4783     "\n    -p FILE     Match a process with PID from the file" \
     4784     "\n    All specified conditions must match" \
     4785     "\n-S only:" \
     4786     "\n    -x EXECUTABLE   Program to run" \
     4787     "\n    -a NAME     Zeroth argument" \
     4788     "\n    -b      Background" \
     4789    IF_FEATURE_START_STOP_DAEMON_FANCY( \
     4790     "\n    -N N        Change nice level" \
     4791    ) \
     4792     "\n    -c USER[:[GRP]] Change to user/group" \
     4793     "\n    -m      Write PID to the pidfile specified by -p" \
     4794     "\n-K only:" \
     4795     "\n    -s SIG      Signal to send" \
     4796     "\n    -t      Match only, exit with 0 if a process is found" \
     4797     "\nOther:" \
     4798    IF_FEATURE_START_STOP_DAEMON_FANCY( \
     4799     "\n    -o      Exit with status 0 if nothing is done" \
     4800     "\n    -v      Verbose" \
     4801    ) \
     4802     "\n    -q      Quiet" \
     4803    ) \
    31634804
    31644805#define stat_trivial_usage \
    3165        "[OPTION] FILE..."
    3166 #define stat_full_usage \
    3167        "Display file (default) or filesystem status" \
    3168        "\n\nOptions:\n" \
    3169     USE_FEATURE_STAT_FORMAT( \
    3170        "    -c fmt  Use the specified format\n") \
    3171        "    -f  Display filesystem status\n" \
    3172        "    -L,-l   Dereference links\n" \
    3173        "    -t  Display info in terse form" \
    3174     USE_SELINUX( \
    3175        "\n  -Z  Print security context" \
    3176     ) \
    3177     USE_FEATURE_STAT_FORMAT( \
     4806       "[OPTIONS] FILE..."
     4807#define stat_full_usage "\n\n" \
     4808       "Display file (default) or filesystem status\n" \
     4809     "\nOptions:" \
     4810    IF_FEATURE_STAT_FORMAT( \
     4811     "\n    -c fmt  Use the specified format" \
     4812    ) \
     4813     "\n    -f  Display filesystem status" \
     4814     "\n    -L  Follow links" \
     4815     "\n    -t  Display info in terse form" \
     4816    IF_SELINUX( \
     4817     "\n    -Z  Print security context" \
     4818    ) \
     4819    IF_FEATURE_STAT_FORMAT( \
    31784820       "\n\nValid format sequences for files:\n" \
    31794821       " %a Access rights in octal\n" \
     
    31904832       " %i Inode number\n" \
    31914833       " %n File name\n" \
    3192        " %N Quoted file name with dereference if symlink\n" \
     4834       " %N File name, with -> TARGET if symlink\n" \
    31934835       " %o I/O block size\n" \
    31944836       " %s Total size, in bytes\n" \
     
    32094851       " %d Free file nodes in file system\n" \
    32104852       " %f Free blocks in file system\n" \
    3211     USE_SELINUX( \
    3212        " %C Security context in SELinux\n" \
     4853    IF_SELINUX( \
     4854       " %C Security context in selinux\n" \
    32134855    ) \
    32144856       " %i File System ID in hex\n" \
     
    32194861       " %t Type in hex\n" \
    32204862       " %T Type in human readable form" \
    3221     )
     4863    ) \
    32224864
    32234865#define strings_trivial_usage \
    3224        "[-afo] [-n length] [file ...]"
    3225 #define strings_full_usage \
    3226        "Display printable strings in a binary file" \
    3227        "\n\nOptions:" \
    3228        "\n  -a  Scan the whole files (this is the default)" \
    3229        "\n  -f  Precede each string with the name of the file where it was found" \
    3230        "\n  -n N    Specifies that at least N characters forms a sequence (default 4)" \
    3231        "\n  -o  Each string is preceded by its decimal offset in the file"
     4866       "[-afo] [-n LEN] [FILE]..."
     4867#define strings_full_usage "\n\n" \
     4868       "Display printable strings in a binary file\n" \
     4869     "\nOptions:" \
     4870     "\n    -a  Scan whole file (default)" \
     4871     "\n    -f  Precede strings with filenames" \
     4872     "\n    -n LEN  At least LEN characters form a string (default 4)" \
     4873     "\n    -o  Precede strings with decimal offsets" \
    32324874
    32334875#define stty_trivial_usage \
    32344876       "[-a|g] [-F DEVICE] [SETTING]..."
    3235 #define stty_full_usage \
     4877#define stty_full_usage "\n\n" \
    32364878       "Without arguments, prints baud rate, line discipline,\n" \
    3237        "and deviations from stty sane" \
    3238        "\n\nOptions:" \
    3239        "\n  -F DEVICE   Open device instead of stdin" \
    3240        "\n  -a      Print all current settings in human-readable form" \
    3241        "\n  -g      Print in stty-readable form" \
    3242        "\n  [SETTING]   See manpage"
     4879       "and deviations from stty sane\n" \
     4880     "\nOptions:" \
     4881     "\n    -F DEVICE   Open device instead of stdin" \
     4882     "\n    -a      Print all current settings in human-readable form" \
     4883     "\n    -g      Print in stty-readable form" \
     4884     "\n    [SETTING]   See manpage" \
    32434885
    32444886#define su_trivial_usage \
    3245        "[OPTION]... [-] [username]"
    3246 #define su_full_usage \
    3247        "Change user id or become root" \
    3248        "\n\nOptions:" \
    3249        "\n  -p, -m  Preserve environment" \
    3250        "\n  -c  Command to pass to 'sh -c'" \
    3251        "\n  -s  Shell to use instead of default shell"
     4887       "[OPTIONS] [-] [USERNAME]"
     4888#define su_full_usage "\n\n" \
     4889       "Change user id or become root\n" \
     4890     "\nOptions:" \
     4891     "\n    -p,-m   Preserve environment" \
     4892     "\n    -c CMD  Command to pass to 'sh -c'" \
     4893     "\n    -s SH   Shell to use instead of default shell" \
    32524894
    32534895#define sulogin_trivial_usage \
    3254        "[OPTION]... [tty-device]"
    3255 #define sulogin_full_usage \
    3256        "Single user login" \
    3257        "\n\nOptions:" \
    3258        "\n  -t  Timeout"
     4896       "[-t N] [TTY]"
     4897#define sulogin_full_usage "\n\n" \
     4898       "Single user login\n" \
     4899     "\nOptions:" \
     4900     "\n    -t N    Timeout" \
    32594901
    32604902#define sum_trivial_usage \
    3261        "[rs] [files...]"
    3262 #define sum_full_usage \
    3263        "Checksum and count the blocks in a file" \
    3264        "\n\nOptions:\n" \
    3265        "    -r  Use BSD sum algorithm (1K blocks)\n" \
    3266        "    -s  Use System V sum algorithm (512byte blocks)"
     4903       "[-rs] [FILE]..."
     4904#define sum_full_usage "\n\n" \
     4905       "Checksum and count the blocks in a file\n" \
     4906     "\nOptions:" \
     4907     "\n    -r  Use BSD sum algorithm (1K blocks)" \
     4908     "\n    -s  Use System V sum algorithm (512byte blocks)" \
    32674909
    32684910#define sv_trivial_usage \
    3269        "[-v] [-w sec] command service..."
    3270 #define sv_full_usage \
     4911       "[-v] [-w SEC] CMD SERVICE_DIR..."
     4912#define sv_full_usage "\n\n" \
    32714913       "Control services monitored by runsv supervisor.\n" \
    32724914       "Commands (only first character is enough):\n" \
     
    32764918       "once: like 'up', but if service stops, don't restart it\n" \
    32774919       "down: send TERM and CONT signals. If ./run exits, start ./finish\n" \
    3278        "    if it exists. After it stops, do not restart service\n" \
     4920       "    if it exists. After it stops, don't restart service\n" \
    32794921       "exit: send TERM and CONT signals to service and log service. If they exit,\n" \
    3280        "    runsv exits too\n" \
     4922       "    runsv exits too\n" \
    32814923       "pause, cont, hup, alarm, interrupt, quit, 1, 2, term, kill: send\n" \
    3282        "STOP, CONT, HUP, ALRM, INT, QUIT, USR1, USR2, TERM, KILL signal to service"
     4924       "STOP, CONT, HUP, ALRM, INT, QUIT, USR1, USR2, TERM, KILL signal to service" \
    32834925
    32844926#define svlogd_trivial_usage \
    3285        "[-ttv] [-r c] [-R abc] [-l len] [-b buflen] dir..."
    3286 #define svlogd_full_usage \
    3287        "Continuously read log data from standard input, optionally " \
    3288        "filter log messages, and write the data to one or more automatically " \
    3289        "rotated logs"
     4927       "[-ttv] [-r C] [-R CHARS] [-l MATCHLEN] [-b BUFLEN] DIR..."
     4928#define svlogd_full_usage "\n\n" \
     4929       "Continuously read log data from stdin, optionally\n" \
     4930       "filter log messages, and write the data to one or more automatically\n" \
     4931       "rotated logs" \
    32904932
    32914933#define swapoff_trivial_usage \
    32924934       "[-a] [DEVICE]"
    3293 #define swapoff_full_usage \
    3294        "Stop swapping virtual memory pages on DEVICE" \
    3295        "\n\nOptions:\n" \
    3296        "    -a  Stop swapping on all swap devices"
     4935#define swapoff_full_usage "\n\n" \
     4936       "Stop swapping on DEVICE\n" \
     4937     "\nOptions:" \
     4938     "\n    -a  Stop swapping on all swap devices" \
    32974939
    32984940#define swapon_trivial_usage \
    3299        "[-a] [DEVICE]"
    3300 #define swapon_full_usage \
    3301        "Start swapping virtual memory pages on DEVICE" \
    3302        "\n\nOptions:\n" \
    3303        "    -a  Start swapping on all swap devices"
     4941       "[-a]" IF_FEATURE_SWAPON_PRI(" [-p PRI]") " [DEVICE]"
     4942#define swapon_full_usage "\n\n" \
     4943       "Start swapping on DEVICE\n" \
     4944     "\nOptions:" \
     4945     "\n    -a  Start swapping on all swap devices" \
     4946    IF_FEATURE_SWAPON_PRI( \
     4947     "\n    -p PRI  Set swap device priority" \
     4948    ) \
    33044949
    33054950#define switch_root_trivial_usage \
    3306        "[-c /dev/console] NEW_ROOT NEW_INIT [ARGUMENTS_TO_INIT]"
    3307 #define switch_root_full_usage \
    3308        "Use from PID 1 under initramfs to free initramfs, chroot to NEW_ROOT,\n" \
    3309        "and exec NEW_INIT" \
    3310        "\n\nOptions:\n" \
    3311        "    -c  Redirect console to device on new root"
     4951       "[-c /dev/console] NEW_ROOT NEW_INIT [ARGS]"
     4952#define switch_root_full_usage "\n\n" \
     4953       "Free initramfs and switch to another root fs:\n" \
     4954       "chroot to NEW_ROOT, delete all in /, move NEW_ROOT to /,\n" \
     4955       "execute NEW_INIT. PID must be 1. NEW_ROOT must be a mountpoint.\n" \
     4956     "\nOptions:" \
     4957     "\n    -c DEV  Reopen stdio to DEV after switch" \
    33124958
    33134959#define sync_trivial_usage \
    33144960       ""
    3315 #define sync_full_usage \
    3316        "Write all buffered filesystem blocks to disk"
     4961#define sync_full_usage "\n\n" \
     4962       "Write all buffered blocks to disk"
     4963
     4964#define fsync_trivial_usage \
     4965       "[-d] FILE..."
     4966#define fsync_full_usage "\n\n" \
     4967       "Write files' buffered blocks to disk\n" \
     4968     "\nOptions:" \
     4969     "\n    -d  Avoid syncing metadata"
    33174970
    33184971#define sysctl_trivial_usage \
    3319        "[OPTIONS]... [VALUE]..."
    3320 #define sysctl_full_usage \
    3321        "Configure kernel parameters at runtime" \
    3322        "\n\nOptions:\n" \
    3323        "    -n  Use this option to disable printing of the key name when printing values\n" \
    3324        "    -w  Use this option when you want to change a sysctl setting\n" \
    3325        "    -p  Load in sysctl settings from the file specified or /etc/sysctl.conf if none given\n" \
    3326        "    -a  Display all values currently available\n" \
    3327        "    -A  Display all values currently available in table form"
     4972       "[OPTIONS] [VALUE]..."
     4973#define sysctl_full_usage "\n\n" \
     4974       "Configure kernel parameters at runtime\n" \
     4975     "\nOptions:" \
     4976     "\n    -n  Don't print key names" \
     4977     "\n    -e  Don't warn about unknown keys" \
     4978     "\n    -w  Change sysctl setting" \
     4979     "\n    -p FILE Load sysctl settings from FILE (default /etc/sysctl.conf)" \
     4980     "\n    -a  Display all values" \
     4981     "\n    -A  Display all values in table form" \
     4982
    33284983#define sysctl_example_usage \
    3329        "sysctl [-n] variable ...\n" \
    3330        "sysctl [-n] -w variable=value ...\n" \
    3331        "sysctl [-n] -a\n" \
    3332        "sysctl [-n] -p file (default /etc/sysctl.conf)\n" \
    3333        "sysctl [-n] -A\n"
     4984       "sysctl [-n] [-e] variable...\n" \
     4985       "sysctl [-n] [-e] -w variable=value...\n" \
     4986       "sysctl [-n] [-e] -a\n" \
     4987       "sysctl [-n] [-e] -p file    (default /etc/sysctl.conf)\n" \
     4988       "sysctl [-n] [-e] -A\n"
    33344989
    33354990#define syslogd_trivial_usage \
    3336        "[OPTION]..."
    3337 #define syslogd_full_usage \
     4991       "[OPTIONS]"
     4992#define syslogd_full_usage "\n\n" \
    33384993       "System logging utility.\n" \
    3339        "Note that this version of syslogd ignores /etc/syslog.conf." \
    3340        "\n\nOptions:" \
    3341        "\n  -n      Run as foreground process" \
    3342        "\n  -O FILE     Log to given file (default=/var/log/messages)" \
    3343        "\n  -l n        Set local log level" \
    3344        "\n  -S      Smaller logging output" \
    3345     USE_FEATURE_ROTATE_LOGFILE( \
    3346        "\n  -s SIZE     Max size (KB) before rotate (default=200KB, 0=off)" \
    3347        "\n  -b NUM      Number of rotated logs to keep (default=1, max=99, 0=purge)") \
    3348     USE_FEATURE_REMOTE_LOG( \
    3349        "\n  -R HOST[:PORT]  Log to IP or hostname on PORT (default PORT=514/UDP)" \
    3350        "\n  -L      Log locally and via network (default is network only if -R)") \
    3351     USE_FEATURE_IPC_SYSLOG( \
    3352        "\n  -C[size(KiB)]   Log to shared mem buffer (read it using logread)")
     4994       "This version of syslogd ignores /etc/syslog.conf\n" \
     4995     "\nOptions:" \
     4996     "\n    -n      Run in foreground" \
     4997     "\n    -O FILE     Log to given file (default:/var/log/messages)" \
     4998     "\n    -l N        Set local log level" \
     4999     "\n    -S      Smaller logging output" \
     5000    IF_FEATURE_ROTATE_LOGFILE( \
     5001     "\n    -s SIZE     Max size (KB) before rotate (default:200KB, 0=off)" \
     5002     "\n    -b N        N rotated logs to keep (default:1, max=99, 0=purge)") \
     5003    IF_FEATURE_REMOTE_LOG( \
     5004     "\n    -R HOST[:PORT]  Log to IP or hostname on PORT (default PORT=514/UDP)" \
     5005     "\n    -L      Log locally and via network (default is network only if -R)") \
     5006    IF_FEATURE_SYSLOGD_DUP( \
     5007     "\n    -D      Drop duplicates") \
     5008    IF_FEATURE_IPC_SYSLOG( \
     5009     "\n    -C[size(KiB)]   Log to shared mem buffer (read it using logread)") \
    33535010    /* NB: -Csize shouldn't have space (because size is optional) */
    3354 /*     "\n  -m MIN      Minutes between MARK lines (default=20, 0=off)" */
     5011/*   "\n    -m MIN      Minutes between MARK lines (default:20, 0=off)" */
     5012
    33555013#define syslogd_example_usage \
    33565014       "$ syslogd -R masterlog:514\n" \
    33575015       "$ syslogd -R 192.168.1.1:601\n"
    33585016
    3359 #define tail_trivial_usage \
    3360        "[OPTION]... [FILE]..."
    3361 #define tail_full_usage \
    3362        "Print last 10 lines of each FILE to standard output.\n" \
    3363        "With more than one FILE, precede each with a header giving the\n" \
    3364        "file name. With no FILE, or when FILE is -, read standard input." \
    3365        "\n\nOptions:" \
    3366     USE_FEATURE_FANCY_TAIL( \
    3367        "\n  -c N[kbm]   Output the last N bytes") \
    3368        "\n  -n N[kbm]   Print last N lines instead of last 10" \
    3369        "\n  -f      Output data as the file grows" \
    3370     USE_FEATURE_FANCY_TAIL( \
    3371        "\n  -q      Never output headers giving file names" \
    3372        "\n  -s SEC      Wait SEC seconds between reads with -f" \
    3373        "\n  -v      Always output headers giving file names" \
    3374        "\n\n" \
    3375        "If the first character of N (bytes or lines) is a '+', output begins with\n" \
    3376        "the Nth item from the start of each file, otherwise, print the last N items\n" \
    3377        "in the file. N bytes may be suffixed by k (x1024), b (x512), or m (1024^2)." )
    3378 #define tail_example_usage \
    3379        "$ tail -n 1 /etc/resolv.conf\n" \
    3380        "nameserver 10.0.0.1\n"
    3381 
    3382 #define tar_trivial_usage \
    3383        "-[" USE_FEATURE_TAR_CREATE("c") USE_FEATURE_TAR_GZIP("z") \
    3384     USE_FEATURE_TAR_BZIP2("j") USE_FEATURE_TAR_LZMA("a") \
    3385     USE_FEATURE_TAR_COMPRESS("Z") "xtvO] " \
    3386     USE_FEATURE_TAR_FROM("[-X FILE] ") \
    3387        "[-f TARFILE] [-C DIR] [FILE(s)] ..."
    3388 #define tar_full_usage \
    3389        "Create, extract, or list files from a tar file" \
    3390        "\n\nOptions:\n" \
    3391     USE_FEATURE_TAR_CREATE( \
    3392        "    c   Create\n") \
    3393        "    x   Extract\n" \
    3394        "    t   List\n" \
    3395        "\nArchive format selection:\n" \
    3396     USE_FEATURE_TAR_GZIP( \
    3397        "    z   Filter the archive through gzip\n") \
    3398     USE_FEATURE_TAR_BZIP2( \
    3399        "    j   Filter the archive through bzip2\n") \
    3400     USE_FEATURE_TAR_LZMA( \
    3401        "    a   Filter the archive through lzma\n") \
    3402     USE_FEATURE_TAR_COMPRESS( \
    3403        "    Z   Filter the archive through compress\n") \
    3404        "\nFile selection:\n" \
    3405        "    f   Name of TARFILE or \"-\" for stdin\n" \
    3406        "    O   Extract to stdout\n" \
    3407     USE_FEATURE_TAR_FROM( \
    3408        "    exclude File to exclude\n" \
    3409        "    X   File with names to exclude\n") \
    3410        "    C   Change to directory DIR before operation\n" \
    3411        "    v   Verbose"
    3412 #define tar_example_usage \
    3413        "$ zcat /tmp/tarball.tar.gz | tar -xf -\n" \
    3414        "$ tar -cf /tmp/tarball.tar /usr/local\n"
     5017#define tac_trivial_usage \
     5018    "[FILE]..."
     5019#define tac_full_usage "\n\n" \
     5020    "Concatenate FILEs and print them in reverse"
    34155021
    34165022#define taskset_trivial_usage \
    3417        "[OPTIONS] [mask] [pid | command [arg]...]"
    3418 #define taskset_full_usage \
    3419        "Set or get CPU affinity" \
    3420        "\n\nOptions:\n" \
    3421        "    -p  Operate on an existing PID"
     5023       "[-p] [MASK] [PID | PROG ARGS]"
     5024#define taskset_full_usage "\n\n" \
     5025       "Set or get CPU affinity\n" \
     5026     "\nOptions:" \
     5027     "\n    -p  Operate on an existing PID" \
     5028
    34225029#define taskset_example_usage \
    34235030       "$ taskset 0x7 ./dgemm_test&\n" \
     
    34325039
    34335040#define tee_trivial_usage \
    3434        "[OPTION]... [FILE]..."
    3435 #define tee_full_usage \
    3436        "Copy standard input to each FILE, and also to standard output" \
    3437        "\n\nOptions:\n" \
    3438        "    -a  Append to the given FILEs, do not overwrite\n" \
    3439        "    -i  Ignore interrupt signals (SIGINT)"
     5041       "[-ai] [FILE]..."
     5042#define tee_full_usage "\n\n" \
     5043       "Copy stdin to each FILE, and also to stdout\n" \
     5044     "\nOptions:" \
     5045     "\n    -a  Append to the given FILEs, don't overwrite" \
     5046     "\n    -i  Ignore interrupt signals (SIGINT)" \
     5047
    34405048#define tee_example_usage \
    34415049       "$ echo \"Hello\" | tee /tmp/foo\n" \
     
    34465054#define telnet_trivial_usage \
    34475055       "[-a] [-l USER] HOST [PORT]"
    3448 #define telnet_full_usage \
    3449        "Connect to remote telnet server" \
    3450        "\n\nOptions:\n" \
    3451        "    -a  Attempt an automatic login with the USER variable\n" \
    3452        "    -l USER Attempt an automatic login with the USER argument\n" \
    3453        "    HOST    The official name, alias or the IP address of the\n" \
    3454        "        remote host\n" \
    3455        "    PORT    The remote port number to connect to. If it is not\n" \
    3456        "        specified, the default telnet (23) port is used."
     5056#define telnet_full_usage "\n\n" \
     5057       "Connect to telnet server\n" \
     5058     "\nOptions:" \
     5059     "\n    -a  Automatic login with $USER variable" \
     5060     "\n    -l USER Automatic login as USER" \
     5061
    34575062#else
    34585063#define telnet_trivial_usage \
    34595064       "HOST [PORT]"
    3460 #define telnet_full_usage \
    3461        "Connect to remote telnet server"
     5065#define telnet_full_usage "\n\n" \
     5066       "Connect to telnet server"
    34625067#endif
    34635068
    34645069#define telnetd_trivial_usage \
    3465        "[OPTION]"
    3466 #define telnetd_full_usage \
     5070       "[OPTIONS]"
     5071#define telnetd_full_usage "\n\n" \
    34675072       "Handle incoming telnet connections" \
    3468     SKIP_FEATURE_TELNETD_STANDALONE(" via inetd") \
    3469        "\n\nOptions:" \
    3470        "\n  -l LOGIN    Exec LOGIN on connect" \
    3471        "\n  -f issue_file   Display issue_file instead of /etc/issue" \
    3472     USE_FEATURE_TELNETD_STANDALONE( \
    3473        "\n  -p PORT     Port to listen to" \
    3474        "\n  -b ADDR     Address to bind to" \
    3475        "\n  -F      Stay in foreground" \
    3476        "\n  -i      Run as inetd subservice" \
     5073    IF_NOT_FEATURE_TELNETD_STANDALONE(" via inetd") "\n" \
     5074     "\nOptions:" \
     5075     "\n    -l LOGIN    Exec LOGIN on connect" \
     5076     "\n    -f ISSUE_FILE   Display ISSUE_FILE instead of /etc/issue" \
     5077     "\n    -K      Close connection as soon as login exits" \
     5078     "\n            (normally wait until all programs close slave pty)" \
     5079    IF_FEATURE_TELNETD_STANDALONE( \
     5080     "\n    -p PORT     Port to listen on" \
     5081     "\n    -b ADDR[:PORT]  Address to bind to" \
     5082     "\n    -F      Run in foreground" \
     5083     "\n    -i      Inetd mode" \
     5084    IF_FEATURE_TELNETD_INETD_WAIT( \
     5085     "\n    -w SEC      Inetd 'wait' mode, linger time SEC" \
     5086     "\n    -S      Log to syslog (implied by -i or without -F and -w)" \
     5087    ) \
    34775088    )
    34785089
     5090/* "test --help" does not print help (POSIX compat), only "[ --help" does.
     5091 * We display "<applet> EXPRESSION ]" here (not "<applet> EXPRESSION")
     5092 * Unfortunately, it screws up generated BusyBox.html. TODO. */
    34795093#define test_trivial_usage \
    3480        "EXPRESSION\n  or   [ EXPRESSION ]"
    3481 #define test_full_usage \
    3482        "Check file types and compares values returning an exit code\n" \
    3483        "determined by the value of EXPRESSION"
     5094       "EXPRESSION ]"
     5095#define test_full_usage "\n\n" \
     5096       "Check file types, compare values etc. Return a 0/1 exit code\n" \
     5097       "depending on logical value of EXPRESSION"
    34845098#define test_example_usage \
    34855099       "$ test 1 -eq 2\n" \
     
    34965110       "1\n"
    34975111
     5112#define tc_trivial_usage \
     5113    /*"[OPTIONS] "*/"OBJECT CMD [dev STRING]"
     5114#define tc_full_usage "\n\n" \
     5115    "OBJECT: {qdisc|class|filter}\n" \
     5116    "CMD: {add|del|change|replace|show}\n" \
     5117    "\n" \
     5118    "qdisc [ handle QHANDLE ] [ root |"IF_FEATURE_TC_INGRESS(" ingress |")" parent CLASSID ]\n" \
     5119    /* "[ estimator INTERVAL TIME_CONSTANT ]\n" */ \
     5120    "   [ [ QDISC_KIND ] [ help | OPTIONS ] ]\n" \
     5121    "   QDISC_KIND := { [p|b]fifo | tbf | prio | cbq | red | etc. }\n" \
     5122    "qdisc show [ dev STRING ]"IF_FEATURE_TC_INGRESS(" [ingress]")"\n" \
     5123    "class [ classid CLASSID ] [ root | parent CLASSID ]\n" \
     5124    "   [ [ QDISC_KIND ] [ help | OPTIONS ] ]\n" \
     5125    "class show [ dev STRING ] [ root | parent CLASSID ]\n" \
     5126    "filter [ pref PRIO ] [ protocol PROTO ]\n" \
     5127    /* "\t[ estimator INTERVAL TIME_CONSTANT ]\n" */ \
     5128    "   [ root | classid CLASSID ] [ handle FILTERID ]\n" \
     5129    "   [ [ FILTER_TYPE ] [ help | OPTIONS ] ]\n" \
     5130    "filter show [ dev STRING ] [ root | parent CLASSID ]"
     5131
    34985132#define tcpsvd_trivial_usage \
    3499        "[-hEv] [-c n] [-C n:msg] [-b n] [-u user] [-l name] ip port prog..."
     5133       "[-hEv] [-c N] [-C N[:MSG]] [-b N] [-u USER] [-l NAME] IP PORT PROG"
    35005134/* with not-implemented options: */
    3501 /*     "[-hpEvv] [-c n] [-C n:msg] [-b n] [-u user] [-l name] [-i dir|-x cdb] [-t sec] ip port prog..." */
    3502 #define tcpsvd_full_usage \
    3503        "Creates TCP socket, binds it to ip:port and listens on it\n" \
    3504        "for incoming connections. For each connection it runs prog." \
    3505      "\n" \
    3506      "\nip      IP to listen on. '0' = all" \
    3507      "\nport        Port to listen on" \
    3508      "\nprog [arg]  Program to run" \
    3509      "\n-l name     Local hostname (else looks up local hostname in DNS)" \
    3510      "\n-u user[:group] Change to user/group after bind" \
    3511      "\n-c n        Handle up to n connections simultaneously" \
    3512      "\n-b n        Allow a backlog of approximately n TCP SYNs" \
    3513      "\n-C n[:msg]  Allow only up to n connections from the same IP" \
    3514      "\n        New connections from this IP address are closed" \
    3515      "\n        immediately. 'msg' is written to the peer before close" \
    3516      "\n-h      Look up peer's hostname" \
    3517      "\n-E      Do not set up environment variables" \
    3518      "\n-v      Verbose"
     5135/*     "[-hpEvv] [-c N] [-C N[:MSG]] [-b N] [-u USER] [-l NAME] [-i DIR|-x CDB] [-t SEC] IP PORT PROG" */
     5136#define tcpsvd_full_usage "\n\n" \
     5137       "Create TCP socket, bind to IP:PORT and listen\n" \
     5138       "for incoming connection. Run PROG for each connection.\n" \
     5139     "\n    IP      IP to listen on. '0' = all" \
     5140     "\n    PORT        Port to listen on" \
     5141     "\n    PROG ARGS   Program to run" \
     5142     "\n    -l NAME     Local hostname (else looks up local hostname in DNS)" \
     5143     "\n    -u USER[:GRP]   Change to user/group after bind" \
     5144     "\n    -c N        Handle up to N connections simultaneously" \
     5145     "\n    -b N        Allow a backlog of approximately N TCP SYNs" \
     5146     "\n    -C N[:MSG]  Allow only up to N connections from the same IP." \
     5147     "\n            New connections from this IP address are closed" \
     5148     "\n            immediately. MSG is written to the peer before close" \
     5149     "\n    -h      Look up peer's hostname" \
     5150     "\n    -E      Don't set up environment variables" \
     5151     "\n    -v      Verbose" \
    35195152
    35205153#define udpsvd_trivial_usage \
    3521        "[-hEv] [-c n] [-u user] [-l name] ip port prog"
    3522 #define udpsvd_full_usage \
    3523        "Creates UDP socket, binds it to ip:port and listens on it\n" \
    3524        "for incoming packets. For each packet it runs prog\n" \
    3525        "(redirecting all further packets with same peer ip:port to it)." \
    3526      "\n" \
    3527      "\nip      IP to listen on. '0' = all" \
    3528      "\nport        Port to listen on" \
    3529      "\nprog [arg]  Program to run" \
    3530      "\n-l name     Local hostname (else looks up local hostname in DNS)" \
    3531      "\n-u user[:group] Change to user/group after bind" \
    3532      "\n-c n        Handle up to n connections simultaneously" \
    3533      "\n-h      Look up peer's hostname" \
    3534      "\n-E      Do not set up environment variables" \
    3535      "\n-v      Verbose"
     5154       "[-hEv] [-c N] [-u USER] [-l NAME] IP PORT PROG"
     5155#define udpsvd_full_usage "\n\n" \
     5156       "Create UDP socket, bind to IP:PORT and wait\n" \
     5157       "for incoming packets. Run PROG for each packet,\n" \
     5158       "redirecting all further packets with same peer ip:port to it.\n" \
     5159     "\n    IP      IP to listen on. '0' = all" \
     5160     "\n    PORT        Port to listen on" \
     5161     "\n    PROG ARGS   Program to run" \
     5162     "\n    -l NAME     Local hostname (else looks up local hostname in DNS)" \
     5163     "\n    -u USER[:GRP]   Change to user/group after bind" \
     5164     "\n    -c N        Handle up to N connections simultaneously" \
     5165     "\n    -h      Look up peer's hostname" \
     5166     "\n    -E      Don't set up environment variables" \
     5167     "\n    -v      Verbose" \
    35365168
    35375169#define tftp_trivial_usage \
    3538        "[OPTION]... HOST [PORT]"
    3539 #define tftp_full_usage \
    3540        "Transfer a file from/to tftp server using \"octet\" mode" \
    3541        "\n\nOptions:" \
    3542        "\n  -l FILE Local FILE" \
    3543        "\n  -r FILE Remote FILE" \
    3544     USE_FEATURE_TFTP_GET( \
    3545        "\n  -g  Get file" \
    3546     ) \
    3547     USE_FEATURE_TFTP_PUT( \
    3548        "\n  -p  Put file" \
    3549     ) \
    3550     USE_FEATURE_TFTP_BLOCKSIZE( \
    3551        "\n  -b SIZE Transfer blocks of SIZE octets" \
     5170       "[OPTIONS] HOST [PORT]"
     5171#define tftp_full_usage "\n\n" \
     5172       "Transfer a file from/to tftp server\n" \
     5173     "\nOptions:" \
     5174     "\n    -l FILE Local FILE" \
     5175     "\n    -r FILE Remote FILE" \
     5176    IF_FEATURE_TFTP_GET( \
     5177     "\n    -g  Get file" \
     5178    ) \
     5179    IF_FEATURE_TFTP_PUT( \
     5180     "\n    -p  Put file" \
     5181    ) \
     5182    IF_FEATURE_TFTP_BLOCKSIZE( \
     5183     "\n    -b SIZE Transfer blocks of SIZE octets" \
    35525184    )
     5185
     5186#define tftpd_trivial_usage \
     5187       "[-cr] [-u USER] [DIR]"
     5188#define tftpd_full_usage "\n\n" \
     5189       "Transfer a file on tftp client's request\n" \
     5190       "\n" \
     5191       "tftpd should be used as an inetd service.\n" \
     5192       "tftpd's line for inetd.conf:\n" \
     5193       "    69 dgram udp nowait root tftpd tftpd /files/to/serve\n" \
     5194       "It also can be ran from udpsvd:\n" \
     5195       "    udpsvd -vE 0.0.0.0 69 tftpd /files/to/serve\n" \
     5196     "\nOptions:" \
     5197     "\n    -r  Prohibit upload" \
     5198     "\n    -c  Allow file creation via upload" \
     5199     "\n    -u  Access files as USER" \
     5200
    35535201#define time_trivial_usage \
    3554        "[OPTION]... COMMAND [ARGS...]"
    3555 #define time_full_usage \
    3556        "Run the program COMMAND with arguments ARGS. When COMMAND finishes,\n" \
    3557        "COMMAND's resource usage information is displayed." \
    3558        "\n\nOptions:\n" \
    3559        "    -v  Verbose"
     5202       "[-v] PROG ARGS"
     5203#define time_full_usage "\n\n" \
     5204       "Run PROG, display resource usage when it exits\n" \
     5205     "\nOptions:" \
     5206     "\n    -v  Verbose" \
     5207
     5208#define timeout_trivial_usage \
     5209       "[-t SECS] [-s SIG] PROG ARGS"
     5210#define timeout_full_usage "\n\n" \
     5211       "Runs PROG. Sends SIG to it if it is not gone in SECS seconds.\n" \
     5212       "Defaults: SECS: 10, SIG: TERM." \
    35605213
    35615214#define top_trivial_usage \
    3562        "[-b] [-n count] [-d seconds]"
    3563 #define top_full_usage \
     5215       "[-b] [-nCOUNT] [-dSECONDS]" IF_FEATURE_TOPMEM(" [-m]")
     5216#define top_full_usage "\n\n" \
    35645217       "Provide a view of process activity in real time.\n" \
    3565        "Read the status of all processes from /proc each <seconds>\n" \
    3566        "and show the status for however many processes will fit on the screen."
     5218       "Read the status of all processes from /proc each SECONDS\n" \
     5219       "and display a screenful of them." \
     5220//TODO: add options and keyboard commands
    35675221
    35685222#define touch_trivial_usage \
    3569        "[-c] FILE [FILE ...]"
    3570 #define touch_full_usage \
    3571        "Update the last-modified date on the given FILE[s]" \
    3572        "\n\nOptions:\n" \
    3573        "    -c  Do not create any files"
     5223       "[-c] [-d DATE] [-r FILE] FILE [FILE]..."
     5224#define touch_full_usage "\n\n" \
     5225       "Update the last-modified date on the given FILE[s]\n" \
     5226     "\nOptions:" \
     5227     "\n    -c  Don't create files" \
     5228     "\n    -d DT   Date/time to use" \
     5229     "\n    -r FILE Use FILE's date/time" \
     5230
    35745231#define touch_example_usage \
    35755232       "$ ls -l /tmp/foo\n" \
     
    35815238#define tr_trivial_usage \
    35825239       "[-cds] STRING1 [STRING2]"
    3583 #define tr_full_usage \
    3584        "Translate, squeeze, and/or delete characters from\n" \
    3585        "standard input, writing to standard output" \
    3586        "\n\nOptions:\n" \
    3587        "    -c  Take complement of STRING1\n" \
    3588        "    -d  Delete input characters coded STRING1\n" \
    3589        "    -s  Squeeze multiple output characters of STRING2 into one character"
     5240#define tr_full_usage "\n\n" \
     5241       "Translate, squeeze, or delete characters from stdin, writing to stdout\n" \
     5242     "\nOptions:" \
     5243     "\n    -c  Take complement of STRING1" \
     5244     "\n    -d  Delete input characters coded STRING1" \
     5245     "\n    -s  Squeeze multiple output characters of STRING2 into one character" \
     5246
    35905247#define tr_example_usage \
    35915248       "$ echo \"gdkkn vnqkc\" | tr [a-y] [b-z]\n" \
     
    35935250
    35945251#define traceroute_trivial_usage \
    3595        "[-FIldnrv] [-f 1st_ttl] [-m max_ttl] [-p port#] [-q nqueries]\n" \
    3596        "    [-s src_addr] [-t tos] [-w wait] [-g gateway] [-i iface]\n" \
    3597        "    [-z pausemsecs] host [data size]"
    3598 #define traceroute_full_usage \
    3599        "Trace the route ip packets follow going to \"host\"" \
    3600        "\n\nOptions:\n" \
    3601        "    -F  Set the don't fragment bit\n" \
    3602        "    -I  Use ICMP ECHO instead of UDP datagrams\n" \
    3603        "    -l  Display the ttl value of the returned packet\n" \
    3604        "    -d  Set SO_DEBUG options to socket\n" \
    3605        "    -n  Print hop addresses numerically rather than symbolically\n" \
    3606        "    -r  Bypass the normal routing tables and send directly to a host\n" \
    3607        "    -v  Verbose\n" \
    3608        "    -m max_ttl  Max time-to-live (max number of hops)\n" \
    3609        "    -p port#    Base UDP port number used in probes\n" \
    3610        "            (default is 33434)\n" \
    3611        "    -q nqueries Number of probes per 'ttl' (default 3)\n" \
    3612        "    -s src_addr IP address to use as the source address\n" \
    3613        "    -t tos      Type-of-service in probe packets (default 0)\n" \
    3614        "    -w wait     Time in seconds to wait for a response to a probe\n" \
    3615        "            (default 3 sec)\n" \
    3616        "    -g      Specify a loose source route gateway (8 max)"
    3617 
     5252       "[-"IF_TRACEROUTE6("46")"FIldnrv] [-f 1ST_TTL] [-m MAXTTL] [-p PORT] [-q PROBES]\n" \
     5253       "    [-s SRC_IP] [-t TOS] [-w WAIT_SEC] [-g GATEWAY] [-i IFACE]\n" \
     5254       "    [-z PAUSE_MSEC] HOST [BYTES]"
     5255#define traceroute_full_usage "\n\n" \
     5256       "Trace the route to HOST\n" \
     5257     "\nOptions:" \
     5258    IF_TRACEROUTE6( \
     5259     "\n    -4,-6   Force IP or IPv6 name resolution" \
     5260    ) \
     5261     "\n    -F  Set the don't fragment bit" \
     5262     "\n    -I  Use ICMP ECHO instead of UDP datagrams" \
     5263     "\n    -l  Display the TTL value of the returned packet" \
     5264     "\n    -d  Set SO_DEBUG options to socket" \
     5265     "\n    -n  Print numeric addresses" \
     5266     "\n    -r  Bypass routing tables, send directly to HOST" \
     5267     "\n    -v  Verbose" \
     5268     "\n    -m  Max time-to-live (max number of hops)" \
     5269     "\n    -p  Base UDP port number used in probes" \
     5270     "\n        (default 33434)" \
     5271     "\n    -q  Number of probes per TTL (default 3)" \
     5272     "\n    -s  IP address to use as the source address" \
     5273     "\n    -t  Type-of-service in probe packets (default 0)" \
     5274     "\n    -w  Time in seconds to wait for a response (default 3)" \
     5275     "\n    -g  Loose source route gateway (8 max)" \
     5276
     5277#define traceroute6_trivial_usage \
     5278       "[-dnrv] [-m MAXTTL] [-p PORT] [-q PROBES]\n" \
     5279       "    [-s SRC_IP] [-t TOS] [-w WAIT_SEC] [-i IFACE]\n" \
     5280       "    HOST [BYTES]"
     5281#define traceroute6_full_usage "\n\n" \
     5282       "Trace the route to HOST\n" \
     5283     "\nOptions:" \
     5284     "\n    -d  Set SO_DEBUG options to socket" \
     5285     "\n    -n  Print numeric addresses" \
     5286     "\n    -r  Bypass routing tables, send directly to HOST" \
     5287     "\n    -v  Verbose" \
     5288     "\n    -m  Max time-to-live (max number of hops)" \
     5289     "\n    -p  Base UDP port number used in probes" \
     5290     "\n        (default is 33434)" \
     5291     "\n    -q  Number of probes per TTL (default 3)" \
     5292     "\n    -s  IP address to use as the source address" \
     5293     "\n    -t  Type-of-service in probe packets (default 0)" \
     5294     "\n    -w  Time in seconds to wait for a response (default 3)" \
    36185295
    36195296#define true_trivial_usage \
    36205297       ""
    3621 #define true_full_usage \
     5298#define true_full_usage "\n\n" \
    36225299       "Return an exit code of TRUE (0)"
    36235300#define true_example_usage \
     
    36285305#define tty_trivial_usage \
    36295306       ""
    3630 #define tty_full_usage \
    3631        "Print file name of standard input's terminal" \
    3632     USE_INCLUDE_SUSv2( \
    3633        "\n\nOptions:\n" \
    3634        "    -s  Print nothing, only return exit status")
     5307#define tty_full_usage "\n\n" \
     5308       "Print file name of stdin's terminal" \
     5309    IF_INCLUDE_SUSv2( "\n" \
     5310     "\nOptions:" \
     5311     "\n    -s  Print nothing, only return exit status" \
     5312    )
    36355313#define tty_example_usage \
    36365314       "$ tty\n" \
     
    36395317#define ttysize_trivial_usage \
    36405318       "[w] [h]"
    3641 #define ttysize_full_usage \
    3642        "Print dimension(s) of standard input's terminal, on error return 80x25"
    3643 
    3644 #define tune2fs_trivial_usage \
    3645        "[-c max-mounts-count] [-e errors-behavior] [-g group] " \
    3646        "[-i interval[d|m|w]] [-j] [-J journal-options] [-l] [-s sparse-flag] " \
    3647        "[-m reserved-blocks-percent] [-o [^]mount-options[,...]] " \
    3648        "[-r reserved-blocks-count] [-u user] [-C mount-count] " \
    3649        "[-L volume-label] [-M last-mounted-dir] [-O [^]feature[,...]] " \
    3650        "[-T last-check-time] [-U UUID] device"
    3651 #define tune2fs_full_usage \
    3652        "Adjust filesystem options on ext[23] filesystems"
    3653 
    3654 #define udhcpc_trivial_usage \
    3655        "[-Cfbnqtv] [-c CID] [-V VCLS] [-H HOSTNAME] [-i INTERFACE]\n" \
    3656        "    [-p pidfile] [-r IP] [-s script]"
    3657 #define udhcpc_full_usage \
    3658        "    -V,--vendorclass=CLASSID    Set vendor class identifier" \
    3659        "\n  -i,--interface=INTERFACE    Interface to use (default: eth0)" \
    3660        "\n  -H,-h,--hostname=HOSTNAME   Client hostname" \
    3661        "\n  -c,--clientid=CLIENTID  Set client identifier" \
    3662        "\n  -C,--clientid-none  Suppress default client identifier" \
    3663        "\n  -p,--pidfile=file   Store process ID of daemon in file" \
    3664        "\n  -r,--request=IP     IP address to request" \
    3665        "\n  -s,--script=file    Run file at dhcp events (default: /usr/share/udhcpc/default.script)" \
    3666        "\n  -t,--retries=N      Send up to N request packets"\
    3667        "\n  -f,--foreground Stay in foreground" \
    3668        "\n  -b,--background Background if lease cannot be immediately negotiated" \
    3669        "\n  -S,--syslog Log to syslog too" \
    3670        "\n  -n,--now    Exit with failure if lease cannot be immediately negotiated" \
    3671        "\n  -q,--quit   Quit after obtaining lease" \
    3672        "\n  -R,--release    Release IP on quit" \
    3673        "\n  -v,--version    Display version" \
     5319#define ttysize_full_usage "\n\n" \
     5320       "Print dimension(s) of stdin's terminal, on error return 80x25"
     5321
     5322#define tunctl_trivial_usage \
     5323       "[-f device] ([-t name] | -d name)" IF_FEATURE_TUNCTL_UG(" [-u owner] [-g group] [-b]")
     5324#define tunctl_full_usage "\n\n" \
     5325       "Create or delete tun interfaces\n" \
     5326     "\nOptions:" \
     5327     "\n    -f name     tun device (/dev/net/tun)" \
     5328     "\n    -t name     Create iface 'name'" \
     5329     "\n    -d name     Delete iface 'name'" \
     5330    IF_FEATURE_TUNCTL_UG( \
     5331     "\n    -u owner    Set iface owner" \
     5332     "\n    -g group    Set iface group" \
     5333     "\n    -b      Brief output" \
     5334    )
     5335#define tunctl_example_usage \
     5336       "# tunctl\n" \
     5337       "# tunctl -d tun0\n"
    36745338
    36755339#define udhcpd_trivial_usage \
    3676        "[-fS] [configfile]" \
    3677 
    3678 #define udhcpd_full_usage \
    3679        "DHCP server" \
    3680        "\n  -f  Stay in foreground" \
    3681        "\n  -S  Log to syslog too"
     5340       "[-fS]" IF_FEATURE_UDHCP_PORT(" [-P N]") " [CONFFILE]" \
     5341
     5342#define udhcpd_full_usage "\n\n" \
     5343       "DHCP server\n" \
     5344     "\n    -f  Run in foreground" \
     5345     "\n    -S  Log to syslog too" \
     5346    IF_FEATURE_UDHCP_PORT( \
     5347     "\n    -P N    Use port N (default 67)" \
     5348    )
    36825349
    36835350#define umount_trivial_usage \
    3684        "[flags] FILESYSTEM|DIRECTORY"
    3685 #define umount_full_usage \
    3686        "Unmount file systems" \
    3687        "\n\nOptions:\n" \
    3688     USE_FEATURE_UMOUNT_ALL( \
    3689        "\n  -a  Unmount all file systems" USE_FEATURE_MTAB_SUPPORT(" in /etc/mtab")) \
    3690     USE_FEATURE_MTAB_SUPPORT( \
    3691        "\n  -n  Don't erase /etc/mtab entries") \
    3692        "\n  -r  Try to remount devices as read-only if mount is busy" \
    3693        "\n  -l  Lazy umount (detach filesystem)" \
    3694        "\n  -f  Force umount (i.e., unreachable NFS server)" \
    3695     USE_FEATURE_MOUNT_LOOP( \
    3696        "\n  -D  Do not free loop device (if a loop device has been used)")
     5351       "[OPTIONS] FILESYSTEM|DIRECTORY"
     5352#define umount_full_usage "\n\n" \
     5353       "Unmount file systems\n" \
     5354     "\nOptions:" \
     5355    IF_FEATURE_UMOUNT_ALL( \
     5356     "\n    -a  Unmount all file systems" IF_FEATURE_MTAB_SUPPORT(" in /etc/mtab") \
     5357    ) \
     5358    IF_FEATURE_MTAB_SUPPORT( \
     5359     "\n    -n  Don't erase /etc/mtab entries" \
     5360    ) \
     5361     "\n    -r  Try to remount devices as read-only if mount is busy" \
     5362     "\n    -l  Lazy umount (detach filesystem)" \
     5363     "\n    -f  Force umount (i.e., unreachable NFS server)" \
     5364    IF_FEATURE_MOUNT_LOOP( \
     5365     "\n    -d  Free loop device if it has been used" \
     5366    )
     5367
    36975368#define umount_example_usage \
    36985369       "$ umount /dev/hdc1\n"
    36995370
    37005371#define uname_trivial_usage \
    3701        "[OPTION]..."
    3702 #define uname_full_usage \
    3703        "Print certain system information. With no OPTION, same as -s." \
    3704        "\n\nOptions:\n" \
    3705        "    -a  Print all information\n" \
    3706        "    -m  The machine (hardware) type\n" \
    3707        "    -n  Print the machine's network node hostname\n" \
    3708        "    -r  Print the operating system release\n" \
    3709        "    -s  Print the operating system name\n" \
    3710        "    -p  Print the host processor type\n" \
    3711        "    -v  Print the operating system version"
     5372       "[-amnrspv]"
     5373#define uname_full_usage "\n\n" \
     5374       "Print system information\n" \
     5375     "\nOptions:" \
     5376     "\n    -a  Print all" \
     5377     "\n    -m  The machine (hardware) type" \
     5378     "\n    -n  Hostname" \
     5379     "\n    -r  OS release" \
     5380     "\n    -s  OS name (default)" \
     5381     "\n    -p  Processor type" \
     5382     "\n    -v  OS version" \
     5383
    37125384#define uname_example_usage \
    37135385       "$ uname -a\n" \
     
    37155387
    37165388#define uncompress_trivial_usage \
    3717        "[-c] [-f] [name...]"
    3718 #define uncompress_full_usage \
    3719        "Uncompress .Z file[s]" \
    3720        "\n\nOptions:\n" \
    3721        "    -c  Extract to stdout\n" \
    3722        "    -f  Force overwrite an existing file"
     5389       "[-cf] [FILE]..."
     5390#define uncompress_full_usage "\n\n" \
     5391       "Decompress .Z file[s]\n" \
     5392     "\nOptions:" \
     5393     "\n    -c  Write to stdout" \
     5394     "\n    -f  Overwrite" \
    37235395
    37245396#define unexpand_trivial_usage \
    3725        "[-f][-a][-t NUM] [FILE|-]"
    3726 #define unexpand_full_usage \
    3727        "Convert spaces to tabs, writing to standard output." \
    3728        "\n\nOptions:" \
    3729        "\n  -a" USE_FEATURE_UNEXPAND_LONG_OPTIONS(",--all") \
    3730        "    Convert all blanks" \
    3731        "\n  -f" USE_FEATURE_UNEXPAND_LONG_OPTIONS(",--first-only") \
    3732        "    Convert only leading sequences of blanks" \
    3733        "\n  -t" USE_FEATURE_UNEXPAND_LONG_OPTIONS(",--tabs=N") \
    3734        "    Tabstops every N chars"
     5397       "[-fa][-t N] [FILE]..."
     5398#define unexpand_full_usage "\n\n" \
     5399       "Convert spaces to tabs, writing to stdout\n" \
     5400     "\nOptions:" \
     5401    IF_FEATURE_UNEXPAND_LONG_OPTIONS( \
     5402     "\n    -a,--all    Convert all blanks" \
     5403     "\n    -f,--first-only Convert only leading blanks" \
     5404     "\n    -t,--tabs=N Tabstops every N chars" \
     5405    ) \
     5406    IF_NOT_FEATURE_UNEXPAND_LONG_OPTIONS( \
     5407     "\n    -a  Convert all blanks" \
     5408     "\n    -f  Convert only leading blanks" \
     5409     "\n    -t N    Tabstops every N chars" \
     5410    )
    37355411
    37365412#define uniq_trivial_usage \
    3737        "[-fscdu]... [INPUT [OUTPUT]]"
    3738 #define uniq_full_usage \
    3739        "Discard all but one of successive identical lines from INPUT\n" \
    3740        "(or standard input), writing to OUTPUT (or standard output)" \
    3741        "\n\nOptions:\n" \
    3742        "    -c  Prefix lines by the number of occurrences\n" \
    3743        "    -d  Only print duplicate lines\n" \
    3744        "    -u  Only print unique lines\n" \
    3745        "    -f N    Skip the first N fields\n" \
    3746        "    -s N    Skip the first N chars (after any skipped fields)"
     5413       "[-cdu][-f,s,w N] [INPUT [OUTPUT]]"
     5414#define uniq_full_usage "\n\n" \
     5415       "Discard duplicate lines\n" \
     5416     "\nOptions:" \
     5417     "\n    -c  Prefix lines by the number of occurrences" \
     5418     "\n    -d  Only print duplicate lines" \
     5419     "\n    -u  Only print unique lines" \
     5420     "\n    -f N    Skip first N fields" \
     5421     "\n    -s N    Skip first N chars (after any skipped fields)" \
     5422     "\n    -w N    Compare N characters in line" \
     5423
    37475424#define uniq_example_usage \
    37485425       "$ echo -e \"a\\na\\nb\\nc\\nc\\na\" | sort | uniq\n" \
     
    37515428       "c\n"
    37525429
    3753 #define unix2dos_trivial_usage \
    3754        "[option] [FILE]"
    3755 #define unix2dos_full_usage \
    3756        "Convert FILE from unix format to dos format. When no option\n" \
    3757        "is given, the input is converted to the opposite output format.\n" \
    3758        "When no file is given, use stdin/stdout." \
    3759        "\n\nOptions:\n" \
    3760        "    -u  Output will be in UNIX format\n" \
    3761        "    -d  Output will be in DOS format"
    3762 
    37635430#define unzip_trivial_usage \
    3764        "[-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]"
    3765 #define unzip_full_usage \
    3766        "Extract files from ZIP archives" \
    3767        "\n\nOptions:\n" \
    3768        "    -l  List archive contents (short form)\n" \
    3769        "    -n  Never overwrite existing files (default)\n" \
    3770        "    -o  Overwrite files without prompting\n" \
    3771        "    -p  Send output to stdout\n" \
    3772        "    -q  Quiet\n" \
    3773        "    -x  Exclude these files\n" \
    3774        "    -d  Extract files into this directory"
     5431       "[-opts[modifiers]] FILE[.zip] [LIST] [-x XLIST] [-d DIR]"
     5432#define unzip_full_usage "\n\n" \
     5433       "Extract files from ZIP archives\n" \
     5434     "\nOptions:" \
     5435     "\n    -l  List archive contents (with -q for short form)" \
     5436     "\n    -n  Never overwrite files (default)" \
     5437     "\n    -o  Overwrite" \
     5438     "\n    -p  Send output to stdout" \
     5439     "\n    -q  Quiet" \
     5440     "\n    -x XLST Exclude these files" \
     5441     "\n    -d DIR  Extract files into DIR" \
    37755442
    37765443#define uptime_trivial_usage \
    37775444       ""
    3778 #define uptime_full_usage \
     5445#define uptime_full_usage "\n\n" \
    37795446       "Display the time since the last boot"
     5447
    37805448#define uptime_example_usage \
    37815449       "$ uptime\n" \
     
    37845452#define usleep_trivial_usage \
    37855453       "N"
    3786 #define usleep_full_usage \
     5454#define usleep_full_usage "\n\n" \
    37875455       "Pause for N microseconds"
     5456
    37885457#define usleep_example_usage \
    37895458       "$ usleep 1000000\n" \
     
    37915460
    37925461#define uudecode_trivial_usage \
    3793        "[-o outfile] [infile]"
    3794 #define uudecode_full_usage \
     5462       "[-o OUTFILE] [INFILE]"
     5463#define uudecode_full_usage "\n\n" \
    37955464       "Uudecode a file\n" \
    3796        "NB: finds outfile name in uuencoded source unless -o is given"
     5465       "Finds outfile name in uuencoded source unless -o is given"
     5466
    37975467#define uudecode_example_usage \
    37985468       "$ uudecode -o busybox busybox.uu\n" \
     
    38015471
    38025472#define uuencode_trivial_usage \
    3803        "[-m] [infile] stored_filename"
    3804 #define uuencode_full_usage \
    3805        "Uuencode a file to stdout" \
    3806        "\n\nOptions:\n" \
    3807        "    -m  Use base64 encoding per RFC1521"
     5473       "[-m] [INFILE] STORED_FILENAME"
     5474#define uuencode_full_usage "\n\n" \
     5475       "Uuencode a file to stdout\n" \
     5476     "\nOptions:" \
     5477     "\n    -m  Use base64 encoding per RFC1521" \
     5478
    38085479#define uuencode_example_usage \
    38095480       "$ uuencode busybox busybox\n" \
     
    38145485
    38155486#define vconfig_trivial_usage \
    3816        "COMMAND [OPTIONS] ..."
    3817 #define vconfig_full_usage \
    3818        "Create and remove virtual ethernet devices" \
    3819        "\n\nOptions:\n" \
    3820        "    add     [interface-name] [vlan_id]\n" \
    3821        "    rem     [vlan-name]\n" \
    3822        "    set_flag    [interface-name] [flag-num] [0 | 1]\n" \
    3823        "    set_egress_map  [vlan-name] [skb_priority] [vlan_qos]\n" \
    3824        "    set_ingress_map [vlan-name] [skb_priority] [vlan_qos]\n" \
    3825        "    set_name_type   [name-type]"
     5487       "COMMAND [OPTIONS]"
     5488#define vconfig_full_usage "\n\n" \
     5489       "Create and remove virtual ethernet devices\n" \
     5490     "\nOptions:" \
     5491     "\n    add     [interface-name] [vlan_id]" \
     5492     "\n    rem     [vlan-name]" \
     5493     "\n    set_flag    [interface-name] [flag-num] [0 | 1]" \
     5494     "\n    set_egress_map  [vlan-name] [skb_priority] [vlan_qos]" \
     5495     "\n    set_ingress_map [vlan-name] [skb_priority] [vlan_qos]" \
     5496     "\n    set_name_type   [name-type]" \
    38265497
    38275498#define vi_trivial_usage \
    3828        "[OPTION] [FILE]..."
    3829 #define vi_full_usage \
    3830        "Edit FILE" \
    3831        "\n\nOptions:\n" \
    3832        "    -R  Read-only - do not write to the file"
     5499       "[OPTIONS] [FILE]..."
     5500#define vi_full_usage "\n\n" \
     5501       "Edit FILE\n" \
     5502     "\nOptions:" \
     5503    IF_FEATURE_VI_COLON( \
     5504     "\n    -c  Initial command to run ($EXINIT also available)" \
     5505    ) \
     5506    IF_FEATURE_VI_READONLY( \
     5507     "\n    -R  Read-only" \
     5508    ) \
     5509     "\n    -H  Short help regarding available features" \
    38335510
    38345511#define vlock_trivial_usage \
    3835        "[OPTIONS]"
    3836 #define vlock_full_usage \
    3837        "Lock a virtual terminal. A password is required to unlock." \
    3838        "\n\nOptions:\n" \
    3839        "    -a  Lock all VTs"
     5512       "[-a]"
     5513#define vlock_full_usage "\n\n" \
     5514       "Lock a virtual terminal. A password is required to unlock.\n" \
     5515     "\nOptions:" \
     5516     "\n    -a  Lock all VTs" \
     5517
     5518#define volname_trivial_usage \
     5519       "[DEVICE]"
     5520#define volname_full_usage "\n\n" \
     5521       "Show CD volume name of the DEVICE (default /dev/cdrom)"
     5522
     5523#define wall_trivial_usage \
     5524    "[FILE]"
     5525#define wall_full_usage "\n\n" \
     5526    "Write content of FILE or stdin to all logged-in users"
     5527#define wall_sample_usage \
     5528    "echo foo | wall\n" \
     5529    "wall ./mymessage"
    38405530
    38415531#define watch_trivial_usage \
    3842        "[-n seconds] [-t] COMMAND..."
    3843 #define watch_full_usage \
    3844        "Execute a program periodically" \
    3845        "\n\nOptions:\n" \
    3846        "    -n  Loop period in seconds - default is 2\n" \
    3847        "    -t  Don't print header"
     5532       "[-n SEC] [-t] PROG ARGS"
     5533#define watch_full_usage "\n\n" \
     5534       "Run PROG periodically\n" \
     5535     "\nOptions:" \
     5536     "\n    -n  Loop period in seconds (default 2)" \
     5537     "\n    -t  Don't print header" \
     5538
    38485539#define watch_example_usage \
    38495540       "$ watch date\n" \
     
    38535544
    38545545#define watchdog_trivial_usage \
    3855        "[-t seconds] [-F] DEV"
    3856 #define watchdog_full_usage \
    3857        "Periodically write to watchdog device DEV" \
    3858        "\n\nOptions:\n" \
    3859        "    -t  Timer period in seconds - default is 30\n" \
    3860        "    -F  Stay in the foreground and don't fork"
    3861 
    3862 #define wc_trivial_usage \
    3863        "[OPTION]... [FILE]..."
    3864 #define wc_full_usage \
    3865        "Print line, word, and byte counts for each FILE, and a total line if\n" \
    3866        "more than one FILE is specified. With no FILE, read standard input." \
    3867        "\n\nOptions:\n" \
    3868        "    -c  Print the byte counts\n" \
    3869        "    -l  Print the newline counts\n" \
    3870        "    -L  Print the length of the longest line\n" \
    3871        "    -w  Print the word counts"
    3872 #define wc_example_usage \
    3873        "$ wc /etc/passwd\n" \
    3874        "     31      46    1365 /etc/passwd\n"
     5546       "[-t N[ms]] [-T N[ms]] [-F] DEV"
     5547#define watchdog_full_usage "\n\n" \
     5548       "Periodically write to watchdog device DEV\n" \
     5549     "\nOptions:" \
     5550     "\n    -T N    Reboot after N seconds if not reset (default 60)" \
     5551     "\n    -t N    Reset every N seconds (default 30)" \
     5552     "\n    -F  Run in foreground" \
     5553     "\n" \
     5554     "\nUse 500ms to specify period in milliseconds" \
    38755555
    38765556#define wget_trivial_usage \
    3877        "[-c|--continue] [-s|--spider] [-q|--quiet] [-O|--output-document file]\n" \
    3878        "        [--header 'header: value'] [-Y|--proxy on/off] [-P DIR]\n" \
    3879        "        [-U|--user-agent agent] url"
    3880 #define wget_full_usage \
    3881        "Retrieve files via HTTP or FTP" \
    3882        "\n\nOptions:\n" \
    3883        "    -s  Spider mode - only check file existence\n" \
    3884        "    -c  Continue retrieval of aborted transfer\n" \
    3885        "    -q  Quiet\n" \
    3886        "    -P  Set directory prefix to DIR\n" \
    3887        "    -O  Save to filename ('-' for stdout)\n" \
    3888        "    -U  Adjust 'User-Agent' field\n" \
    3889        "    -Y  Use proxy ('on' or 'off')"
     5557    IF_FEATURE_WGET_LONG_OPTIONS( \
     5558       "[-c|--continue] [-s|--spider] [-q|--quiet] [-O|--output-document FILE]\n" \
     5559       "    [--header 'header: value'] [-Y|--proxy on/off] [-P DIR]\n" \
     5560       "    [--no-check-certificate] [-U|--user-agent AGENT]" \
     5561            IF_FEATURE_WGET_TIMEOUT("[-T SEC] ") " URL" \
     5562    ) \
     5563    IF_NOT_FEATURE_WGET_LONG_OPTIONS( \
     5564       "[-csq] [-O FILE] [-Y on/off] [-P DIR] [-U AGENT]" \
     5565            IF_FEATURE_WGET_TIMEOUT("[-T SEC] ") " URL" \
     5566    )
     5567#define wget_full_usage "\n\n" \
     5568       "Retrieve files via HTTP or FTP\n" \
     5569     "\nOptions:" \
     5570     "\n    -s  Spider mode - only check file existence" \
     5571     "\n    -c  Continue retrieval of aborted transfer" \
     5572     "\n    -q  Quiet" \
     5573     "\n    -P DIR  Save to DIR (default .)" \
     5574    IF_FEATURE_WGET_TIMEOUT( \
     5575     "\n    -T SEC  Network read timeout is SEC seconds" \
     5576    ) \
     5577     "\n    -O FILE Save to FILE ('-' for stdout)" \
     5578     "\n    -U STR  Use STR for User-Agent header" \
     5579     "\n    -Y  Use proxy ('on' or 'off')" \
    38905580
    38915581#define which_trivial_usage \
    3892        "[COMMAND ...]"
    3893 #define which_full_usage \
     5582       "[COMMAND]..."
     5583#define which_full_usage "\n\n" \
    38945584       "Locate a COMMAND"
    38955585#define which_example_usage \
     
    38985588
    38995589#define who_trivial_usage \
    3900        " "
    3901 #define who_full_usage \
    3902        "Print the current user names and related information"
     5590       "[-a]"
     5591#define who_full_usage "\n\n" \
     5592       "Show who is logged on\n" \
     5593     "\nOptions:" \
     5594     "\n    -a  Show all" \
    39035595
    39045596#define whoami_trivial_usage \
    39055597       ""
    3906 #define whoami_full_usage \
     5598#define whoami_full_usage "\n\n" \
    39075599       "Print the user name associated with the current effective user id"
    3908 
    3909 #define xargs_trivial_usage \
    3910        "[OPTIONS] [COMMAND] [ARGS...]"
    3911 #define xargs_full_usage \
    3912        "Execute COMMAND on every item given by standard input" \
    3913        "\n\nOptions:\n" \
    3914     USE_FEATURE_XARGS_SUPPORT_CONFIRMATION( \
    3915        "    -p  Prompt the user about whether to run each command\n") \
    3916        "    -r  Do not run command for empty read lines\n" \
    3917     USE_FEATURE_XARGS_SUPPORT_TERMOPT( \
    3918        "    -x  Exit if the size is exceeded\n") \
    3919     USE_FEATURE_XARGS_SUPPORT_ZERO_TERM( \
    3920        "    -0  Input filenames are terminated by a null character\n") \
    3921        "    -t  Print the command line on stderr before executing it"
    3922 #define xargs_example_usage \
    3923        "$ ls | xargs gzip\n" \
    3924        "$ find . -name '*.c' -print | xargs rm\n"
    3925 
    3926 #define yes_trivial_usage \
    3927        "[OPTION]... [STRING]..."
    3928 #define yes_full_usage \
    3929        "Repeatedly output a line with all specified STRING(s), or 'y'"
    39305600
    39315601#define zcat_trivial_usage \
    39325602       "FILE"
    3933 #define zcat_full_usage \
    3934        "Uncompress to stdout"
     5603#define zcat_full_usage "\n\n" \
     5604       "Decompress to stdout"
    39355605
    39365606#define zcip_trivial_usage \
    3937        "[OPTIONS] ifname script"
    3938 #define zcip_full_usage \
    3939        "Manage a ZeroConf IPv4 link-local address" \
    3940        "\n\nOptions:\n" \
    3941        "    -f      Foreground mode\n" \
    3942        "    -q      Quit after address (no daemon)\n" \
    3943        "    -r 169.254.x.x  Request this address first\n" \
    3944        "    -v      Verbose"
    3945 
    3946 #endif /* __BB_USAGE_H__ */
     5607       "[OPTIONS] IFACE SCRIPT"
     5608#define zcip_full_usage "\n\n" \
     5609       "Manage a ZeroConf IPv4 link-local address\n" \
     5610     "\nOptions:" \
     5611     "\n    -f      Run in foreground" \
     5612     "\n    -q      Quit after obtaining address" \
     5613     "\n    -r 169.254.x.x  Request this address first" \
     5614     "\n    -v      Verbose" \
     5615     "\n" \
     5616     "\nWith no -q, runs continuously monitoring for ARP conflicts," \
     5617     "\nexits only on I/O errors (link down etc)" \
     5618
     5619
     5620#endif
  • branches/2.2.9/mindi-busybox/include/xatonum.h

    r1765 r2725  
    55 * Copyright (C) 2003  Manuel Novoa III  <mjn3@codepoet.org>
    66 *
    7  * Licensed under GPLv2, see file LICENSE in this tarball for details.
     7 * Licensed under GPLv2, see file LICENSE in this source tree.
    88 */
     9
     10PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
    911
    1012/* Provides extern declarations of functions */
    1113#define DECLARE_STR_CONV(type, T, UT) \
    1214\
    13 unsigned type xstrto##UT##_range_sfx(const char *str, int b, unsigned type l, unsigned type u, const struct suffix_mult *sfx); \
    14 unsigned type xstrto##UT##_range(const char *str, int b, unsigned type l, unsigned type u); \
    15 unsigned type xstrto##UT##_sfx(const char *str, int b, const struct suffix_mult *sfx); \
    16 unsigned type xstrto##UT(const char *str, int b); \
    17 unsigned type xato##UT##_range_sfx(const char *str, unsigned type l, unsigned type u, const struct suffix_mult *sfx); \
    18 unsigned type xato##UT##_range(const char *str, unsigned type l, unsigned type u); \
    19 unsigned type xato##UT##_sfx(const char *str, const struct suffix_mult *sfx); \
    20 unsigned type xato##UT(const char *str); \
    21 type xstrto##T##_range_sfx(const char *str, int b, type l, type u, const struct suffix_mult *sfx); \
    22 type xstrto##T##_range(const char *str, int b, type l, type u); \
    23 type xato##T##_range_sfx(const char *str, type l, type u, const struct suffix_mult *sfx); \
    24 type xato##T##_range(const char *str, type l, type u); \
    25 type xato##T##_sfx(const char *str, const struct suffix_mult *sfx); \
    26 type xato##T(const char *str); \
     15unsigned type xstrto##UT##_range_sfx(const char *str, int b, unsigned type l, unsigned type u, const struct suffix_mult *sfx) FAST_FUNC; \
     16unsigned type xstrto##UT##_range(const char *str, int b, unsigned type l, unsigned type u) FAST_FUNC; \
     17unsigned type xstrto##UT##_sfx(const char *str, int b, const struct suffix_mult *sfx) FAST_FUNC; \
     18unsigned type xstrto##UT(const char *str, int b) FAST_FUNC; \
     19unsigned type xato##UT##_range_sfx(const char *str, unsigned type l, unsigned type u, const struct suffix_mult *sfx) FAST_FUNC; \
     20unsigned type xato##UT##_range(const char *str, unsigned type l, unsigned type u) FAST_FUNC; \
     21unsigned type xato##UT##_sfx(const char *str, const struct suffix_mult *sfx) FAST_FUNC; \
     22unsigned type xato##UT(const char *str) FAST_FUNC; \
     23type xstrto##T##_range_sfx(const char *str, int b, type l, type u, const struct suffix_mult *sfx) FAST_FUNC; \
     24type xstrto##T##_range(const char *str, int b, type l, type u) FAST_FUNC; \
     25type xstrto##T(const char *str, int b) FAST_FUNC; \
     26type xato##T##_range_sfx(const char *str, type l, type u, const struct suffix_mult *sfx) FAST_FUNC; \
     27type xato##T##_range(const char *str, type l, type u) FAST_FUNC; \
     28type xato##T##_sfx(const char *str, const struct suffix_mult *sfx) FAST_FUNC; \
     29type xato##T(const char *str) FAST_FUNC; \
    2730
    2831/* Unsigned long long functions always exist */
     
    6568{ return xstrto##W##_range(str, b, l, u); } \
    6669static ALWAYS_INLINE \
     70narrow xstrto##N(const char *str, int b) \
     71{ return xstrto##W(str, b); } \
     72static ALWAYS_INLINE \
    6773narrow xato##N##_range_sfx(const char *str, narrow l, narrow u, const struct suffix_mult *sfx) \
    6874{ return xato##W##_range_sfx(str, l, u, sfx); } \
     
    96102/* Specialized */
    97103
    98 int BUG_xatou32_unimplemented(void);
     104uint32_t BUG_xatou32_unimplemented(void);
    99105static ALWAYS_INLINE uint32_t xatou32(const char *numstr)
    100106{
     
    106112}
    107113
    108 /* Non-aborting kind of convertors */
     114/* Non-aborting kind of convertors: bb_strto[u][l]l */
    109115
    110 unsigned long long bb_strtoull(const char *arg, char **endp, int base);
    111 long long bb_strtoll(const char *arg, char **endp, int base);
     116/* On exit: errno = 0 only if there was non-empty, '\0' terminated value
     117 * errno = EINVAL if value was not '\0' terminated, but otherwise ok
     118 *    Return value is still valid, caller should just check whether end[0]
     119 *    is a valid terminating char for particular case. OTOH, if caller
     120 *    requires '\0' terminated input, [s]he can just check errno == 0.
     121 * errno = ERANGE if value had alphanumeric terminating char ("1234abcg").
     122 * errno = ERANGE if value is out of range, missing, etc.
     123 * errno = ERANGE if value had minus sign for strtouXX (even "-0" is not ok )
     124 *    return value is all-ones in this case.
     125 */
     126
     127unsigned long long bb_strtoull(const char *arg, char **endp, int base) FAST_FUNC;
     128long long bb_strtoll(const char *arg, char **endp, int base) FAST_FUNC;
    112129
    113130#if ULONG_MAX == ULLONG_MAX
     
    119136{ return bb_strtoll(arg, endp, base); }
    120137#else
    121 unsigned long bb_strtoul(const char *arg, char **endp, int base);
    122 long bb_strtol(const char *arg, char **endp, int base);
     138unsigned long bb_strtoul(const char *arg, char **endp, int base) FAST_FUNC;
     139long bb_strtol(const char *arg, char **endp, int base) FAST_FUNC;
    123140#endif
    124141
     
    138155{ return bb_strtol(arg, endp, base); }
    139156#else
    140 unsigned bb_strtou(const char *arg, char **endp, int base);
    141 int bb_strtoi(const char *arg, char **endp, int base);
     157unsigned bb_strtou(const char *arg, char **endp, int base) FAST_FUNC;
     158int bb_strtoi(const char *arg, char **endp, int base) FAST_FUNC;
    142159#endif
    143160
    144 int BUG_bb_strtou32_unimplemented(void);
     161uint32_t BUG_bb_strtou32_unimplemented(void);
    145162static ALWAYS_INLINE
    146163uint32_t bb_strtou32(const char *arg, char **endp, int base)
     
    155172/* Floating point */
    156173
    157 /* double bb_strtod(const char *arg, char **endp); */
     174double bb_strtod(const char *arg, char **endp) FAST_FUNC;
     175
     176POP_SAVED_FUNCTION_VISIBILITY
  • branches/2.2.9/mindi-busybox/include/xregex.h

    r1765 r2725  
    55 *
    66 * Based in part on code from sash, Copyright (c) 1999 by David I. Bell
    7  * Permission has been granted to redistribute this code under the GPL.
     7 * Permission has been granted to redistribute this code under GPL.
    88 *
    9  * Licensed under GPLv2 or later, see file License in this tarball for details.
     9 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
    1010 */
    11 #ifndef __BB_REGEX__
    12 #define __BB_REGEX__
     11#ifndef BB_REGEX_H
     12#define BB_REGEX_H 1
    1313
    1414#include <regex.h>
    15 char* regcomp_or_errmsg(regex_t *preg, const char *regex, int cflags);
    16 void xregcomp(regex_t *preg, const char *regex, int cflags);
     15
     16PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
     17
     18char* regcomp_or_errmsg(regex_t *preg, const char *regex, int cflags) FAST_FUNC;
     19void xregcomp(regex_t *preg, const char *regex, int cflags) FAST_FUNC;
     20
     21POP_SAVED_FUNCTION_VISIBILITY
    1722
    1823#endif
Note: See TracChangeset for help on using the changeset viewer.