1*662f5a1dSjdolecek /* $NetBSD: yppoll.c,v 1.13 2003/12/10 17:10:34 jdolecek Exp $ */ 2b2fd6338Sthorpej 3a4dd8f97Sbrezak /* 4b86d2fa0Sderaadt * Copyright (c) 1992, 1993 Theo de Raadt <deraadt@fsa.ca> 57db1d33cSagc * All rights reserved. 67db1d33cSagc * 77db1d33cSagc * Redistribution and use in source and binary forms, with or without 87db1d33cSagc * modification, are permitted provided that the following conditions 97db1d33cSagc * are met: 107db1d33cSagc * 1. Redistributions of source code must retain the above copyright 117db1d33cSagc * notice, this list of conditions and the following disclaimer. 127db1d33cSagc * 2. Redistributions in binary form must reproduce the above copyright 137db1d33cSagc * notice, this list of conditions and the following disclaimer in the 147db1d33cSagc * documentation and/or other materials provided with the distribution. 157db1d33cSagc * 167db1d33cSagc * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 177db1d33cSagc * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 187db1d33cSagc * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 197db1d33cSagc * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 207db1d33cSagc * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 217db1d33cSagc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 227db1d33cSagc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 237db1d33cSagc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 247db1d33cSagc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 257db1d33cSagc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 267db1d33cSagc * SUCH DAMAGE. 277db1d33cSagc */ 287db1d33cSagc 297db1d33cSagc /* 30b86d2fa0Sderaadt * Copyright (c) 1992, 1993 John Brezak 31a4dd8f97Sbrezak * All rights reserved. 32a4dd8f97Sbrezak * 33a4dd8f97Sbrezak * Redistribution and use in source and binary forms, with or without 34a4dd8f97Sbrezak * modification, are permitted provided that the following conditions 35a4dd8f97Sbrezak * are met: 36a4dd8f97Sbrezak * 1. Redistributions of source code must retain the above copyright 37a4dd8f97Sbrezak * notice, this list of conditions and the following disclaimer. 38a4dd8f97Sbrezak * 2. Redistributions in binary form must reproduce the above copyright 39a4dd8f97Sbrezak * notice, this list of conditions and the following disclaimer in the 40a4dd8f97Sbrezak * documentation and/or other materials provided with the distribution. 41*662f5a1dSjdolecek * 3. The name of the author may not be used to endorse or promote 42a4dd8f97Sbrezak * products derived from this software without specific prior written 43a4dd8f97Sbrezak * permission. 44a4dd8f97Sbrezak * 45a4dd8f97Sbrezak * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 46a4dd8f97Sbrezak * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 47a4dd8f97Sbrezak * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 48a4dd8f97Sbrezak * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 49a4dd8f97Sbrezak * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 50a4dd8f97Sbrezak * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 51a4dd8f97Sbrezak * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 52a4dd8f97Sbrezak * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 53a4dd8f97Sbrezak * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 54a4dd8f97Sbrezak * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 55a4dd8f97Sbrezak * SUCH DAMAGE. 56a4dd8f97Sbrezak */ 57a4dd8f97Sbrezak 58587f1445Sthorpej #include <sys/cdefs.h> 59aee4b07bSmycroft #ifndef lint 60*662f5a1dSjdolecek __RCSID("$NetBSD: yppoll.c,v 1.13 2003/12/10 17:10:34 jdolecek Exp $"); 61aee4b07bSmycroft #endif /* not lint */ 62a4dd8f97Sbrezak 63a4dd8f97Sbrezak #include <sys/param.h> 64a4dd8f97Sbrezak #include <sys/types.h> 65a4dd8f97Sbrezak #include <sys/socket.h> 66587f1445Sthorpej #include <err.h> 67a4dd8f97Sbrezak #include <stdio.h> 683ab02a87Smatt #include <stdlib.h> 69a4dd8f97Sbrezak #include <time.h> 70f452d538Sderaadt #include <netdb.h> 71f452d538Sderaadt #include <unistd.h> 72f452d538Sderaadt #include <string.h> 73f452d538Sderaadt #include <netinet/in.h> 74f452d538Sderaadt #include <arpa/inet.h> 75a4dd8f97Sbrezak 76a4dd8f97Sbrezak #include <rpc/rpc.h> 77a4dd8f97Sbrezak #include <rpc/xdr.h> 78a4dd8f97Sbrezak #include <rpcsvc/yp_prot.h> 79a4dd8f97Sbrezak #include <rpcsvc/ypclnt.h> 80a4dd8f97Sbrezak 81587f1445Sthorpej int main __P((int, char *[])); 82587f1445Sthorpej int get_remote_info __P((char *, char *, char *, int *, char **)); 83587f1445Sthorpej void usage __P((void)); 84587f1445Sthorpej 85587f1445Sthorpej int 86587f1445Sthorpej main(argc, argv) 87587f1445Sthorpej int argc; 88587f1445Sthorpej char **argv; 89a4dd8f97Sbrezak { 90587f1445Sthorpej char *domainname; 91587f1445Sthorpej char *hostname = NULL; 92587f1445Sthorpej char *inmap, *master; 93587f1445Sthorpej int order; 94587f1445Sthorpej int c, r; 95587f1445Sthorpej 96587f1445Sthorpej yp_get_default_domain(&domainname); 97587f1445Sthorpej 98587f1445Sthorpej while ((c = getopt(argc, argv, "h:d:")) != -1) { 99587f1445Sthorpej switch (c) { 100587f1445Sthorpej case 'd': 101587f1445Sthorpej domainname = optarg; 102587f1445Sthorpej break; 103587f1445Sthorpej 104587f1445Sthorpej case 'h': 105587f1445Sthorpej hostname = optarg; 106587f1445Sthorpej break; 107587f1445Sthorpej 108587f1445Sthorpej default: 109587f1445Sthorpej usage(); 110587f1445Sthorpej /*NOTREACHED*/ 111587f1445Sthorpej } 112587f1445Sthorpej } 113587f1445Sthorpej 114587f1445Sthorpej if (domainname == NULL) 115587f1445Sthorpej errx(1, "YP domain name not set"); 116587f1445Sthorpej 117587f1445Sthorpej argc -= optind; 118587f1445Sthorpej argv += optind; 119587f1445Sthorpej 120587f1445Sthorpej if (argc != 1) 121587f1445Sthorpej usage(); 122587f1445Sthorpej 123587f1445Sthorpej inmap = argv[0]; 124587f1445Sthorpej 125587f1445Sthorpej if (hostname != NULL) 126587f1445Sthorpej r = get_remote_info(domainname, inmap, hostname, 127587f1445Sthorpej &order, &master); 128587f1445Sthorpej else { 129587f1445Sthorpej r = yp_order(domainname, inmap, &order); 130587f1445Sthorpej if (r == 0) 131587f1445Sthorpej r = yp_master(domainname, inmap, &master); 132587f1445Sthorpej } 133587f1445Sthorpej 134587f1445Sthorpej if (r != 0) 135eda9e509Sgrant errx(1, "no such map %s. Reason: %s", 136587f1445Sthorpej inmap, yperr_string(r)); 137587f1445Sthorpej 138587f1445Sthorpej printf("Map %s has order number %d. %s", inmap, order, 139f33f7a14Sthorpej ctime((void *)&order)); 140587f1445Sthorpej printf("The master server is %s.\n", master); 141587f1445Sthorpej exit(0); 142a4dd8f97Sbrezak } 143a4dd8f97Sbrezak 144a4dd8f97Sbrezak int 145f452d538Sderaadt get_remote_info(indomain, inmap, server, outorder, outname) 146f452d538Sderaadt char *indomain; 147f452d538Sderaadt char *inmap; 148f452d538Sderaadt char *server; 149f452d538Sderaadt int *outorder; 150f452d538Sderaadt char **outname; 151f452d538Sderaadt { 152f452d538Sderaadt struct ypresp_order ypro; 153f452d538Sderaadt struct ypresp_master yprm; 154f452d538Sderaadt struct ypreq_nokey yprnk; 155f452d538Sderaadt struct timeval tv; 156f452d538Sderaadt int r; 157f452d538Sderaadt struct sockaddr_in rsrv_sin; 158f452d538Sderaadt int rsrv_sock; 159f452d538Sderaadt CLIENT *client; 160f452d538Sderaadt struct hostent *h; 161f452d538Sderaadt 162587f1445Sthorpej memset(&rsrv_sin, 0, sizeof(rsrv_sin)); 163f452d538Sderaadt rsrv_sin.sin_len = sizeof rsrv_sin; 164f452d538Sderaadt rsrv_sin.sin_family = AF_INET; 165f452d538Sderaadt rsrv_sock = RPC_ANYSOCK; 166f452d538Sderaadt 167f452d538Sderaadt h = gethostbyname(server); 168f452d538Sderaadt if (h == NULL) { 169587f1445Sthorpej if (inet_aton(server, &rsrv_sin.sin_addr) == 0) 170587f1445Sthorpej errx(1, "unknown host %s", server); 171587f1445Sthorpej } else 172587f1445Sthorpej memcpy(&rsrv_sin.sin_addr.s_addr, h->h_addr, h->h_length); 173f452d538Sderaadt 174f452d538Sderaadt tv.tv_sec = 10; 175f452d538Sderaadt tv.tv_usec = 0; 176f452d538Sderaadt 177f452d538Sderaadt client = clntudp_create(&rsrv_sin, YPPROG, YPVERS, tv, &rsrv_sock); 178587f1445Sthorpej if (client == NULL) 179eda9e509Sgrant errx(1, "clntudp_create: no contact with host %s.", server); 180f452d538Sderaadt 181f452d538Sderaadt yprnk.domain = indomain; 182f452d538Sderaadt yprnk.map = inmap; 183f452d538Sderaadt 184587f1445Sthorpej memset(&ypro, 0, sizeof(ypro)); 185f452d538Sderaadt 186f452d538Sderaadt r = clnt_call(client, YPPROC_ORDER, xdr_ypreq_nokey, &yprnk, 187f452d538Sderaadt xdr_ypresp_order, &ypro, tv); 188f452d538Sderaadt if (r != RPC_SUCCESS) 189f452d538Sderaadt clnt_perror(client, "yp_order: clnt_call"); 190f452d538Sderaadt 191f452d538Sderaadt *outorder = ypro.ordernum; 192f452d538Sderaadt xdr_free(xdr_ypresp_order, (char *)&ypro); 193f452d538Sderaadt 194f452d538Sderaadt r = ypprot_err(ypro.status); 195f452d538Sderaadt if (r == RPC_SUCCESS) { 196587f1445Sthorpej memset(&yprm, 0, sizeof(yprm)); 197f452d538Sderaadt 198f452d538Sderaadt r = clnt_call(client, YPPROC_MASTER, xdr_ypreq_nokey, 199f452d538Sderaadt &yprnk, xdr_ypresp_master, &yprm, tv); 200f452d538Sderaadt if (r != RPC_SUCCESS) 201f452d538Sderaadt clnt_perror(client, "yp_master: clnt_call"); 202f452d538Sderaadt r = ypprot_err(yprm.status); 203f452d538Sderaadt if (r == 0) 204f452d538Sderaadt *outname = (char *)strdup(yprm.master); 205f452d538Sderaadt xdr_free(xdr_ypresp_master, (char *)&yprm); 206f452d538Sderaadt } 207f452d538Sderaadt clnt_destroy(client); 208f452d538Sderaadt return r; 209f452d538Sderaadt } 210f452d538Sderaadt 211587f1445Sthorpej void 212587f1445Sthorpej usage() 213a4dd8f97Sbrezak { 214a4dd8f97Sbrezak 215587f1445Sthorpej fprintf(stderr, "usage: %s [-h host] [-d domainname] mapname\n", 21625bdbb66Scgd getprogname()); 217a4dd8f97Sbrezak exit(1); 218a4dd8f97Sbrezak } 219