xref: /freebsd/usr.sbin/sysconf/sysconf_query_value.c (revision 3fe5961a0b708da599d42cbb6b5e4f030c28ea45)
1 /*
2  * Copyright (c) 2013-2026 Devin Teske <dteske@FreeBSD.org>
3  * Copyright (c) 2021-2026 Faraz Vahedi <kfv@FreeBSD.org>
4  *
5  * SPDX-License-Identifier: BSD-2-Clause
6  */
7 
8 /*
9  * Report effective directive values (named reads and -a).
10  */
11 
12 #include "sysconf_priv.h"
13 
14 /*
15  * Report read requests (and `-a') from the results of a completed
16  * scan_pass(). Returns EXIT_SUCCESS or EXIT_FAILURE.
17  */
18 int
do_reads(void)19 do_reads(void)
20 {
21 	int rv = EXIT_SUCCESS;
22 	size_t d;
23 	unsigned int n;
24 
25 	if (dump_all) {
26 		for (d = 0; d < ndumps; d++) {
27 			/*
28 			 * Without -A, a plain -a dumps only what the conf
29 			 * files themselves configure; a directive whose
30 			 * value still comes from the (always-scanned)
31 			 * defaults file is out of scope.
32 			 */
33 			if (!with_defaults && defaults_idx >= 0 &&
34 			    dumps[d].srcidx == defaults_idx)
35 				continue;
36 			if (!quiet)
37 				warn_with_equals_no(dumps[d].name,
38 				    dumps[d].value,
39 				    conf_files[dumps[d].srcidx],
40 				    dumps[d].line);
41 			if (show_desc)
42 				print_desc(dumps[d].name);
43 			else if (verbose_trail)
44 				print_trail(dumps[d].name, dumps[d].trail,
45 				    dumps[d].ntrail);
46 			else
47 				print_pair(conf_files[dumps[d].srcidx],
48 				    dumps[d].name, dumps[d].value);
49 		}
50 		return (EXIT_SUCCESS);
51 	}
52 
53 	/* Report the results in the order requested */
54 	for (n = 0; n < nreqs; n++) {
55 		if (reqs[n].newvalue != NULL || reqs[n].remove ||
56 		    reqs[n].name[0] == '\0') /* neutralized by validation */
57 			continue;
58 		if (!reqs[n].found) {
59 			if (ignore_unknown)
60 				continue;
61 			if (!quiet)
62 				warnx("unknown directive '%s'",
63 				    reqs[n].name);
64 			rv = EXIT_FAILURE;
65 			continue;
66 		}
67 		if (!quiet)
68 			warn_with_equals_no(reqs[n].name, reqs[n].value,
69 			    conf_files[reqs[n].srcidx], reqs[n].line);
70 		if (verbose_trail)
71 			print_trail(reqs[n].name, reqs[n].trail,
72 			    reqs[n].ntrail);
73 		else
74 			print_pair(conf_files[reqs[n].srcidx], reqs[n].name,
75 			    reqs[n].value);
76 	}
77 
78 	return (rv);
79 }
80