Download raw body.
yppoll / ypset: convert to getaddrinfo
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.
yppoll / ypset: convert to getaddrinfo