From: Florian Obser Subject: yppoll / ypset: convert to getaddrinfo To: tech Date: Thu, 22 Aug 2024 18:22:44 +0200 pretty straight forward, untested for lack of YP... Tests, OKs? diff --git yppoll.c yppoll.c index 266f88b60cc..78c89e4c085 100644 --- yppoll.c +++ yppoll.c @@ -65,7 +65,7 @@ get_remote_info(char *indomain, char *inmap, char *server, int *outorder, struct sockaddr_in rsrv_sin; int rsrv_sock; CLIENT *client; - struct hostent *h; + struct addrinfo hints, *res; int r; bzero((char *)&rsrv_sin, sizeof rsrv_sin); @@ -73,14 +73,15 @@ get_remote_info(char *indomain, char *inmap, char *server, int *outorder, rsrv_sin.sin_family = AF_INET; rsrv_sock = RPC_ANYSOCK; - h = gethostbyname(server); - if (h == NULL) { - if (inet_aton(server, &rsrv_sin.sin_addr) == 0) { - fprintf(stderr, "unknown host %s\n", server); - exit(1); - } - } else - rsrv_sin.sin_addr.s_addr = *(u_int32_t *)h->h_addr; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + + if (getaddrinfo(server, NULL, &hints, &res) != 0) { + fprintf(stderr, "unknown host %s\n", server); + exit(1); + } + rsrv_sin.sin_addr = ((struct sockaddr_in *)res->ai_addr)->sin_addr; + freeaddrinfo(res); tv.tv_sec = 10; tv.tv_usec = 0; diff --git ypset.c ypset.c index ebd86597fa1..103b8235861 100644 --- ypset.c +++ ypset.c @@ -54,7 +54,7 @@ bind_tohost(struct sockaddr_in *sin, char *dom, char *server) { struct ypbind_setdom ypsd; struct in_addr iaddr; - struct hostent *hp; + struct addrinfo hints, *res; struct timeval tv; CLIENT *client; int sock, port, r; @@ -66,12 +66,14 @@ bind_tohost(struct sockaddr_in *sin, char *dom, char *server) memset(&ypsd, 0, sizeof ypsd); - if (inet_aton(server, &iaddr) == 0) { - hp = gethostbyname(server); - if (hp == NULL) - errx(1, "can't find address for %s", server); - memmove(&iaddr.s_addr, hp->h_addr, sizeof(iaddr.s_addr)); - } + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + + if (getaddrinfo(server, NULL, &hints, &res) != 0) + errx(1, "can't find address for %s", server); + iaddr = ((struct sockaddr_in *)res->ai_addr)->sin_addr; + freeaddrinfo(res); + ypsd.ypsetdom_domain = dom; bcopy(&iaddr.s_addr, &ypsd.ypsetdom_binding.ypbind_binding_addr, sizeof(ypsd.ypsetdom_binding.ypbind_binding_addr)); @@ -105,7 +107,7 @@ int main(int argc, char *argv[]) { struct sockaddr_in sin; - struct hostent *hent; + struct addrinfo hints, *res; extern char *optarg; extern int optind; char *domainname; @@ -123,13 +125,15 @@ main(int argc, char *argv[]) domainname = optarg; break; case 'h': - if (inet_aton(optarg, &sin.sin_addr) == 0) { - hent = gethostbyname(optarg); - if (hent == NULL) - errx(1, "host %s unknown\n", optarg); - bcopy(hent->h_addr, &sin.sin_addr, - sizeof(sin.sin_addr)); - } + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + + if (getaddrinfo(optarg, NULL, &hints, &res) != 0) + errx(1, "host %s unknown\n", optarg); + + sin.sin_addr = + ((struct sockaddr_in *)res->ai_addr)->sin_addr; + freeaddrinfo(res); break; default: usage(); -- In my defence, I have been left unsupervised.