X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Futils.c;h=0f7b00cc7949807aa1ce4d2a39577049c3e4dc6e;hb=43ed5b9a5d739c50317d5d24898de07526a9297f;hp=e80fdd9be10f7db8031a8e2851eeec86fc432bd5;hpb=a86faaf34711d6b0f278b670d70a229a3cf0d479;p=meshlink diff --git a/src/utils.c b/src/utils.c index e80fdd9b..0f7b00cc 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,7 +1,6 @@ /* utils.c -- gathering of some stupid small functions - Copyright (C) 1999-2005 Ivo Timmermans - 2000-2013 Guus Sliepen + Copyright (C) 2014 Guus Sliepen 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; +}