Usermode/libpsockets - Added basic services to getaddrinfo
authorJohn Hodge <[email protected]>
Sun, 11 Aug 2013 03:12:42 +0000 (11:12 +0800)
committerJohn Hodge <[email protected]>
Sun, 11 Aug 2013 03:12:42 +0000 (11:12 +0800)
Usermode/Libraries/libpsocket.so_src/Makefile
Usermode/Libraries/libpsocket.so_src/getaddrinfo.c
Usermode/Libraries/libpsocket.so_src/include_exp/sys/socket.h

index 81418ad..bd7f38d 100644 (file)
@@ -6,7 +6,7 @@ CPPFLAGS +=
 CFLAGS   += -Wall
 LDFLAGS  += -lc -soname libpsocket.so -lnet
 
-OBJ = main.o getaddrinfo.o socket.o
+OBJ = main.o getaddrinfo.o socket.o pton.o
 BIN = libpsocket.so
 
 include ../Makefile.tpl
index d4d6ce8..aa8128d 100644 (file)
 #include <stdlib.h>    // strtol
 #include <acess/sys.h>
 
+static const struct {
+       const char *Name;
+        int    SockType;
+        int    Protocol;
+        int    Port;
+} caLocalServices[] = {
+       {"telnet", SOCK_STREAM, 0, 23},
+       {"http", SOCK_STREAM, 0, 80},
+};
+static const int ciNumLocalServices = sizeof(caLocalServices)/sizeof(caLocalServices[0]);
+
 // === CODE ===
 int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res)
 {
@@ -40,7 +51,6 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi
        else
        {
                // 1. Check if the node is an IP address
-               // TODO: Break this function out into inet_pton?
                {
                         int    type;
                        char    addrdata[16];
@@ -106,15 +116,29 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi
                char *end;
                
                default_port = strtol(service, &end, 0);
-               if( *end != '\0' && !(hints->ai_flags & AI_NUMERICSERV) )
+               if( *end != '\0' && (hints->ai_flags & AI_NUMERICSERV) )
+               {
+                       return EAI_NONAME;
+               }
+               
+               if( *end != '\0' )
                {
                        // TODO: Read something like /Acess/Conf/services
-                       _SysDebug("getaddrinfo: TODO Service translation");
+                       for( int i = 0; i < ciNumLocalServices; i ++ )
+                       {
+                               if( strcmp(service, caLocalServices[i].Name) == 0 ) {
+                                       end = service + strlen(service);
+                                       default_socktype = caLocalServices[i].SockType;
+                                       default_protocol = caLocalServices[i].Protocol;
+                                       default_port = caLocalServices[i].Port;
+                                       break;
+                               }
+                       }
                }
                
                if( *end != '\0' )
                {
-                       return EAI_NONAME;
+                       _SysDebug("getaddrinfo: TODO Service translation");
                }
        }
 
index bba7397..4d052db 100644 (file)
@@ -29,7 +29,7 @@ typedef enum
 struct sockaddr
 {
        sa_family_t     sa_family;
-       char            sa_data[16];
+       char            sa_data[16+2];
 };
 
 struct msghdr

UCC git Repository :: git.ucc.asn.au