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

[tyndur-devel] [PATCH 2/5] libc: POSIX: getservbyname()



+ libc: POSIX: getservbyname(). Die Service-Datenbank ist vorerst in der
  libc hartkodiert.
---
 src/modules/include/netdb.h |   21 +++++++++++++++++++++
 src/modules/lib/posix/net.c |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+), 0 deletions(-)

diff --git a/src/modules/include/netdb.h b/src/modules/include/netdb.h
index d2a3666..12e6e9a 100644
--- a/src/modules/include/netdb.h
+++ b/src/modules/include/netdb.h
@@ -38,7 +38,28 @@ struct hostent {
 #define h_addr h_addr_list[0]
 };
 
+struct servent {
+    char*   s_name;
+    char**  s_aliases;
+
+    /// Portnummer des Diensts, in Big Endian
+    int     s_port;
+
+    char*   s_proto;
+
+};
+
 struct hostent* gethostbyname(const char* name);
 
+/**
+ * Gibt Informationen zu einem Netzwerkdienst zurueck. Wenn der Dienst nicht
+ * gefunden werden kann, wird NULL zurueckgegeben.
+ *
+ * @param name Name des Diensts (z.B. "imap")
+ * @param protocol Name des Transportprotokolls (z.B. "tcp"). Falls nicht
+ * angegeben, soll jeder Treffer zaehlen.
+ */
+struct servent* getservbyname(const char* name, const char* protocol);
+
 #endif
 
diff --git a/src/modules/lib/posix/net.c b/src/modules/lib/posix/net.c
index 545c906..0b335a8 100644
--- a/src/modules/lib/posix/net.c
+++ b/src/modules/lib/posix/net.c
@@ -119,3 +119,39 @@ struct hostent* gethostbyname(const char* name)
 
     return &hostent;
 }
+
+
+/* Definition der bekannten Netzwerkdienste */
+static char* service_aliases_http[] = { "http", NULL };
+static char* service_aliases_imap[] = { "imap", NULL };
+static char* service_aliases_irc[] = { "irc", NULL };
+
+static struct servent services[] = {
+    { "http",     service_aliases_http,   big_endian_word(80),    "tcp" },
+    { "imap",     service_aliases_imap,   big_endian_word(143),   "tcp" },
+    { "irc",      service_aliases_irc,    big_endian_word(6667),  "tcp" },
+    { NULL, NULL, 0, NULL }
+};
+
+/**
+ * Gibt Informationen zu einem Netzwerkdienst zurueck. Wenn der Dienst nicht
+ * gefunden werden kann, wird NULL zurueckgegeben.
+ *
+ * @param name Name des Diensts (z.B. "imap")
+ * @param protocol Name des Transportprotokolls (z.B. "tcp"). Falls nicht
+ * angegeben, soll jeder Treffer zaehlen.
+ */
+struct servent* getservbyname(const char* name, const char* protocol)
+{
+    int i;
+    for (i = 0; services[i].s_name != NULL; i++) {
+        if (strcmp(name, services[i].s_name)) {
+            continue;
+        }
+        if ((protocol == NULL) || strcmp(protocol, services[i].s_proto)) {
+            return &services[i];
+        }
+    }
+
+    return NULL;
+}
-- 
1.6.0.2