]> git.meshlink.io Git - meshlink/blobdiff - src/utils.c
Utility functions to get string representation of sockaddr components.
[meshlink] / src / utils.c
index e80fdd9be10f7db8031a8e2851eeec86fc432bd5..0f7b00cc7949807aa1ce4d2a39577049c3e4dc6e 100644 (file)
@@ -1,7 +1,6 @@
 /*
     utils.c -- gathering of some stupid small functions
-    Copyright (C) 1999-2005 Ivo Timmermans
-                  2000-2013 Guus Sliepen <guus@meshlink.io>
+    Copyright (C) 2014 Guus Sliepen <guus@meshlink.io>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -52,14 +51,16 @@ static int charhex2bin(char c) {
                return toupper(c) - 'A' + 10;
 }
 
-int hex2bin(const char *src, char *dst, int length) {
+int hex2bin(const char *src, void *vdst, int length) {
+       uint8_t *dst = vdst;
        int i;
        for(i = 0; i < length && isxdigit(src[i * 2]) && isxdigit(src[i * 2 + 1]); i++)
                dst[i] = charhex2bin(src[i * 2]) * 16 + charhex2bin(src[i * 2 + 1]);
        return i;
 }
 
-int bin2hex(const char *src, char *dst, int length) {
+int bin2hex(const void *vsrc, char *dst, int length) {
+       const uint8_t *src = vsrc;
        for(int i = length - 1; i >= 0; i--) {
                dst[i * 2 + 1] = hexadecimals[(unsigned char) src[i] & 15];
                dst[i * 2] = hexadecimals[(unsigned char) src[i] >> 4];
@@ -68,10 +69,10 @@ int bin2hex(const char *src, char *dst, int length) {
        return length * 2;
 }
 
-int b64decode(const char *src, char *dst, int length) {
+int b64decode(const char *src, void *dst, int length) {
        int i;
        uint32_t triplet = 0;
-       unsigned char *udst = (unsigned char *)dst;
+       unsigned char *udst = dst;
 
        for(i = 0; i < length / 3 * 4 && src[i]; i++) {
                triplet |= base64_decode[src[i] & 0xff] << (6 * (i & 3));
@@ -99,9 +100,9 @@ int b64decode(const char *src, char *dst, int length) {
        }
 }
 
-static int b64encode_internal(const char *src, char *dst, int length, const char *alphabet) {
+static int b64encode_internal(const void *src, char *dst, int length, const char *alphabet) {
        uint32_t triplet;
-       const unsigned char *usrc = (unsigned char *)src;
+       const unsigned char *usrc = src;
        int si = length / 3 * 3;
        int di = length / 3 * 4;
 
@@ -140,11 +141,11 @@ static int b64encode_internal(const char *src, char *dst, int length, const char
        return length;
 }
 
-int b64encode(const char *src, char *dst, int length) {
+int b64encode(const void *src, char *dst, int length) {
        return b64encode_internal(src, dst, length, base64_original);
 }
 
-int b64encode_urlsafe(const char *src, char *dst, int length) {
+int b64encode_urlsafe(const void *src, char *dst, int length) {
        return b64encode_internal(src, dst, length, base64_urlsafe);
 }
 
@@ -177,3 +178,51 @@ unsigned int bitfield_to_int(const void *bitfield, size_t size) {
        memcpy(&value, bitfield, size);
        return value;
 }
+
+/* Write IP address from sockaddr to string.
+ * Returns NULL on error.
+ */
+char *get_ip_str(const struct sockaddr *sa, char *s, size_t maxlen)
+{
+       switch(sa->sa_family) {
+               case AF_INET:
+                       inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),
+                               s, maxlen);
+                       break;
+
+               case AF_INET6:
+                       inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),
+                               s, maxlen);
+                       break;
+
+               default:
+                       strncpy(s, "Unknown AF", maxlen);
+                       return NULL;
+       }
+
+       return s;
+}
+
+/* Write port from sockaddr to string.
+ * Returns NULL on error.
+ */
+char *get_port_str(const struct sockaddr *sa, char *s, size_t maxlen)
+{
+       switch(sa->sa_family) {
+               case AF_INET:
+                       snprintf(s, maxlen, "%d",
+                               ntohs(((struct sockaddr_in*)sa)->sin_port));
+                       break;
+
+               case AF_INET6:
+                       snprintf(s, maxlen, "%d",
+                               ntohs(((struct sockaddr_in6*)sa)->sin6_port));
+                       break;
+
+               default:
+                       strncpy(s, "Unknown AF", maxlen);
+                       return NULL;
+       }
+
+       return s;
+}