From ba3b6d386e9c7cd213ff8fa12182003abe929cea Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Fri, 1 Jul 2016 18:23:36 +0200 Subject: [PATCH] Add inet_ntop(3). --- libc/Makefile | 2 +- libc/arpa/inet/inet_ntop.c | 45 ++++++++++++++++++++++++++++---------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/libc/Makefile b/libc/Makefile index 7d76ebd7..2176bae7 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -16,6 +16,7 @@ CXXFLAGS=-std=gnu++11 -fno-exceptions -fno-rtti ASFLAGS= FREEOBJS=\ +arpa/inet/inet_ntop.o \ assert/__assert.o \ c++/c++.o \ c++/op-new.o \ @@ -316,7 +317,6 @@ wctype/wctype.o \ HOSTEDOBJS=\ arpa/inet/inet_addr.o \ arpa/inet/inet_ntoa.o \ -arpa/inet/inet_ntop.o \ arpa/inet/inet_pton.o \ blf/blowfish.o \ $(CPUDIR)/fork.o \ diff --git a/libc/arpa/inet/inet_ntop.c b/libc/arpa/inet/inet_ntop.c index d08d785a..0197eb1d 100644 --- a/libc/arpa/inet/inet_ntop.c +++ b/libc/arpa/inet/inet_ntop.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Jonas 'Sortie' Termansen. + * Copyright (c) 2016 Jonas 'Sortie' Termansen. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,25 +14,48 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * arpa/inet/inet_ntop.c - * Internet address manipulation routines. + * Convert network address to string. */ #include -#include -#include +#include +#include +#include #include -#include const char* inet_ntop(int af, const void* restrict src, char* restrict dst, socklen_t size) { - (void) af; - (void) src; - (void) dst; - (void) size; - fprintf(stderr, "%s is not implemented yet, aborting.\n", __func__); - abort(); + if ( af == AF_INET ) + { + const unsigned char* ip = (const unsigned char*) src; + int len = snprintf(dst, size, "%u.%u.%u.%u", + ip[0], ip[1], ip[2], ip[3]); + if ( len < 0 ) + return NULL; + if ( size <= (size_t) len ) + return errno = ENOSPC, (const char*) NULL; + return dst; + } + else if ( af == AF_INET6 ) + { + // TODO: Support for :: syntax. + // TODO: Support for x:x:x:x:x:x:d.d.d.d syntax. + const unsigned char* ip = (const unsigned char*) src; + int len = snprintf(dst, size, "%x:%x:%x:%x:%x:%x:%x:%x", + ip[0] << 8 | ip[1], ip[2] << 8 | ip[3], + ip[4] << 8 | ip[5], ip[6] << 8 | ip[7], + ip[8] << 8 | ip[9], ip[10] << 8 | ip[11], + ip[12] << 8 | ip[13], ip[14] << 8 | ip[15]); + if ( len < 0 ) + return NULL; + if ( size <= (size_t) len ) + return errno = ENOSPC, (const char*) NULL; + return dst; + } + else + return errno = EAFNOSUPPORT, NULL; }