xref: /netbsd/usr.sbin/yppoll/yppoll.c (revision eda9e509)
1*eda9e509Sgrant /*	$NetBSD: yppoll.c,v 1.10 2002/07/20 08:40:22 grant Exp $	*/
2b2fd6338Sthorpej 
3a4dd8f97Sbrezak /*
4b86d2fa0Sderaadt  * Copyright (c) 1992, 1993 Theo de Raadt <deraadt@fsa.ca>
5b86d2fa0Sderaadt  * Copyright (c) 1992, 1993 John Brezak
6a4dd8f97Sbrezak  * All rights reserved.
7a4dd8f97Sbrezak  *
8a4dd8f97Sbrezak  * Redistribution and use in source and binary forms, with or without
9a4dd8f97Sbrezak  * modification, are permitted provided that the following conditions
10a4dd8f97Sbrezak  * are met:
11a4dd8f97Sbrezak  * 1. Redistributions of source code must retain the above copyright
12a4dd8f97Sbrezak  *    notice, this list of conditions and the following disclaimer.
13a4dd8f97Sbrezak  * 2. Redistributions in binary form must reproduce the above copyright
14a4dd8f97Sbrezak  *    notice, this list of conditions and the following disclaimer in the
15a4dd8f97Sbrezak  *    documentation and/or other materials provided with the distribution.
16b86d2fa0Sderaadt  * 3. All advertising materials mentioning features or use of this software
17b86d2fa0Sderaadt  *    must display the following acknowledgement:
18b86d2fa0Sderaadt  *	This product includes software developed by Theo de Raadt and
19b86d2fa0Sderaadt  *	John Brezak.
20b86d2fa0Sderaadt  * 4. The name of the author may not be used to endorse or promote
21a4dd8f97Sbrezak  *    products derived from this software without specific prior written
22a4dd8f97Sbrezak  *    permission.
23a4dd8f97Sbrezak  *
24a4dd8f97Sbrezak  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
25a4dd8f97Sbrezak  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26a4dd8f97Sbrezak  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27a4dd8f97Sbrezak  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
28a4dd8f97Sbrezak  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29a4dd8f97Sbrezak  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30a4dd8f97Sbrezak  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31a4dd8f97Sbrezak  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32a4dd8f97Sbrezak  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33a4dd8f97Sbrezak  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34a4dd8f97Sbrezak  * SUCH DAMAGE.
35a4dd8f97Sbrezak  */
36a4dd8f97Sbrezak 
37587f1445Sthorpej #include <sys/cdefs.h>
38aee4b07bSmycroft #ifndef lint
39*eda9e509Sgrant __RCSID("$NetBSD: yppoll.c,v 1.10 2002/07/20 08:40:22 grant Exp $");
40aee4b07bSmycroft #endif /* not lint */
41a4dd8f97Sbrezak 
42a4dd8f97Sbrezak #include <sys/param.h>
43a4dd8f97Sbrezak #include <sys/types.h>
44a4dd8f97Sbrezak #include <sys/socket.h>
45587f1445Sthorpej #include <err.h>
46a4dd8f97Sbrezak #include <stdio.h>
473ab02a87Smatt #include <stdlib.h>
48a4dd8f97Sbrezak #include <time.h>
49f452d538Sderaadt #include <netdb.h>
50f452d538Sderaadt #include <unistd.h>
51f452d538Sderaadt #include <string.h>
52f452d538Sderaadt #include <netinet/in.h>
53f452d538Sderaadt #include <arpa/inet.h>
54a4dd8f97Sbrezak 
55a4dd8f97Sbrezak #include <rpc/rpc.h>
56a4dd8f97Sbrezak #include <rpc/xdr.h>
57a4dd8f97Sbrezak #include <rpcsvc/yp_prot.h>
58a4dd8f97Sbrezak #include <rpcsvc/ypclnt.h>
59a4dd8f97Sbrezak 
60587f1445Sthorpej int	main __P((int, char *[]));
61587f1445Sthorpej int	get_remote_info __P((char *, char *, char *, int *, char **));
62587f1445Sthorpej void	usage __P((void));
63587f1445Sthorpej 
64587f1445Sthorpej int
65587f1445Sthorpej main(argc, argv)
66587f1445Sthorpej 	int  argc;
67587f1445Sthorpej 	char **argv;
68a4dd8f97Sbrezak {
69587f1445Sthorpej 	char *domainname;
70587f1445Sthorpej 	char *hostname = NULL;
71587f1445Sthorpej 	char *inmap, *master;
72587f1445Sthorpej 	int order;
73587f1445Sthorpej 	int c, r;
74587f1445Sthorpej 
75587f1445Sthorpej 	yp_get_default_domain(&domainname);
76587f1445Sthorpej 
77587f1445Sthorpej 	while ((c = getopt(argc, argv, "h:d:")) != -1) {
78587f1445Sthorpej 		switch (c) {
79587f1445Sthorpej 		case 'd':
80587f1445Sthorpej 			domainname = optarg;
81587f1445Sthorpej 			break;
82587f1445Sthorpej 
83587f1445Sthorpej 		case 'h':
84587f1445Sthorpej 			hostname = optarg;
85587f1445Sthorpej 			break;
86587f1445Sthorpej 
87587f1445Sthorpej 		default:
88587f1445Sthorpej 			usage();
89587f1445Sthorpej 			/*NOTREACHED*/
90587f1445Sthorpej 		}
91587f1445Sthorpej 	}
92587f1445Sthorpej 
93587f1445Sthorpej 	if (domainname == NULL)
94587f1445Sthorpej 		errx(1, "YP domain name not set");
95587f1445Sthorpej 
96587f1445Sthorpej 	argc -= optind;
97587f1445Sthorpej 	argv += optind;
98587f1445Sthorpej 
99587f1445Sthorpej 	if (argc != 1)
100587f1445Sthorpej 		usage();
101587f1445Sthorpej 
102587f1445Sthorpej 	inmap = argv[0];
103587f1445Sthorpej 
104587f1445Sthorpej 	if (hostname != NULL)
105587f1445Sthorpej 		r = get_remote_info(domainname, inmap, hostname,
106587f1445Sthorpej 		    &order, &master);
107587f1445Sthorpej 	else {
108587f1445Sthorpej 		r = yp_order(domainname, inmap, &order);
109587f1445Sthorpej 		if (r == 0)
110587f1445Sthorpej 			r = yp_master(domainname, inmap, &master);
111587f1445Sthorpej 	}
112587f1445Sthorpej 
113587f1445Sthorpej 	if (r != 0)
114*eda9e509Sgrant 		errx(1, "no such map %s. Reason: %s",
115587f1445Sthorpej 		    inmap, yperr_string(r));
116587f1445Sthorpej 
117587f1445Sthorpej 	printf("Map %s has order number %d. %s", inmap, order,
118587f1445Sthorpej 	    ctime((time_t *)&order));
119587f1445Sthorpej 	printf("The master server is %s.\n", master);
120587f1445Sthorpej 	exit(0);
121a4dd8f97Sbrezak }
122a4dd8f97Sbrezak 
123a4dd8f97Sbrezak int
124f452d538Sderaadt get_remote_info(indomain, inmap, server, outorder, outname)
125f452d538Sderaadt 	char *indomain;
126f452d538Sderaadt 	char *inmap;
127f452d538Sderaadt 	char *server;
128f452d538Sderaadt 	int *outorder;
129f452d538Sderaadt 	char **outname;
130f452d538Sderaadt {
131f452d538Sderaadt 	struct ypresp_order ypro;
132f452d538Sderaadt 	struct ypresp_master yprm;
133f452d538Sderaadt 	struct ypreq_nokey yprnk;
134f452d538Sderaadt 	struct timeval tv;
135f452d538Sderaadt 	int r;
136f452d538Sderaadt 	struct sockaddr_in rsrv_sin;
137f452d538Sderaadt 	int rsrv_sock;
138f452d538Sderaadt 	CLIENT *client;
139f452d538Sderaadt 	struct hostent *h;
140f452d538Sderaadt 
141587f1445Sthorpej 	memset(&rsrv_sin, 0, sizeof(rsrv_sin));
142f452d538Sderaadt 	rsrv_sin.sin_len = sizeof rsrv_sin;
143f452d538Sderaadt 	rsrv_sin.sin_family = AF_INET;
144f452d538Sderaadt 	rsrv_sock = RPC_ANYSOCK;
145f452d538Sderaadt 
146f452d538Sderaadt 	h = gethostbyname(server);
147f452d538Sderaadt 	if (h == NULL) {
148587f1445Sthorpej 		if (inet_aton(server, &rsrv_sin.sin_addr) == 0)
149587f1445Sthorpej 			errx(1, "unknown host %s", server);
150587f1445Sthorpej 	} else
151587f1445Sthorpej 		memcpy(&rsrv_sin.sin_addr.s_addr, h->h_addr, h->h_length);
152f452d538Sderaadt 
153f452d538Sderaadt 	tv.tv_sec = 10;
154f452d538Sderaadt 	tv.tv_usec = 0;
155f452d538Sderaadt 
156f452d538Sderaadt 	client = clntudp_create(&rsrv_sin, YPPROG, YPVERS, tv, &rsrv_sock);
157587f1445Sthorpej 	if (client == NULL)
158*eda9e509Sgrant 		errx(1, "clntudp_create: no contact with host %s.", server);
159f452d538Sderaadt 
160f452d538Sderaadt 	yprnk.domain = indomain;
161f452d538Sderaadt 	yprnk.map = inmap;
162f452d538Sderaadt 
163587f1445Sthorpej 	memset(&ypro, 0, sizeof(ypro));
164f452d538Sderaadt 
165f452d538Sderaadt 	r = clnt_call(client, YPPROC_ORDER, xdr_ypreq_nokey, &yprnk,
166f452d538Sderaadt 	    xdr_ypresp_order, &ypro, tv);
167f452d538Sderaadt 	if (r != RPC_SUCCESS)
168f452d538Sderaadt 		clnt_perror(client, "yp_order: clnt_call");
169f452d538Sderaadt 
170f452d538Sderaadt 	*outorder = ypro.ordernum;
171f452d538Sderaadt 	xdr_free(xdr_ypresp_order, (char *)&ypro);
172f452d538Sderaadt 
173f452d538Sderaadt 	r = ypprot_err(ypro.status);
174f452d538Sderaadt 	if (r == RPC_SUCCESS) {
175587f1445Sthorpej 		memset(&yprm, 0, sizeof(yprm));
176f452d538Sderaadt 
177f452d538Sderaadt 		r = clnt_call(client, YPPROC_MASTER, xdr_ypreq_nokey,
178f452d538Sderaadt 		    &yprnk, xdr_ypresp_master, &yprm, tv);
179f452d538Sderaadt 		if (r != RPC_SUCCESS)
180f452d538Sderaadt 			clnt_perror(client, "yp_master: clnt_call");
181f452d538Sderaadt 		r = ypprot_err(yprm.status);
182f452d538Sderaadt 		if (r == 0)
183f452d538Sderaadt 			*outname = (char *)strdup(yprm.master);
184f452d538Sderaadt 		xdr_free(xdr_ypresp_master, (char *)&yprm);
185f452d538Sderaadt 	}
186f452d538Sderaadt 	clnt_destroy(client);
187f452d538Sderaadt 	return r;
188f452d538Sderaadt }
189f452d538Sderaadt 
190587f1445Sthorpej void
191587f1445Sthorpej usage()
192a4dd8f97Sbrezak {
193a4dd8f97Sbrezak 
194587f1445Sthorpej 	fprintf(stderr, "usage: %s [-h host] [-d domainname] mapname\n",
19525bdbb66Scgd 	    getprogname());
196a4dd8f97Sbrezak 	exit(1);
197a4dd8f97Sbrezak }
198