xref: /openbsd/usr.bin/getconf/getconf.c (revision 3b665a45)
1*3b665a45Sderaadt /*-
2*3b665a45Sderaadt  * Copyright (c) 1996 The NetBSD Foundation, Inc.
3df930be7Sderaadt  * All rights reserved.
4df930be7Sderaadt  *
5*3b665a45Sderaadt  * This code is derived from software contributed to The NetBSD Foundation
6*3b665a45Sderaadt  * by J.T. Conklin.
7*3b665a45Sderaadt  *
8df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
9df930be7Sderaadt  * modification, are permitted provided that the following conditions
10df930be7Sderaadt  * are met:
11df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
12df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
13df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
14df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
15df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
16df930be7Sderaadt  * 3. All advertising materials mentioning features or use of this software
17df930be7Sderaadt  *    must display the following acknowledgement:
18df930be7Sderaadt  *      This product includes software developed by Winning Strategies, Inc.
19df930be7Sderaadt  * 4. The name of the author may not be used to endorse or promote products
20df930be7Sderaadt  *    derived from this software without specific prior written permission.
21df930be7Sderaadt  *
22df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23df930be7Sderaadt  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24df930be7Sderaadt  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25df930be7Sderaadt  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26df930be7Sderaadt  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27df930be7Sderaadt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28df930be7Sderaadt  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29df930be7Sderaadt  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30df930be7Sderaadt  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31df930be7Sderaadt  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32df930be7Sderaadt  */
33df930be7Sderaadt 
34df930be7Sderaadt /*
35df930be7Sderaadt  * POSIX.2 getconf utility
36df930be7Sderaadt  *
37df930be7Sderaadt  * Written by:
38df930be7Sderaadt  *	J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
39df930be7Sderaadt  */
40df930be7Sderaadt 
41df930be7Sderaadt #ifndef lint
42*3b665a45Sderaadt static char rcsid[] = "$Id: getconf.c,v 1.2 1996/05/04 09:15:06 deraadt Exp $";
43df930be7Sderaadt #endif /* not lint */
44df930be7Sderaadt 
45df930be7Sderaadt #include <stdio.h>
46df930be7Sderaadt #include <stdlib.h>
47df930be7Sderaadt #include <limits.h>
48df930be7Sderaadt #include <locale.h>
49df930be7Sderaadt #include <unistd.h>
50df930be7Sderaadt #include <errno.h>
51df930be7Sderaadt 
52df930be7Sderaadt static void usage __P((void));
53df930be7Sderaadt 
54df930be7Sderaadt struct conf_variable
55df930be7Sderaadt {
56df930be7Sderaadt   const char *name;
57df930be7Sderaadt   enum { SYSCONF, CONFSTR, PATHCONF, CONSTANT } type;
58df930be7Sderaadt   long value;
59df930be7Sderaadt };
60df930be7Sderaadt 
61df930be7Sderaadt const struct conf_variable conf_table[] =
62df930be7Sderaadt {
63df930be7Sderaadt   { "PATH",			CONFSTR,	_CS_PATH		},
64df930be7Sderaadt 
65df930be7Sderaadt   /* Utility Limit Minimum Values */
66df930be7Sderaadt   { "POSIX2_BC_BASE_MAX",	CONSTANT,	_POSIX2_BC_BASE_MAX	},
67df930be7Sderaadt   { "POSIX2_BC_DIM_MAX",	CONSTANT,	_POSIX2_BC_DIM_MAX	},
68df930be7Sderaadt   { "POSIX2_BC_SCALE_MAX",	CONSTANT,	_POSIX2_BC_SCALE_MAX	},
69df930be7Sderaadt   { "POSIX2_BC_STRING_MAX",	CONSTANT,	_POSIX2_BC_STRING_MAX	},
70df930be7Sderaadt   { "POSIX2_COLL_WEIGHTS_MAX",	CONSTANT,	_POSIX2_COLL_WEIGHTS_MAX },
71df930be7Sderaadt   { "POSIX2_EXPR_NEST_MAX",	CONSTANT,	_POSIX2_EXPR_NEST_MAX	},
72df930be7Sderaadt   { "POSIX2_LINE_MAX",		CONSTANT,	_POSIX2_LINE_MAX	},
73df930be7Sderaadt   { "POSIX2_RE_DUP_MAX",	CONSTANT,	_POSIX2_RE_DUP_MAX	},
74df930be7Sderaadt   { "POSIX2_VERSION",		CONSTANT,	_POSIX2_VERSION		},
75df930be7Sderaadt 
76df930be7Sderaadt   /* POSIX.1 Minimum Values */
77df930be7Sderaadt   { "_POSIX_ARG_MAX",		CONSTANT,	_POSIX_ARG_MAX		},
78df930be7Sderaadt   { "_POSIX_CHILD_MAX",		CONSTANT,	_POSIX_CHILD_MAX	},
79df930be7Sderaadt   { "_POSIX_LINK_MAX",		CONSTANT,	_POSIX_LINK_MAX		},
80df930be7Sderaadt   { "_POSIX_MAX_CANON",		CONSTANT,	_POSIX_MAX_CANON	},
81df930be7Sderaadt   { "_POSIX_MAX_INPUT",		CONSTANT,	_POSIX_MAX_INPUT	},
82df930be7Sderaadt   { "_POSIX_NAME_MAX",		CONSTANT,	_POSIX_NAME_MAX		},
83df930be7Sderaadt   { "_POSIX_NGROUPS_MAX",	CONSTANT,	_POSIX_NGROUPS_MAX	},
84df930be7Sderaadt   { "_POSIX_OPEN_MAX",		CONSTANT,	_POSIX_OPEN_MAX		},
85df930be7Sderaadt   { "_POSIX_PATH_MAX",		CONSTANT,	_POSIX_PIPE_BUF		},
86df930be7Sderaadt   { "_POSIX_PIPE_BUF",		CONSTANT,	_POSIX_PIPE_BUF		},
87df930be7Sderaadt   { "_POSIX_SSIZE_MAX",		CONSTANT,	_POSIX_SSIZE_MAX	},
88df930be7Sderaadt   { "_POSIX_STREAM_MAX",	CONSTANT,	_POSIX_STREAM_MAX	},
89df930be7Sderaadt   { "_POSIX_TZNAME_MAX",	CONSTANT,	_POSIX_TZNAME_MAX	},
90df930be7Sderaadt 
91df930be7Sderaadt   /* Symbolic Utility Limits */
92df930be7Sderaadt   { "BC_BASE_MAX",		SYSCONF,	_SC_BC_BASE_MAX		},
93df930be7Sderaadt   { "BC_DIM_MAX",		SYSCONF,	_SC_BC_DIM_MAX		},
94df930be7Sderaadt   { "BC_SCALE_MAX",		SYSCONF,	_SC_BC_SCALE_MAX	},
95df930be7Sderaadt   { "BC_STRING_MAX",		SYSCONF,	_SC_BC_STRING_MAX	},
96df930be7Sderaadt   { "COLL_WEIGHTS_MAX",		SYSCONF,	_SC_COLL_WEIGHTS_MAX	},
97df930be7Sderaadt   { "EXPR_NEST_MAX",		SYSCONF,	_SC_EXPR_NEST_MAX	},
98df930be7Sderaadt   { "LINE_MAX",			SYSCONF,	_SC_LINE_MAX		},
99df930be7Sderaadt   { "RE_DUP_MAX",		SYSCONF,	_SC_RE_DUP_MAX		},
100df930be7Sderaadt 
101df930be7Sderaadt   /* Optional Facility Configuration Values */
102df930be7Sderaadt #if 0
103df930be7Sderaadt   { "POSIX2_C_BIND",		SYSCONF,	???			},
104df930be7Sderaadt #endif
105df930be7Sderaadt   { "POSIX2_C_DEV",		SYSCONF,	_SC_2_C_DEV		},
106df930be7Sderaadt   { "POSIX2_CHAR_TERM",		SYSCONF,	_SC_2_CHAR_TERM		},
107df930be7Sderaadt   { "POSIX2_FORT_DEV",		SYSCONF,	_SC_2_FORT_DEV		},
108df930be7Sderaadt   { "POSIX2_FORT_RUN",		SYSCONF,	_SC_2_FORT_RUN		},
109df930be7Sderaadt   { "POSIX2_LOCALEDEF",		SYSCONF,	_SC_2_LOCALEDEF		},
110df930be7Sderaadt   { "POSIX2_SW_DEV",		SYSCONF,	_SC_2_SW_DEV		},
111df930be7Sderaadt   { "POSIX2_UPE",		SYSCONF,	_SC_2_UPE		},
112df930be7Sderaadt 
113df930be7Sderaadt   /* POSIX.1 Configurable System Variables */
114df930be7Sderaadt   { "ARG_MAX",			SYSCONF,	_SC_ARG_MAX 		},
115df930be7Sderaadt   { "CHILD_MAX",		SYSCONF,	_SC_CHILD_MAX		},
116df930be7Sderaadt   { "CLK_TCK",			SYSCONF,	_SC_CLK_TCK		},
117df930be7Sderaadt   { "NGROUPS_MAX",		SYSCONF,	_SC_NGROUPS_MAX		},
118df930be7Sderaadt   { "OPEN_MAX",			SYSCONF,	_SC_OPEN_MAX		},
119df930be7Sderaadt   { "STREAM_MAX",		SYSCONF,	_SC_STREAM_MAX		},
120df930be7Sderaadt   { "TZNAME_MAX",		SYSCONF,	_SC_TZNAME_MAX		},
121df930be7Sderaadt   { "_POSIX_JOB_CONTROL",	SYSCONF,	_SC_JOB_CONTROL 	},
122df930be7Sderaadt   { "_POSIX_SAVED_IDS",		SYSCONF,	_SC_SAVED_IDS		},
123df930be7Sderaadt   { "_POSIX_VERSION",		SYSCONF,	_SC_VERSION		},
124df930be7Sderaadt 
125df930be7Sderaadt   { "LINK_MAX",			PATHCONF,	_PC_LINK_MAX		},
126df930be7Sderaadt   { "MAX_CANON",		PATHCONF,	_PC_MAX_CANON		},
127df930be7Sderaadt   { "MAX_INPUT",		PATHCONF,	_PC_MAX_INPUT		},
128df930be7Sderaadt   { "NAME_MAX",			PATHCONF,	_PC_NAME_MAX		},
129df930be7Sderaadt   { "PATH_MAX",			PATHCONF,	_PC_PATH_MAX		},
130df930be7Sderaadt   { "PIPE_BUF",			PATHCONF,	_PC_PIPE_BUF		},
131df930be7Sderaadt   { "_POSIX_CHOWN_RESTRICTED",	PATHCONF,	_PC_CHOWN_RESTRICTED	},
132df930be7Sderaadt   { "_POSIX_NO_TRUNC",		PATHCONF,	_PC_NO_TRUNC		},
133df930be7Sderaadt   { "_POSIX_VDISABLE",		PATHCONF,	_PC_VDISABLE		},
134df930be7Sderaadt 
135df930be7Sderaadt   { NULL }
136df930be7Sderaadt };
137df930be7Sderaadt 
138df930be7Sderaadt 
139df930be7Sderaadt int
140df930be7Sderaadt main(argc, argv)
141df930be7Sderaadt 	int argc;
142df930be7Sderaadt 	char **argv;
143df930be7Sderaadt {
144df930be7Sderaadt 	int ch;
145df930be7Sderaadt 	const struct conf_variable *cp;
146df930be7Sderaadt 
147df930be7Sderaadt 	long val;
148df930be7Sderaadt 	size_t slen;
149df930be7Sderaadt 	char * sval;
150df930be7Sderaadt 
151df930be7Sderaadt 	setlocale(LC_ALL, "");
152df930be7Sderaadt 
153df930be7Sderaadt 	while ((ch = getopt(argc, argv, "")) != -1) {
154df930be7Sderaadt 		switch (ch) {
155df930be7Sderaadt 		case '?':
156df930be7Sderaadt 		default:
157df930be7Sderaadt 			usage();
158df930be7Sderaadt 		}
159df930be7Sderaadt 	}
160df930be7Sderaadt 	argc -= optind;
161df930be7Sderaadt 	argv += optind;
162df930be7Sderaadt 
163df930be7Sderaadt 	if (argc < 1 || argc > 2) {
164df930be7Sderaadt 		usage();
165df930be7Sderaadt 		/* NOTREACHED */
166df930be7Sderaadt 	}
167df930be7Sderaadt 
168df930be7Sderaadt 	for (cp = conf_table; cp->name != NULL; cp++) {
169df930be7Sderaadt 		if (strcmp(*argv, cp->name) == 0)
170df930be7Sderaadt 			break;
171df930be7Sderaadt 	}
172df930be7Sderaadt 	if (cp->name == NULL) {
173*3b665a45Sderaadt 		errx(1, "%s: unknown variable", *argv);
174df930be7Sderaadt 		/* NOTREACHED */
175df930be7Sderaadt 	}
176df930be7Sderaadt 
177df930be7Sderaadt 	if (cp->type == PATHCONF) {
178df930be7Sderaadt 		if (argc != 2) usage();
179df930be7Sderaadt 	} else {
180df930be7Sderaadt 		if (argc != 1) usage();
181df930be7Sderaadt 	}
182df930be7Sderaadt 
183df930be7Sderaadt 	switch (cp->type) {
184df930be7Sderaadt 	case CONSTANT:
185df930be7Sderaadt 		printf("%ld\n", cp->value);
186df930be7Sderaadt 		break;
187df930be7Sderaadt 
188df930be7Sderaadt 	case CONFSTR:
189df930be7Sderaadt 		slen = confstr (cp->value, (char *) 0, (size_t) 0);
190df930be7Sderaadt 
191df930be7Sderaadt 		if ((sval = malloc(slen)) == NULL)
192df930be7Sderaadt 			err(1, NULL);
193df930be7Sderaadt 
194df930be7Sderaadt 		confstr(cp->value, sval, slen);
195df930be7Sderaadt 		printf("%s\n", sval);
196df930be7Sderaadt 		break;
197df930be7Sderaadt 
198df930be7Sderaadt 	case SYSCONF:
199df930be7Sderaadt 		errno = 0;
200df930be7Sderaadt 		if ((val = sysconf(cp->value)) == -1) {
201df930be7Sderaadt 			if (errno != 0) {
202df930be7Sderaadt 				err(1, NULL);
203df930be7Sderaadt 				/* NOTREACHED */
204df930be7Sderaadt 			}
205df930be7Sderaadt 
206df930be7Sderaadt 			printf ("undefined\n");
207df930be7Sderaadt 		} else {
208df930be7Sderaadt 			printf("%ld\n", val);
209df930be7Sderaadt 		}
210df930be7Sderaadt 		break;
211df930be7Sderaadt 
212df930be7Sderaadt 	case PATHCONF:
213df930be7Sderaadt 		errno = 0;
214df930be7Sderaadt 		if ((val = pathconf(argv[1], cp->value)) == -1) {
215df930be7Sderaadt 			if (errno != 0) {
216df930be7Sderaadt 				err(1, "%s", argv[1]);
217df930be7Sderaadt 				/* NOTREACHED */
218df930be7Sderaadt 			}
219df930be7Sderaadt 
220df930be7Sderaadt 			printf ("undefined\n");
221df930be7Sderaadt 		} else {
222df930be7Sderaadt 			printf ("%ld\n", val);
223df930be7Sderaadt 		}
224df930be7Sderaadt 		break;
225df930be7Sderaadt 	}
226df930be7Sderaadt 
227df930be7Sderaadt 	exit (ferror(stdout));
228df930be7Sderaadt }
229df930be7Sderaadt 
230df930be7Sderaadt 
231df930be7Sderaadt static void
232df930be7Sderaadt usage()
233df930be7Sderaadt {
234df930be7Sderaadt   fprintf (stderr, "usage: getconf system_var\n");
235df930be7Sderaadt   fprintf (stderr, "       getconf path_var pathname\n");
236df930be7Sderaadt   exit(1);
237df930be7Sderaadt }
238