"Fossies" - the Fresh Open Source Software Archive

Member "scanssh-2.1/getaddrinfo.c" (31 Mar 2004, 2286 Bytes) of package /linux/privat/old/scanssh-2.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "getaddrinfo.c" see the Fossies "Dox" file reference documentation.

    1 /*
    2  * fake library for ssh
    3  *
    4  * This file includes getaddrinfo(), freeaddrinfo() and gai_strerror().
    5  * These funtions are defined in rfc2133.
    6  *
    7  * But these functions are not implemented correctly. The minimum subset
    8  * is implemented for ssh use only. For exapmle, this routine assumes
    9  * that ai_family is AF_INET. Don't use it for another purpose.
   10  */
   11 
   12 #include <sys/types.h>
   13 #include <sys/socket.h>
   14 #include <netdb.h>
   15 
   16 #include "config.h"
   17 
   18 void freeaddrinfo(struct addrinfo *ai)
   19 {
   20     struct addrinfo *next;
   21 
   22     do {
   23         next = ai->ai_next;
   24         free(ai);
   25     } while (NULL != (ai = next));
   26 }
   27 
   28 static struct addrinfo *malloc_ai(int port, u_long addr)
   29 {
   30     struct addrinfo *ai;
   31 
   32     ai = malloc(sizeof(struct addrinfo) + sizeof(struct sockaddr_in));
   33     if (ai == NULL)
   34         return(NULL);
   35     
   36     memset(ai, 0, sizeof(struct addrinfo) + sizeof(struct sockaddr_in));
   37     
   38     ai->ai_addr = (struct sockaddr *)(ai + 1);
   39     /* XXX -- ssh doesn't use sa_len */
   40     ai->ai_addrlen = sizeof(struct sockaddr_in);
   41     ai->ai_addr->sa_family = ai->ai_family = AF_INET;
   42 
   43     ((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port;
   44     ((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr;
   45     
   46     return(ai);
   47 }
   48 
   49 int getaddrinfo(const char *hostname, const char *servname, 
   50                 const struct addrinfo *hints, struct addrinfo **res)
   51 {
   52     struct addrinfo *cur, *prev = NULL;
   53     struct hostent *hp;
   54     struct in_addr in;
   55     int i, port;
   56 
   57     if (servname)
   58         port = htons(atoi(servname));
   59     else
   60         port = 0;
   61 
   62     if (hints && hints->ai_flags & AI_PASSIVE) {
   63         if (NULL != (*res = malloc_ai(port, htonl(0x00000000))))
   64             return 0;
   65         else
   66             return EAI_MEMORY;
   67     }
   68         
   69     if (!hostname) {
   70         if (NULL != (*res = malloc_ai(port, htonl(0x7f000001))))
   71             return 0;
   72         else
   73             return EAI_MEMORY;
   74     }
   75     
   76     if (inet_aton(hostname, &in)) {
   77         if (NULL != (*res = malloc_ai(port, in.s_addr)))
   78             return 0;
   79         else
   80             return EAI_MEMORY;
   81     }
   82     
   83     hp = gethostbyname(hostname);
   84     if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
   85         for (i = 0; hp->h_addr_list[i]; i++) {
   86             cur = malloc_ai(port, ((struct in_addr *)hp->h_addr_list[i])->s_addr);
   87             if (cur == NULL) {
   88                 if (*res)
   89                     freeaddrinfo(*res);
   90                 return EAI_MEMORY;
   91             }
   92             
   93             if (prev)
   94                 prev->ai_next = cur;
   95             else
   96                 *res = cur;
   97 
   98             prev = cur;
   99         }
  100         return 0;
  101     }
  102     
  103     return EAI_NODATA;
  104 }