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 でも顕在化したと。んー。