busybox/networking/libiproute/ll_addr.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * This program is free software; you can redistribute it and/or
   4 * modify it under the terms of the GNU General Public License
   5 * as published by the Free Software Foundation; either version
   6 * 2 of the License, or (at your option) any later version.
   7 *
   8 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
   9 */
  10#include <net/if_arp.h>
  11
  12#include "libbb.h"
  13#include "rt_names.h"
  14#include "utils.h"
  15
  16const char* FAST_FUNC ll_addr_n2a(unsigned char *addr, int alen, int type, char *buf, int blen)
  17{
  18        int i;
  19        int l;
  20
  21        if (alen == 4
  22         && (type == ARPHRD_TUNNEL || type == ARPHRD_SIT || type == ARPHRD_IPGRE)
  23        ) {
  24                return inet_ntop(AF_INET, addr, buf, blen);
  25        }
  26        l = 0;
  27        for (i = 0; i < alen; i++) {
  28                if (i == 0) {
  29                        snprintf(buf + l, blen, ":%02x"+1, addr[i]);
  30                        blen -= 2;
  31                        l += 2;
  32                } else {
  33                        snprintf(buf + l, blen, ":%02x", addr[i]);
  34                        blen -= 3;
  35                        l += 3;
  36                }
  37        }
  38        return buf;
  39}
  40
  41int FAST_FUNC ll_addr_a2n(unsigned char *lladdr, int len, char *arg)
  42{
  43        int i;
  44
  45        if (strchr(arg, '.')) {
  46                inet_prefix pfx;
  47                if (get_addr_1(&pfx, arg, AF_INET)) {
  48                        bb_error_msg("\"%s\" is invalid lladdr", arg);
  49                        return -1;
  50                }
  51                if (len < 4) {
  52                        return -1;
  53                }
  54                memcpy(lladdr, pfx.data, 4);
  55                return 4;
  56        }
  57
  58        for (i = 0; i < len; i++) {
  59                int temp;
  60                char *cp = strchr(arg, ':');
  61                if (cp) {
  62                        *cp = 0;
  63                        cp++;
  64                }
  65                if (sscanf(arg, "%x", &temp) != 1 || (temp < 0 || temp > 255)) {
  66                        bb_error_msg("\"%s\" is invalid lladdr", arg);
  67                        return -1;
  68                }
  69                lladdr[i] = temp;
  70                if (!cp) {
  71                        break;
  72                }
  73                arg = cp;
  74        }
  75        return i+1;
  76}
  77