ypset.c revision 1.16
11.16Sjrf/*	$NetBSD: ypset.c,v 1.16 2004/09/07 13:20:41 jrf 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.16Sjrf__RCSID("$NetBSD: ypset.c,v 1.16 2004/09/07 13:20:41 jrf 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.11Sthorpejint	main __P((int, char *[]));
511.10Schristosstatic void usage __P((void));
521.10Schristosstatic void gethostaddr __P((const char *, struct in_addr *));
531.10Schristosstatic int bind_tohost __P((struct sockaddr_in *, char *, char *));
541.10Schristos
551.11Sthorpejint
561.11Sthorpejmain(argc, argv)
571.11Sthorpej	int argc;
581.11Sthorpej	char *argv[];
591.1Sderaadt{
601.11Sthorpej	struct sockaddr_in sin;
611.11Sthorpej	char *domainname;
621.11Sthorpej	int c;
631.11Sthorpej
641.11Sthorpej	yp_get_default_domain(&domainname);
651.11Sthorpej
661.11Sthorpej	(void) memset(&sin, 0, sizeof sin);
671.11Sthorpej	sin.sin_family = AF_INET;
681.11Sthorpej	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
691.11Sthorpej
701.11Sthorpej	while ((c = getopt(argc, argv, "h:d:")) != -1) {
711.11Sthorpej		switch(c) {
721.11Sthorpej		case 'd':
731.11Sthorpej			domainname = optarg;
741.11Sthorpej			break;
751.11Sthorpej
761.11Sthorpej		case 'h':
771.11Sthorpej			gethostaddr(optarg, &sin.sin_addr);
781.11Sthorpej			break;
791.11Sthorpej
801.11Sthorpej		default:
811.11Sthorpej			usage();
821.11Sthorpej		}
831.11Sthorpej	}
841.11Sthorpej
851.11Sthorpej	if (domainname == NULL)
861.11Sthorpej		errx(1, "YP domain name not set");
871.11Sthorpej
881.11Sthorpej	argc -= optind;
891.11Sthorpej	argv += optind;
901.11Sthorpej
911.11Sthorpej	if (argc != 1)
921.11Sthorpej		usage();
931.11Sthorpej
941.11Sthorpej	return bind_tohost(&sin, domainname, argv[0]) != 0;
951.1Sderaadt}
961.1Sderaadt
971.10Schristosstatic void
981.10Schristosgethostaddr(host, ia)
991.10Schristos	const char *host;
1001.10Schristos	struct in_addr *ia;
1011.10Schristos{
1021.10Schristos	struct hostent *hp;
1031.10Schristos
1041.10Schristos	if (inet_aton(host, ia) != 0)
1051.10Schristos		return;
1061.10Schristos
1071.10Schristos	hp = gethostbyname(host);
1081.10Schristos	if (hp == NULL)
1091.10Schristos		errx(1, "Cannot get host address for %s: %s", host,
1101.10Schristos		    hstrerror(h_errno));
1111.10Schristos	(void) memcpy(ia, hp->h_addr, sizeof(*ia));
1121.10Schristos}
1131.10Schristos
1141.10Schristosstatic int
1151.1Sderaadtbind_tohost(sin, dom, server)
1161.10Schristos	struct sockaddr_in *sin;
1171.10Schristos	char *dom, *server;
1181.1Sderaadt{
1191.1Sderaadt	struct ypbind_setdom ypsd;
1201.1Sderaadt	struct timeval tv;
1211.1Sderaadt	CLIENT *client;
1221.1Sderaadt	int sock, port;
1231.1Sderaadt	int r;
1241.1Sderaadt
1251.10Schristos	port = htons(getrpcport(server, YPPROG, YPPROC_NULL, IPPROTO_UDP));
1261.10Schristos	if (port == 0)
1271.10Schristos		errx(1, "%s not running ypserv.", server);
1281.1Sderaadt
1291.10Schristos	(void) memset(&ypsd, 0, sizeof ypsd);
1301.4Sbrezak
1311.10Schristos	gethostaddr(server, &ypsd.ypsetdom_addr);
1321.4Sbrezak
1331.16Sjrf	(void) strlcpy(ypsd.ypsetdom_domain, dom, sizeof ypsd.ypsetdom_domain);
1341.4Sbrezak	ypsd.ypsetdom_port = port;
1351.1Sderaadt	ypsd.ypsetdom_vers = YPVERS;
1361.1Sderaadt
1371.1Sderaadt	tv.tv_sec = 15;
1381.1Sderaadt	tv.tv_usec = 0;
1391.1Sderaadt	sock = RPC_ANYSOCK;
1401.10Schristos
1411.3Sderaadt	client = clntudp_create(sin, YPBINDPROG, YPBINDVERS, tv, &sock);
1421.10Schristos	if (client == NULL) {
1431.10Schristos		warnx("Can't yp_bind: Reason: %s", yperr_string(YPERR_YPBIND));
1441.1Sderaadt		return YPERR_YPBIND;
1451.1Sderaadt	}
1461.1Sderaadt	client->cl_auth = authunix_create_default();
1471.1Sderaadt
1481.1Sderaadt	r = clnt_call(client, YPBINDPROC_SETDOM,
1491.10Schristos	    xdr_ypbind_setdom, &ypsd, xdr_void, NULL, tv);
1501.10Schristos	if (r) {
1511.14Sgrant		warnx("Cannot ypset for domain %s on host %s: %s.",
1521.10Schristos		    dom, server, clnt_sperrno(r));
1531.1Sderaadt		clnt_destroy(client);
1541.1Sderaadt		return YPERR_YPBIND;
1551.1Sderaadt	}
1561.1Sderaadt	clnt_destroy(client);
1571.1Sderaadt	return 0;
1581.1Sderaadt}
1591.1Sderaadt
1601.11Sthorpejstatic void
1611.11Sthorpejusage()
1621.1Sderaadt{
1631.11Sthorpej	(void) fprintf(stderr, "usage: %s [-h host ] [-d domain] server\n",
1641.13Scgd	    getprogname());
1651.11Sthorpej	exit(1);
1661.1Sderaadt}
167