ifconfig: code shrink
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 4 Nov 2007 04:10:17 +0000 (04:10 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 4 Nov 2007 04:10:17 +0000 (04:10 -0000)
adjtimex: code shrink
libbb: move nth_string function into libbb
hdparm: nth_string was here

   text    data     bss     dec     hex filename
 730013   10334   12032  752379   b7afb busybox_old
 730093   10134   12032  752259   b7a83 busybox_unstripped

include/libbb.h
libbb/compare_string_array.c
miscutils/adjtimex.c
miscutils/hdparm.c
networking/ifconfig.c

index 71f439f..77c678c 100644 (file)
@@ -846,10 +846,13 @@ extern int correct_password(const struct passwd *pw);
 /* Returns a ptr to static storage */
 extern char *pw_encrypt(const char *clear, const char *salt);
 extern int obscure(const char *old, const char *newval, const struct passwd *pwdp);
-extern int index_in_str_array(const char *const string_array[], const char *key);
-extern int index_in_strings(const char *strings, const char *key);
-extern int index_in_substr_array(const char *const string_array[], const char *key);
-extern int index_in_substrings(const char *strings, const char *key);
+
+int index_in_str_array(const char *const string_array[], const char *key);
+int index_in_strings(const char *strings, const char *key);
+int index_in_substr_array(const char *const string_array[], const char *key);
+int index_in_substrings(const char *strings, const char *key);
+const char *nth_string(const char *strings, int n);
+
 extern void print_login_issue(const char *issue_file, const char *tty);
 extern void print_login_prompt(void);
 
index 731d3d8..7b5ce85 100644 (file)
@@ -67,3 +67,12 @@ int index_in_substrings(const char *strings, const char *key)
        }
        return -1;
 }
+
+const char *nth_string(const char *strings, int n)
+{
+        while (n) {
+                n--;
+                strings += strlen(strings) + 1;
+        }
+        return strings;
+}
index 67dd0a9..07f0834 100644 (file)
 #include "libbb.h"
 #include <sys/timex.h>
 
-static const struct {
-       int bit;
-       const char *name;
-} statlist[] = {
-       { STA_PLL,       "PLL"       },
-       { STA_PPSFREQ,   "PPSFREQ"   },
-       { STA_PPSTIME,   "PPSTIME"   },
-       { STA_FLL,       "FFL"       },
-       { STA_INS,       "INS"       },
-       { STA_DEL,       "DEL"       },
-       { STA_UNSYNC,    "UNSYNC"    },
-       { STA_FREQHOLD,  "FREQHOLD"  },
-       { STA_PPSSIGNAL, "PPSSIGNAL" },
-       { STA_PPSJITTER, "PPSJITTER" },
-       { STA_PPSWANDER, "PPSWANDER" },
-       { STA_PPSERROR,  "PPSERROR"  },
-       { STA_CLOCKERR,  "CLOCKERR"  },
-       { 0, NULL }
+static const uint16_t statlist_bit[] = {
+       STA_PLL,
+       STA_PPSFREQ,
+       STA_PPSTIME,
+       STA_FLL,
+       STA_INS,
+       STA_DEL,
+       STA_UNSYNC,
+       STA_FREQHOLD,
+       STA_PPSSIGNAL,
+       STA_PPSJITTER,
+       STA_PPSWANDER,
+       STA_PPSERROR,
+       STA_CLOCKERR,
+       0
 };
+static const char statlist_name[] =
+       "PLL"       "\0"
+       "PPSFREQ"   "\0"
+       "PPSTIME"   "\0"
+       "FFL"       "\0"
+       "INS"       "\0"
+       "DEL"       "\0"
+       "UNSYNC"    "\0"
+       "FREQHOLD"  "\0"
+       "PPSSIGNAL" "\0"
+       "PPSJITTER" "\0"
+       "PPSWANDER" "\0"
+       "PPSERROR"  "\0"
+       "CLOCKERR"
+;
 
-static const char *const ret_code_descript[] = {
-       "clock synchronized",
-       "insert leap second",
-       "delete leap second",
-       "leap second in progress",
-       "leap second has occurred",
+static const char ret_code_descript[] =
+       "clock synchronized" "\0"
+       "insert leap second" "\0"
+       "delete leap second" "\0"
+       "leap second in progress" "\0"
+       "leap second has occurred" "\0"
        "clock not synchronized"
-};
+;
 
 int adjtimex_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int adjtimex_main(int argc, char **argv)
@@ -52,7 +64,7 @@ int adjtimex_main(int argc, char **argv)
        unsigned opt;
        char *opt_o, *opt_f, *opt_p, *opt_t;
        struct timex txc;
-       int i, ret, sep;
+       int i, ret;
        const char *descript;
        txc.modes=0;
 
@@ -81,33 +93,42 @@ int adjtimex_main(int argc, char **argv)
 
        ret = adjtimex(&txc);
 
-       if (ret < 0) perror("adjtimex");
+       if (ret < 0) {
+               bb_perror_nomsg_and_die();
+       }
+
+       if (!(opt & OPT_quiet)) {
+               int sep;
+               const char *name;
 
-       if (!(opt & OPT_quiet) && ret>=0) {
                printf(
                        "    mode:         %d\n"
                        "-o  offset:       %ld\n"
                        "-f  frequency:    %ld\n"
                        "    maxerror:     %ld\n"
                        "    esterror:     %ld\n"
-                       "    status:       %d ( ",
+                       "    status:       %d (",
                txc.modes, txc.offset, txc.freq, txc.maxerror,
                txc.esterror, txc.status);
 
                /* representative output of next code fragment:
                   "PLL | PPSTIME" */
-               sep=0;
-               for (i=0; statlist[i].name; i++) {
-                       if (txc.status & statlist[i].bit) {
-                               if (sep) fputs(" | ",stdout);
-                               fputs(statlist[i].name,stdout);
-                               sep=1;
+               name = statlist_name;
+               sep = 0;
+               for (i = 0; statlist_bit[i]; i++) {
+                       if (txc.status & statlist_bit[i]) {
+                               if (sep)
+                                       fputs(" | ", stdout);
+                               fputs(name, stdout);
+                               sep = 1;
                        }
+                       name += strlen(name) + 1;
                }
 
                descript = "error";
-               if (ret >= 0 && ret <= 5) descript = ret_code_descript[ret];
-               printf(" )\n"
+               if (ret <= 5)
+                       descript = nth_string(ret_code_descript, ret);
+               printf(")\n"
                        "-p  timeconstant: %ld\n"
                        "    precision:    %ld\n"
                        "    tolerance:    %ld\n"
@@ -119,5 +140,6 @@ int adjtimex_main(int argc, char **argv)
                txc.precision, txc.tolerance, txc.tick,
                (long)txc.time.tv_sec, (long)txc.time.tv_usec, ret, descript);
        }
-       return (ret<0);
+
+       return 0;
 }
index c8129d7..93b1aac 100644 (file)
@@ -491,15 +491,6 @@ static uint8_t mode_loop(uint16_t mode_sup, uint16_t mode_sel, int cc, uint8_t *
        return err_dma;
 }
 
-static const char *nth_str(const char *strings, int n)
-{
-       while (n) {
-               n--;
-               strings += strlen(strings) + 1;
-       }
-       return strings;
-}
-
 static const char pkt_str[] ALIGN1 =
        "Direct-access device" "\0"             /* word 0, bits 12-8 = 00 */
        "Sequential-access device" "\0"         /* word 0, bits 12-8 = 01 */
@@ -710,7 +701,7 @@ static void identify(uint16_t *val)
        } else if (!(val[GEN_CONFIG] & NOT_ATAPI)) {
                dev = ATAPI_DEV;
                eqpt = (val[GEN_CONFIG] & EQPT_TYPE) >> SHIFT_EQPT;
-               printf("ATAPI %s, with ", eqpt <= 0xf ? nth_str(pkt_str, eqpt) : "unknown");
+               printf("ATAPI %s, with ", eqpt <= 0xf ? nth_string(pkt_str, eqpt) : "unknown");
                like_std = 3;
        } else
                /* "Unknown device type:\n\tbits 15&14 of general configuration word 0 both set to 1.\n" */
@@ -748,7 +739,7 @@ static void identify(uint16_t *val)
                if (val[MINOR] && (val[MINOR] <= MINOR_MAX)) {
                        if (like_std < 3) like_std = 3;
                        std = actual_ver[val[MINOR]];
-                       if (std) printf("\n\tUsed: %s ", nth_str(minor_str, val[MINOR]));
+                       if (std) printf("\n\tUsed: %s ", nth_string(minor_str, val[MINOR]));
 
                }
                /* looks like when they up-issue the std, they obsolete one;
@@ -847,7 +838,7 @@ static void identify(uint16_t *val)
                jj = val[GEN_CONFIG] >> 1;
                for (ii = 1; ii < 15; ii++) {
                        if (jj & 0x0001)
-                               printf("\t%s\n", nth_str(ata1_cfg_str, ii));
+                               printf("\t%s\n", nth_string(ata1_cfg_str, ii));
                        jj >>=1;
                }
        }
@@ -1070,7 +1061,7 @@ static void identify(uint16_t *val)
                jj = val[CMDS_SUPP_0];
                kk = val[CMDS_EN_0];
                for (ii = 0; ii < NUM_CMD_FEAT_STR; ii++) {
-                       const char *feat_str = nth_str(cmd_feat_str, ii);
+                       const char *feat_str = nth_string(cmd_feat_str, ii);
                        if ((jj & 0x8000) && (*feat_str != '\0')) {
                                printf("\t%s\t%s\n", (kk & 0x8000) ? "   *" : "", feat_str);
                        }
@@ -1088,7 +1079,7 @@ static void identify(uint16_t *val)
        }
        /* Removable Media Status Notification feature set */
        if ((val[RM_STAT] & RM_STAT_BITS) == RM_STAT_SUP)
-               printf("\t%s supported\n", nth_str(cmd_feat_str, 27));
+               printf("\t%s supported\n", nth_string(cmd_feat_str, 27));
 
        /* security */
        if ((eqpt != CDROM) && (like_std > 3)
@@ -1100,7 +1091,7 @@ static void identify(uint16_t *val)
                jj = val[SECU_STATUS];
                if (jj) {
                        for (ii = 0; ii < NUM_SECU_STR; ii++) {
-                               printf("\t%s\t%s\n", (!(jj & 0x0001)) ? "not" : "", nth_str(secu_str, ii));
+                               printf("\t%s\t%s\n", (!(jj & 0x0001)) ? "not" : "", nth_string(secu_str, ii));
                                jj >>=1;
                        }
                        if (val[SECU_STATUS] & SECU_ENABLED) {
@@ -1182,13 +1173,13 @@ static void dump_identity(const struct hd_driveid *id)
                                id->model, id->fw_rev, id->serial_no);
        for (i = 0; i <= 15; i++) {
                if (id->config & (1<<i))
-                       printf(" %s", nth_str(cfg_str, i));
+                       printf(" %s", nth_string(cfg_str, i));
        }
        printf(" }\n RawCHS=%u/%u/%u, TrkSize=%u, SectSize=%u, ECCbytes=%u\n"
                        " BuffType=(%u) %s, BuffSize=%ukB, MaxMultSect=%u",
                                id->cyls, id->heads, id->sectors, id->track_bytes,
                                id->sector_bytes, id->ecc_bytes,
-                               id->buf_type, nth_str(BuffType, (id->buf_type > 3) ? 0 : id->buf_type),
+                               id->buf_type, nth_string(BuffType, (id->buf_type > 3) ? 0 : id->buf_type),
                                id->buf_size/2, id->max_multsect);
        if (id->max_multsect) {
                printf(", MultSect=");
@@ -1294,7 +1285,7 @@ static void dump_identity(const struct hd_driveid *id)
        if ((id->minor_rev_num && id->minor_rev_num <= 31)
         || (id->major_rev_num && id->minor_rev_num <= 31)
        ) {
-               printf("\n Drive conforms to: %s: ", (id->minor_rev_num <= 31) ? nth_str(minor_str, id->minor_rev_num) : "unknown");
+               printf("\n Drive conforms to: %s: ", (id->minor_rev_num <= 31) ? nth_string(minor_str, id->minor_rev_num) : "unknown");
                if (id->major_rev_num != 0x0000 &&  /* NOVAL_0 */
                    id->major_rev_num != 0xFFFF) {  /* NOVAL_1 */
                        for (i = 0; i <= 15; i++) {
index 3dcb118..fff5f5d 100644 (file)
@@ -164,7 +164,7 @@ struct in6_ifreq {
 
 struct arg1opt {
        const char *name;
-       int selector;
+       unsigned short selector;
        unsigned short ifr_offset;
 };
 
@@ -183,70 +183,70 @@ struct options {
 #define ifreq_offsetof(x)  offsetof(struct ifreq, x)
 
 static const struct arg1opt Arg1Opt[] = {
-       {"SIOCSIFMETRIC",  SIOCSIFMETRIC,  ifreq_offsetof(ifr_metric)},
-       {"SIOCSIFMTU",     SIOCSIFMTU,     ifreq_offsetof(ifr_mtu)},
-       {"SIOCSIFTXQLEN",  SIOCSIFTXQLEN,  ifreq_offsetof(ifr_qlen)},
-       {"SIOCSIFDSTADDR", SIOCSIFDSTADDR, ifreq_offsetof(ifr_dstaddr)},
-       {"SIOCSIFNETMASK", SIOCSIFNETMASK, ifreq_offsetof(ifr_netmask)},
-       {"SIOCSIFBRDADDR", SIOCSIFBRDADDR, ifreq_offsetof(ifr_broadaddr)},
+       { "SIFMETRIC",  SIOCSIFMETRIC,  ifreq_offsetof(ifr_metric) },
+       { "SIFMTU",     SIOCSIFMTU,     ifreq_offsetof(ifr_mtu) },
+       { "SIFTXQLEN",  SIOCSIFTXQLEN,  ifreq_offsetof(ifr_qlen) },
+       { "SIFDSTADDR", SIOCSIFDSTADDR, ifreq_offsetof(ifr_dstaddr) },
+       { "SIFNETMASK", SIOCSIFNETMASK, ifreq_offsetof(ifr_netmask) },
+       { "SIFBRDADDR", SIOCSIFBRDADDR, ifreq_offsetof(ifr_broadaddr) },
 #if ENABLE_FEATURE_IFCONFIG_HW
-       {"SIOCSIFHWADDR",  SIOCSIFHWADDR,  ifreq_offsetof(ifr_hwaddr)},
+       { "SIFHWADDR",  SIOCSIFHWADDR,  ifreq_offsetof(ifr_hwaddr) },
 #endif
-       {"SIOCSIFDSTADDR", SIOCSIFDSTADDR, ifreq_offsetof(ifr_dstaddr)},
+       { "SIFDSTADDR", SIOCSIFDSTADDR, ifreq_offsetof(ifr_dstaddr) },
 #ifdef SIOCSKEEPALIVE
-       {"SIOCSKEEPALIVE", SIOCSKEEPALIVE, ifreq_offsetof(ifr_data)},
+       { "SKEEPALIVE", SIOCSKEEPALIVE, ifreq_offsetof(ifr_data) },
 #endif
 #ifdef SIOCSOUTFILL
-       {"SIOCSOUTFILL",   SIOCSOUTFILL,   ifreq_offsetof(ifr_data)},
+       { "SOUTFILL",   SIOCSOUTFILL,   ifreq_offsetof(ifr_data) },
 #endif
 #if ENABLE_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
-       {"SIOCSIFMAP",     SIOCSIFMAP,     ifreq_offsetof(ifr_map.mem_start)},
-       {"SIOCSIFMAP",     SIOCSIFMAP,     ifreq_offsetof(ifr_map.base_addr)},
-       {"SIOCSIFMAP",     SIOCSIFMAP,     ifreq_offsetof(ifr_map.irq)},
+       { "SIFMAP",     SIOCSIFMAP,     ifreq_offsetof(ifr_map.mem_start) },
+       { "SIFMAP",     SIOCSIFMAP,     ifreq_offsetof(ifr_map.base_addr) },
+       { "SIFMAP",     SIOCSIFMAP,     ifreq_offsetof(ifr_map.irq) },
 #endif
        /* Last entry if for unmatched (possibly hostname) arg. */
 #if ENABLE_FEATURE_IPV6
-       {"SIOCSIFADDR",    SIOCSIFADDR,    ifreq_offsetof(ifr_addr)}, /* IPv6 version ignores the offset */
-       {"SIOCDIFADDR",    SIOCDIFADDR,    ifreq_offsetof(ifr_addr)}, /* IPv6 version ignores the offset */
+       { "SIFADDR",    SIOCSIFADDR,    ifreq_offsetof(ifr_addr) }, /* IPv6 version ignores the offset */
+       { "DIFADDR",    SIOCDIFADDR,    ifreq_offsetof(ifr_addr) }, /* IPv6 version ignores the offset */
 #endif
-       {"SIOCSIFADDR",    SIOCSIFADDR,    ifreq_offsetof(ifr_addr)},
+       { "SIFADDR",    SIOCSIFADDR,    ifreq_offsetof(ifr_addr) },
 };
 
 static const struct options OptArray[] = {
-       {"metric",      N_ARG,         ARG_METRIC,      0},
-       {"mtu",         N_ARG,         ARG_MTU,         0},
-       {"txqueuelen",  N_ARG,         ARG_TXQUEUELEN,  0},
-       {"dstaddr",     N_ARG,         ARG_DSTADDR,     0},
-       {"netmask",     N_ARG,         ARG_NETMASK,     0},
-       {"broadcast",   N_ARG | M_CLR, ARG_BROADCAST,   IFF_BROADCAST},
+       { "metric",      N_ARG,         ARG_METRIC,      0 },
+       { "mtu",         N_ARG,         ARG_MTU,         0 },
+       { "txqueuelen",  N_ARG,         ARG_TXQUEUELEN,  0 },
+       { "dstaddr",     N_ARG,         ARG_DSTADDR,     0 },
+       { "netmask",     N_ARG,         ARG_NETMASK,     0 },
+       { "broadcast",   N_ARG | M_CLR, ARG_BROADCAST,   IFF_BROADCAST },
 #if ENABLE_FEATURE_IFCONFIG_HW
-       {"hw",          N_ARG, ARG_HW,                  0},
+       { "hw",          N_ARG, ARG_HW,                  0 },
 #endif
-       {"pointopoint", N_ARG | M_CLR, ARG_POINTOPOINT, IFF_POINTOPOINT},
+       { "pointopoint", N_ARG | M_CLR, ARG_POINTOPOINT, IFF_POINTOPOINT },
 #ifdef SIOCSKEEPALIVE
-       {"keepalive",   N_ARG,         ARG_KEEPALIVE,   0},
+       { "keepalive",   N_ARG,         ARG_KEEPALIVE,   0 },
 #endif
 #ifdef SIOCSOUTFILL
-       {"outfill",     N_ARG,         ARG_OUTFILL,     0},
+       { "outfill",     N_ARG,         ARG_OUTFILL,     0 },
 #endif
 #if ENABLE_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
-       {"mem_start",   N_ARG,         ARG_MEM_START,   0},
-       {"io_addr",     N_ARG,         ARG_IO_ADDR,     0},
-       {"irq",         N_ARG,         ARG_IRQ,         0},
+       { "mem_start",   N_ARG,         ARG_MEM_START,   0 },
+       { "io_addr",     N_ARG,         ARG_IO_ADDR,     0 },
+       { "irq",         N_ARG,         ARG_IRQ,         0 },
 #endif
 #if ENABLE_FEATURE_IPV6
-       {"add",         N_ARG,         ARG_ADD_DEL,     0},
-       {"del",         N_ARG,         ARG_ADD_DEL,     0},
-#endif
-       {"arp",         N_CLR | M_SET, 0,               IFF_NOARP},
-       {"trailers",    N_CLR | M_SET, 0,               IFF_NOTRAILERS},
-       {"promisc",     N_SET | M_CLR, 0,               IFF_PROMISC},
-       {"multicast",   N_SET | M_CLR, 0,               IFF_MULTICAST},
-       {"allmulti",    N_SET | M_CLR, 0,               IFF_ALLMULTI},
-       {"dynamic",     N_SET | M_CLR, 0,               IFF_DYNAMIC},
-       {"up",          N_SET,         0,               (IFF_UP | IFF_RUNNING)},
-       {"down",        N_CLR,         0,               IFF_UP},
-       {NULL,          0,             ARG_HOSTNAME,    (IFF_UP | IFF_RUNNING)}
+       { "add",         N_ARG,         ARG_ADD_DEL,     0 },
+       { "del",         N_ARG,         ARG_ADD_DEL,     0 },
+#endif
+       { "arp",         N_CLR | M_SET, 0,               IFF_NOARP },
+       { "trailers",    N_CLR | M_SET, 0,               IFF_NOTRAILERS },
+       { "promisc",     N_SET | M_CLR, 0,               IFF_PROMISC },
+       { "multicast",   N_SET | M_CLR, 0,               IFF_MULTICAST },
+       { "allmulti",    N_SET | M_CLR, 0,               IFF_ALLMULTI },
+       { "dynamic",     N_SET | M_CLR, 0,               IFF_DYNAMIC },
+       { "up",          N_SET,         0,               (IFF_UP | IFF_RUNNING) },
+       { "down",        N_CLR,         0,               IFF_UP },
+       { NULL,          0,             ARG_HOSTNAME,    (IFF_UP | IFF_RUNNING) }
 };
 
 /*
@@ -405,7 +405,7 @@ int ifconfig_main(int argc, char **argv)
                                                                xioctl(sockfd6, SIOGIFINDEX, &ifr);
                                                                ifr6.ifr6_ifindex = ifr.ifr_ifindex;
                                                                ifr6.ifr6_prefixlen = prefix_len;
-                                                               ioctl_or_perror_and_die(sockfd6, a1op->selector, &ifr6, "%s", a1op->name);
+                                                               ioctl_or_perror_and_die(sockfd6, a1op->selector, &ifr6, "SIOC%s", a1op->name);
                                                                if (ENABLE_FEATURE_CLEAN_UP)
                                                                        free(lsa);
                                                                continue;
@@ -457,7 +457,7 @@ int ifconfig_main(int argc, char **argv)
                                                *((int *) p) = i;
                                }
 
-                               ioctl_or_perror_and_die(sockfd, a1op->selector, &ifr, "%s", a1op->name);
+                               ioctl_or_perror_and_die(sockfd, a1op->selector, &ifr, "SIOC%s", a1op->name);
 #ifdef QUESTIONABLE_ALIAS_CASE
                                if (mask & A_COLON_CHK) {
                                        /*