ypset.c revision 1.10
11.9Sthorpej/*	$NetBSD: ypset.c,v 1.10 1996/06/18 20:32:25 christos 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.2Sderaadt#ifndef LINT
361.9Sthorpejstatic char rcsid[] = "$NetBSD: ypset.c,v 1.10 1996/06/18 20:32:25 christos Exp $";
371.2Sderaadt#endif
381.2Sderaadt
391.1Sderaadt#include <sys/param.h>
401.1Sderaadt#include <sys/types.h>
411.1Sderaadt#include <sys/socket.h>
421.1Sderaadt#include <stdio.h>
431.10Schristos#include <string.h>
441.10Schristos#include <stdlib.h>
451.10Schristos#include <unistd.h>
461.10Schristos#include <err.h>
471.1Sderaadt#include <netdb.h>
481.1Sderaadt#include <rpc/rpc.h>
491.1Sderaadt#include <rpc/xdr.h>
501.1Sderaadt#include <rpcsvc/yp_prot.h>
511.1Sderaadt#include <rpcsvc/ypclnt.h>
521.4Sbrezak#include <arpa/inet.h>
531.1Sderaadt
541.10Schristosextern char *__progname;
551.10Schristos
561.10Schristosstatic void usage __P((void));
571.10Schristosstatic void gethostaddr __P((const char *, struct in_addr *));
581.10Schristosstatic int bind_tohost __P((struct sockaddr_in *, char *, char *));
591.10Schristos
601.10Schristosstatic void
611.1Sderaadtusage()
621.1Sderaadt{
631.10Schristos	(void) fprintf(stderr, "Usage: %s [-h host ] [-d domain] server\n",
641.10Schristos	    __progname);
651.1Sderaadt	exit(1);
661.1Sderaadt}
671.1Sderaadt
681.10Schristosstatic void
691.10Schristosgethostaddr(host, ia)
701.10Schristos	const char *host;
711.10Schristos	struct in_addr *ia;
721.10Schristos{
731.10Schristos	struct hostent *hp;
741.10Schristos
751.10Schristos	if (inet_aton(host, ia) != 0)
761.10Schristos		return;
771.10Schristos
781.10Schristos	hp = gethostbyname(host);
791.10Schristos	if (hp == NULL)
801.10Schristos		errx(1, "Cannot get host address for %s: %s", host,
811.10Schristos		    hstrerror(h_errno));
821.10Schristos	(void) memcpy(ia, hp->h_addr, sizeof(*ia));
831.10Schristos}
841.10Schristos
851.10Schristos
861.10Schristosstatic int
871.1Sderaadtbind_tohost(sin, dom, server)
881.10Schristos	struct sockaddr_in *sin;
891.10Schristos	char *dom, *server;
901.1Sderaadt{
911.1Sderaadt	struct ypbind_setdom ypsd;
921.1Sderaadt	struct timeval tv;
931.1Sderaadt	CLIENT *client;
941.1Sderaadt	int sock, port;
951.1Sderaadt	int r;
961.1Sderaadt
971.10Schristos	port = htons(getrpcport(server, YPPROG, YPPROC_NULL, IPPROTO_UDP));
981.10Schristos	if (port == 0)
991.10Schristos		errx(1, "%s not running ypserv.", server);
1001.1Sderaadt
1011.10Schristos	(void) memset(&ypsd, 0, sizeof ypsd);
1021.4Sbrezak
1031.10Schristos	gethostaddr(server, &ypsd.ypsetdom_addr);
1041.4Sbrezak
1051.10Schristos	(void) strncpy(ypsd.ypsetdom_domain, dom, sizeof ypsd.ypsetdom_domain);
1061.10Schristos	ypsd.ypsetdom_domain[sizeof(ypsd.ypsetdom_domain) - 1] = '\0';
1071.4Sbrezak	ypsd.ypsetdom_port = port;
1081.1Sderaadt	ypsd.ypsetdom_vers = YPVERS;
1091.1Sderaadt
1101.1Sderaadt	tv.tv_sec = 15;
1111.1Sderaadt	tv.tv_usec = 0;
1121.1Sderaadt	sock = RPC_ANYSOCK;
1131.10Schristos
1141.3Sderaadt	client = clntudp_create(sin, YPBINDPROG, YPBINDVERS, tv, &sock);
1151.10Schristos	if (client == NULL) {
1161.10Schristos		warnx("Can't yp_bind: Reason: %s", yperr_string(YPERR_YPBIND));
1171.1Sderaadt		return YPERR_YPBIND;
1181.1Sderaadt	}
1191.1Sderaadt	client->cl_auth = authunix_create_default();
1201.1Sderaadt
1211.1Sderaadt	r = clnt_call(client, YPBINDPROC_SETDOM,
1221.10Schristos	    xdr_ypbind_setdom, &ypsd, xdr_void, NULL, tv);
1231.10Schristos	if (r) {
1241.10Schristos		warnx("Cannot ypset for domain %s on host %s: %s.\n",
1251.10Schristos		    dom, server, clnt_sperrno(r));
1261.1Sderaadt		clnt_destroy(client);
1271.1Sderaadt		return YPERR_YPBIND;
1281.1Sderaadt	}
1291.1Sderaadt	clnt_destroy(client);
1301.1Sderaadt	return 0;
1311.1Sderaadt}
1321.1Sderaadt
1331.1Sderaadtint
1341.1Sderaadtmain(argc, argv)
1351.10Schristos	int argc;
1361.10Schristos	char *argv[];
1371.1Sderaadt{
1381.1Sderaadt	struct sockaddr_in sin;
1391.1Sderaadt	extern char *optarg;
1401.1Sderaadt	extern int optind;
1411.1Sderaadt	char *domainname;
1421.1Sderaadt	int c;
1431.1Sderaadt
1441.1Sderaadt	yp_get_default_domain(&domainname);
1451.1Sderaadt
1461.10Schristos	(void) memset(&sin, 0, sizeof sin);
1471.1Sderaadt	sin.sin_family = AF_INET;
1481.10Schristos	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1491.1Sderaadt
1501.10Schristos	while((c = getopt(argc, argv, "h:d:")) != -1)
1511.1Sderaadt		switch(c) {
1521.1Sderaadt		case 'd':
1531.1Sderaadt			domainname = optarg;
1541.1Sderaadt			break;
1551.1Sderaadt		case 'h':
1561.10Schristos			gethostaddr(optarg, &sin.sin_addr);
1571.1Sderaadt			break;
1581.1Sderaadt		default:
1591.1Sderaadt			usage();
1601.1Sderaadt		}
1611.1Sderaadt
1621.10Schristos	if(optind + 1 != argc)
1631.1Sderaadt		usage();
1641.1Sderaadt
1651.10Schristos	return bind_tohost(&sin, domainname, argv[optind]) != 0;
1661.1Sderaadt}
167