ypset.c revision 1.1
11.1Sderaadt#include <sys/param.h>
21.1Sderaadt#include <sys/types.h>
31.1Sderaadt#include <sys/socket.h>
41.1Sderaadt#include <stdio.h>
51.1Sderaadt#include <netdb.h>
61.1Sderaadt#include <rpc/rpc.h>
71.1Sderaadt#include <rpc/xdr.h>
81.1Sderaadt#include <rpcsvc/yp_prot.h>
91.1Sderaadt#include <rpcsvc/ypclnt.h>
101.1Sderaadt
111.1Sderaadtextern bool_t xdr_domainname();
121.1Sderaadt
131.1Sderaadtusage()
141.1Sderaadt{
151.1Sderaadt	fprintf(stderr, "Usage:\n");
161.1Sderaadt	fprintf(stderr, "\typset [-h host ] [-d domain] server\n");
171.1Sderaadt	exit(1);
181.1Sderaadt}
191.1Sderaadt
201.1Sderaadtbind_tohost(sin, dom, server)
211.1Sderaadtstruct sockaddr_in *sin;
221.1Sderaadtchar *dom, *server;
231.1Sderaadt{
241.1Sderaadt	struct ypbind_setdom ypsd;
251.1Sderaadt	struct timeval tv;
261.1Sderaadt	CLIENT *client;
271.1Sderaadt	int sock, port;
281.1Sderaadt	int r;
291.1Sderaadt
301.1Sderaadt	if( (port=htons(getrpcport(server, YPPROG, YPPROC_NULL, IPPROTO_UDP))) == 0) {
311.1Sderaadt		fprintf(stderr, "%s not running ypserv.\n", server);
321.1Sderaadt		exit(1);
331.1Sderaadt	}
341.1Sderaadt
351.1Sderaadt	bzero(&ypsd, sizeof ypsd);
361.1Sderaadt	strncpy(ypsd.ypsetdom_domain, dom, sizeof ypsd.ypsetdom_domain);
371.1Sderaadt	ypsd.ypsetdom_addr = sin->sin_addr;
381.1Sderaadt	ypsd.ypsetdom_vers = YPVERS;
391.1Sderaadt	ypsd.ypsetdom_port = port;
401.1Sderaadt
411.1Sderaadt	tv.tv_sec = 15;
421.1Sderaadt	tv.tv_usec = 0;
431.1Sderaadt	sock = RPC_ANYSOCK;
441.1Sderaadt	client = clntudp_create(sin, YPBINDPROG, YPBINDVERS, &sock, 0, 0);
451.1Sderaadt	if (client==NULL) {
461.1Sderaadt		fprintf(stderr, "can't yp_bind: Reason: %s\n",
471.1Sderaadt			yperr_string(YPERR_YPBIND));
481.1Sderaadt		return YPERR_YPBIND;
491.1Sderaadt	}
501.1Sderaadt	client->cl_auth = authunix_create_default();
511.1Sderaadt
521.1Sderaadt	r = clnt_call(client, YPBINDPROC_SETDOM,
531.1Sderaadt		xdr_ypbind_setdom, &ypsd, xdr_void, NULL, tv);
541.1Sderaadt	if(r) {
551.1Sderaadt		fprintf(stderr, "Sorry, cannot ypset for domain %s on host.\n", dom);
561.1Sderaadt		clnt_destroy(client);
571.1Sderaadt		return YPERR_YPBIND;
581.1Sderaadt	}
591.1Sderaadt	clnt_destroy(client);
601.1Sderaadt	return 0;
611.1Sderaadt}
621.1Sderaadt
631.1Sderaadtint
641.1Sderaadtmain(argc, argv)
651.1Sderaadtchar **argv;
661.1Sderaadt{
671.1Sderaadt	struct sockaddr_in sin;
681.1Sderaadt	struct hostent *hent;
691.1Sderaadt	extern char *optarg;
701.1Sderaadt	extern int optind;
711.1Sderaadt	char *domainname;
721.1Sderaadt	int c;
731.1Sderaadt
741.1Sderaadt	yp_get_default_domain(&domainname);
751.1Sderaadt
761.1Sderaadt	bzero(&sin, sizeof sin);
771.1Sderaadt	sin.sin_family = AF_INET;
781.1Sderaadt	sin.sin_addr.s_addr = htonl(0x7f000001);
791.1Sderaadt
801.1Sderaadt	while( (c=getopt(argc, argv, "h:d:")) != -1)
811.1Sderaadt		switch(c) {
821.1Sderaadt		case 'd':
831.1Sderaadt			domainname = optarg;
841.1Sderaadt			break;
851.1Sderaadt		case 'h':
861.1Sderaadt			if( (sin.sin_addr.s_addr=inet_addr(optarg)) == -1) {
871.1Sderaadt				hent = gethostbyname(optarg);
881.1Sderaadt				if(hent==NULL) {
891.1Sderaadt					fprintf(stderr, "ypset: host %s unknown\n",
901.1Sderaadt						optarg);
911.1Sderaadt					exit(1);
921.1Sderaadt				}
931.1Sderaadt				bcopy(&hent->h_addr_list[0], &sin.sin_addr,
941.1Sderaadt					sizeof sin.sin_addr);
951.1Sderaadt			}
961.1Sderaadt			break;
971.1Sderaadt		default:
981.1Sderaadt			usage();
991.1Sderaadt		}
1001.1Sderaadt
1011.1Sderaadt	if(optind + 1 != argc )
1021.1Sderaadt		usage();
1031.1Sderaadt
1041.1Sderaadt	if (bind_tohost(&sin, domainname, argv[optind]))
1051.1Sderaadt		exit(1);
1061.1Sderaadt	exit(0);
1071.1Sderaadt}
108