[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