src/resolve.c
branchnew-lib-errors
changeset 219 cefec18b8268
parent 218 5229a5d098b2
equal deleted inserted replaced
218:5229a5d098b2 219:cefec18b8268
     1 #include "resolve.h"
       
     2 
       
     3 #include <sys/types.h>
       
     4 #include <sys/socket.h>
       
     5 #include <string.h>
       
     6 #include <stdio.h>
       
     7 
       
     8 err_t resolve_addr (struct resolve_result *res, const char *node, const char *service, int socktype, int ai_flags, error_t *err)
       
     9 {
       
    10     struct addrinfo hints, *ai;
       
    11     int ret;
       
    12 
       
    13     // build hints
       
    14     memset(&hints, 0, sizeof(hints));
       
    15     hints.ai_flags = ai_flags;
       
    16     hints.ai_family = AF_UNSPEC;
       
    17     hints.ai_socktype = socktype;
       
    18 
       
    19     // resolve (blocking)
       
    20     if ((ret = getaddrinfo(node, service, &hints, &ai)))
       
    21         RETURN_SET_ERROR_EXTRA(err, ERR_GETADDRINFO, ret);
       
    22 
       
    23     // no results?
       
    24     if (!ai)
       
    25         RETURN_SET_ERROR(err, ERR_GETADDRINFO_EMPTY);
       
    26     
       
    27     // store
       
    28     res->list = res->item = ai;
       
    29 
       
    30     // ok
       
    31     return SUCCESS;
       
    32 }
       
    33 
       
    34 void resolve_result_init (struct resolve_result *res)
       
    35 {
       
    36     res->list = res->item = NULL;
       
    37 }
       
    38 
       
    39 struct addrinfo* resolve_result_next (struct resolve_result *res)
       
    40 {
       
    41     if (!res->item) {
       
    42         // no items left
       
    43         return NULL;
       
    44 
       
    45     } else {
       
    46         // ...remember the current item
       
    47         struct addrinfo *ai = res->item;
       
    48 
       
    49         if (res->item)
       
    50             // advance item to the next one
       
    51             res->item = res->item->ai_next;
       
    52 
       
    53         // return the current one
       
    54         return ai;
       
    55     }
       
    56 }
       
    57 
       
    58 void resolve_result_deinit (struct resolve_result *res)
       
    59 {
       
    60     if (res->list)
       
    61         // free them all
       
    62         freeaddrinfo(res->list);
       
    63     
       
    64     // invalidate
       
    65     res->list = res->item = NULL;
       
    66 }
       
    67 
       
    68 const char * resolve_addr_text (const struct addrinfo *addr)
       
    69 {
       
    70     static char text[1024];
       
    71     char host[NI_MAXHOST], service[NI_MAXSERV];
       
    72     int ret;
       
    73 
       
    74     // lookup the reverse nameinfo
       
    75     if ((ret = getnameinfo(
       
    76                 addr->ai_addr, addr->ai_addrlen, 
       
    77                 host, sizeof(host), service, sizeof(service), 
       
    78                 NI_NUMERICHOST | NI_NUMERICSERV
       
    79     ))) {
       
    80         strcpy(host, "???");
       
    81         strcpy(service, "???");
       
    82     }
       
    83 
       
    84     // format message
       
    85     snprintf(text, sizeof(text), "[%s]:%s", host, service);
       
    86 
       
    87     // return static pointer
       
    88     return text;
       
    89 }