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