[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH v2 4/4] libc: POSIX: IP-Adressen-Umwandlung String/Integer



+ libc: POSIX: inet_aton() / inet_ntoa()
---
 src/modules/include/netinet/in.h |   19 +++++++++++++++++++
 src/modules/lib/posix/net.c      |   31 +++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/src/modules/include/netinet/in.h b/src/modules/include/netinet/in.h
index 366319f..a150e23 100644
--- a/src/modules/include/netinet/in.h
+++ b/src/modules/include/netinet/in.h
@@ -39,5 +39,24 @@ struct sockaddr_in {
     uint32_t        sin_port;
 };
 
+typedef uint32_t in_addr_t;
+struct in_addr {
+    in_addr_t s_addr;
+};
+
+/**
+ * Wandelt einen String, der eine IP-Adresse der Form a.b.c.d enthaelt in einen
+ * 32-Bit-Wert um.
+ *
+ * @return 0 im Fehlerfall; ungleich 0 bei Erfolg
+ */
+int inet_aton(const char* ip_string, struct in_addr* ip);
+
+/**
+ * Wandelt eine 32-Bit-Adresse in einen String um. Der String ist in einem
+ * statischen Puffer und wird beim naechsten Aufruf ueberschrieben.
+ */
+char* inet_ntoa(struct in_addr ip);
+
 #endif
 
diff --git a/src/modules/lib/posix/net.c b/src/modules/lib/posix/net.c
index f544b45..545c906 100644
--- a/src/modules/lib/posix/net.c
+++ b/src/modules/lib/posix/net.c
@@ -31,6 +31,8 @@
 #include <netdb.h>
 
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 
 unsigned long int htonl(unsigned long int hostlong)
 {
@@ -52,6 +54,35 @@ unsigned short int ntohs(unsigned short int netshort)
     return big_endian_dword(netshort);
 }
 
+/**
+ * Wandelt einen String, der eine IP-Adresse der Form a.b.c.d enthaelt in einen
+ * 32-Bit-Wert um.
+ *
+ * @return 0 im Fehlerfall; ungleich 0 bei Erfolg
+ * FIXME 0.0.0.0 ist eine gueltige Adresse
+ */
+int inet_aton(const char* ip_string, struct in_addr* ip)
+{
+    ip->s_addr = string_to_ip((char*) ip_string);
+    return ip->s_addr;
+}
+
+/**
+ * Wandelt eine 32-Bit-Adresse in einen String um. Der String ist in einem
+ * statischen Puffer und wird beim naechsten Aufruf ueberschrieben.
+ */
+char* inet_ntoa(struct in_addr ip)
+{
+    static char buf[16];
+    char* res;
+
+    res = ip_to_string(ip.s_addr);
+    strncpy(buf, res, 16);
+    free(res);
+
+    return buf;
+}
+
 struct hostent* gethostbyname(const char* name)
 {
     static struct hostent hostent;
-- 
1.6.0.2