getaddrinfo() を試す

さっきの続き。

gethostbyname() は obsolete だから getaddrinfo() を使ってね,と man に書いてあったので,getaddrinfo() だとどうなのか調べてみる。

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int
main(int argc, char *argv[])
{
    struct addrinfo hints, *res;
    struct in_addr addr;
    int err;

    memset(&hints, 0, sizeof(hints));
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_family   = AF_INET;

    err = getaddrinfo(argv[1], NULL, &hints, &res);
    if (err) {
        fprintf(stderr, "%d\n", err);
        return 1;
    }

    memcpy(
        &addr,
        &((struct sockaddr_in *)(res->ai_addr))->sin_addr,
        sizeof(addr));

    fprintf(stderr, "ip: %s\n", inet_ntoa(addr));

    freeaddrinfo(res);

    return 0;
}

コードは getaddrinfo:Geekなぺーじ からパクった。

$ gcc -Wall -g -c -o test.o test.c

$ gcc -Wall -g -o test test.o

$ ./test SMB_SERVER_NAME

ip: 192.168.0.102

うまく動いた。


となると libc の gethostbyname() があやしい。アロケータのメモリ領域を破壊してるのかも。Bug #59449 “Valgrind errors on gethostbyname().” : Bugs : glibc package : Ubuntu こんなバグも報告されてるけど Hardy の Beta でも顕在化したと。んー。

see ぐあ間違えてリンクしてた - daily dayflower