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$");
3299112Sobrien
3359632Swollman#include <sys/types.h>
3459632Swollman
3559632Swollman#include <err.h>
3659632Swollman#include <errno.h>
3759632Swollman#include <stdio.h>
3859632Swollman#include <stdlib.h>
3959632Swollman#include <sysexits.h>
4059632Swollman#include <unistd.h>
4159632Swollman
4259632Swollman#include "getconf.h"
4359632Swollman
4459632Swollmanstatic void	do_confstr(const char *name, int key);
4559632Swollmanstatic void	do_sysconf(const char *name, int key);
4659632Swollmanstatic void	do_pathconf(const char *name, int key, const char *path);
4759632Swollman
4859632Swollmanstatic void
4959632Swollmanusage(void)
5059632Swollman{
51119025Stjr	fprintf(stderr,
52119025Stjr"usage: getconf [-v prog_env] system_var\n"
53119025Stjr"       getconf [-v prog_env] path_var pathname\n");
5459632Swollman	exit(EX_USAGE);
5559632Swollman}
5659632Swollman
5759632Swollmanint
5859632Swollmanmain(int argc, char **argv)
5959632Swollman{
60103591Swollman	int c, key, valid;
61103591Swollman	const char *name, *vflag, *alt_path;
62103591Swollman	intmax_t limitval;
6359632Swollman
64103591Swollman	vflag = NULL;
6559632Swollman	while ((c = getopt(argc, argv, "v:")) != -1) {
6659632Swollman		switch (c) {
6759632Swollman		case 'v':
6859632Swollman			vflag = optarg;
6959632Swollman			break;
7059632Swollman
7159632Swollman		default:
7259632Swollman			usage();
7359632Swollman		}
7459632Swollman	}
7559632Swollman
76103591Swollman	if ((name = argv[optind]) == NULL)
7759632Swollman		usage();
7859632Swollman
79103591Swollman	if (vflag != NULL) {
80103591Swollman		if ((valid = find_progenv(vflag, &alt_path)) == 0)
81103591Swollman			errx(EX_USAGE, "invalid programming environment %s",
82103591Swollman			     vflag);
83103591Swollman		if (valid > 0 && alt_path != NULL) {
84103591Swollman			if (argv[optind + 1] == NULL)
85103591Swollman				execl(alt_path, "getconf", argv[optind],
86103591Swollman				      (char *)NULL);
87103591Swollman			else
88103591Swollman				execl(alt_path, "getconf", argv[optind],
89103591Swollman				      argv[optind + 1], (char *)NULL);
90103591Swollman
91103591Swollman			err(EX_OSERR, "execl: %s", alt_path);
92103591Swollman		}
93103591Swollman		if (valid < 0)
94103591Swollman			errx(EX_UNAVAILABLE, "environment %s is not available",
95103591Swollman			     vflag);
96103591Swollman	}
97103591Swollman
98103591Swollman	if (argv[optind + 1] == NULL) { /* confstr or sysconf */
99103591Swollman		if ((valid = find_limit(name, &limitval)) != 0) {
100103591Swollman			if (valid > 0)
101106016Swollman				printf("%" PRIdMAX "\n", limitval);
102103591Swollman			else
103103591Swollman				printf("undefined\n");
104103591Swollman
105103591Swollman			return 0;
106103591Swollman		}
107103591Swollman		if ((valid = find_confstr(name, &key)) != 0) {
108103591Swollman			if (valid > 0)
109103591Swollman				do_confstr(name, key);
110103591Swollman			else
111103591Swollman				printf("undefined\n");
11259632Swollman		} else {
113103591Swollman			valid = find_sysconf(name, &key);
114103591Swollman			if (valid > 0) {
11559632Swollman				do_sysconf(name, key);
116103591Swollman			} else if (valid < 0) {
117103591Swollman				printf("undefined\n");
118103591Swollman			} else
11959632Swollman				errx(EX_USAGE,
12059632Swollman				     "no such configuration parameter `%s'",
12159632Swollman				     name);
12259632Swollman		}
12359632Swollman	} else {
124103591Swollman		valid = find_pathconf(name, &key);
125103591Swollman		if (valid != 0) {
126103591Swollman			if (valid > 0)
127103591Swollman				do_pathconf(name, key, argv[optind + 1]);
128103591Swollman			else
129103591Swollman				printf("undefined\n");
130103591Swollman		} else
13159632Swollman			errx(EX_USAGE,
13259632Swollman			     "no such path configuration parameter `%s'",
13359632Swollman			     name);
13459632Swollman	}
13559632Swollman	return 0;
13659632Swollman}
13759632Swollman
13859632Swollmanstatic void
13959632Swollmando_confstr(const char *name, int key)
14059632Swollman{
14159632Swollman	size_t len;
142164945Smaxim	int savederr;
14359632Swollman
144164945Smaxim	savederr = errno;
145164945Smaxim	errno = 0;
14659632Swollman	len = confstr(key, 0, 0);
147164945Smaxim	if (len == 0) {
148164945Smaxim		if (errno)
149164945Smaxim			err(EX_OSERR, "confstr: %s", name);
150164945Smaxim		else
151164945Smaxim			printf("undefined\n");
152164945Smaxim	} else {
153119312Smarkm		char buf[len + 1];
154119312Smarkm
155119312Smarkm		confstr(key, buf, len);
156119312Smarkm		printf("%s\n", buf);
15759632Swollman	}
158164945Smaxim	errno = savederr;
15959632Swollman}
16059632Swollman
16159632Swollmanstatic void
16259632Swollmando_sysconf(const char *name, int key)
16359632Swollman{
16459632Swollman	long value;
16559632Swollman
16659632Swollman	errno = 0;
16759632Swollman	value = sysconf(key);
16859632Swollman	if (value == -1 && errno != 0)
16959632Swollman		err(EX_OSERR, "sysconf: %s", name);
17059632Swollman	else if (value == -1)
17159632Swollman		printf("undefined\n");
17259632Swollman	else
17359632Swollman		printf("%ld\n", value);
17459632Swollman}
17559632Swollman
17659632Swollmanstatic void
17759632Swollmando_pathconf(const char *name, int key, const char *path)
17859632Swollman{
17959632Swollman	long value;
18059632Swollman
18159632Swollman	errno = 0;
18259632Swollman	value = pathconf(path, key);
18359632Swollman	if (value == -1 && errno != 0)
18459632Swollman		err(EX_OSERR, "pathconf: %s", name);
18559632Swollman	else if (value == -1)
18659632Swollman		printf("undefined\n");
18759632Swollman	else
18859632Swollman		printf("%ld\n", value);
18959632Swollman}
190103591Swollman
191