ypset.c revision 1.2
11.2Sderaadt/*
21.2Sderaadt * Copyright (c) 1992/3 Theo de Raadt <deraadt@fsa.ca>
31.2Sderaadt * All rights reserved.
41.2Sderaadt *
51.2Sderaadt * Redistribution and use in source and binary forms, with or without
61.2Sderaadt * modification, are permitted provided that the following conditions
71.2Sderaadt * are met:
81.2Sderaadt * 1. Redistributions of source code must retain the above copyright
91.2Sderaadt *    notice, this list of conditions and the following disclaimer.
101.2Sderaadt * 2. Redistributions in binary form must reproduce the above copyright
111.2Sderaadt *    notice, this list of conditions and the following disclaimer in the
121.2Sderaadt *    documentation and/or other materials provided with the distribution.
131.2Sderaadt * 3. The name of the author may not be used to endorse or promote
141.2Sderaadt *    products derived from this software without specific prior written
151.2Sderaadt *    permission.
161.2Sderaadt *
171.2Sderaadt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
181.2Sderaadt * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
191.2Sderaadt * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
201.2Sderaadt * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
211.2Sderaadt * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
221.2Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
231.2Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
241.2Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
251.2Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
261.2Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
271.2Sderaadt * SUCH DAMAGE.
281.2Sderaadt */
291.2Sderaadt
301.2Sderaadt#ifndef LINT
311.2Sderaadtstatic char rcsid[] = "$Id: ypset.c,v 1.2 1993/05/16 02:49:07 deraadt 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.1Sderaadt#include <netdb.h>
391.1Sderaadt#include <rpc/rpc.h>
401.1Sderaadt#include <rpc/xdr.h>
411.1Sderaadt#include <rpcsvc/yp_prot.h>
421.1Sderaadt#include <rpcsvc/ypclnt.h>
431.1Sderaadt
441.1Sderaadtextern bool_t xdr_domainname();
451.1Sderaadt
461.1Sderaadtusage()
471.1Sderaadt{
481.1Sderaadt	fprintf(stderr, "Usage:\n");
491.1Sderaadt	fprintf(stderr, "\typset [-h host ] [-d domain] server\n");
501.1Sderaadt	exit(1);
511.1Sderaadt}
521.1Sderaadt
531.1Sderaadtbind_tohost(sin, dom, server)
541.1Sderaadtstruct sockaddr_in *sin;
551.1Sderaadtchar *dom, *server;
561.1Sderaadt{
571.1Sderaadt	struct ypbind_setdom ypsd;
581.1Sderaadt	struct timeval tv;
591.1Sderaadt	CLIENT *client;
601.1Sderaadt	int sock, port;
611.1Sderaadt	int r;
621.1Sderaadt
631.1Sderaadt	if( (port=htons(getrpcport(server, YPPROG, YPPROC_NULL, IPPROTO_UDP))) == 0) {
641.1Sderaadt		fprintf(stderr, "%s not running ypserv.\n", server);
651.1Sderaadt		exit(1);
661.1Sderaadt	}
671.1Sderaadt
681.1Sderaadt	bzero(&ypsd, sizeof ypsd);
691.1Sderaadt	strncpy(ypsd.ypsetdom_domain, dom, sizeof ypsd.ypsetdom_domain);
701.1Sderaadt	ypsd.ypsetdom_addr = sin->sin_addr;
711.1Sderaadt	ypsd.ypsetdom_vers = YPVERS;
721.1Sderaadt	ypsd.ypsetdom_port = port;
731.1Sderaadt
741.1Sderaadt	tv.tv_sec = 15;
751.1Sderaadt	tv.tv_usec = 0;
761.1Sderaadt	sock = RPC_ANYSOCK;
771.1Sderaadt	client = clntudp_create(sin, YPBINDPROG, YPBINDVERS, &sock, 0, 0);
781.1Sderaadt	if (client==NULL) {
791.1Sderaadt		fprintf(stderr, "can't yp_bind: Reason: %s\n",
801.1Sderaadt			yperr_string(YPERR_YPBIND));
811.1Sderaadt		return YPERR_YPBIND;
821.1Sderaadt	}
831.1Sderaadt	client->cl_auth = authunix_create_default();
841.1Sderaadt
851.1Sderaadt	r = clnt_call(client, YPBINDPROC_SETDOM,
861.1Sderaadt		xdr_ypbind_setdom, &ypsd, xdr_void, NULL, tv);
871.1Sderaadt	if(r) {
881.1Sderaadt		fprintf(stderr, "Sorry, cannot ypset for domain %s on host.\n", dom);
891.1Sderaadt		clnt_destroy(client);
901.1Sderaadt		return YPERR_YPBIND;
911.1Sderaadt	}
921.1Sderaadt	clnt_destroy(client);
931.1Sderaadt	return 0;
941.1Sderaadt}
951.1Sderaadt
961.1Sderaadtint
971.1Sderaadtmain(argc, argv)
981.1Sderaadtchar **argv;
991.1Sderaadt{
1001.1Sderaadt	struct sockaddr_in sin;
1011.1Sderaadt	struct hostent *hent;
1021.1Sderaadt	extern char *optarg;
1031.1Sderaadt	extern int optind;
1041.1Sderaadt	char *domainname;
1051.1Sderaadt	int c;
1061.1Sderaadt
1071.1Sderaadt	yp_get_default_domain(&domainname);
1081.1Sderaadt
1091.1Sderaadt	bzero(&sin, sizeof sin);
1101.1Sderaadt	sin.sin_family = AF_INET;
1111.1Sderaadt	sin.sin_addr.s_addr = htonl(0x7f000001);
1121.1Sderaadt
1131.1Sderaadt	while( (c=getopt(argc, argv, "h:d:")) != -1)
1141.1Sderaadt		switch(c) {
1151.1Sderaadt		case 'd':
1161.1Sderaadt			domainname = optarg;
1171.1Sderaadt			break;
1181.1Sderaadt		case 'h':
1191.1Sderaadt			if( (sin.sin_addr.s_addr=inet_addr(optarg)) == -1) {
1201.1Sderaadt				hent = gethostbyname(optarg);
1211.1Sderaadt				if(hent==NULL) {
1221.1Sderaadt					fprintf(stderr, "ypset: host %s unknown\n",
1231.1Sderaadt						optarg);
1241.1Sderaadt					exit(1);
1251.1Sderaadt				}
1261.1Sderaadt				bcopy(&hent->h_addr_list[0], &sin.sin_addr,
1271.1Sderaadt					sizeof sin.sin_addr);
1281.1Sderaadt			}
1291.1Sderaadt			break;
1301.1Sderaadt		default:
1311.1Sderaadt			usage();
1321.1Sderaadt		}
1331.1Sderaadt
1341.1Sderaadt	if(optind + 1 != argc )
1351.1Sderaadt		usage();
1361.1Sderaadt
1371.1Sderaadt	if (bind_tohost(&sin, domainname, argv[optind]))
1381.1Sderaadt		exit(1);
1391.1Sderaadt	exit(0);
1401.1Sderaadt}
141