diff options
author | araujo <araujo@FreeBSD.org> | 2015-09-03 07:12:40 +0000 |
---|---|---|
committer | araujo <araujo@FreeBSD.org> | 2015-09-03 07:12:40 +0000 |
commit | e4a962650c8eb40be639934026f50f9293867c76 (patch) | |
tree | 520f08f1e67bcb52775b537c1d5f4513f3f499d4 /usr.sbin/yppoll/yppoll.c | |
parent | d600cd57f445e84a2d649eb0a660e7cc01c4d13c (diff) | |
download | FreeBSD-src-e4a962650c8eb40be639934026f50f9293867c76.zip FreeBSD-src-e4a962650c8eb40be639934026f50f9293867c76.tar.gz |
Sync with the latest code from OpenBSD.
Approved by: rodrigc (mentor)
Differential Revision: D3550
Diffstat (limited to 'usr.sbin/yppoll/yppoll.c')
-rw-r--r-- | usr.sbin/yppoll/yppoll.c | 146 |
1 files changed, 106 insertions, 40 deletions
diff --git a/usr.sbin/yppoll/yppoll.c b/usr.sbin/yppoll/yppoll.c index 34ba18b..4560c21 100644 --- a/usr.sbin/yppoll/yppoll.c +++ b/usr.sbin/yppoll/yppoll.c @@ -1,6 +1,9 @@ +/* $OpenBSD: yppoll.c,v 1.15 2015/01/16 06:40:22 deraadt Exp $ */ +/* $NetBSD: yppoll.c,v 1.5 1996/05/13 02:46:36 thorpej Exp $ */ + /* - * Copyright (c) 1992/3 Theo de Raadt <deraadt@fsa.ca> - * Copyright (c) 1992/3 John Brezak + * Copyright (c) 1992, 1993 Theo de Raadt <deraadt@openbsd.org> + * Copyright (c) 1992, 1993 John Brezak * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,11 +37,17 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/types.h> #include <sys/socket.h> + +#include <arpa/inet.h> +#include <netinet/in.h> + +#include <ctype.h> #include <err.h> +#include <netdb.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <time.h> -#include <timeconv.h> #include <unistd.h> #include <rpc/rpc.h> @@ -49,59 +58,116 @@ __FBSDID("$FreeBSD$"); static void usage(void) { -#if 0 - fprintf(stderr, "usage: yppoll [-h host] [-d domainname] mapname\n"); -#else - fprintf(stderr, "usage: yppoll [-d domainname] mapname\n"); -#endif + fprintf(stderr, "usage: yppoll [-d domain] [-h host] mapname\n"); exit(1); } +static int +get_remote_info(char *indomain, char *inmap, char *server, int *outorder, + char **outname) +{ + struct ypresp_order ypro; + struct ypresp_master yprm; + struct ypreq_nokey yprnk; + struct timeval tv; + struct sockaddr_in rsrv_sin; + int rsrv_sock; + CLIENT *client; + struct hostent *h; + int r; + + bzero((char *)&rsrv_sin, sizeof rsrv_sin); + rsrv_sin.sin_len = sizeof rsrv_sin; + rsrv_sin.sin_family = AF_INET; + rsrv_sock = RPC_ANYSOCK; + + h = gethostbyname(server); + if (h == NULL) { + if (inet_aton(server, &rsrv_sin.sin_addr) == 0) + errx(1, "unknown host %s.", server); + } else + rsrv_sin.sin_addr.s_addr = *(u_int32_t *)h->h_addr; + + tv.tv_sec = 10; + tv.tv_usec = 0; + + client = clntudp_create(&rsrv_sin, YPPROG, YPVERS, tv, &rsrv_sock); + if (client == NULL) + errx(1, "clntudp_create: no contact with host %s.", server); + + yprnk.domain = indomain; + yprnk.map = inmap; + + bzero((char *)(char *)&ypro, sizeof ypro); + + r = clnt_call(client, YPPROC_ORDER, (xdrproc_t)xdr_ypreq_nokey, &yprnk, + (xdrproc_t)xdr_ypresp_order, &ypro, tv); + if (r != RPC_SUCCESS) + clnt_perror(client, "yp_order: clnt_call"); + + *outorder = ypro.ordernum; + xdr_free((xdrproc_t)xdr_ypresp_order, (char *)&ypro); + + r = ypprot_err(ypro.status); + if (r == RPC_SUCCESS) { + bzero((char *)&yprm, sizeof yprm); + + r = clnt_call(client, YPPROC_MASTER, (xdrproc_t)xdr_ypreq_nokey, + &yprnk, (xdrproc_t)xdr_ypresp_master, &yprm, tv); + if (r != RPC_SUCCESS) + clnt_perror(client, "yp_master: clnt_call"); + r = ypprot_err(yprm.status); + if (r == 0) + *outname = (char *)strdup(yprm.master); + xdr_free((xdrproc_t)xdr_ypresp_master, (char *)&yprm); + } + clnt_destroy(client); + return (r); +} + int main(int argc, char *argv[]) { - char *domainname; -#if 0 - char *hostname = "localhost"; -#endif - char *inmap, *master; - int order; - int c, r; - time_t t; + char *domainname, *hostname = NULL, *inmap, *master; + int order, c, r; + time_t torder; - yp_get_default_domain(&domainname); + yp_get_default_domain(&domainname); while ((c = getopt(argc, argv, "h:d:")) != -1) switch (c) { case 'd': - domainname = optarg; + domainname = optarg; break; - case 'h': -#if 0 - hostname = optarg; -#else - /* does nothing */ -#endif - break; - case '?': - usage(); - /*NOTREACHED*/ + case 'h': + hostname = optarg; + break; + default: + usage(); + /*NOTREACHED*/ } if (optind + 1 != argc) usage(); - inmap = argv[optind]; - r = yp_order(domainname, inmap, &order); - if (r != 0) - errx(1, "no such map %s. Reason: %s", inmap, yperr_string(r)); - t = _int_to_time(order); - printf("Map %s has order number %d. %s", inmap, order, ctime(&t)); - r = yp_master(domainname, inmap, &master); - if (r != 0) - errx(1, "no such map %s. Reason: %s", inmap, yperr_string(r)); - printf("The master server is %s.\n", master); - - exit(0); + if (hostname != NULL) { + r = get_remote_info(domainname, inmap, hostname, + &order, &master); + } else { + r = yp_order(domainname, inmap, &order); + if (r == 0) + r = yp_master(domainname, inmap, &master); + } + + if (r != 0) + errx(1, "no such map %s: reason: %s", + inmap, yperr_string(r)); + + torder = order; + printf("Map %s has order number %lld. %s", inmap, + (long long)order, ctime(&torder)); + printf("The master server is %s.\n", master); + + exit(0); } |