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