From 3e81b0123b4bbfedbdc1135a6a4305c347f91a3a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 9 Aug 2003 16:41:59 +0000 Subject: Initial commit git-svn-id: file:///home/lennart/svn/public/aeswepd/trunk@3 022f378f-78c4-0310-b860-d162c87e6274 --- src/util.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 src/util.c (limited to 'src/util.c') diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..4728752 --- /dev/null +++ b/src/util.c @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "util.h" + +struct hw_addr null_ap = { { 0, 0, 0, 0, 0, 0 } }; + +void print_hex(FILE *f, uint8_t *w, int l) { + while (l > 0) { + fprintf(f, "%02x", *(w++)); + l--; + } +} + +int hw_addr_equal(struct hw_addr *a, struct hw_addr *b) { + return memcmp(a->addr, b->addr, ETH_ALEN) == 0; +} + +int is_assoc_ap(struct hw_addr *ap) { + int b, j; + b = 1; + assert(ap); + + for (j = 1; j < ETH_ALEN; j++) + if (ap->addr[j] != ap->addr[0]) { + b = 0; + break; + } + + return !b || (ap->addr[0] != 0xFF && ap->addr[0] != 0x44 && ap->addr[0] != 0x00); +} + + +void print_hw_addr(FILE*f, struct hw_addr *a) { + fprintf(f, "%02x:%02x:%02x:%02x:%02x:%02x", + a->addr[0], a->addr[1], a->addr[2], + a->addr[3], a->addr[4], a->addr[5]); +} + +void snprint_hw_addr(char *c, int l, struct hw_addr *a) { + snprintf(c, l, "%02x:%02x:%02x:%02x:%02x:%02x", + a->addr[0], a->addr[1], a->addr[2], + a->addr[3], a->addr[4], a->addr[5]); +} + + +int parse_hex(char *s, uint8_t *b, int l) { + int n = 0; + char *p; + int nibble = 0; + + for (p = s; *p && l >= 0; p++) { + int c; + + if (*p >= '0' && *p <= '9') + c = *p - '0'; + else if (*p >= 'A' && *p <= 'F') + c = *p - 'A' + 10; + else if (*p >= 'a' && *p <= 'f') + c = *p - 'a' + 10; + else if (*p == ':' || *p == '.') + continue; + else + return -(p-s)-1; + + if (!nibble) + *b = c << 4; + else { + *b |= c & 15; + b++; + l--; + n++; + } + + nibble = !nibble; + } + + if (*p) + return -(p-s)-1; + + return n; +} + + +int get_ifname(int idx, char *p, int l) { + struct ifreq req; + int s; + + if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { + daemon_log(LOG_ERR, "socket() failed: %s\n", strerror(errno)); + return -1; + } + + memset(&req, 0, sizeof(req)); + req.ifr_ifindex = idx; + + if(ioctl(s, SIOCGIFNAME, &req) < 0) { + close(s); + daemon_log(LOG_ERR, "SIOCGIFNAME failed: %s\n", strerror(errno)); + return -1; + } + + close(s); + + strncpy(p, req.ifr_name, l-1); + p[l-1] = 0; + + return 0; +} + +int is_iface_available(char *p) { + struct ifreq req; + int s, r; + + if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { + daemon_log(LOG_ERR, "socket() failed: %s\n", strerror(errno)); + return -1; + } + + memset(&req, 0, sizeof(req)); + strncpy(req.ifr_name, p, IFNAMSIZ); + + if ((r = ioctl(s, SIOCGIFINDEX, &req)) < 0 && errno != ENODEV) { + daemon_log(LOG_ERR, "SIOCGIFINDEX failed: %s\n", strerror(errno)); + return -1; + } + + close(s); + return r >= 0 && req.ifr_ifindex >= 0; +} -- cgit