]>
Commit | Line | Data |
---|---|---|
83f6dbe8 A |
1 | /* |
2 | * Copyright 2000 Massachusetts Institute of Technology | |
3 | * | |
4 | * Permission to use, copy, modify, and distribute this software and | |
5 | * its documentation for any purpose and without fee is hereby | |
6 | * granted, provided that both the above copyright notice and this | |
7 | * permission notice appear in all copies, that both the above | |
8 | * copyright notice and this permission notice appear in all | |
9 | * supporting documentation, and that the name of M.I.T. not be used | |
10 | * in advertising or publicity pertaining to distribution of the | |
11 | * software without specific, written prior permission. M.I.T. makes | |
12 | * no representations about the suitability of this software for any | |
13 | * purpose. It is provided "as is" without express or implied | |
14 | * warranty. | |
15 | * | |
16 | * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS | |
17 | * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, | |
18 | * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
19 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT | |
20 | * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
21 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
22 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |
23 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
24 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
25 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |
26 | * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
27 | * SUCH DAMAGE. | |
28 | */ | |
29 | ||
30 | #include <sys/cdefs.h> | |
ef8ad44b | 31 | __FBSDID("$FreeBSD: src/usr.bin/getconf/getconf.c,v 1.10 2006/12/06 12:00:26 maxim Exp $"); |
83f6dbe8 A |
32 | |
33 | #include <sys/types.h> | |
34 | ||
35 | #include <err.h> | |
36 | #include <errno.h> | |
37 | #include <stdio.h> | |
38 | #include <stdlib.h> | |
39 | #include <sysexits.h> | |
40 | #include <unistd.h> | |
41 | ||
42 | #include "getconf.h" | |
43 | ||
44 | static void do_confstr(const char *name, int key); | |
45 | static void do_sysconf(const char *name, int key); | |
46 | static void do_pathconf(const char *name, int key, const char *path); | |
47 | ||
48 | static void | |
49 | usage(void) | |
50 | { | |
51 | fprintf(stderr, | |
52 | "usage: getconf [-v prog_env] system_var\n" | |
53 | " getconf [-v prog_env] path_var pathname\n"); | |
54 | exit(EX_USAGE); | |
55 | } | |
56 | ||
57 | int | |
58 | main(int argc, char **argv) | |
59 | { | |
60 | int c, key, valid; | |
61 | const char *name, *vflag, *alt_path; | |
62 | intmax_t limitval; | |
63 | ||
64 | vflag = NULL; | |
65 | while ((c = getopt(argc, argv, "v:")) != -1) { | |
66 | switch (c) { | |
67 | case 'v': | |
68 | vflag = optarg; | |
69 | break; | |
70 | ||
71 | default: | |
72 | usage(); | |
73 | } | |
74 | } | |
75 | ||
76 | if ((name = argv[optind]) == NULL) | |
77 | usage(); | |
78 | ||
79 | if (vflag != NULL) { | |
80 | if ((valid = find_progenv(vflag, &alt_path)) == 0) | |
81 | errx(EX_USAGE, "invalid programming environment %s", | |
82 | vflag); | |
83 | if (valid > 0 && alt_path != NULL) { | |
84 | if (argv[optind + 1] == NULL) | |
85 | execl(alt_path, "getconf", argv[optind], | |
86 | (char *)NULL); | |
87 | else | |
88 | execl(alt_path, "getconf", argv[optind], | |
89 | argv[optind + 1], (char *)NULL); | |
90 | ||
91 | err(EX_OSERR, "execl: %s", alt_path); | |
92 | } | |
93 | if (valid < 0) | |
94 | errx(EX_UNAVAILABLE, "environment %s is not available", | |
95 | vflag); | |
96 | } | |
97 | ||
98 | if (argv[optind + 1] == NULL) { /* confstr or sysconf */ | |
83f6dbe8 A |
99 | if ((valid = find_limit(name, &limitval)) != 0) { |
100 | if (valid > 0) | |
101 | printf("%" PRIdMAX "\n", limitval); | |
102 | else | |
103 | printf("undefined\n"); | |
104 | ||
105 | return 0; | |
106 | } | |
107 | if ((valid = find_confstr(name, &key)) != 0) { | |
108 | if (valid > 0) | |
109 | do_confstr(name, key); | |
110 | else | |
111 | printf("undefined\n"); | |
cf37c299 | 112 | } else { |
83f6dbe8 A |
113 | valid = find_sysconf(name, &key); |
114 | if (valid > 0) { | |
115 | do_sysconf(name, key); | |
116 | } else if (valid < 0) { | |
117 | printf("undefined\n"); | |
cf37c299 | 118 | } else |
83f6dbe8 A |
119 | errx(EX_USAGE, |
120 | "no such configuration parameter `%s'", | |
121 | name); | |
122 | } | |
123 | } else { | |
124 | valid = find_pathconf(name, &key); | |
125 | if (valid != 0) { | |
126 | if (valid > 0) | |
127 | do_pathconf(name, key, argv[optind + 1]); | |
128 | else | |
129 | printf("undefined\n"); | |
130 | } else | |
131 | errx(EX_USAGE, | |
132 | "no such path configuration parameter `%s'", | |
133 | name); | |
134 | } | |
135 | return 0; | |
136 | } | |
137 | ||
138 | static void | |
139 | do_confstr(const char *name, int key) | |
140 | { | |
141 | size_t len; | |
ef8ad44b | 142 | int savederr; |
83f6dbe8 | 143 | |
ef8ad44b | 144 | savederr = errno; |
34d340d7 | 145 | errno = 0; |
83f6dbe8 | 146 | len = confstr(key, 0, 0); |
34d340d7 | 147 | if (len == 0) { |
ef8ad44b | 148 | if (errno) |
34d340d7 | 149 | err(EX_OSERR, "confstr: %s", name); |
ef8ad44b | 150 | else |
34d340d7 | 151 | printf("undefined\n"); |
34d340d7 | 152 | } else { |
83f6dbe8 A |
153 | char buf[len + 1]; |
154 | ||
155 | confstr(key, buf, len); | |
156 | printf("%s\n", buf); | |
157 | } | |
ef8ad44b | 158 | errno = savederr; |
83f6dbe8 A |
159 | } |
160 | ||
161 | static void | |
162 | do_sysconf(const char *name, int key) | |
163 | { | |
164 | long value; | |
165 | ||
166 | errno = 0; | |
167 | value = sysconf(key); | |
168 | if (value == -1 && errno != 0) | |
169 | err(EX_OSERR, "sysconf: %s", name); | |
170 | else if (value == -1) | |
171 | printf("undefined\n"); | |
172 | else | |
173 | printf("%ld\n", value); | |
174 | } | |
175 | ||
176 | static void | |
177 | do_pathconf(const char *name, int key, const char *path) | |
178 | { | |
179 | long value; | |
180 | ||
181 | errno = 0; | |
182 | value = pathconf(path, key); | |
183 | if (value == -1 && errno != 0) | |
184 | err(EX_OSERR, "pathconf: %s", name); | |
185 | else if (value == -1) | |
186 | printf("undefined\n"); | |
187 | else | |
188 | printf("%ld\n", value); | |
189 | } |