xref: /freebsd/lib/libbsdconf/bsdconf_format_loader.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 #include "bsdconf_formats.h"
9*3fe5961aSDevin Teske 
10*3fe5961aSDevin Teske /*
11*3fe5961aSDevin Teske  * BSDCONF_FORMAT_LOADER: loader.conf(5)
12*3fe5961aSDevin Teske  *
13*3fe5961aSDevin Teske  * Assignments with no whitespace around the `=' -- the Forth reader in
14*3fe5961aSDevin Teske  * support.4th rejects anything else, so BSDCONF_STRICT_EQUALS is enforced.
15*3fe5961aSDevin Teske  * Quoted or unquoted input values are accepted when parsing but values are
16*3fe5961aSDevin Teske  * always written back quoted (BSDCONF_PUT_QUOTE_ALWAYS), the form every
17*3fe5961aSDevin Teske  * loader accepts for every value.
18*3fe5961aSDevin Teske  *
19*3fe5961aSDevin Teske  * The loader itself hardcodes only /boot/defaults/loader.conf and discovers
20*3fe5961aSDevin Teske  * every other file from the loader_conf_files, loader_conf_dirs, and
21*3fe5961aSDevin Teske  * local_loader_conf_files directives encountered along the way -- any file
22*3fe5961aSDevin Teske  * so discovered may revise those lists in turn. The `defaults' member
23*3fe5961aSDevin Teske  * quintet below hands that same discovery to bsdconf_format_files(); the
24*3fe5961aSDevin Teske  * static source list is only the fallback for systems whose defaults file
25*3fe5961aSDevin Teske  * is missing. The defaults file itself is deliberately excluded from the
26*3fe5961aSDevin Teske  * resolved list, mirroring how sysrc(8) excludes /etc/defaults/rc.conf.
27*3fe5961aSDevin Teske  */
28*3fe5961aSDevin Teske static const struct bsdconf_source bsdconf_loader_sources[] = {
29*3fe5961aSDevin Teske 	{ BSDCONF_SOURCE_FILE,	"/boot/device.hints" },
30*3fe5961aSDevin Teske 	{ BSDCONF_SOURCE_FILE,	"/boot/loader.conf" },
31*3fe5961aSDevin Teske 	{ BSDCONF_SOURCE_DIR,	"/boot/loader.conf.d" },
32*3fe5961aSDevin Teske 	{ BSDCONF_SOURCE_FILE,	"/boot/loader.conf.local" },
33*3fe5961aSDevin Teske 	{ BSDCONF_SOURCE_FILE,	NULL },
34*3fe5961aSDevin Teske };
35*3fe5961aSDevin Teske 
36*3fe5961aSDevin Teske const struct bsdconf_format_def bsdconf_format_loader_def = {
37*3fe5961aSDevin Teske 	.keyword		= "loader",
38*3fe5961aSDevin Teske 	.path			= "/boot/loader.conf",
39*3fe5961aSDevin Teske 	.sources		= bsdconf_loader_sources,
40*3fe5961aSDevin Teske 	.defaults		= "/boot/defaults/loader.conf",
41*3fe5961aSDevin Teske 	.defaults_env		= "LOADER_DEFAULTS",
42*3fe5961aSDevin Teske 	.files_directive	= "loader_conf_files",
43*3fe5961aSDevin Teske 	.dirs_directive		= "loader_conf_dirs",
44*3fe5961aSDevin Teske 	.local_directive	= "local_loader_conf_files",
45*3fe5961aSDevin Teske 	.processing		= BSDCONF_BREAK_ON_EQUALS |
46*3fe5961aSDevin Teske 				  BSDCONF_CASE_SENSITIVE |
47*3fe5961aSDevin Teske 				  BSDCONF_REQUIRE_EQUALS |
48*3fe5961aSDevin Teske 				  BSDCONF_STRICT_EQUALS,
49*3fe5961aSDevin Teske 	.put			= BSDCONF_PUT_QUOTE_ALWAYS |
50*3fe5961aSDevin Teske 				  BSDCONF_PUT_ALLOW_EMPTY,
51*3fe5961aSDevin Teske };
52