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