11.17Sjoerg/*	$NetBSD: ypset.c,v 1.17 2011/08/27 22:41:35 joerg Exp $	*/
21.8Sthorpej
31.2Sderaadt/*
41.5Sderaadt * Copyright (c) 1992, 1993 Theo de Raadt <deraadt@fsa.ca>
51.2Sderaadt * All rights reserved.
61.2Sderaadt *
71.2Sderaadt * Redistribution and use in source and binary forms, with or without
81.2Sderaadt * modification, are permitted provided that the following conditions
91.2Sderaadt * are met:
101.2Sderaadt * 1. Redistributions of source code must retain the above copyright
111.2Sderaadt *    notice, this list of conditions and the following disclaimer.
121.2Sderaadt * 2. Redistributions in binary form must reproduce the above copyright
131.2Sderaadt *    notice, this list of conditions and the following disclaimer in the
141.2Sderaadt *    documentation and/or other materials provided with the distribution.
151.2Sderaadt *
161.2Sderaadt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
171.2Sderaadt * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
181.2Sderaadt * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
191.2Sderaadt * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
201.2Sderaadt * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
211.2Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
221.2Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
231.2Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
241.2Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
251.2Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
261.2Sderaadt * SUCH DAMAGE.
271.2Sderaadt */
281.2Sderaadt
291.11Sthorpej#include <sys/cdefs.h>
301.11Sthorpej#ifndef lint
311.17Sjoerg__RCSID("$NetBSD: ypset.c,v 1.17 2011/08/27 22:41:35 joerg Exp $");
321.2Sderaadt#endif
331.2Sderaadt
341.1Sderaadt#include <sys/param.h>
351.1Sderaadt#include <sys/types.h>
361.1Sderaadt#include <sys/socket.h>
371.1Sderaadt#include <stdio.h>
381.10Schristos#include <string.h>
391.10Schristos#include <stdlib.h>
401.10Schristos#include <unistd.h>
411.10Schristos#include <err.h>
421.1Sderaadt#include <netdb.h>
431.11Sthorpej
441.1Sderaadt#include <rpc/rpc.h>
451.1Sderaadt#include <rpc/xdr.h>
461.1Sderaadt#include <rpcsvc/yp_prot.h>
471.1Sderaadt#include <rpcsvc/ypclnt.h>
481.4Sbrezak#include <arpa/inet.h>
491.1Sderaadt
501.17Sjoerg__dead static void usage(void);
511.17Sjoergstatic void gethostaddr(const char *, struct in_addr *);
521.17Sjoergstatic int bind_tohost(struct sockaddr_in *, char *, char *);
531.10Schristos
541.11Sthorpejint
551.17Sjoergmain(int argc, char *argv[])
561.1Sderaadt{
571.11Sthorpej	struct sockaddr_in sin;
581.11Sthorpej	char *domainname;
591.11Sthorpej	int c;
601.11Sthorpej
611.11Sthorpej	yp_get_default_domain(&domainname);
621.11Sthorpej
631.11Sthorpej	(void) memset(&sin, 0, sizeof sin);
641.11Sthorpej	sin.sin_family = AF_INET;
651.11Sthorpej	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
661.11Sthorpej
671.11Sthorpej	while ((c = getopt(argc, argv, "h:d:")) != -1) {
681.11Sthorpej		switch(c) {
691.11Sthorpej		case 'd':
701.11Sthorpej			domainname = optarg;
711.11Sthorpej			break;
721.11Sthorpej
731.11Sthorpej		case 'h':
741.11Sthorpej			gethostaddr(optarg, &sin.sin_addr);
751.11Sthorpej			break;
761.11Sthorpej
771.11Sthorpej		default:
781.11Sthorpej			usage();
791.11Sthorpej		}
801.11Sthorpej	}
811.11Sthorpej
821.11Sthorpej	if (domainname == NULL)
831.11Sthorpej		errx(1, "YP domain name not set");
841.11Sthorpej
851.11Sthorpej	argc -= optind;
861.11Sthorpej	argv += optind;
871.11Sthorpej
881.11Sthorpej	if (argc != 1)
891.11Sthorpej		usage();
901.11Sthorpej
911.11Sthorpej	return bind_tohost(&sin, domainname, argv[0]) != 0;
921.1Sderaadt}
931.1Sderaadt
941.10Schristosstatic void
951.17Sjoerggethostaddr(const char *host, struct in_addr *ia)
961.10Schristos{
971.10Schristos	struct hostent *hp;
981.10Schristos
991.10Schristos	if (inet_aton(host, ia) != 0)
1001.10Schristos		return;
1011.10Schristos
1021.10Schristos	hp = gethostbyname(host);
1031.10Schristos	if (hp == NULL)
1041.10Schristos		errx(1, "Cannot get host address for %s: %s", host,
1051.10Schristos		    hstrerror(h_errno));
1061.10Schristos	(void) memcpy(ia, hp->h_addr, sizeof(*ia));
1071.10Schristos}
1081.10Schristos
1091.10Schristosstatic int
1101.17Sjoergbind_tohost(struct sockaddr_in *sin, char *dom, char *server)
1111.1Sderaadt{
1121.1Sderaadt	struct ypbind_setdom ypsd;
1131.1Sderaadt	struct timeval tv;
1141.1Sderaadt	CLIENT *client;
1151.1Sderaadt	int sock, port;
1161.1Sderaadt	int r;
1171.1Sderaadt
1181.10Schristos	port = htons(getrpcport(server, YPPROG, YPPROC_NULL, IPPROTO_UDP));
1191.10Schristos	if (port == 0)
1201.10Schristos		errx(1, "%s not running ypserv.", server);
1211.1Sderaadt
1221.10Schristos	(void) memset(&ypsd, 0, sizeof ypsd);
1231.4Sbrezak
1241.10Schristos	gethostaddr(server, &ypsd.ypsetdom_addr);
1251.4Sbrezak
1261.16Sjrf	(void) strlcpy(ypsd.ypsetdom_domain, dom, sizeof ypsd.ypsetdom_domain);
1271.4Sbrezak	ypsd.ypsetdom_port = port;
1281.1Sderaadt	ypsd.ypsetdom_vers = YPVERS;
1291.1Sderaadt
1301.1Sderaadt	tv.tv_sec = 15;
1311.1Sderaadt	tv.tv_usec = 0;
1321.1Sderaadt	sock = RPC_ANYSOCK;
1331.10Schristos
1341.3Sderaadt	client = clntudp_create(sin, YPBINDPROG, YPBINDVERS, tv, &sock);
1351.10Schristos	if (client == NULL) {
1361.10Schristos		warnx("Can't yp_bind: Reason: %s", yperr_string(YPERR_YPBIND));
1371.1Sderaadt		return YPERR_YPBIND;
1381.1Sderaadt	}
1391.1Sderaadt	client->cl_auth = authunix_create_default();
1401.1Sderaadt
1411.1Sderaadt	r = clnt_call(client, YPBINDPROC_SETDOM,
1421.10Schristos	    xdr_ypbind_setdom, &ypsd, xdr_void, NULL, tv);
1431.10Schristos	if (r) {
1441.14Sgrant		warnx("Cannot ypset for domain %s on host %s: %s.",
1451.10Schristos		    dom, server, clnt_sperrno(r));
1461.1Sderaadt		clnt_destroy(client);
1471.1Sderaadt		return YPERR_YPBIND;
1481.1Sderaadt	}
1491.1Sderaadt	clnt_destroy(client);
1501.1Sderaadt	return 0;
1511.1Sderaadt}
1521.1Sderaadt
1531.11Sthorpejstatic void
1541.17Sjoergusage(void)
1551.1Sderaadt{
1561.11Sthorpej	(void) fprintf(stderr, "usage: %s [-h host ] [-d domain] server\n",
1571.13Scgd	    getprogname());
1581.11Sthorpej	exit(1);
1591.1Sderaadt}
160