Ignore:
Timestamp:
Jan 1, 2014, 12:47:38 AM (7 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.21.1
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3.2/mindi-busybox/networking/libiproute/utils.c

    r2725 r3232  
    8484    }
    8585
    86     addr->family = AF_INET;
    8786    if (family != AF_UNSPEC && family != AF_INET)
    8887        return -1;
     88
     89    /* Try to parse it as IPv4 */
     90    addr->family = AF_INET;
     91#if 0 /* Doesn't handle e.g. "10.10", for example, "ip r l root 10.10/16" */
    8992    if (inet_pton(AF_INET, name, addr->data) <= 0)
    9093        return -1;
     94#else
     95    {
     96        unsigned i = 0;
     97        unsigned n = 0;
     98        const char *cp = name - 1;
     99        while (*++cp) {
     100            if ((unsigned char)(*cp - '0') <= 9) {
     101                n = 10 * n + (unsigned char)(*cp - '0');
     102                if (n >= 256)
     103                    return -1;
     104                ((uint8_t*)addr->data)[i] = n;
     105                continue;
     106            }
     107            if (*cp == '.' && ++i <= 3) {
     108                n = 0;
     109                continue;
     110            }
     111            return -1;
     112        }
     113    }
     114#endif
    91115    addr->bytelen = 4;
    92116    addr->bitlen = -1;
     117
    93118    return 0;
    94119}
    95120
    96 static int get_prefix_1(inet_prefix *dst, char *arg, int family)
    97 {
    98     int err;
    99     unsigned plen;
     121static void get_prefix_1(inet_prefix *dst, char *arg, int family)
     122{
    100123    char *slash;
    101124
     
    109132        /*dst->bytelen = 0; - done by memset */
    110133        /*dst->bitlen = 0;*/
    111         return 0;
     134        return;
    112135    }
    113136
     
    115138    if (slash)
    116139        *slash = '\0';
    117     err = get_addr_1(dst, arg, family);
    118     if (err == 0) {
     140
     141    if (get_addr_1(dst, arg, family) == 0) {
    119142        dst->bitlen = (dst->family == AF_INET6) ? 128 : 32;
    120143        if (slash) {
     144            unsigned plen;
    121145            inet_prefix netmask_pfx;
    122146
     
    124148            plen = bb_strtou(slash + 1, NULL, 0);
    125149            if ((errno || plen > dst->bitlen)
    126              && (get_addr_1(&netmask_pfx, slash + 1, family)))
    127                 err = -1;
    128             else if (netmask_pfx.family == AF_INET) {
     150             && get_addr_1(&netmask_pfx, slash + 1, family) != 0
     151            ) {
     152                goto bad;
     153            }
     154            if (netmask_pfx.family == AF_INET) {
    129155                /* fill in prefix length of dotted quad */
    130156                uint32_t mask = ntohl(netmask_pfx.data[0]);
     
    132158
    133159                /* a valid netmask must be 2^n - 1 */
    134                 if (!(host & (host + 1))) {
    135                     for (plen = 0; mask; mask <<= 1)
    136                         ++plen;
    137                     if (plen <= dst->bitlen) {
    138                         dst->bitlen = plen;
    139                         /* dst->flags |= PREFIXLEN_SPECIFIED; */
    140                     } else
    141                         err = -1;
    142                 } else
    143                     err = -1;
    144             } else {
    145                 /* plain prefix */
    146                 dst->bitlen = plen;
    147             }
    148         }
    149     }
     160                if (host & (host + 1))
     161                    goto bad;
     162
     163                for (plen = 0; mask; mask <<= 1)
     164                    ++plen;
     165                if (plen > dst->bitlen)
     166                    goto bad;
     167                /* dst->flags |= PREFIXLEN_SPECIFIED; */
     168            }
     169            dst->bitlen = plen;
     170        }
     171    }
     172
    150173    if (slash)
    151174        *slash = '/';
    152     return err;
     175    return;
     176 bad:
     177    bb_error_msg_and_die("an %s %s is expected rather than \"%s\"", "inet", "prefix", arg);
    153178}
    154179
     
    164189}
    165190
    166 int get_prefix(inet_prefix *dst, char *arg, int family)
     191void get_prefix(inet_prefix *dst, char *arg, int family)
    167192{
    168193    if (family == AF_PACKET) {
    169194        bb_error_msg_and_die("\"%s\" may be inet %s, but it is not allowed in this context", arg, "prefix");
    170195    }
    171     if (get_prefix_1(dst, arg, family)) {
    172         bb_error_msg_and_die("an %s %s is expected rather than \"%s\"", "inet", "prefix", arg);
    173     }
    174     return 0;
     196    get_prefix_1(dst, arg, family);
    175197}
    176198
     
    205227}
    206228
    207 int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits)
    208 {
    209     uint32_t *a1 = a->data;
    210     uint32_t *a2 = b->data;
     229int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits)
     230{
     231    const uint32_t *a1 = a->data;
     232    const uint32_t *a2 = b->data;
    211233    int words = bits >> 5;
    212234
Note: See TracChangeset for help on using the changeset viewer.