xref: /minix3/usr.bin/getent/getent.c (revision 14d921278d893ff9c46e8515bb716ff102bade2d)
1*14d92127SDavid van Moolenbroek /*	$NetBSD: getent.c,v 1.19 2012/03/15 02:02:23 joerg Exp $	*/
2*14d92127SDavid van Moolenbroek 
3*14d92127SDavid van Moolenbroek /*-
4*14d92127SDavid van Moolenbroek  * Copyright (c) 2004-2006 The NetBSD Foundation, Inc.
5*14d92127SDavid van Moolenbroek  * All rights reserved.
6*14d92127SDavid van Moolenbroek  *
7*14d92127SDavid van Moolenbroek  * This code is derived from software contributed to The NetBSD Foundation
8*14d92127SDavid van Moolenbroek  * by Luke Mewburn.
9*14d92127SDavid van Moolenbroek  *
10*14d92127SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
11*14d92127SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
12*14d92127SDavid van Moolenbroek  * are met:
13*14d92127SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
14*14d92127SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
15*14d92127SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
16*14d92127SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
17*14d92127SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
18*14d92127SDavid van Moolenbroek  *
19*14d92127SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*14d92127SDavid van Moolenbroek  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*14d92127SDavid van Moolenbroek  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*14d92127SDavid van Moolenbroek  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*14d92127SDavid van Moolenbroek  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*14d92127SDavid van Moolenbroek  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*14d92127SDavid van Moolenbroek  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*14d92127SDavid van Moolenbroek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*14d92127SDavid van Moolenbroek  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*14d92127SDavid van Moolenbroek  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*14d92127SDavid van Moolenbroek  * POSSIBILITY OF SUCH DAMAGE.
30*14d92127SDavid van Moolenbroek  */
31*14d92127SDavid van Moolenbroek 
32*14d92127SDavid van Moolenbroek #include <sys/cdefs.h>
33*14d92127SDavid van Moolenbroek #ifndef lint
34*14d92127SDavid van Moolenbroek __RCSID("$NetBSD: getent.c,v 1.19 2012/03/15 02:02:23 joerg Exp $");
35*14d92127SDavid van Moolenbroek #endif /* not lint */
36*14d92127SDavid van Moolenbroek 
37*14d92127SDavid van Moolenbroek #include <sys/socket.h>
38*14d92127SDavid van Moolenbroek 
39*14d92127SDavid van Moolenbroek #include <assert.h>
40*14d92127SDavid van Moolenbroek #include <ctype.h>
41*14d92127SDavid van Moolenbroek #include <errno.h>
42*14d92127SDavid van Moolenbroek #include <grp.h>
43*14d92127SDavid van Moolenbroek #include <limits.h>
44*14d92127SDavid van Moolenbroek #include <netdb.h>
45*14d92127SDavid van Moolenbroek #include <netgroup.h>
46*14d92127SDavid van Moolenbroek #include <pwd.h>
47*14d92127SDavid van Moolenbroek #include <stdio.h>
48*14d92127SDavid van Moolenbroek #include <stdarg.h>
49*14d92127SDavid van Moolenbroek #include <stdbool.h>
50*14d92127SDavid van Moolenbroek #include <stdlib.h>
51*14d92127SDavid van Moolenbroek #include <string.h>
52*14d92127SDavid van Moolenbroek #include <unistd.h>
53*14d92127SDavid van Moolenbroek #include <paths.h>
54*14d92127SDavid van Moolenbroek #include <err.h>
55*14d92127SDavid van Moolenbroek 
56*14d92127SDavid van Moolenbroek #include <arpa/inet.h>
57*14d92127SDavid van Moolenbroek #include <arpa/nameser.h>
58*14d92127SDavid van Moolenbroek 
59*14d92127SDavid van Moolenbroek #include <net/if.h>
60*14d92127SDavid van Moolenbroek #include <net/if_ether.h>
61*14d92127SDavid van Moolenbroek 
62*14d92127SDavid van Moolenbroek #include <netinet/in.h>		/* for INET6_ADDRSTRLEN */
63*14d92127SDavid van Moolenbroek 
64*14d92127SDavid van Moolenbroek #if !defined(__minix)
65*14d92127SDavid van Moolenbroek #include <rpc/rpcent.h>
66*14d92127SDavid van Moolenbroek #endif /* !defined(__minix) */
67*14d92127SDavid van Moolenbroek 
68*14d92127SDavid van Moolenbroek #include <disktab.h>
69*14d92127SDavid van Moolenbroek 
70*14d92127SDavid van Moolenbroek static int	usage(void) __attribute__((__noreturn__));
71*14d92127SDavid van Moolenbroek static int	parsenum(const char *, unsigned long *);
72*14d92127SDavid van Moolenbroek static int	disktab(int, char *[]);
73*14d92127SDavid van Moolenbroek static int	gettytab(int, char *[]);
74*14d92127SDavid van Moolenbroek static int	ethers(int, char *[]);
75*14d92127SDavid van Moolenbroek static int	group(int, char *[]);
76*14d92127SDavid van Moolenbroek static int	hosts(int, char *[]);
77*14d92127SDavid van Moolenbroek static int	netgroup(int, char *[]);
78*14d92127SDavid van Moolenbroek static int	networks(int, char *[]);
79*14d92127SDavid van Moolenbroek static int	passwd(int, char *[]);
80*14d92127SDavid van Moolenbroek static int	printcap(int, char *[]);
81*14d92127SDavid van Moolenbroek static int	protocols(int, char *[]);
82*14d92127SDavid van Moolenbroek #if !defined(__minix)
83*14d92127SDavid van Moolenbroek static int	rpc(int, char *[]);
84*14d92127SDavid van Moolenbroek #endif /* !defined(__minix) */
85*14d92127SDavid van Moolenbroek static int	services(int, char *[]);
86*14d92127SDavid van Moolenbroek static int	shells(int, char *[]);
87*14d92127SDavid van Moolenbroek 
88*14d92127SDavid van Moolenbroek enum {
89*14d92127SDavid van Moolenbroek 	RV_OK		= 0,
90*14d92127SDavid van Moolenbroek 	RV_USAGE	= 1,
91*14d92127SDavid van Moolenbroek 	RV_NOTFOUND	= 2,
92*14d92127SDavid van Moolenbroek 	RV_NOENUM	= 3
93*14d92127SDavid van Moolenbroek };
94*14d92127SDavid van Moolenbroek 
95*14d92127SDavid van Moolenbroek static struct getentdb {
96*14d92127SDavid van Moolenbroek 	const char	*name;
97*14d92127SDavid van Moolenbroek 	int		(*callback)(int, char *[]);
98*14d92127SDavid van Moolenbroek } databases[] = {
99*14d92127SDavid van Moolenbroek 	{	"disktab",	disktab,	},
100*14d92127SDavid van Moolenbroek 	{	"ethers",	ethers,		},
101*14d92127SDavid van Moolenbroek 	{	"gettytab",	gettytab,	},
102*14d92127SDavid van Moolenbroek 	{	"group",	group,		},
103*14d92127SDavid van Moolenbroek 	{	"hosts",	hosts,		},
104*14d92127SDavid van Moolenbroek 	{	"netgroup",	netgroup,	},
105*14d92127SDavid van Moolenbroek 	{	"networks",	networks,	},
106*14d92127SDavid van Moolenbroek 	{	"passwd",	passwd,		},
107*14d92127SDavid van Moolenbroek 	{	"printcap",	printcap,	},
108*14d92127SDavid van Moolenbroek 	{	"protocols",	protocols,	},
109*14d92127SDavid van Moolenbroek #if !defined(__minix)
110*14d92127SDavid van Moolenbroek 	{	"rpc",		rpc,		},
111*14d92127SDavid van Moolenbroek #endif /* !defined(__minix) */
112*14d92127SDavid van Moolenbroek 	{	"services",	services,	},
113*14d92127SDavid van Moolenbroek 	{	"shells",	shells,		},
114*14d92127SDavid van Moolenbroek 
115*14d92127SDavid van Moolenbroek 	{	NULL,		NULL,		},
116*14d92127SDavid van Moolenbroek };
117*14d92127SDavid van Moolenbroek 
118*14d92127SDavid van Moolenbroek 
119*14d92127SDavid van Moolenbroek int
main(int argc,char * argv[])120*14d92127SDavid van Moolenbroek main(int argc, char *argv[])
121*14d92127SDavid van Moolenbroek {
122*14d92127SDavid van Moolenbroek 	struct getentdb	*curdb;
123*14d92127SDavid van Moolenbroek 
124*14d92127SDavid van Moolenbroek 	setprogname(argv[0]);
125*14d92127SDavid van Moolenbroek 
126*14d92127SDavid van Moolenbroek 	if (argc < 2)
127*14d92127SDavid van Moolenbroek 		usage();
128*14d92127SDavid van Moolenbroek 	for (curdb = databases; curdb->name != NULL; curdb++)
129*14d92127SDavid van Moolenbroek 		if (strcmp(curdb->name, argv[1]) == 0)
130*14d92127SDavid van Moolenbroek 			return (*curdb->callback)(argc, argv);
131*14d92127SDavid van Moolenbroek 
132*14d92127SDavid van Moolenbroek 	warn("Unknown database `%s'", argv[1]);
133*14d92127SDavid van Moolenbroek 	usage();
134*14d92127SDavid van Moolenbroek 	/* NOTREACHED */
135*14d92127SDavid van Moolenbroek }
136*14d92127SDavid van Moolenbroek 
137*14d92127SDavid van Moolenbroek static int
usage(void)138*14d92127SDavid van Moolenbroek usage(void)
139*14d92127SDavid van Moolenbroek {
140*14d92127SDavid van Moolenbroek 	struct getentdb	*curdb;
141*14d92127SDavid van Moolenbroek 	size_t i;
142*14d92127SDavid van Moolenbroek 
143*14d92127SDavid van Moolenbroek 	(void)fprintf(stderr, "Usage: %s database [key ...]\n",
144*14d92127SDavid van Moolenbroek 	    getprogname());
145*14d92127SDavid van Moolenbroek 	(void)fprintf(stderr, "\tdatabase may be one of:");
146*14d92127SDavid van Moolenbroek 	for (i = 0, curdb = databases; curdb->name != NULL; curdb++, i++) {
147*14d92127SDavid van Moolenbroek 		if (i % 7 == 0)
148*14d92127SDavid van Moolenbroek 			(void)fputs("\n\t\t", stderr);
149*14d92127SDavid van Moolenbroek 		(void)fprintf(stderr, "%s%s", i % 7 == 0 ? "" : " ",
150*14d92127SDavid van Moolenbroek 		    curdb->name);
151*14d92127SDavid van Moolenbroek 	}
152*14d92127SDavid van Moolenbroek 	(void)fprintf(stderr, "\n");
153*14d92127SDavid van Moolenbroek 	exit(RV_USAGE);
154*14d92127SDavid van Moolenbroek 	/* NOTREACHED */
155*14d92127SDavid van Moolenbroek }
156*14d92127SDavid van Moolenbroek 
157*14d92127SDavid van Moolenbroek static int
parsenum(const char * word,unsigned long * result)158*14d92127SDavid van Moolenbroek parsenum(const char *word, unsigned long *result)
159*14d92127SDavid van Moolenbroek {
160*14d92127SDavid van Moolenbroek 	unsigned long	num;
161*14d92127SDavid van Moolenbroek 	char		*ep;
162*14d92127SDavid van Moolenbroek 
163*14d92127SDavid van Moolenbroek 	assert(word != NULL);
164*14d92127SDavid van Moolenbroek 	assert(result != NULL);
165*14d92127SDavid van Moolenbroek 
166*14d92127SDavid van Moolenbroek 	if (!isdigit((unsigned char)word[0]))
167*14d92127SDavid van Moolenbroek 		return 0;
168*14d92127SDavid van Moolenbroek 	errno = 0;
169*14d92127SDavid van Moolenbroek 	num = strtoul(word, &ep, 10);
170*14d92127SDavid van Moolenbroek 	if (num == ULONG_MAX && errno == ERANGE)
171*14d92127SDavid van Moolenbroek 		return 0;
172*14d92127SDavid van Moolenbroek 	if (*ep != '\0')
173*14d92127SDavid van Moolenbroek 		return 0;
174*14d92127SDavid van Moolenbroek 	*result = num;
175*14d92127SDavid van Moolenbroek 	return 1;
176*14d92127SDavid van Moolenbroek }
177*14d92127SDavid van Moolenbroek 
178*14d92127SDavid van Moolenbroek /*
179*14d92127SDavid van Moolenbroek  * printfmtstrings --
180*14d92127SDavid van Moolenbroek  *	vprintf(format, ...),
181*14d92127SDavid van Moolenbroek  *	then the aliases (beginning with prefix, separated by sep),
182*14d92127SDavid van Moolenbroek  *	then a newline
183*14d92127SDavid van Moolenbroek  */
184*14d92127SDavid van Moolenbroek static __printflike(4, 5) void
printfmtstrings(char * strings[],const char * prefix,const char * sep,const char * fmt,...)185*14d92127SDavid van Moolenbroek printfmtstrings(char *strings[], const char *prefix, const char *sep,
186*14d92127SDavid van Moolenbroek     const char *fmt, ...)
187*14d92127SDavid van Moolenbroek {
188*14d92127SDavid van Moolenbroek 	va_list		ap;
189*14d92127SDavid van Moolenbroek 	const char	*curpref;
190*14d92127SDavid van Moolenbroek 	size_t		i;
191*14d92127SDavid van Moolenbroek 
192*14d92127SDavid van Moolenbroek 	va_start(ap, fmt);
193*14d92127SDavid van Moolenbroek 	(void)vprintf(fmt, ap);
194*14d92127SDavid van Moolenbroek 	va_end(ap);
195*14d92127SDavid van Moolenbroek 
196*14d92127SDavid van Moolenbroek 	curpref = prefix;
197*14d92127SDavid van Moolenbroek 	for (i = 0; strings[i] != NULL; i++) {
198*14d92127SDavid van Moolenbroek 		(void)printf("%s%s", curpref, strings[i]);
199*14d92127SDavid van Moolenbroek 		curpref = sep;
200*14d92127SDavid van Moolenbroek 	}
201*14d92127SDavid van Moolenbroek 	(void)printf("\n");
202*14d92127SDavid van Moolenbroek }
203*14d92127SDavid van Moolenbroek 
204*14d92127SDavid van Moolenbroek 
205*14d92127SDavid van Moolenbroek 		/*
206*14d92127SDavid van Moolenbroek 		 * ethers
207*14d92127SDavid van Moolenbroek 		 */
208*14d92127SDavid van Moolenbroek 
209*14d92127SDavid van Moolenbroek static int
ethers(int argc,char * argv[])210*14d92127SDavid van Moolenbroek ethers(int argc, char *argv[])
211*14d92127SDavid van Moolenbroek {
212*14d92127SDavid van Moolenbroek 	char		hostname[MAXHOSTNAMELEN + 1], *hp;
213*14d92127SDavid van Moolenbroek 	struct ether_addr ea, *eap;
214*14d92127SDavid van Moolenbroek 	int		i, rv;
215*14d92127SDavid van Moolenbroek 
216*14d92127SDavid van Moolenbroek 	assert(argc > 1);
217*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
218*14d92127SDavid van Moolenbroek 
219*14d92127SDavid van Moolenbroek #define ETHERSPRINT	(void)printf("%-17s  %s\n", ether_ntoa(eap), hp)
220*14d92127SDavid van Moolenbroek 
221*14d92127SDavid van Moolenbroek 	rv = RV_OK;
222*14d92127SDavid van Moolenbroek 	if (argc == 2) {
223*14d92127SDavid van Moolenbroek 		warnx("Enumeration not supported on ethers");
224*14d92127SDavid van Moolenbroek 		rv = RV_NOENUM;
225*14d92127SDavid van Moolenbroek 	} else {
226*14d92127SDavid van Moolenbroek 		for (i = 2; i < argc; i++) {
227*14d92127SDavid van Moolenbroek 			if ((eap = ether_aton(argv[i])) == NULL) {
228*14d92127SDavid van Moolenbroek 				eap = &ea;
229*14d92127SDavid van Moolenbroek 				hp = argv[i];
230*14d92127SDavid van Moolenbroek 				if (ether_hostton(hp, eap) != 0) {
231*14d92127SDavid van Moolenbroek 					rv = RV_NOTFOUND;
232*14d92127SDavid van Moolenbroek 					break;
233*14d92127SDavid van Moolenbroek 				}
234*14d92127SDavid van Moolenbroek 			} else {
235*14d92127SDavid van Moolenbroek 				hp = hostname;
236*14d92127SDavid van Moolenbroek 				if (ether_ntohost(hp, eap) != 0) {
237*14d92127SDavid van Moolenbroek 					rv = RV_NOTFOUND;
238*14d92127SDavid van Moolenbroek 					break;
239*14d92127SDavid van Moolenbroek 				}
240*14d92127SDavid van Moolenbroek 			}
241*14d92127SDavid van Moolenbroek 			ETHERSPRINT;
242*14d92127SDavid van Moolenbroek 		}
243*14d92127SDavid van Moolenbroek 	}
244*14d92127SDavid van Moolenbroek 	return rv;
245*14d92127SDavid van Moolenbroek }
246*14d92127SDavid van Moolenbroek 
247*14d92127SDavid van Moolenbroek 		/*
248*14d92127SDavid van Moolenbroek 		 * group
249*14d92127SDavid van Moolenbroek 		 */
250*14d92127SDavid van Moolenbroek 
251*14d92127SDavid van Moolenbroek static int
group(int argc,char * argv[])252*14d92127SDavid van Moolenbroek group(int argc, char *argv[])
253*14d92127SDavid van Moolenbroek {
254*14d92127SDavid van Moolenbroek 	struct group	*gr;
255*14d92127SDavid van Moolenbroek 	unsigned long	id;
256*14d92127SDavid van Moolenbroek 	int		i, rv;
257*14d92127SDavid van Moolenbroek 
258*14d92127SDavid van Moolenbroek 	assert(argc > 1);
259*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
260*14d92127SDavid van Moolenbroek 
261*14d92127SDavid van Moolenbroek #define GROUPPRINT	printfmtstrings(gr->gr_mem, ":", ",", "%s:%s:%u", \
262*14d92127SDavid van Moolenbroek 			    gr->gr_name, gr->gr_passwd, gr->gr_gid)
263*14d92127SDavid van Moolenbroek 
264*14d92127SDavid van Moolenbroek 	(void)setgroupent(1);
265*14d92127SDavid van Moolenbroek 	rv = RV_OK;
266*14d92127SDavid van Moolenbroek 	if (argc == 2) {
267*14d92127SDavid van Moolenbroek 		while ((gr = getgrent()) != NULL)
268*14d92127SDavid van Moolenbroek 			GROUPPRINT;
269*14d92127SDavid van Moolenbroek 	} else {
270*14d92127SDavid van Moolenbroek 		for (i = 2; i < argc; i++) {
271*14d92127SDavid van Moolenbroek 			if (parsenum(argv[i], &id))
272*14d92127SDavid van Moolenbroek 				gr = getgrgid((gid_t)id);
273*14d92127SDavid van Moolenbroek 			else
274*14d92127SDavid van Moolenbroek 				gr = getgrnam(argv[i]);
275*14d92127SDavid van Moolenbroek 			if (gr != NULL)
276*14d92127SDavid van Moolenbroek 				GROUPPRINT;
277*14d92127SDavid van Moolenbroek 			else {
278*14d92127SDavid van Moolenbroek 				rv = RV_NOTFOUND;
279*14d92127SDavid van Moolenbroek 				break;
280*14d92127SDavid van Moolenbroek 			}
281*14d92127SDavid van Moolenbroek 		}
282*14d92127SDavid van Moolenbroek 	}
283*14d92127SDavid van Moolenbroek 	endgrent();
284*14d92127SDavid van Moolenbroek 	return rv;
285*14d92127SDavid van Moolenbroek }
286*14d92127SDavid van Moolenbroek 
287*14d92127SDavid van Moolenbroek 
288*14d92127SDavid van Moolenbroek 		/*
289*14d92127SDavid van Moolenbroek 		 * hosts
290*14d92127SDavid van Moolenbroek 		 */
291*14d92127SDavid van Moolenbroek 
292*14d92127SDavid van Moolenbroek static void
hostsprint(const struct hostent * he)293*14d92127SDavid van Moolenbroek hostsprint(const struct hostent *he)
294*14d92127SDavid van Moolenbroek {
295*14d92127SDavid van Moolenbroek 	char	buf[INET6_ADDRSTRLEN];
296*14d92127SDavid van Moolenbroek 
297*14d92127SDavid van Moolenbroek 	assert(he != NULL);
298*14d92127SDavid van Moolenbroek 	if (inet_ntop(he->h_addrtype, he->h_addr, buf, sizeof(buf)) == NULL)
299*14d92127SDavid van Moolenbroek 		(void)strlcpy(buf, "# unknown", sizeof(buf));
300*14d92127SDavid van Moolenbroek 	printfmtstrings(he->h_aliases, "  ", " ", "%-16s  %s", buf, he->h_name);
301*14d92127SDavid van Moolenbroek }
302*14d92127SDavid van Moolenbroek 
303*14d92127SDavid van Moolenbroek static int
hosts(int argc,char * argv[])304*14d92127SDavid van Moolenbroek hosts(int argc, char *argv[])
305*14d92127SDavid van Moolenbroek {
306*14d92127SDavid van Moolenbroek 	struct hostent	*he;
307*14d92127SDavid van Moolenbroek 	char		addr[IN6ADDRSZ];
308*14d92127SDavid van Moolenbroek 	int		i, rv;
309*14d92127SDavid van Moolenbroek 
310*14d92127SDavid van Moolenbroek 	assert(argc > 1);
311*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
312*14d92127SDavid van Moolenbroek 
313*14d92127SDavid van Moolenbroek 	sethostent(1);
314*14d92127SDavid van Moolenbroek 	rv = RV_OK;
315*14d92127SDavid van Moolenbroek 	if (argc == 2) {
316*14d92127SDavid van Moolenbroek 		while ((he = gethostent()) != NULL)
317*14d92127SDavid van Moolenbroek 			hostsprint(he);
318*14d92127SDavid van Moolenbroek 	} else {
319*14d92127SDavid van Moolenbroek 		for (i = 2; i < argc; i++) {
320*14d92127SDavid van Moolenbroek 			if (inet_pton(AF_INET6, argv[i], (void *)addr) > 0)
321*14d92127SDavid van Moolenbroek 				he = gethostbyaddr(addr, IN6ADDRSZ, AF_INET6);
322*14d92127SDavid van Moolenbroek 			else if (inet_pton(AF_INET, argv[i], (void *)addr) > 0)
323*14d92127SDavid van Moolenbroek 				he = gethostbyaddr(addr, INADDRSZ, AF_INET);
324*14d92127SDavid van Moolenbroek 			else
325*14d92127SDavid van Moolenbroek 				he = gethostbyname(argv[i]);
326*14d92127SDavid van Moolenbroek 			if (he != NULL)
327*14d92127SDavid van Moolenbroek 				hostsprint(he);
328*14d92127SDavid van Moolenbroek 			else {
329*14d92127SDavid van Moolenbroek 				rv = RV_NOTFOUND;
330*14d92127SDavid van Moolenbroek 				break;
331*14d92127SDavid van Moolenbroek 			}
332*14d92127SDavid van Moolenbroek 		}
333*14d92127SDavid van Moolenbroek 	}
334*14d92127SDavid van Moolenbroek 	endhostent();
335*14d92127SDavid van Moolenbroek 	return rv;
336*14d92127SDavid van Moolenbroek }
337*14d92127SDavid van Moolenbroek 
338*14d92127SDavid van Moolenbroek 		/*
339*14d92127SDavid van Moolenbroek 		 * netgroup
340*14d92127SDavid van Moolenbroek 		 */
341*14d92127SDavid van Moolenbroek static int
netgroup(int argc,char * argv[])342*14d92127SDavid van Moolenbroek netgroup(int argc, char *argv[])
343*14d92127SDavid van Moolenbroek {
344*14d92127SDavid van Moolenbroek 	int		rv, i;
345*14d92127SDavid van Moolenbroek 	bool		first;
346*14d92127SDavid van Moolenbroek 	const char	*host, *user, *domain;
347*14d92127SDavid van Moolenbroek 
348*14d92127SDavid van Moolenbroek 	assert(argc > 1);
349*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
350*14d92127SDavid van Moolenbroek 
351*14d92127SDavid van Moolenbroek #define NETGROUPPRINT(s)	(((s) != NULL) ? (s) : "")
352*14d92127SDavid van Moolenbroek 
353*14d92127SDavid van Moolenbroek 	rv = RV_OK;
354*14d92127SDavid van Moolenbroek 	if (argc == 2) {
355*14d92127SDavid van Moolenbroek 		warnx("Enumeration not supported on netgroup");
356*14d92127SDavid van Moolenbroek 		rv = RV_NOENUM;
357*14d92127SDavid van Moolenbroek 	} else {
358*14d92127SDavid van Moolenbroek 		for (i = 2; i < argc; i++) {
359*14d92127SDavid van Moolenbroek 			setnetgrent(argv[i]);
360*14d92127SDavid van Moolenbroek 			first = true;
361*14d92127SDavid van Moolenbroek 			while (getnetgrent(&host, &user, &domain) != 0) {
362*14d92127SDavid van Moolenbroek 				if (first) {
363*14d92127SDavid van Moolenbroek 					first = false;
364*14d92127SDavid van Moolenbroek 					(void)fputs(argv[i], stdout);
365*14d92127SDavid van Moolenbroek 				}
366*14d92127SDavid van Moolenbroek 				(void)printf(" (%s,%s,%s)",
367*14d92127SDavid van Moolenbroek 				    NETGROUPPRINT(host),
368*14d92127SDavid van Moolenbroek 				    NETGROUPPRINT(user),
369*14d92127SDavid van Moolenbroek 				    NETGROUPPRINT(domain));
370*14d92127SDavid van Moolenbroek 			}
371*14d92127SDavid van Moolenbroek 			if (!first)
372*14d92127SDavid van Moolenbroek 				(void)putchar('\n');
373*14d92127SDavid van Moolenbroek 			endnetgrent();
374*14d92127SDavid van Moolenbroek 		}
375*14d92127SDavid van Moolenbroek 	}
376*14d92127SDavid van Moolenbroek 
377*14d92127SDavid van Moolenbroek 	return rv;
378*14d92127SDavid van Moolenbroek }
379*14d92127SDavid van Moolenbroek 
380*14d92127SDavid van Moolenbroek 		/*
381*14d92127SDavid van Moolenbroek 		 * networks
382*14d92127SDavid van Moolenbroek 		 */
383*14d92127SDavid van Moolenbroek 
384*14d92127SDavid van Moolenbroek static void
networksprint(const struct netent * ne)385*14d92127SDavid van Moolenbroek networksprint(const struct netent *ne)
386*14d92127SDavid van Moolenbroek {
387*14d92127SDavid van Moolenbroek 	char		buf[INET6_ADDRSTRLEN];
388*14d92127SDavid van Moolenbroek 	struct	in_addr	ianet;
389*14d92127SDavid van Moolenbroek 
390*14d92127SDavid van Moolenbroek 	assert(ne != NULL);
391*14d92127SDavid van Moolenbroek 	ianet = inet_makeaddr(ne->n_net, 0);
392*14d92127SDavid van Moolenbroek 	if (inet_ntop(ne->n_addrtype, &ianet, buf, sizeof(buf)) == NULL)
393*14d92127SDavid van Moolenbroek 		(void)strlcpy(buf, "# unknown", sizeof(buf));
394*14d92127SDavid van Moolenbroek 	printfmtstrings(ne->n_aliases, "  ", " ", "%-16s  %s", ne->n_name, buf);
395*14d92127SDavid van Moolenbroek }
396*14d92127SDavid van Moolenbroek 
397*14d92127SDavid van Moolenbroek static int
networks(int argc,char * argv[])398*14d92127SDavid van Moolenbroek networks(int argc, char *argv[])
399*14d92127SDavid van Moolenbroek {
400*14d92127SDavid van Moolenbroek 	struct netent	*ne;
401*14d92127SDavid van Moolenbroek 	in_addr_t	net;
402*14d92127SDavid van Moolenbroek 	int		i, rv;
403*14d92127SDavid van Moolenbroek 
404*14d92127SDavid van Moolenbroek 	assert(argc > 1);
405*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
406*14d92127SDavid van Moolenbroek 
407*14d92127SDavid van Moolenbroek 	setnetent(1);
408*14d92127SDavid van Moolenbroek 	rv = RV_OK;
409*14d92127SDavid van Moolenbroek 	if (argc == 2) {
410*14d92127SDavid van Moolenbroek 		while ((ne = getnetent()) != NULL)
411*14d92127SDavid van Moolenbroek 			networksprint(ne);
412*14d92127SDavid van Moolenbroek 	} else {
413*14d92127SDavid van Moolenbroek 		for (i = 2; i < argc; i++) {
414*14d92127SDavid van Moolenbroek 			net = inet_network(argv[i]);
415*14d92127SDavid van Moolenbroek 			if (net != INADDR_NONE)
416*14d92127SDavid van Moolenbroek 				ne = getnetbyaddr(net, AF_INET);
417*14d92127SDavid van Moolenbroek 			else
418*14d92127SDavid van Moolenbroek 				ne = getnetbyname(argv[i]);
419*14d92127SDavid van Moolenbroek 			if (ne != NULL)
420*14d92127SDavid van Moolenbroek 				networksprint(ne);
421*14d92127SDavid van Moolenbroek 			else {
422*14d92127SDavid van Moolenbroek 				rv = RV_NOTFOUND;
423*14d92127SDavid van Moolenbroek 				break;
424*14d92127SDavid van Moolenbroek 			}
425*14d92127SDavid van Moolenbroek 		}
426*14d92127SDavid van Moolenbroek 	}
427*14d92127SDavid van Moolenbroek 	endnetent();
428*14d92127SDavid van Moolenbroek 	return rv;
429*14d92127SDavid van Moolenbroek }
430*14d92127SDavid van Moolenbroek 
431*14d92127SDavid van Moolenbroek 
432*14d92127SDavid van Moolenbroek 		/*
433*14d92127SDavid van Moolenbroek 		 * passwd
434*14d92127SDavid van Moolenbroek 		 */
435*14d92127SDavid van Moolenbroek 
436*14d92127SDavid van Moolenbroek static int
passwd(int argc,char * argv[])437*14d92127SDavid van Moolenbroek passwd(int argc, char *argv[])
438*14d92127SDavid van Moolenbroek {
439*14d92127SDavid van Moolenbroek 	struct passwd	*pw;
440*14d92127SDavid van Moolenbroek 	unsigned long	id;
441*14d92127SDavid van Moolenbroek 	int		i, rv;
442*14d92127SDavid van Moolenbroek 
443*14d92127SDavid van Moolenbroek 	assert(argc > 1);
444*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
445*14d92127SDavid van Moolenbroek 
446*14d92127SDavid van Moolenbroek #define PASSWDPRINT	(void)printf("%s:%s:%u:%u:%s:%s:%s\n", \
447*14d92127SDavid van Moolenbroek 			    pw->pw_name, pw->pw_passwd, pw->pw_uid, \
448*14d92127SDavid van Moolenbroek 			    pw->pw_gid, pw->pw_gecos, pw->pw_dir, pw->pw_shell)
449*14d92127SDavid van Moolenbroek 
450*14d92127SDavid van Moolenbroek 	(void)setpassent(1);
451*14d92127SDavid van Moolenbroek 	rv = RV_OK;
452*14d92127SDavid van Moolenbroek 	if (argc == 2) {
453*14d92127SDavid van Moolenbroek 		while ((pw = getpwent()) != NULL)
454*14d92127SDavid van Moolenbroek 			PASSWDPRINT;
455*14d92127SDavid van Moolenbroek 	} else {
456*14d92127SDavid van Moolenbroek 		for (i = 2; i < argc; i++) {
457*14d92127SDavid van Moolenbroek 			if (parsenum(argv[i], &id))
458*14d92127SDavid van Moolenbroek 				pw = getpwuid((uid_t)id);
459*14d92127SDavid van Moolenbroek 			else
460*14d92127SDavid van Moolenbroek 				pw = getpwnam(argv[i]);
461*14d92127SDavid van Moolenbroek 			if (pw != NULL)
462*14d92127SDavid van Moolenbroek 				PASSWDPRINT;
463*14d92127SDavid van Moolenbroek 			else {
464*14d92127SDavid van Moolenbroek 				rv = RV_NOTFOUND;
465*14d92127SDavid van Moolenbroek 				break;
466*14d92127SDavid van Moolenbroek 			}
467*14d92127SDavid van Moolenbroek 		}
468*14d92127SDavid van Moolenbroek 	}
469*14d92127SDavid van Moolenbroek 	endpwent();
470*14d92127SDavid van Moolenbroek 	return rv;
471*14d92127SDavid van Moolenbroek }
472*14d92127SDavid van Moolenbroek 
473*14d92127SDavid van Moolenbroek static char *
mygetent(const char * const * db_array,const char * name)474*14d92127SDavid van Moolenbroek mygetent(const char * const * db_array, const char *name)
475*14d92127SDavid van Moolenbroek {
476*14d92127SDavid van Moolenbroek 	char *buf = NULL;
477*14d92127SDavid van Moolenbroek 	int error;
478*14d92127SDavid van Moolenbroek 
479*14d92127SDavid van Moolenbroek 	switch (error = cgetent(&buf, db_array, name)) {
480*14d92127SDavid van Moolenbroek 	case -3:
481*14d92127SDavid van Moolenbroek 		warnx("tc= loop in record `%s' in `%s'", name, db_array[0]);
482*14d92127SDavid van Moolenbroek 		break;
483*14d92127SDavid van Moolenbroek 	case -2:
484*14d92127SDavid van Moolenbroek 		warn("system error fetching record `%s' in `%s'", name,
485*14d92127SDavid van Moolenbroek 		    db_array[0]);
486*14d92127SDavid van Moolenbroek 		break;
487*14d92127SDavid van Moolenbroek 	case -1:
488*14d92127SDavid van Moolenbroek 	case 0:
489*14d92127SDavid van Moolenbroek 		break;
490*14d92127SDavid van Moolenbroek 	case 1:
491*14d92127SDavid van Moolenbroek 		warnx("tc= reference not found in record for `%s' in `%s'",
492*14d92127SDavid van Moolenbroek 		    name, db_array[0]);
493*14d92127SDavid van Moolenbroek 		break;
494*14d92127SDavid van Moolenbroek 	default:
495*14d92127SDavid van Moolenbroek 		warnx("unknown error %d in record `%s' in `%s'", error, name,
496*14d92127SDavid van Moolenbroek 		    db_array[0]);
497*14d92127SDavid van Moolenbroek 		break;
498*14d92127SDavid van Moolenbroek 	}
499*14d92127SDavid van Moolenbroek 	return buf;
500*14d92127SDavid van Moolenbroek }
501*14d92127SDavid van Moolenbroek 
502*14d92127SDavid van Moolenbroek static char *
mygetone(const char * const * db_array,int first)503*14d92127SDavid van Moolenbroek mygetone(const char * const * db_array, int first)
504*14d92127SDavid van Moolenbroek {
505*14d92127SDavid van Moolenbroek 	char *buf = NULL;
506*14d92127SDavid van Moolenbroek 	int error;
507*14d92127SDavid van Moolenbroek 
508*14d92127SDavid van Moolenbroek 	switch (error = (first ? cgetfirst : cgetnext)(&buf, db_array)) {
509*14d92127SDavid van Moolenbroek 	case -2:
510*14d92127SDavid van Moolenbroek 		warnx("tc= loop in `%s'", db_array[0]);
511*14d92127SDavid van Moolenbroek 		break;
512*14d92127SDavid van Moolenbroek 	case -1:
513*14d92127SDavid van Moolenbroek 		warn("system error fetching record in `%s'", db_array[0]);
514*14d92127SDavid van Moolenbroek 		break;
515*14d92127SDavid van Moolenbroek 	case 0:
516*14d92127SDavid van Moolenbroek 	case 1:
517*14d92127SDavid van Moolenbroek 		break;
518*14d92127SDavid van Moolenbroek 	case 2:
519*14d92127SDavid van Moolenbroek 		warnx("tc= reference not found in `%s'", db_array[0]);
520*14d92127SDavid van Moolenbroek 		break;
521*14d92127SDavid van Moolenbroek 	default:
522*14d92127SDavid van Moolenbroek 		warnx("unknown error %d in `%s'", error, db_array[0]);
523*14d92127SDavid van Moolenbroek 		break;
524*14d92127SDavid van Moolenbroek 	}
525*14d92127SDavid van Moolenbroek 	return buf;
526*14d92127SDavid van Moolenbroek }
527*14d92127SDavid van Moolenbroek 
528*14d92127SDavid van Moolenbroek static void
capprint(const char * cap)529*14d92127SDavid van Moolenbroek capprint(const char *cap)
530*14d92127SDavid van Moolenbroek {
531*14d92127SDavid van Moolenbroek 	char *c = strchr(cap, ':');
532*14d92127SDavid van Moolenbroek 	if (c)
533*14d92127SDavid van Moolenbroek 		if (c == cap)
534*14d92127SDavid van Moolenbroek 			(void)printf("true\n");
535*14d92127SDavid van Moolenbroek 		else {
536*14d92127SDavid van Moolenbroek 			int l = (int)(c - cap);
537*14d92127SDavid van Moolenbroek 			(void)printf("%*.*s\n", l, l, cap);
538*14d92127SDavid van Moolenbroek 		}
539*14d92127SDavid van Moolenbroek 	else
540*14d92127SDavid van Moolenbroek 		(void)printf("%s\n", cap);
541*14d92127SDavid van Moolenbroek }
542*14d92127SDavid van Moolenbroek 
543*14d92127SDavid van Moolenbroek static void
prettyprint(char * b)544*14d92127SDavid van Moolenbroek prettyprint(char *b)
545*14d92127SDavid van Moolenbroek {
546*14d92127SDavid van Moolenbroek #define TERMWIDTH 65
547*14d92127SDavid van Moolenbroek 	int did = 0;
548*14d92127SDavid van Moolenbroek 	size_t len;
549*14d92127SDavid van Moolenbroek 	char *s, c;
550*14d92127SDavid van Moolenbroek 
551*14d92127SDavid van Moolenbroek 	for (;;) {
552*14d92127SDavid van Moolenbroek 		len = strlen(b);
553*14d92127SDavid van Moolenbroek 		if (len <= TERMWIDTH) {
554*14d92127SDavid van Moolenbroek done:
555*14d92127SDavid van Moolenbroek 			if (did)
556*14d92127SDavid van Moolenbroek 				printf("\t:");
557*14d92127SDavid van Moolenbroek 			printf("%s\n", b);
558*14d92127SDavid van Moolenbroek 			return;
559*14d92127SDavid van Moolenbroek 		}
560*14d92127SDavid van Moolenbroek 		for (s = b + TERMWIDTH; s > b && *s != ':'; s--)
561*14d92127SDavid van Moolenbroek 			continue;
562*14d92127SDavid van Moolenbroek 		if (*s++ != ':')
563*14d92127SDavid van Moolenbroek 			goto done;
564*14d92127SDavid van Moolenbroek 		c = *s;
565*14d92127SDavid van Moolenbroek 		*s = '\0';
566*14d92127SDavid van Moolenbroek 		if (did)
567*14d92127SDavid van Moolenbroek 			printf("\t:");
568*14d92127SDavid van Moolenbroek 		did++;
569*14d92127SDavid van Moolenbroek 		printf("%s\\\n", b);
570*14d92127SDavid van Moolenbroek 		*s = c;
571*14d92127SDavid van Moolenbroek 		b = s;
572*14d92127SDavid van Moolenbroek 	}
573*14d92127SDavid van Moolenbroek }
574*14d92127SDavid van Moolenbroek 
575*14d92127SDavid van Moolenbroek static void
handleone(const char * const * db_array,char * b,int recurse,int pretty,int level)576*14d92127SDavid van Moolenbroek handleone(const char * const *db_array, char *b, int recurse, int pretty,
577*14d92127SDavid van Moolenbroek     int level)
578*14d92127SDavid van Moolenbroek {
579*14d92127SDavid van Moolenbroek 	char *tc;
580*14d92127SDavid van Moolenbroek 
581*14d92127SDavid van Moolenbroek 	if (level && pretty)
582*14d92127SDavid van Moolenbroek 		printf("\n");
583*14d92127SDavid van Moolenbroek 	if (pretty)
584*14d92127SDavid van Moolenbroek 		prettyprint(b);
585*14d92127SDavid van Moolenbroek 	else
586*14d92127SDavid van Moolenbroek 		printf("%s\n", b);
587*14d92127SDavid van Moolenbroek 	if (!recurse || cgetstr(b, "tc", &tc) <= 0)
588*14d92127SDavid van Moolenbroek 		return;
589*14d92127SDavid van Moolenbroek 
590*14d92127SDavid van Moolenbroek 	b = mygetent(db_array, tc);
591*14d92127SDavid van Moolenbroek 	free(tc);
592*14d92127SDavid van Moolenbroek 
593*14d92127SDavid van Moolenbroek 	if (b == NULL)
594*14d92127SDavid van Moolenbroek 		return;
595*14d92127SDavid van Moolenbroek 
596*14d92127SDavid van Moolenbroek 	handleone(db_array, b, recurse, pretty, ++level);
597*14d92127SDavid van Moolenbroek 	free(b);
598*14d92127SDavid van Moolenbroek }
599*14d92127SDavid van Moolenbroek 
600*14d92127SDavid van Moolenbroek static int
handlecap(const char * db,int argc,char * argv[])601*14d92127SDavid van Moolenbroek handlecap(const char *db, int argc, char *argv[])
602*14d92127SDavid van Moolenbroek {
603*14d92127SDavid van Moolenbroek 	static const char sfx[] = "=#:";
604*14d92127SDavid van Moolenbroek 	const char *db_array[] = { db, NULL };
605*14d92127SDavid van Moolenbroek 	char	*b, *cap;
606*14d92127SDavid van Moolenbroek 	int	i, rv, c;
607*14d92127SDavid van Moolenbroek 	size_t	j;
608*14d92127SDavid van Moolenbroek 	int	expand = 1, recurse = 0, pretty = 0;
609*14d92127SDavid van Moolenbroek 
610*14d92127SDavid van Moolenbroek 	assert(argc > 1);
611*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
612*14d92127SDavid van Moolenbroek 
613*14d92127SDavid van Moolenbroek 	argc--;
614*14d92127SDavid van Moolenbroek 	argv++;
615*14d92127SDavid van Moolenbroek 	while ((c = getopt(argc, argv, "pnr")) != -1)
616*14d92127SDavid van Moolenbroek 		switch (c) {
617*14d92127SDavid van Moolenbroek 		case 'n':
618*14d92127SDavid van Moolenbroek 			expand = 0;
619*14d92127SDavid van Moolenbroek 			break;
620*14d92127SDavid van Moolenbroek 		case 'r':
621*14d92127SDavid van Moolenbroek 			expand = 0;
622*14d92127SDavid van Moolenbroek 			recurse = 1;
623*14d92127SDavid van Moolenbroek 			break;
624*14d92127SDavid van Moolenbroek 		case 'p':
625*14d92127SDavid van Moolenbroek 			pretty = 1;
626*14d92127SDavid van Moolenbroek 			break;
627*14d92127SDavid van Moolenbroek 		default:
628*14d92127SDavid van Moolenbroek 			usage();
629*14d92127SDavid van Moolenbroek 			break;
630*14d92127SDavid van Moolenbroek 		}
631*14d92127SDavid van Moolenbroek 
632*14d92127SDavid van Moolenbroek 	argc -= optind;
633*14d92127SDavid van Moolenbroek 	argv += optind;
634*14d92127SDavid van Moolenbroek 	csetexpandtc(expand);
635*14d92127SDavid van Moolenbroek 	rv = RV_OK;
636*14d92127SDavid van Moolenbroek 	if (argc == 0) {
637*14d92127SDavid van Moolenbroek 		for (b = mygetone(db_array, 1); b; b = mygetone(db_array, 0)) {
638*14d92127SDavid van Moolenbroek 			handleone(db_array, b, recurse, pretty, 0);
639*14d92127SDavid van Moolenbroek 			free(b);
640*14d92127SDavid van Moolenbroek 		}
641*14d92127SDavid van Moolenbroek 	} else {
642*14d92127SDavid van Moolenbroek 		if ((b = mygetent(db_array, argv[0])) == NULL)
643*14d92127SDavid van Moolenbroek 			return RV_NOTFOUND;
644*14d92127SDavid van Moolenbroek 		if (argc == 1)
645*14d92127SDavid van Moolenbroek 			handleone(db_array, b, recurse, pretty, 0);
646*14d92127SDavid van Moolenbroek 		else {
647*14d92127SDavid van Moolenbroek 			for (i = 2; i < argc; i++) {
648*14d92127SDavid van Moolenbroek 				for (j = 0; j < sizeof(sfx) - 1; j++) {
649*14d92127SDavid van Moolenbroek 					cap = cgetcap(b, argv[i], sfx[j]);
650*14d92127SDavid van Moolenbroek 					if (cap) {
651*14d92127SDavid van Moolenbroek 						capprint(cap);
652*14d92127SDavid van Moolenbroek 						break;
653*14d92127SDavid van Moolenbroek 					}
654*14d92127SDavid van Moolenbroek 				}
655*14d92127SDavid van Moolenbroek 				if (j == sizeof(sfx) - 1)
656*14d92127SDavid van Moolenbroek 					printf("false\n");
657*14d92127SDavid van Moolenbroek 			}
658*14d92127SDavid van Moolenbroek 		}
659*14d92127SDavid van Moolenbroek 		free(b);
660*14d92127SDavid van Moolenbroek 	}
661*14d92127SDavid van Moolenbroek 	return rv;
662*14d92127SDavid van Moolenbroek }
663*14d92127SDavid van Moolenbroek 
664*14d92127SDavid van Moolenbroek 		/*
665*14d92127SDavid van Moolenbroek 		 * gettytab
666*14d92127SDavid van Moolenbroek 		 */
667*14d92127SDavid van Moolenbroek 
668*14d92127SDavid van Moolenbroek static int
gettytab(int argc,char * argv[])669*14d92127SDavid van Moolenbroek gettytab(int argc, char *argv[])
670*14d92127SDavid van Moolenbroek {
671*14d92127SDavid van Moolenbroek 	return handlecap(_PATH_GETTYTAB, argc, argv);
672*14d92127SDavid van Moolenbroek }
673*14d92127SDavid van Moolenbroek 
674*14d92127SDavid van Moolenbroek 		/*
675*14d92127SDavid van Moolenbroek 		 * printcap
676*14d92127SDavid van Moolenbroek 		 */
677*14d92127SDavid van Moolenbroek 
678*14d92127SDavid van Moolenbroek static int
printcap(int argc,char * argv[])679*14d92127SDavid van Moolenbroek printcap(int argc, char *argv[])
680*14d92127SDavid van Moolenbroek {
681*14d92127SDavid van Moolenbroek 	return handlecap(_PATH_PRINTCAP, argc, argv);
682*14d92127SDavid van Moolenbroek }
683*14d92127SDavid van Moolenbroek 
684*14d92127SDavid van Moolenbroek 		/*
685*14d92127SDavid van Moolenbroek 		 * disktab
686*14d92127SDavid van Moolenbroek 		 */
687*14d92127SDavid van Moolenbroek 
688*14d92127SDavid van Moolenbroek static int
disktab(int argc,char * argv[])689*14d92127SDavid van Moolenbroek disktab(int argc, char *argv[])
690*14d92127SDavid van Moolenbroek {
691*14d92127SDavid van Moolenbroek 	return handlecap(_PATH_DISKTAB, argc, argv);
692*14d92127SDavid van Moolenbroek }
693*14d92127SDavid van Moolenbroek 
694*14d92127SDavid van Moolenbroek 		/*
695*14d92127SDavid van Moolenbroek 		 * protocols
696*14d92127SDavid van Moolenbroek 		 */
697*14d92127SDavid van Moolenbroek 
698*14d92127SDavid van Moolenbroek static int
protocols(int argc,char * argv[])699*14d92127SDavid van Moolenbroek protocols(int argc, char *argv[])
700*14d92127SDavid van Moolenbroek {
701*14d92127SDavid van Moolenbroek 	struct protoent	*pe;
702*14d92127SDavid van Moolenbroek 	unsigned long	id;
703*14d92127SDavid van Moolenbroek 	int		i, rv;
704*14d92127SDavid van Moolenbroek 
705*14d92127SDavid van Moolenbroek 	assert(argc > 1);
706*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
707*14d92127SDavid van Moolenbroek 
708*14d92127SDavid van Moolenbroek #define PROTOCOLSPRINT	printfmtstrings(pe->p_aliases, "  ", " ", \
709*14d92127SDavid van Moolenbroek 			    "%-16s  %5d", pe->p_name, pe->p_proto)
710*14d92127SDavid van Moolenbroek 
711*14d92127SDavid van Moolenbroek 	setprotoent(1);
712*14d92127SDavid van Moolenbroek 	rv = RV_OK;
713*14d92127SDavid van Moolenbroek 	if (argc == 2) {
714*14d92127SDavid van Moolenbroek 		while ((pe = getprotoent()) != NULL)
715*14d92127SDavid van Moolenbroek 			PROTOCOLSPRINT;
716*14d92127SDavid van Moolenbroek 	} else {
717*14d92127SDavid van Moolenbroek 		for (i = 2; i < argc; i++) {
718*14d92127SDavid van Moolenbroek 			if (parsenum(argv[i], &id))
719*14d92127SDavid van Moolenbroek 				pe = getprotobynumber((int)id);
720*14d92127SDavid van Moolenbroek 			else
721*14d92127SDavid van Moolenbroek 				pe = getprotobyname(argv[i]);
722*14d92127SDavid van Moolenbroek 			if (pe != NULL)
723*14d92127SDavid van Moolenbroek 				PROTOCOLSPRINT;
724*14d92127SDavid van Moolenbroek 			else {
725*14d92127SDavid van Moolenbroek 				rv = RV_NOTFOUND;
726*14d92127SDavid van Moolenbroek 				break;
727*14d92127SDavid van Moolenbroek 			}
728*14d92127SDavid van Moolenbroek 		}
729*14d92127SDavid van Moolenbroek 	}
730*14d92127SDavid van Moolenbroek 	endprotoent();
731*14d92127SDavid van Moolenbroek 	return rv;
732*14d92127SDavid van Moolenbroek }
733*14d92127SDavid van Moolenbroek 
734*14d92127SDavid van Moolenbroek #if !defined(__minix)
735*14d92127SDavid van Moolenbroek 		/*
736*14d92127SDavid van Moolenbroek 		 * rpc
737*14d92127SDavid van Moolenbroek 		 */
738*14d92127SDavid van Moolenbroek 
739*14d92127SDavid van Moolenbroek static int
rpc(int argc,char * argv[])740*14d92127SDavid van Moolenbroek rpc(int argc, char *argv[])
741*14d92127SDavid van Moolenbroek {
742*14d92127SDavid van Moolenbroek 	struct rpcent	*re;
743*14d92127SDavid van Moolenbroek 	unsigned long	id;
744*14d92127SDavid van Moolenbroek 	int		i, rv;
745*14d92127SDavid van Moolenbroek 
746*14d92127SDavid van Moolenbroek 	assert(argc > 1);
747*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
748*14d92127SDavid van Moolenbroek 
749*14d92127SDavid van Moolenbroek #define RPCPRINT	printfmtstrings(re->r_aliases, "  ", " ", \
750*14d92127SDavid van Moolenbroek 				"%-16s  %6d", \
751*14d92127SDavid van Moolenbroek 				re->r_name, re->r_number)
752*14d92127SDavid van Moolenbroek 
753*14d92127SDavid van Moolenbroek 	setrpcent(1);
754*14d92127SDavid van Moolenbroek 	rv = RV_OK;
755*14d92127SDavid van Moolenbroek 	if (argc == 2) {
756*14d92127SDavid van Moolenbroek 		while ((re = getrpcent()) != NULL)
757*14d92127SDavid van Moolenbroek 			RPCPRINT;
758*14d92127SDavid van Moolenbroek 	} else {
759*14d92127SDavid van Moolenbroek 		for (i = 2; i < argc; i++) {
760*14d92127SDavid van Moolenbroek 			if (parsenum(argv[i], &id))
761*14d92127SDavid van Moolenbroek 				re = getrpcbynumber((int)id);
762*14d92127SDavid van Moolenbroek 			else
763*14d92127SDavid van Moolenbroek 				re = getrpcbyname(argv[i]);
764*14d92127SDavid van Moolenbroek 			if (re != NULL)
765*14d92127SDavid van Moolenbroek 				RPCPRINT;
766*14d92127SDavid van Moolenbroek 			else {
767*14d92127SDavid van Moolenbroek 				rv = RV_NOTFOUND;
768*14d92127SDavid van Moolenbroek 				break;
769*14d92127SDavid van Moolenbroek 			}
770*14d92127SDavid van Moolenbroek 		}
771*14d92127SDavid van Moolenbroek 	}
772*14d92127SDavid van Moolenbroek 	endrpcent();
773*14d92127SDavid van Moolenbroek 	return rv;
774*14d92127SDavid van Moolenbroek }
775*14d92127SDavid van Moolenbroek #endif /* !defined(__minix) */
776*14d92127SDavid van Moolenbroek 
777*14d92127SDavid van Moolenbroek 		/*
778*14d92127SDavid van Moolenbroek 		 * services
779*14d92127SDavid van Moolenbroek 		 */
780*14d92127SDavid van Moolenbroek 
781*14d92127SDavid van Moolenbroek static int
services(int argc,char * argv[])782*14d92127SDavid van Moolenbroek services(int argc, char *argv[])
783*14d92127SDavid van Moolenbroek {
784*14d92127SDavid van Moolenbroek 	struct servent	*se;
785*14d92127SDavid van Moolenbroek 	unsigned long	id;
786*14d92127SDavid van Moolenbroek 	char		*proto;
787*14d92127SDavid van Moolenbroek 	int		i, rv;
788*14d92127SDavid van Moolenbroek 
789*14d92127SDavid van Moolenbroek 	assert(argc > 1);
790*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
791*14d92127SDavid van Moolenbroek 
792*14d92127SDavid van Moolenbroek #define SERVICESPRINT	printfmtstrings(se->s_aliases, "  ", " ", \
793*14d92127SDavid van Moolenbroek 			    "%-16s  %5d/%s", \
794*14d92127SDavid van Moolenbroek 			    se->s_name, ntohs(se->s_port), se->s_proto)
795*14d92127SDavid van Moolenbroek 
796*14d92127SDavid van Moolenbroek 	setservent(1);
797*14d92127SDavid van Moolenbroek 	rv = RV_OK;
798*14d92127SDavid van Moolenbroek 	if (argc == 2) {
799*14d92127SDavid van Moolenbroek 		while ((se = getservent()) != NULL)
800*14d92127SDavid van Moolenbroek 			SERVICESPRINT;
801*14d92127SDavid van Moolenbroek 	} else {
802*14d92127SDavid van Moolenbroek 		for (i = 2; i < argc; i++) {
803*14d92127SDavid van Moolenbroek 			proto = strchr(argv[i], '/');
804*14d92127SDavid van Moolenbroek 			if (proto != NULL)
805*14d92127SDavid van Moolenbroek 				*proto++ = '\0';
806*14d92127SDavid van Moolenbroek 			if (parsenum(argv[i], &id))
807*14d92127SDavid van Moolenbroek 				se = getservbyport(htons(id), proto);
808*14d92127SDavid van Moolenbroek 			else
809*14d92127SDavid van Moolenbroek 				se = getservbyname(argv[i], proto);
810*14d92127SDavid van Moolenbroek 			if (se != NULL)
811*14d92127SDavid van Moolenbroek 				SERVICESPRINT;
812*14d92127SDavid van Moolenbroek 			else {
813*14d92127SDavid van Moolenbroek 				rv = RV_NOTFOUND;
814*14d92127SDavid van Moolenbroek 				break;
815*14d92127SDavid van Moolenbroek 			}
816*14d92127SDavid van Moolenbroek 		}
817*14d92127SDavid van Moolenbroek 	}
818*14d92127SDavid van Moolenbroek 	endservent();
819*14d92127SDavid van Moolenbroek 	return rv;
820*14d92127SDavid van Moolenbroek }
821*14d92127SDavid van Moolenbroek 
822*14d92127SDavid van Moolenbroek 
823*14d92127SDavid van Moolenbroek 		/*
824*14d92127SDavid van Moolenbroek 		 * shells
825*14d92127SDavid van Moolenbroek 		 */
826*14d92127SDavid van Moolenbroek 
827*14d92127SDavid van Moolenbroek static int
shells(int argc,char * argv[])828*14d92127SDavid van Moolenbroek shells(int argc, char *argv[])
829*14d92127SDavid van Moolenbroek {
830*14d92127SDavid van Moolenbroek 	const char	*sh;
831*14d92127SDavid van Moolenbroek 	int		i, rv;
832*14d92127SDavid van Moolenbroek 
833*14d92127SDavid van Moolenbroek 	assert(argc > 1);
834*14d92127SDavid van Moolenbroek 	assert(argv != NULL);
835*14d92127SDavid van Moolenbroek 
836*14d92127SDavid van Moolenbroek #define SHELLSPRINT	(void)printf("%s\n", sh)
837*14d92127SDavid van Moolenbroek 
838*14d92127SDavid van Moolenbroek 	setusershell();
839*14d92127SDavid van Moolenbroek 	rv = RV_OK;
840*14d92127SDavid van Moolenbroek 	if (argc == 2) {
841*14d92127SDavid van Moolenbroek 		while ((sh = getusershell()) != NULL)
842*14d92127SDavid van Moolenbroek 			SHELLSPRINT;
843*14d92127SDavid van Moolenbroek 	} else {
844*14d92127SDavid van Moolenbroek 		for (i = 2; i < argc; i++) {
845*14d92127SDavid van Moolenbroek 			setusershell();
846*14d92127SDavid van Moolenbroek 			while ((sh = getusershell()) != NULL) {
847*14d92127SDavid van Moolenbroek 				if (strcmp(sh, argv[i]) == 0) {
848*14d92127SDavid van Moolenbroek 					SHELLSPRINT;
849*14d92127SDavid van Moolenbroek 					break;
850*14d92127SDavid van Moolenbroek 				}
851*14d92127SDavid van Moolenbroek 			}
852*14d92127SDavid van Moolenbroek 			if (sh == NULL) {
853*14d92127SDavid van Moolenbroek 				rv = RV_NOTFOUND;
854*14d92127SDavid van Moolenbroek 				break;
855*14d92127SDavid van Moolenbroek 			}
856*14d92127SDavid van Moolenbroek 		}
857*14d92127SDavid van Moolenbroek 	}
858*14d92127SDavid van Moolenbroek 	endusershell();
859*14d92127SDavid van Moolenbroek 	return rv;
860*14d92127SDavid van Moolenbroek }
861