X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibpsocket.so_src%2Fgetaddrinfo.c;h=5c21c06ea555621970653f23049a3e832a75a6c9;hb=f8cde3fab5eb27ebacf9d76a7ac478a68a36a38b;hp=d4d6ce8d0b01f2efbb2f3171c75dbc5f83e3da65;hpb=8cf9dc88c488ba959a211f1ec653a366d16e1531;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libpsocket.so_src/getaddrinfo.c b/Usermode/Libraries/libpsocket.so_src/getaddrinfo.c index d4d6ce8d..5c21c06e 100644 --- a/Usermode/Libraries/libpsocket.so_src/getaddrinfo.c +++ b/Usermode/Libraries/libpsocket.so_src/getaddrinfo.c @@ -13,6 +13,17 @@ #include // strtol #include +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]; @@ -76,6 +86,8 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi // TODO: DNS Lookups // ? /Acess/Conf/Nameservers // ? /Acess/Conf/Hosts + //count = Net_LookupDNS(node, service, NULL); + // } // 3. No Match, chuck sad @@ -103,23 +115,36 @@ int getaddrinfo(const char *node, const char *service, const struct addrinfo *hi // Convert `node` into types if( service ) { - char *end; + const char *end; - default_port = strtol(service, &end, 0); - if( *end != '\0' && !(hints->ai_flags & AI_NUMERICSERV) ) + default_port = strtol(service, (char**)&end, 0); + 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"); } } - struct addrinfo *ai; - for( ai = ret; ai; ai = ai->ai_next) + for( struct addrinfo *ai = ret; ai; ai = ai->ai_next) { struct sockaddr_in *in = (void*)ai->ai_addr; struct sockaddr_in6 *in6 = (void*)ai->ai_addr; @@ -211,3 +236,8 @@ const char *gai_strerror(int errnum) } } +struct hostent *gethostbyname(const char *name) +{ + return NULL; +} +