summaryrefslogtreecommitdiffstats
path: root/src/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.c')
-rw-r--r--src/util.c136
1 files changed, 136 insertions, 0 deletions
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 <unistd.h>
+#include <sys/socket.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <linux/if.h>
+#include <libdaemon/dlog.h>
+
+#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;
+}