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