diff options
Diffstat (limited to 'keama/data.c')
-rw-r--r-- | keama/data.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/keama/data.c b/keama/data.c index 9c6ba249..6a441d7d 100644 --- a/keama/data.c +++ b/keama/data.c @@ -198,7 +198,7 @@ makeStringExt(int l, const char *s, char fmt) } case 'I': { - /* IPv4 address */ + /* IPv4 address to text */ char buf[40 /* INET_ADDRSTRLEN == 26 */]; assert(l > 3); @@ -206,6 +206,17 @@ makeStringExt(int l, const char *s, char fmt) return makeString(-1, buf); } + case 'i': { + /* IPv4 address to hexa */ + uint8_t a[4]; + char buf[10]; + + assert(inet_pton(AF_INET, s, a) == 1); + snprintf(buf, sizeof(buf), "%02hhx%02hhx%02hhx%02hhx", + a[0], a[1], a[2], a[3]); + return makeString(-1, buf); + } + case '6': { /* IPv6 address */ char buf[80 /* INET6_ADDRSTRLEN == 46 */]; @@ -215,6 +226,39 @@ makeStringExt(int l, const char *s, char fmt) return makeString(-1, buf); } + case 'd': { + /* FQDN to DNS wire format */ + struct string *result; + const char *p; + const char *dot; + char ll; + + assert(s[l] == '0'); + + result = allocString(); + p = s; + while ((dot = strchr(p, '.')) != NULL) { + int len; + + len = dot - p - 1; + if ((len & 0xc0) != 0) + return NULL; + if (dot - s >= l) + return NULL; + ll = len & 0x3f; + concatString(result, makeString(1, &ll)); + concatString(result, makeString(len, p)); + p = dot + 1; + if (p - s == l) + break; + } + if (dot == NULL) { + ll = 0; + concatString(result, makeString(1, &ll)); + } + return result; + } + default: assert(0); } |