xref: /minix3/sbin/sysctl/pathconf.c (revision b4f34f94bee271f15440c5c33aecbd4cd2e40676)
1*b4f34f94SDavid van Moolenbroek /*	$NetBSD: pathconf.c,v 1.7 2004/03/25 19:36:27 atatat Exp $	*/
2*b4f34f94SDavid van Moolenbroek 
3*b4f34f94SDavid van Moolenbroek /*
4*b4f34f94SDavid van Moolenbroek  * Copyright (c) 1993
5*b4f34f94SDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
6*b4f34f94SDavid van Moolenbroek  *
7*b4f34f94SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
8*b4f34f94SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
9*b4f34f94SDavid van Moolenbroek  * are met:
10*b4f34f94SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
11*b4f34f94SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
12*b4f34f94SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
13*b4f34f94SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
14*b4f34f94SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
15*b4f34f94SDavid van Moolenbroek  * 3. Neither the name of the University nor the names of its contributors
16*b4f34f94SDavid van Moolenbroek  *    may be used to endorse or promote products derived from this software
17*b4f34f94SDavid van Moolenbroek  *    without specific prior written permission.
18*b4f34f94SDavid van Moolenbroek  *
19*b4f34f94SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20*b4f34f94SDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*b4f34f94SDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*b4f34f94SDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23*b4f34f94SDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*b4f34f94SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*b4f34f94SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*b4f34f94SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*b4f34f94SDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*b4f34f94SDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*b4f34f94SDavid van Moolenbroek  * SUCH DAMAGE.
30*b4f34f94SDavid van Moolenbroek  */
31*b4f34f94SDavid van Moolenbroek 
32*b4f34f94SDavid van Moolenbroek #ifndef lint
33*b4f34f94SDavid van Moolenbroek static char copyright[] =
34*b4f34f94SDavid van Moolenbroek "@(#) Copyright (c) 1993\n\
35*b4f34f94SDavid van Moolenbroek 	The Regents of the University of California.  All rights reserved.\n";
36*b4f34f94SDavid van Moolenbroek #endif /* not lint */
37*b4f34f94SDavid van Moolenbroek 
38*b4f34f94SDavid van Moolenbroek #ifndef lint
39*b4f34f94SDavid van Moolenbroek #if 0
40*b4f34f94SDavid van Moolenbroek static char sccsid[] = "@(#)pathconf.c	8.1 (Berkeley) 6/6/93";
41*b4f34f94SDavid van Moolenbroek #else
42*b4f34f94SDavid van Moolenbroek static char rcsid[] = "$NetBSD: pathconf.c,v 1.7 2004/03/25 19:36:27 atatat Exp $";
43*b4f34f94SDavid van Moolenbroek #endif
44*b4f34f94SDavid van Moolenbroek #endif /* not lint */
45*b4f34f94SDavid van Moolenbroek 
46*b4f34f94SDavid van Moolenbroek #include <sys/param.h>
47*b4f34f94SDavid van Moolenbroek #include <sys/sysctl.h>
48*b4f34f94SDavid van Moolenbroek #include <sys/unistd.h>
49*b4f34f94SDavid van Moolenbroek 
50*b4f34f94SDavid van Moolenbroek #include <errno.h>
51*b4f34f94SDavid van Moolenbroek #include <stdio.h>
52*b4f34f94SDavid van Moolenbroek #include <stdlib.h>
53*b4f34f94SDavid van Moolenbroek #include <string.h>
54*b4f34f94SDavid van Moolenbroek 
55*b4f34f94SDavid van Moolenbroek #define PC_NAMES { \
56*b4f34f94SDavid van Moolenbroek 	{ 0, 0 }, \
57*b4f34f94SDavid van Moolenbroek 	{ "link_max", CTLTYPE_INT }, \
58*b4f34f94SDavid van Moolenbroek 	{ "max_canon", CTLTYPE_INT }, \
59*b4f34f94SDavid van Moolenbroek 	{ "max_input", CTLTYPE_INT }, \
60*b4f34f94SDavid van Moolenbroek 	{ "name_max", CTLTYPE_INT }, \
61*b4f34f94SDavid van Moolenbroek 	{ "path_max", CTLTYPE_INT }, \
62*b4f34f94SDavid van Moolenbroek 	{ "pipe_buf", CTLTYPE_INT }, \
63*b4f34f94SDavid van Moolenbroek 	{ "chown_restricted", CTLTYPE_INT }, \
64*b4f34f94SDavid van Moolenbroek 	{ "no_trunc", CTLTYPE_INT }, \
65*b4f34f94SDavid van Moolenbroek 	{ "vdisable", CTLTYPE_INT }, \
66*b4f34f94SDavid van Moolenbroek }
67*b4f34f94SDavid van Moolenbroek #define PC_MAXID 10
68*b4f34f94SDavid van Moolenbroek 
69*b4f34f94SDavid van Moolenbroek struct ctlname pcnames[] = PC_NAMES;
70*b4f34f94SDavid van Moolenbroek char names[BUFSIZ];
71*b4f34f94SDavid van Moolenbroek 
72*b4f34f94SDavid van Moolenbroek struct list {
73*b4f34f94SDavid van Moolenbroek 	struct	ctlname *list;
74*b4f34f94SDavid van Moolenbroek 	int	size;
75*b4f34f94SDavid van Moolenbroek };
76*b4f34f94SDavid van Moolenbroek struct list pclist = { pcnames, PC_MAXID };
77*b4f34f94SDavid van Moolenbroek 
78*b4f34f94SDavid van Moolenbroek int	Aflag, aflag, nflag, wflag, stdinflag;
79*b4f34f94SDavid van Moolenbroek 
80*b4f34f94SDavid van Moolenbroek int
main(argc,argv)81*b4f34f94SDavid van Moolenbroek main(argc, argv)
82*b4f34f94SDavid van Moolenbroek 	int argc;
83*b4f34f94SDavid van Moolenbroek 	char *argv[];
84*b4f34f94SDavid van Moolenbroek {
85*b4f34f94SDavid van Moolenbroek 	char *path;
86*b4f34f94SDavid van Moolenbroek 	int ch;
87*b4f34f94SDavid van Moolenbroek 
88*b4f34f94SDavid van Moolenbroek 	while ((ch = getopt(argc, argv, "Aan")) != -1) {
89*b4f34f94SDavid van Moolenbroek 		switch (ch) {
90*b4f34f94SDavid van Moolenbroek 
91*b4f34f94SDavid van Moolenbroek 		case 'A':
92*b4f34f94SDavid van Moolenbroek 			Aflag = 1;
93*b4f34f94SDavid van Moolenbroek 			break;
94*b4f34f94SDavid van Moolenbroek 
95*b4f34f94SDavid van Moolenbroek 		case 'a':
96*b4f34f94SDavid van Moolenbroek 			aflag = 1;
97*b4f34f94SDavid van Moolenbroek 			break;
98*b4f34f94SDavid van Moolenbroek 
99*b4f34f94SDavid van Moolenbroek 		case 'n':
100*b4f34f94SDavid van Moolenbroek 			nflag = 1;
101*b4f34f94SDavid van Moolenbroek 			break;
102*b4f34f94SDavid van Moolenbroek 
103*b4f34f94SDavid van Moolenbroek 		default:
104*b4f34f94SDavid van Moolenbroek 			usage();
105*b4f34f94SDavid van Moolenbroek 		}
106*b4f34f94SDavid van Moolenbroek 	}
107*b4f34f94SDavid van Moolenbroek 	argc -= optind;
108*b4f34f94SDavid van Moolenbroek 	argv += optind;
109*b4f34f94SDavid van Moolenbroek 
110*b4f34f94SDavid van Moolenbroek 	if (argc == 0)
111*b4f34f94SDavid van Moolenbroek 		usage();
112*b4f34f94SDavid van Moolenbroek 	path = *argv++;
113*b4f34f94SDavid van Moolenbroek 	if (strcmp(path, "-") == 0)
114*b4f34f94SDavid van Moolenbroek 		stdinflag = 1;
115*b4f34f94SDavid van Moolenbroek 	argc--;
116*b4f34f94SDavid van Moolenbroek 	if (Aflag || aflag) {
117*b4f34f94SDavid van Moolenbroek 		listall(path, &pclist);
118*b4f34f94SDavid van Moolenbroek 		exit(0);
119*b4f34f94SDavid van Moolenbroek 	}
120*b4f34f94SDavid van Moolenbroek 	if (argc == 0)
121*b4f34f94SDavid van Moolenbroek 		usage();
122*b4f34f94SDavid van Moolenbroek 	while (argc-- > 0)
123*b4f34f94SDavid van Moolenbroek 		parse(path, *argv, 1);
124*b4f34f94SDavid van Moolenbroek 	exit(0);
125*b4f34f94SDavid van Moolenbroek }
126*b4f34f94SDavid van Moolenbroek 
127*b4f34f94SDavid van Moolenbroek /*
128*b4f34f94SDavid van Moolenbroek  * List all variables known to the system.
129*b4f34f94SDavid van Moolenbroek  */
listall(path,lp)130*b4f34f94SDavid van Moolenbroek listall(path, lp)
131*b4f34f94SDavid van Moolenbroek 	char *path;
132*b4f34f94SDavid van Moolenbroek 	struct list *lp;
133*b4f34f94SDavid van Moolenbroek {
134*b4f34f94SDavid van Moolenbroek 	int lvl2;
135*b4f34f94SDavid van Moolenbroek 
136*b4f34f94SDavid van Moolenbroek 	if (lp->list == 0)
137*b4f34f94SDavid van Moolenbroek 		return;
138*b4f34f94SDavid van Moolenbroek 	for (lvl2 = 0; lvl2 < lp->size; lvl2++) {
139*b4f34f94SDavid van Moolenbroek 		if (lp->list[lvl2].ctl_name == 0)
140*b4f34f94SDavid van Moolenbroek 			continue;
141*b4f34f94SDavid van Moolenbroek 		parse(path, lp->list[lvl2].ctl_name, Aflag);
142*b4f34f94SDavid van Moolenbroek 	}
143*b4f34f94SDavid van Moolenbroek }
144*b4f34f94SDavid van Moolenbroek 
145*b4f34f94SDavid van Moolenbroek /*
146*b4f34f94SDavid van Moolenbroek  * Parse a name into an index.
147*b4f34f94SDavid van Moolenbroek  * Lookup and print out the attribute if it exists.
148*b4f34f94SDavid van Moolenbroek  */
parse(pathname,string,flags)149*b4f34f94SDavid van Moolenbroek parse(pathname, string, flags)
150*b4f34f94SDavid van Moolenbroek 	char *pathname;
151*b4f34f94SDavid van Moolenbroek 	char *string;
152*b4f34f94SDavid van Moolenbroek 	int flags;
153*b4f34f94SDavid van Moolenbroek {
154*b4f34f94SDavid van Moolenbroek 	int indx, value;
155*b4f34f94SDavid van Moolenbroek 	char *bufp, buf[BUFSIZ];
156*b4f34f94SDavid van Moolenbroek 
157*b4f34f94SDavid van Moolenbroek 	bufp = buf;
158*b4f34f94SDavid van Moolenbroek 	snprintf(buf, BUFSIZ, "%s", string);
159*b4f34f94SDavid van Moolenbroek 	if ((indx = findname(string, "top", &bufp, &pclist)) == -1)
160*b4f34f94SDavid van Moolenbroek 		return;
161*b4f34f94SDavid van Moolenbroek 	if (bufp) {
162*b4f34f94SDavid van Moolenbroek 		fprintf(stderr, "name %s in %s is unknown\n", *bufp, string);
163*b4f34f94SDavid van Moolenbroek 		return;
164*b4f34f94SDavid van Moolenbroek 	}
165*b4f34f94SDavid van Moolenbroek 	if (stdinflag)
166*b4f34f94SDavid van Moolenbroek 		value = fpathconf(0, indx);
167*b4f34f94SDavid van Moolenbroek 	else
168*b4f34f94SDavid van Moolenbroek 		value = pathconf(pathname, indx);
169*b4f34f94SDavid van Moolenbroek 	if (value == -1) {
170*b4f34f94SDavid van Moolenbroek 		if (flags == 0)
171*b4f34f94SDavid van Moolenbroek 			return;
172*b4f34f94SDavid van Moolenbroek 		switch (errno) {
173*b4f34f94SDavid van Moolenbroek 		case EOPNOTSUPP:
174*b4f34f94SDavid van Moolenbroek 			fprintf(stderr, "%s: value is not available\n", string);
175*b4f34f94SDavid van Moolenbroek 			return;
176*b4f34f94SDavid van Moolenbroek 		case ENOTDIR:
177*b4f34f94SDavid van Moolenbroek 			fprintf(stderr, "%s: specification is incomplete\n",
178*b4f34f94SDavid van Moolenbroek 			    string);
179*b4f34f94SDavid van Moolenbroek 			return;
180*b4f34f94SDavid van Moolenbroek 		case ENOMEM:
181*b4f34f94SDavid van Moolenbroek 			fprintf(stderr, "%s: type is unknown to this program\n",
182*b4f34f94SDavid van Moolenbroek 			    string);
183*b4f34f94SDavid van Moolenbroek 			return;
184*b4f34f94SDavid van Moolenbroek 		default:
185*b4f34f94SDavid van Moolenbroek 			perror(string);
186*b4f34f94SDavid van Moolenbroek 			return;
187*b4f34f94SDavid van Moolenbroek 		}
188*b4f34f94SDavid van Moolenbroek 	}
189*b4f34f94SDavid van Moolenbroek 	if (!nflag)
190*b4f34f94SDavid van Moolenbroek 		fprintf(stdout, "%s = ", string);
191*b4f34f94SDavid van Moolenbroek 	fprintf(stdout, "%d\n", value);
192*b4f34f94SDavid van Moolenbroek }
193*b4f34f94SDavid van Moolenbroek 
194*b4f34f94SDavid van Moolenbroek /*
195*b4f34f94SDavid van Moolenbroek  * Scan a list of names searching for a particular name.
196*b4f34f94SDavid van Moolenbroek  */
findname(string,level,bufp,namelist)197*b4f34f94SDavid van Moolenbroek findname(string, level, bufp, namelist)
198*b4f34f94SDavid van Moolenbroek 	char *string;
199*b4f34f94SDavid van Moolenbroek 	const char *level;
200*b4f34f94SDavid van Moolenbroek 	char **bufp;
201*b4f34f94SDavid van Moolenbroek 	struct list *namelist;
202*b4f34f94SDavid van Moolenbroek {
203*b4f34f94SDavid van Moolenbroek 	char *name;
204*b4f34f94SDavid van Moolenbroek 	int i;
205*b4f34f94SDavid van Moolenbroek 
206*b4f34f94SDavid van Moolenbroek 	if (namelist->list == 0 || (name = strsep(bufp, ".")) == NULL) {
207*b4f34f94SDavid van Moolenbroek 		fprintf(stderr, "%s: incomplete specification\n", string);
208*b4f34f94SDavid van Moolenbroek 		return (-1);
209*b4f34f94SDavid van Moolenbroek 	}
210*b4f34f94SDavid van Moolenbroek 	for (i = 0; i < namelist->size; i++)
211*b4f34f94SDavid van Moolenbroek 		if (namelist->list[i].ctl_name != NULL &&
212*b4f34f94SDavid van Moolenbroek 		    strcmp(name, namelist->list[i].ctl_name) == 0)
213*b4f34f94SDavid van Moolenbroek 			break;
214*b4f34f94SDavid van Moolenbroek 	if (i == namelist->size) {
215*b4f34f94SDavid van Moolenbroek 		fprintf(stderr, "%s level name %s in %s is invalid\n",
216*b4f34f94SDavid van Moolenbroek 		    level, name, string);
217*b4f34f94SDavid van Moolenbroek 		return (-1);
218*b4f34f94SDavid van Moolenbroek 	}
219*b4f34f94SDavid van Moolenbroek 	return (i);
220*b4f34f94SDavid van Moolenbroek }
221*b4f34f94SDavid van Moolenbroek 
usage()222*b4f34f94SDavid van Moolenbroek usage()
223*b4f34f94SDavid van Moolenbroek {
224*b4f34f94SDavid van Moolenbroek 
225*b4f34f94SDavid van Moolenbroek 	(void)fprintf(stderr, "usage:\t%s\n\t%s\n\t%s\n",
226*b4f34f94SDavid van Moolenbroek 	    "pathname [-n] variable ...",
227*b4f34f94SDavid van Moolenbroek 	    "pathname [-n] -a", "pathname [-n] -A");
228*b4f34f94SDavid van Moolenbroek 	exit(1);
229*b4f34f94SDavid van Moolenbroek }
230