From 45ff5c4ee6234d784844f0480cc6e79fb37b242f Mon Sep 17 00:00:00 2001 From: Lectem Date: Sun, 17 Jan 2016 12:58:21 -0500 Subject: [PATCH] added inet_pton and inet_ntop --- libctru/include/arpa/inet.h | 3 +++ libctru/source/services/soc/soc_inet_ntop.c | 28 +++++++++++++++++++++ libctru/source/services/soc/soc_inet_pton.c | 24 ++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 libctru/source/services/soc/soc_inet_ntop.c create mode 100644 libctru/source/services/soc/soc_inet_pton.c diff --git a/libctru/include/arpa/inet.h b/libctru/include/arpa/inet.h index 1052c6b..5e044a9 100644 --- a/libctru/include/arpa/inet.h +++ b/libctru/include/arpa/inet.h @@ -31,6 +31,9 @@ extern "C" { int inet_aton(const char *cp, struct in_addr *inp); char* inet_ntoa(struct in_addr in); + const char *inet_ntop(int af, const void *restrict src, char *restrict dst, socklen_t size); + int inet_pton(int af, const char *restrict src, void *restrict dst); + #ifdef __cplusplus } #endif diff --git a/libctru/source/services/soc/soc_inet_ntop.c b/libctru/source/services/soc/soc_inet_ntop.c new file mode 100644 index 0000000..68016d4 --- /dev/null +++ b/libctru/source/services/soc/soc_inet_ntop.c @@ -0,0 +1,28 @@ +#include "soc_common.h" +#include +#include + + +static const char *inet_ntop4(const void *restrict src, char *restrict dst, socklen_t size) +{ + const u8 * ip = src; + if(size < INET_ADDRSTRLEN) + { + errno = ENOSPC; + return NULL; + } + snprintf(dst,size,"%hhu.%hhu.%hhu.%hhu",ip[0], ip[1], ip[2], ip[3]); + return dst; +} + + +const char *inet_ntop(int af, const void *restrict src, char *restrict dst, socklen_t size) +{ + if(af == AF_INET) + { + return inet_ntop4(src,dst,size); + } + // only support IPv4 + errno = EAFNOSUPPORT; + return NULL; +} diff --git a/libctru/source/services/soc/soc_inet_pton.c b/libctru/source/services/soc/soc_inet_pton.c new file mode 100644 index 0000000..dc8bba9 --- /dev/null +++ b/libctru/source/services/soc/soc_inet_pton.c @@ -0,0 +1,24 @@ +#include "soc_common.h" +#include +#include + + +static int inet_pton4(const char *restrict src, void *restrict dst) +{ + u8 ip[4]; + if(sscanf(src,"%hhu.%hhu.%hhu.%hhu",&ip[0], &ip[1], &ip[2], &ip[3]) != 4) return 0; + *(u32*)dst = *(u32*)ip; + return 1; +} + + +int inet_pton(int af, const char *restrict src, void *restrict dst) +{ + if(af == AF_INET) + { + return inet_pton4(src,dst); + } + // only support IPv4 + errno = EAFNOSUPPORT; + return -1; +}