ypset.c revision 1.11
11.11Sthorpej/*	$NetBSD: ypset.c,v 1.11 1997/07/18 08:16:58 thorpej 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.5Sderaadt * 3. All advertising materials mentioning features or use of this software
161.5Sderaadt *    must display the following acknowledgement:
171.5Sderaadt *	This product includes software developed by Theo de Raadt.
181.5Sderaadt * 4. The name of the author may not be used to endorse or promote
191.2Sderaadt *    products derived from this software without specific prior written
201.2Sderaadt *    permission.
211.2Sderaadt *
221.2Sderaadt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
231.2Sderaadt * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
241.2Sderaadt * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
251.2Sderaadt * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
261.2Sderaadt * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
271.2Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
281.2Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
291.2Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
301.2Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
311.2Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
321.2Sderaadt * SUCH DAMAGE.
331.2Sderaadt */
341.2Sderaadt
351.11Sthorpej#include <sys/cdefs.h>
361.11Sthorpej#ifndef lint
371.11Sthorpej__RCSID("$NetBSD: ypset.c,v 1.11 1997/07/18 08:16:58 thorpej Exp $");
381.2Sderaadt#endif
391.2Sderaadt
401.1Sderaadt#include <sys/param.h>
411.1Sderaadt#include <sys/types.h>
421.1Sderaadt#include <sys/socket.h>
431.1Sderaadt#include <stdio.h>
441.10Schristos#include <string.h>
451.10Schristos#include <stdlib.h>
461.10Schristos#include <unistd.h>
471.10Schristos#include <err.h>
481.1Sderaadt#include <netdb.h>
491.11Sthorpej
501.1Sderaadt#include <rpc/rpc.h>
511.1Sderaadt#include <rpc/xdr.h>
521.1Sderaadt#include <rpcsvc/yp_prot.h>
531.1Sderaadt#include <rpcsvc/ypclnt.h>
541.4Sbrezak#include <arpa/inet.h>
551.1Sderaadt
561.10Schristosextern char *__progname;
571.10Schristos
581.11Sthorpejint	main __P((int, char *[]));
591.10Schristosstatic void usage __P((void));
601.10Schristosstatic void gethostaddr __P((const char *, struct in_addr *));
611.10Schristosstatic int bind_tohost __P((struct sockaddr_in *, char *, char *));
621.10Schristos
631.11Sthorpejint
641.11Sthorpejmain(argc, argv)
651.11Sthorpej	int argc;
661.11Sthorpej	char *argv[];
671.1Sderaadt{
681.11Sthorpej	struct sockaddr_in sin;
691.11Sthorpej	extern char *optarg;
701.11Sthorpej	extern int optind;
711.11Sthorpej	char *domainname;
721.11Sthorpej	int c;
731.11Sthorpej
741.11Sthorpej	yp_get_default_domain(&domainname);
751.11Sthorpej
761.11Sthorpej	(void) memset(&sin, 0, sizeof sin);
771.11Sthorpej	sin.sin_family = AF_INET;
781.11Sthorpej	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
791.11Sthorpej
801.11Sthorpej	while ((c = getopt(argc, argv, "h:d:")) != -1) {
811.11Sthorpej		switch(c) {
821.11Sthorpej		case 'd':
831.11Sthorpej			domainname = optarg;
841.11Sthorpej			break;
851.11Sthorpej
861.11Sthorpej		case 'h':
871.11Sthorpej			gethostaddr(optarg, &sin.sin_addr);
881.11Sthorpej			break;
891.11Sthorpej
901.11Sthorpej		default:
911.11Sthorpej			usage();
921.11Sthorpej		}
931.11Sthorpej	}
941.11Sthorpej
951.11Sthorpej	if (domainname == NULL)
961.11Sthorpej		errx(1, "YP domain name not set");
971.11Sthorpej
981.11Sthorpej	argc -= optind;
991.11Sthorpej	argv += optind;
1001.11Sthorpej
1011.11Sthorpej	if (argc != 1)
1021.11Sthorpej		usage();
1031.11Sthorpej
1041.11Sthorpej	return bind_tohost(&sin, domainname, argv[0]) != 0;
1051.1Sderaadt}
1061.1Sderaadt
1071.10Schristosstatic void
1081.10Schristosgethostaddr(host, ia)
1091.10Schristos	const char *host;
1101.10Schristos	struct in_addr *ia;
1111.10Schristos{
1121.10Schristos	struct hostent *hp;
1131.10Schristos
1141.10Schristos	if (inet_aton(host, ia) != 0)
1151.10Schristos		return;
1161.10Schristos
1171.10Schristos	hp = gethostbyname(host);
1181.10Schristos	if (hp == NULL)
1191.10Schristos		errx(1, "Cannot get host address for %s: %s", host,
1201.10Schristos		    hstrerror(h_errno));
1211.10Schristos	(void) memcpy(ia, hp->h_addr, sizeof(*ia));
1221.10Schristos}
1231.10Schristos
1241.10Schristosstatic int
1251.1Sderaadtbind_tohost(sin, dom, server)
1261.10Schristos	struct sockaddr_in *sin;
1271.10Schristos	char *dom, *server;
1281.1Sderaadt{
1291.1Sderaadt	struct ypbind_setdom ypsd;
1301.1Sderaadt	struct timeval tv;
1311.1Sderaadt	CLIENT *client;
1321.1Sderaadt	int sock, port;
1331.1Sderaadt	int r;
1341.1Sderaadt
1351.10Schristos	port = htons(getrpcport(server, YPPROG, YPPROC_NULL, IPPROTO_UDP));
1361.10Schristos	if (port == 0)
1371.10Schristos		errx(1, "%s not running ypserv.", server);
1381.1Sderaadt
1391.10Schristos	(void) memset(&ypsd, 0, sizeof ypsd);
1401.4Sbrezak
1411.10Schristos	gethostaddr(server, &ypsd.ypsetdom_addr);
1421.4Sbrezak
1431.10Schristos	(void) strncpy(ypsd.ypsetdom_domain, dom, sizeof ypsd.ypsetdom_domain);
1441.10Schristos	ypsd.ypsetdom_domain[sizeof(ypsd.ypsetdom_domain) - 1] = '\0';
1451.4Sbrezak	ypsd.ypsetdom_port = port;
1461.1Sderaadt	ypsd.ypsetdom_vers = YPVERS;
1471.1Sderaadt
1481.1Sderaadt	tv.tv_sec = 15;
1491.1Sderaadt	tv.tv_usec = 0;
1501.1Sderaadt	sock = RPC_ANYSOCK;
1511.10Schristos
1521.3Sderaadt	client = clntudp_create(sin, YPBINDPROG, YPBINDVERS, tv, &sock);
1531.10Schristos	if (client == NULL) {
1541.10Schristos		warnx("Can't yp_bind: Reason: %s", yperr_string(YPERR_YPBIND));
1551.1Sderaadt		return YPERR_YPBIND;
1561.1Sderaadt	}
1571.1Sderaadt	client->cl_auth = authunix_create_default();
1581.1Sderaadt
1591.1Sderaadt	r = clnt_call(client, YPBINDPROC_SETDOM,
1601.10Schristos	    xdr_ypbind_setdom, &ypsd, xdr_void, NULL, tv);
1611.10Schristos	if (r) {
1621.10Schristos		warnx("Cannot ypset for domain %s on host %s: %s.\n",
1631.10Schristos		    dom, server, clnt_sperrno(r));
1641.1Sderaadt		clnt_destroy(client);
1651.1Sderaadt		return YPERR_YPBIND;
1661.1Sderaadt	}
1671.1Sderaadt	clnt_destroy(client);
1681.1Sderaadt	return 0;
1691.1Sderaadt}
1701.1Sderaadt
1711.11Sthorpejstatic void
1721.11Sthorpejusage()
1731.1Sderaadt{
1741.11Sthorpej	(void) fprintf(stderr, "usage: %s [-h host ] [-d domain] server\n",
1751.11Sthorpej	    __progname);
1761.11Sthorpej	exit(1);
1771.1Sderaadt}
178