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