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