Index | Thread | Search

From:
Alexander Bluhm <bluhm@openbsd.org>
Subject:
Re: yppoll / ypset: convert to getaddrinfo
To:
tech@openbsd.org
Date:
Mon, 26 Aug 2024 21:40:41 +0200

Download raw body.

Thread
On Mon, Aug 26, 2024 at 09:11:59PM +0200, Florian Obser wrote:
> On 2024-08-22 18:22 +02, Florian Obser <florian@openbsd.org> 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.