From: Florian Obser Subject: Re: rpcinfo(8): get rid of inet_aton(3). To: tech@openbsd.org Date: Sun, 11 Aug 2024 14:11:22 +0200 On 2024-08-11 13:58 +02, Florian Obser wrote: > OK? > > (I don't think if (res->ai_family != AF_INET) can actually happen, happy > to leave that out.) oops, this is the correct diff. diff --git rpcinfo.c rpcinfo.c index 9b48a2108ee..db6706f904e 100644 --- rpcinfo.c +++ rpcinfo.c @@ -491,15 +491,9 @@ pmapdump(int argc, char **argv) if (argc == 1) get_inet_address(&server_addr, argv[0]); - else { - bzero((char *)&server_addr, sizeof server_addr); - server_addr.sin_family = AF_INET; - if ((hp = gethostbyname("localhost")) != NULL) - bcopy(hp->h_addr, (caddr_t)&server_addr.sin_addr, - hp->h_length); - else - (void) inet_aton("0.0.0.0", &server_addr.sin_addr); - } + else + get_inet_address(&server_addr, "127.0.0.1"); + minutetimeout.tv_sec = 60; minutetimeout.tv_usec = 0; server_addr.sin_port = htons(PMAPPORT); @@ -689,16 +683,25 @@ fail: void get_inet_address(struct sockaddr_in *addr, char *host) { - struct hostent *hp; + struct addrinfo hints, *res; + int error; - bzero((char *)addr, sizeof *addr); - if (inet_aton(host, &addr->sin_addr) == 0) { - if ((hp = gethostbyname(host)) == NULL) { - fprintf(stderr, "rpcinfo: %s is unknown host\n", - host); - exit(1); - } - bcopy(hp->h_addr, (char *)&addr->sin_addr, hp->h_length); + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + + if ((error = getaddrinfo(host, NULL, &hints, &res))) { + fprintf(stderr, "rpcinfo: %s is unknown host: %s\n", + host, gai_strerror(error)); + exit(1); } + + if (res->ai_family != AF_INET) { + fprintf(stderr, "rpcinfo: %s is unknown host\n", + host); + exit(1); + } + addr->sin_family = AF_INET; + addr->sin_addr = ((struct sockaddr_in *)res->ai_addr)->sin_addr; + freeaddrinfo(res); } -- In my defence, I have been left unsupervised.