From owner-svn-src-all@freebsd.org Sat Sep 30 17:30:24 2017 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A87EAE2B79E; Sat, 30 Sep 2017 17:30:24 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 8262F75A7D; Sat, 30 Sep 2017 17:30:24 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v8UHUNf2058131; Sat, 30 Sep 2017 17:30:23 GMT (envelope-from jhb@FreeBSD.org) Received: (from jhb@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v8UHUNRl058125; Sat, 30 Sep 2017 17:30:23 GMT (envelope-from jhb@FreeBSD.org) Message-Id: <201709301730.v8UHUNRl058125@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: jhb set sender to jhb@FreeBSD.org using -f From: John Baldwin Date: Sat, 30 Sep 2017 17:30:23 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r324124 - in stable: 10/usr.bin/getconf 11/usr.bin/getconf X-SVN-Group: stable-11 X-SVN-Commit-Author: jhb X-SVN-Commit-Paths: in stable: 10/usr.bin/getconf 11/usr.bin/getconf X-SVN-Commit-Revision: 324124 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 30 Sep 2017 17:30:24 -0000 Author: jhb Date: Sat Sep 30 17:30:22 2017 New Revision: 324124 URL: https://svnweb.freebsd.org/changeset/base/324124 Log: MFC 323631: Add an -a flag to getconf. When -a is specified, the name and value of all system or path configuration values is reported to standard output. Sponsored by: Chelsio Communications Modified: stable/11/usr.bin/getconf/confstr.gperf stable/11/usr.bin/getconf/getconf.1 stable/11/usr.bin/getconf/getconf.c stable/11/usr.bin/getconf/getconf.h stable/11/usr.bin/getconf/pathconf.gperf stable/11/usr.bin/getconf/sysconf.gperf Directory Properties: stable/11/ (props changed) Changes in other areas also in this revision: Modified: stable/10/usr.bin/getconf/confstr.gperf stable/10/usr.bin/getconf/getconf.1 stable/10/usr.bin/getconf/getconf.c stable/10/usr.bin/getconf/getconf.h stable/10/usr.bin/getconf/pathconf.gperf stable/10/usr.bin/getconf/sysconf.gperf Directory Properties: stable/10/ (props changed) Modified: stable/11/usr.bin/getconf/confstr.gperf ============================================================================== --- stable/11/usr.bin/getconf/confstr.gperf Sat Sep 30 13:17:31 2017 (r324123) +++ stable/11/usr.bin/getconf/confstr.gperf Sat Sep 30 17:30:22 2017 (r324124) @@ -68,3 +68,14 @@ find_confstr(const char *name, int *key) } return 0; } + +void +foreach_confstr(void (*func)(const char *, int)) +{ + const struct map *mp; + + for (mp = wordlist; mp->name != NULL; mp++) { + if (mp->valid) + func(mp->name, mp->key); + } +} Modified: stable/11/usr.bin/getconf/getconf.1 ============================================================================== --- stable/11/usr.bin/getconf/getconf.1 Sat Sep 30 13:17:31 2017 (r324123) +++ stable/11/usr.bin/getconf/getconf.1 Sat Sep 30 17:30:22 2017 (r324124) @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd August 8, 2016 +.Dd September 15, 2017 .Dt GETCONF 1 .Os .Sh NAME @@ -36,6 +36,9 @@ .Nd retrieve standard configuration variables .Sh SYNOPSIS .Nm +.Fl a +.Op Ar file +.Nm .Op Fl v Ar environment .Ar path_var .Ar file @@ -45,20 +48,35 @@ .Sh DESCRIPTION The .Nm -utility prints the value of a +utility prints the values of .Tn POSIX or .Tn X/Open -path or system configuration variable to the standard output. -If the specified variable is undefined, the string +path or system configuration variables to the standard output. +If a variable is undefined, the string .Dq Li undefined is output. .Pp -The first form of the command, with two mandatory +The first form of the command displays all of the path or system configuration +variables to standard output. +If +.Ar file +is provided, +all path configuration variables are reported for +.Ar file +using +.Xr pathconf 2 . +Otherwise, +all system configuration variables are reported using +.Xr confstr 3 +and +.Xr sysconf 3. +.Pp +The second form of the command, with two mandatory arguments, retrieves file- and file system-specific configuration variables using .Xr pathconf 2 . -The second form, with a single argument, retrieves system +The third form, with a single argument, retrieves system configuration variables using .Xr confstr 3 and Modified: stable/11/usr.bin/getconf/getconf.c ============================================================================== --- stable/11/usr.bin/getconf/getconf.c Sat Sep 30 13:17:31 2017 (r324123) +++ stable/11/usr.bin/getconf/getconf.c Sat Sep 30 17:30:22 2017 (r324124) @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -41,6 +42,8 @@ __FBSDID("$FreeBSD$"); #include "getconf.h" +static void do_allsys(void); +static void do_allpath(const char *path); static void do_confstr(const char *name, int key); static void do_sysconf(const char *name, int key); static void do_pathconf(const char *name, int key, const char *path); @@ -49,7 +52,8 @@ static void usage(void) { fprintf(stderr, -"usage: getconf [-v prog_env] system_var\n" +"usage: getconf -a [pathname]\n" +" getconf [-v prog_env] system_var\n" " getconf [-v prog_env] path_var pathname\n"); exit(EX_USAGE); } @@ -57,13 +61,18 @@ usage(void) int main(int argc, char **argv) { + bool aflag; int c, key, valid; const char *name, *vflag, *alt_path; intmax_t limitval; + aflag = false; vflag = NULL; - while ((c = getopt(argc, argv, "v:")) != -1) { + while ((c = getopt(argc, argv, "av:")) != -1) { switch (c) { + case 'a': + aflag = true; + break; case 'v': vflag = optarg; break; @@ -73,6 +82,16 @@ main(int argc, char **argv) } } + if (aflag) { + if (vflag != NULL) + usage(); + if (argv[optind] == NULL) + do_allsys(); + else + do_allpath(argv[optind]); + return (0); + } + if ((name = argv[optind]) == NULL) usage(); @@ -133,6 +152,77 @@ main(int argc, char **argv) name); } return 0; +} + +static void +do_onestr(const char *name, int key) +{ + size_t len; + + errno = 0; + len = confstr(key, 0, 0); + if (len == 0 && errno != 0) { + warn("confstr: %s", name); + return; + } + printf("%s: ", name); + if (len == 0) + printf("undefined\n"); + else { + char buf[len + 1]; + + confstr(key, buf, len); + printf("%s\n", buf); + } +} + +static void +do_onesys(const char *name, int key) +{ + long value; + + errno = 0; + value = sysconf(key); + if (value == -1 && errno != 0) { + warn("sysconf: %s", name); + return; + } + printf("%s: ", name); + if (value == -1) + printf("undefined\n"); + else + printf("%ld\n", value); +} + +static void +do_allsys(void) +{ + + foreach_confstr(do_onestr); + foreach_sysconf(do_onesys); +} + +static void +do_onepath(const char *name, int key, const char *path) +{ + long value; + + errno = 0; + value = pathconf(path, key); + if (value == -1 && errno != EINVAL && errno != 0) + warn("pathconf: %s", name); + printf("%s: ", name); + if (value == -1) + printf("undefined\n"); + else + printf("%ld\n", value); +} + +static void +do_allpath(const char *path) +{ + + foreach_pathconf(do_onepath, path); } static void Modified: stable/11/usr.bin/getconf/getconf.h ============================================================================== --- stable/11/usr.bin/getconf/getconf.h Sat Sep 30 13:17:31 2017 (r324123) +++ stable/11/usr.bin/getconf/getconf.h Sat Sep 30 17:30:22 2017 (r324124) @@ -41,3 +41,7 @@ int find_limit(const char *name, intmax_t *value); int find_pathconf(const char *name, int *key); int find_progenv(const char *name, const char **alt_path); int find_sysconf(const char *name, int *key); +void foreach_confstr(void (*func)(const char *, int)); +void foreach_pathconf(void (*func)(const char *, int, const char *), + const char *path); +void foreach_sysconf(void (*func)(const char *, int)); Modified: stable/11/usr.bin/getconf/pathconf.gperf ============================================================================== --- stable/11/usr.bin/getconf/pathconf.gperf Sat Sep 30 13:17:31 2017 (r324123) +++ stable/11/usr.bin/getconf/pathconf.gperf Sat Sep 30 17:30:22 2017 (r324124) @@ -68,3 +68,15 @@ find_pathconf(const char *name, int *key) } return 0; } + +void +foreach_pathconf(void (*func)(const char *, int, const char *), + const char *path) +{ + const struct map *mp; + + for (mp = wordlist; mp->name != NULL; mp++) { + if (mp->valid) + func(mp->name, mp->key, path); + } +} Modified: stable/11/usr.bin/getconf/sysconf.gperf ============================================================================== --- stable/11/usr.bin/getconf/sysconf.gperf Sat Sep 30 13:17:31 2017 (r324123) +++ stable/11/usr.bin/getconf/sysconf.gperf Sat Sep 30 17:30:22 2017 (r324124) @@ -147,3 +147,14 @@ find_sysconf(const char *name, int *key) } return 0; } + +void +foreach_sysconf(void (*func)(const char *, int)) +{ + const struct map *mp; + + for (mp = wordlist; mp->name != NULL; mp++) { + if (mp->valid) + func(mp->name, mp->key); + } +}