From: Alexander Bluhm Subject: Re: yppoll / ypset: convert to getaddrinfo To: tech@openbsd.org Date: Mon, 26 Aug 2024 21:40:41 +0200 On Mon, Aug 26, 2024 at 09:11:59PM +0200, Florian Obser wrote: > On 2024-08-22 18:22 +02, Florian Obser wrote: > > pretty straight forward, untested for lack of YP... > > Tests, OKs? > > > > Anyone? On comment below. Otherwise OK bluhm@ > 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)); Here is an indent error. memset should be one tab to the left. > + 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.