159632Swollman/*
259632Swollman * Copyright 2000 Massachusetts Institute of Technology
359632Swollman *
459632Swollman * Permission to use, copy, modify, and distribute this software and
559632Swollman * its documentation for any purpose and without fee is hereby
659632Swollman * granted, provided that both the above copyright notice and this
759632Swollman * permission notice appear in all copies, that both the above
859632Swollman * copyright notice and this permission notice appear in all
959632Swollman * supporting documentation, and that the name of M.I.T. not be used
1059632Swollman * in advertising or publicity pertaining to distribution of the
1159632Swollman * software without specific, written prior permission.  M.I.T. makes
1259632Swollman * no representations about the suitability of this software for any
1359632Swollman * purpose.  It is provided "as is" without express or implied
1459632Swollman * warranty.
1559632Swollman *
1659632Swollman * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''.  M.I.T. DISCLAIMS
1759632Swollman * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
1859632Swollman * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1959632Swollman * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
2059632Swollman * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2159632Swollman * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2259632Swollman * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
2359632Swollman * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
2459632Swollman * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2559632Swollman * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
2659632Swollman * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2759632Swollman * SUCH DAMAGE.
2859632Swollman */
2959632Swollman
3099112Sobrien#include <sys/cdefs.h>
3199112Sobrien__FBSDID("$FreeBSD: stable/11/usr.bin/getconf/getconf.c 324124 2017-09-30 17:30:22Z jhb $");
3299112Sobrien
3359632Swollman#include <sys/types.h>
3459632Swollman
3559632Swollman#include <err.h>
3659632Swollman#include <errno.h>
37324124Sjhb#include <stdbool.h>
3859632Swollman#include <stdio.h>
3959632Swollman#include <stdlib.h>
4059632Swollman#include <sysexits.h>
4159632Swollman#include <unistd.h>
4259632Swollman
4359632Swollman#include "getconf.h"
4459632Swollman
45324124Sjhbstatic void	do_allsys(void);
46324124Sjhbstatic void	do_allpath(const char *path);
4759632Swollmanstatic void	do_confstr(const char *name, int key);
4859632Swollmanstatic void	do_sysconf(const char *name, int key);
4959632Swollmanstatic void	do_pathconf(const char *name, int key, const char *path);
5059632Swollman
5159632Swollmanstatic void
5259632Swollmanusage(void)
5359632Swollman{
54119025Stjr	fprintf(stderr,
55324124Sjhb"usage: getconf -a [pathname]\n"
56324124Sjhb"       getconf [-v prog_env] system_var\n"
57119025Stjr"       getconf [-v prog_env] path_var pathname\n");
5859632Swollman	exit(EX_USAGE);
5959632Swollman}
6059632Swollman
6159632Swollmanint
6259632Swollmanmain(int argc, char **argv)
6359632Swollman{
64324124Sjhb	bool aflag;
65103591Swollman	int c, key, valid;
66103591Swollman	const char *name, *vflag, *alt_path;
67103591Swollman	intmax_t limitval;
6859632Swollman
69324124Sjhb	aflag = false;
70103591Swollman	vflag = NULL;
71324124Sjhb	while ((c = getopt(argc, argv, "av:")) != -1) {
7259632Swollman		switch (c) {
73324124Sjhb		case 'a':
74324124Sjhb			aflag = true;
75324124Sjhb			break;
7659632Swollman		case 'v':
7759632Swollman			vflag = optarg;
7859632Swollman			break;
7959632Swollman
8059632Swollman		default:
8159632Swollman			usage();
8259632Swollman		}
8359632Swollman	}
8459632Swollman
85324124Sjhb	if (aflag) {
86324124Sjhb		if (vflag != NULL)
87324124Sjhb			usage();
88324124Sjhb		if (argv[optind] == NULL)
89324124Sjhb			do_allsys();
90324124Sjhb		else
91324124Sjhb			do_allpath(argv[optind]);
92324124Sjhb		return (0);
93324124Sjhb	}
94324124Sjhb
95103591Swollman	if ((name = argv[optind]) == NULL)
9659632Swollman		usage();
9759632Swollman
98103591Swollman	if (vflag != NULL) {
99103591Swollman		if ((valid = find_progenv(vflag, &alt_path)) == 0)
100103591Swollman			errx(EX_USAGE, "invalid programming environment %s",
101103591Swollman			     vflag);
102103591Swollman		if (valid > 0 && alt_path != NULL) {
103103591Swollman			if (argv[optind + 1] == NULL)
104103591Swollman				execl(alt_path, "getconf", argv[optind],
105103591Swollman				      (char *)NULL);
106103591Swollman			else
107103591Swollman				execl(alt_path, "getconf", argv[optind],
108103591Swollman				      argv[optind + 1], (char *)NULL);
109103591Swollman
110103591Swollman			err(EX_OSERR, "execl: %s", alt_path);
111103591Swollman		}
112103591Swollman		if (valid < 0)
113103591Swollman			errx(EX_UNAVAILABLE, "environment %s is not available",
114103591Swollman			     vflag);
115103591Swollman	}
116103591Swollman
117103591Swollman	if (argv[optind + 1] == NULL) { /* confstr or sysconf */
118103591Swollman		if ((valid = find_limit(name, &limitval)) != 0) {
119103591Swollman			if (valid > 0)
120106016Swollman				printf("%" PRIdMAX "\n", limitval);
121103591Swollman			else
122103591Swollman				printf("undefined\n");
123103591Swollman
124103591Swollman			return 0;
125103591Swollman		}
126103591Swollman		if ((valid = find_confstr(name, &key)) != 0) {
127103591Swollman			if (valid > 0)
128103591Swollman				do_confstr(name, key);
129103591Swollman			else
130103591Swollman				printf("undefined\n");
131304949Sngie		} else {
132103591Swollman			valid = find_sysconf(name, &key);
133103591Swollman			if (valid > 0) {
13459632Swollman				do_sysconf(name, key);
135103591Swollman			} else if (valid < 0) {
136103591Swollman				printf("undefined\n");
137304949Sngie			} else
13859632Swollman				errx(EX_USAGE,
13959632Swollman				     "no such configuration parameter `%s'",
14059632Swollman				     name);
14159632Swollman		}
14259632Swollman	} else {
143103591Swollman		valid = find_pathconf(name, &key);
144103591Swollman		if (valid != 0) {
145103591Swollman			if (valid > 0)
146103591Swollman				do_pathconf(name, key, argv[optind + 1]);
147103591Swollman			else
148103591Swollman				printf("undefined\n");
149103591Swollman		} else
15059632Swollman			errx(EX_USAGE,
15159632Swollman			     "no such path configuration parameter `%s'",
15259632Swollman			     name);
15359632Swollman	}
15459632Swollman	return 0;
15559632Swollman}
15659632Swollman
15759632Swollmanstatic void
158324124Sjhbdo_onestr(const char *name, int key)
159324124Sjhb{
160324124Sjhb	size_t len;
161324124Sjhb
162324124Sjhb	errno = 0;
163324124Sjhb	len = confstr(key, 0, 0);
164324124Sjhb	if (len == 0 && errno != 0) {
165324124Sjhb		warn("confstr: %s", name);
166324124Sjhb		return;
167324124Sjhb	}
168324124Sjhb	printf("%s: ", name);
169324124Sjhb	if (len == 0)
170324124Sjhb		printf("undefined\n");
171324124Sjhb	else {
172324124Sjhb		char buf[len + 1];
173324124Sjhb
174324124Sjhb		confstr(key, buf, len);
175324124Sjhb		printf("%s\n", buf);
176324124Sjhb	}
177324124Sjhb}
178324124Sjhb
179324124Sjhbstatic void
180324124Sjhbdo_onesys(const char *name, int key)
181324124Sjhb{
182324124Sjhb	long value;
183324124Sjhb
184324124Sjhb	errno = 0;
185324124Sjhb	value = sysconf(key);
186324124Sjhb	if (value == -1 && errno != 0) {
187324124Sjhb		warn("sysconf: %s", name);
188324124Sjhb		return;
189324124Sjhb	}
190324124Sjhb	printf("%s: ", name);
191324124Sjhb	if (value == -1)
192324124Sjhb		printf("undefined\n");
193324124Sjhb	else
194324124Sjhb		printf("%ld\n", value);
195324124Sjhb}
196324124Sjhb
197324124Sjhbstatic void
198324124Sjhbdo_allsys(void)
199324124Sjhb{
200324124Sjhb
201324124Sjhb	foreach_confstr(do_onestr);
202324124Sjhb	foreach_sysconf(do_onesys);
203324124Sjhb}
204324124Sjhb
205324124Sjhbstatic void
206324124Sjhbdo_onepath(const char *name, int key, const char *path)
207324124Sjhb{
208324124Sjhb	long value;
209324124Sjhb
210324124Sjhb	errno = 0;
211324124Sjhb	value = pathconf(path, key);
212324124Sjhb	if (value == -1 && errno != EINVAL && errno != 0)
213324124Sjhb		warn("pathconf: %s", name);
214324124Sjhb	printf("%s: ", name);
215324124Sjhb	if (value == -1)
216324124Sjhb		printf("undefined\n");
217324124Sjhb	else
218324124Sjhb		printf("%ld\n", value);
219324124Sjhb}
220324124Sjhb
221324124Sjhbstatic void
222324124Sjhbdo_allpath(const char *path)
223324124Sjhb{
224324124Sjhb
225324124Sjhb	foreach_pathconf(do_onepath, path);
226324124Sjhb}
227324124Sjhb
228324124Sjhbstatic void
22959632Swollmando_confstr(const char *name, int key)
23059632Swollman{
23159632Swollman	size_t len;
232164945Smaxim	int savederr;
23359632Swollman
234164945Smaxim	savederr = errno;
235164945Smaxim	errno = 0;
23659632Swollman	len = confstr(key, 0, 0);
237164945Smaxim	if (len == 0) {
238164945Smaxim		if (errno)
239164945Smaxim			err(EX_OSERR, "confstr: %s", name);
240164945Smaxim		else
241164945Smaxim			printf("undefined\n");
242164945Smaxim	} else {
243119312Smarkm		char buf[len + 1];
244119312Smarkm
245119312Smarkm		confstr(key, buf, len);
246119312Smarkm		printf("%s\n", buf);
24759632Swollman	}
248164945Smaxim	errno = savederr;
24959632Swollman}
25059632Swollman
25159632Swollmanstatic void
25259632Swollmando_sysconf(const char *name, int key)
25359632Swollman{
25459632Swollman	long value;
25559632Swollman
25659632Swollman	errno = 0;
25759632Swollman	value = sysconf(key);
25859632Swollman	if (value == -1 && errno != 0)
25959632Swollman		err(EX_OSERR, "sysconf: %s", name);
26059632Swollman	else if (value == -1)
26159632Swollman		printf("undefined\n");
26259632Swollman	else
26359632Swollman		printf("%ld\n", value);
26459632Swollman}
26559632Swollman
26659632Swollmanstatic void
26759632Swollmando_pathconf(const char *name, int key, const char *path)
26859632Swollman{
26959632Swollman	long value;
27059632Swollman
27159632Swollman	errno = 0;
27259632Swollman	value = pathconf(path, key);
27359632Swollman	if (value == -1 && errno != 0)
27459632Swollman		err(EX_OSERR, "pathconf: %s", name);
27559632Swollman	else if (value == -1)
27659632Swollman		printf("undefined\n");
27759632Swollman	else
27859632Swollman		printf("%ld\n", value);
27959632Swollman}
280103591Swollman
281