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

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



+ libc: POSIX: inet_aton() / inet_ntoa()
---
 src/modules/include/netinet/in.h |   20 +++++++++++++++++++-
 src/modules/lib/posix/net.c      |   29 +++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/src/modules/include/netinet/in.h b/src/modules/include/netinet/in.h
index 5bf18d2..6638d7e 100644
--- a/src/modules/include/netinet/in.h
+++ b/src/modules/include/netinet/in.h
@@ -31,7 +31,6 @@
 
 #include <sys/socket.h>
 #include <stdint.h>
-#include <sys/socket.h>
 
 /// Adresse fuer das INET-Protokol (IPv4)
 struct sockaddr_in {
@@ -40,10 +39,29 @@ struct sockaddr_in {
     uint32_t        sin_port;
 };
 
+typedef uint32_t in_addr_t;
+struct in_addr {
+    in_addr_t s_addr;
+};
+
 unsigned long int htonl(unsigned long int hostlong);
 unsigned short int htons(unsigned short int hostshort);
 unsigned long int ntohl(unsigned long int netlong);
 unsigned short int ntohs(unsigned short int 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
+ */
+int inet_aton(const char *cp, struct in_addr *inp);
+
+/**
+ * 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 in);
+
 #endif
 
diff --git a/src/modules/lib/posix/net.c b/src/modules/lib/posix/net.c
index c6fbdb8..a463790 100644
--- a/src/modules/lib/posix/net.c
+++ b/src/modules/lib/posix/net.c
@@ -55,6 +55,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 *cp, struct in_addr *inp)
+{
+    inp->s_addr = string_to_ip((char*) cp);
+    return inp->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 in)
+{
+    static char buf[16];
+    char* res;
+
+    res = ip_to_string(in.s_addr);
+    strncpy(buf, res, 16);
+    free(res);
+
+    return buf;
+}
+
 struct hostent* gethostbyname(const char* name)
 {
     static struct hostent hostent;
-- 
1.6.0.2