xref: /freebsd/usr.sbin/sysconf/sysconf_priv.h (revision 0380d016d9ba407af12eb743b7c5806d49ddf848)
13fe5961aSDevin Teske /*
23fe5961aSDevin Teske  * Copyright (c) 2013-2026 Devin Teske <dteske@FreeBSD.org>
33fe5961aSDevin Teske  * Copyright (c) 2021-2026 Faraz Vahedi <kfv@FreeBSD.org>
43fe5961aSDevin Teske  *
53fe5961aSDevin Teske  * SPDX-License-Identifier: BSD-2-Clause
63fe5961aSDevin Teske  */
73fe5961aSDevin Teske 
83fe5961aSDevin Teske #ifndef _SYSCONF_PRIV_H_
93fe5961aSDevin Teske #define _SYSCONF_PRIV_H_
103fe5961aSDevin Teske 
113fe5961aSDevin Teske #ifdef __FreeBSD__
123fe5961aSDevin Teske #include <sys/param.h>
133fe5961aSDevin Teske #include <sys/capsicum.h>
143fe5961aSDevin Teske #include <sys/jail.h>
153fe5961aSDevin Teske #include <sys/linker.h>
163fe5961aSDevin Teske #include <sys/sysctl.h>
173fe5961aSDevin Teske 
183fe5961aSDevin Teske #include <capsicum_helpers.h>
193fe5961aSDevin Teske #include <jail.h>
203fe5961aSDevin Teske #endif
213fe5961aSDevin Teske 
223fe5961aSDevin Teske #include <bsdconf.h>
233fe5961aSDevin Teske #include <dirent.h>
243fe5961aSDevin Teske #include <err.h>
253fe5961aSDevin Teske #include <errno.h>
263fe5961aSDevin Teske #include <fcntl.h>
273fe5961aSDevin Teske #include <inttypes.h>
283fe5961aSDevin Teske #include <limits.h>
293fe5961aSDevin Teske #include <stdbool.h>
303fe5961aSDevin Teske #include <stdint.h>
313fe5961aSDevin Teske #include <stdio.h>
323fe5961aSDevin Teske #include <stdlib.h>
333fe5961aSDevin Teske #include <string.h>
343fe5961aSDevin Teske #include <unistd.h>
353fe5961aSDevin Teske 
363fe5961aSDevin Teske #ifndef __unused
373fe5961aSDevin Teske #define __unused	/* not all compilers support attributes */
383fe5961aSDevin Teske #endif
393fe5961aSDevin Teske 
40*0380d016SDevin Teske #define SYSCONF_VERSION	"1.1 2026-09-15"
413fe5961aSDevin Teske 
423fe5961aSDevin Teske /* getopt(3) optstring; shared by parse_options() and find_target() */
433fe5961aSDevin Teske #define OPTSTRING	"AacdDEeFf:hij:k:lLnNqR:svVx"
443fe5961aSDevin Teske 
453fe5961aSDevin Teske /* One assignment step recorded for `-V' trails */
463fe5961aSDevin Teske struct trail_step {
473fe5961aSDevin Teske 	size_t		fileidx;	/* index into conf_files */
483fe5961aSDevin Teske 	uint32_t	line;		/* 1-based line in that file */
493fe5961aSDevin Teske 	enum bsdconf_op	op;		/* operator of this statement */
503fe5961aSDevin Teske 	char		*piece;		/* unquoted fragment */
513fe5961aSDevin Teske 	char		*effective;	/* value after applying the op */
523fe5961aSDevin Teske };
533fe5961aSDevin Teske 
543fe5961aSDevin Teske /*
553fe5961aSDevin Teske  * One make(1) assignment statement for `name-=word' strikes: the last
563fe5961aSDevin Teske  * statement whose piece contains the word is rewritten (or removed if
573fe5961aSDevin Teske  * the piece becomes empty).
583fe5961aSDevin Teske  */
593fe5961aSDevin Teske struct make_assign {
603fe5961aSDevin Teske 	size_t		fileidx;
613fe5961aSDevin Teske 	uint32_t	line;
623fe5961aSDevin Teske 	enum bsdconf_op	op;
633fe5961aSDevin Teske 	char		*piece;
643fe5961aSDevin Teske };
653fe5961aSDevin Teske 
663fe5961aSDevin Teske /* Requests to process (one per name argument) */
673fe5961aSDevin Teske struct request {
683fe5961aSDevin Teske 	const char	*name;		/* directive name */
693fe5961aSDevin Teske 	const char	*newvalue;	/* value to write (NULL for reads) */
703fe5961aSDevin Teske 	enum bsdconf_op	op;		/* assignment operator (writes) */
713fe5961aSDevin Teske 	char		listop;		/* `+' append / `-' strike words */
723fe5961aSDevin Teske 	char		*value;		/* value read from file(s) */
733fe5961aSDevin Teske 	int		found;		/* directive seen while parsing */
743fe5961aSDevin Teske 	int		append_present; /* identical make `+=value' line */
753fe5961aSDevin Teske 	int		remove;		/* nonzero for `-x' removals */
763fe5961aSDevin Teske 	int		srcidx;		/* conf file that last set the value
773fe5961aSDevin Teske 					   (authoritative); -1 if unset */
783fe5961aSDevin Teske 	uint32_t	line;		/* 1-based line of that definition */
793fe5961aSDevin Teske 	unsigned char	*infile;	/* per-file presence map */
803fe5961aSDevin Teske 	struct trail_step *trail;	/* `-V' assignment steps */
813fe5961aSDevin Teske 	size_t		ntrail;
823fe5961aSDevin Teske 	struct make_assign *assigns;	/* make `-=': per-statement pieces */
833fe5961aSDevin Teske 	size_t		nassigns;
843fe5961aSDevin Teske };
853fe5961aSDevin Teske 
863fe5961aSDevin Teske /* Union of all directives, for `-a' against multi-file targets */
873fe5961aSDevin Teske struct dumpent {
883fe5961aSDevin Teske 	char		*name;		/* directive name */
893fe5961aSDevin Teske 	char		*value;		/* last value seen */
903fe5961aSDevin Teske 	int		srcidx;		/* conf file that last set the value */
913fe5961aSDevin Teske 	uint32_t	line;		/* 1-based line of that definition */
923fe5961aSDevin Teske 	struct trail_step *trail;	/* `-V' assignment steps */
933fe5961aSDevin Teske 	size_t		ntrail;
943fe5961aSDevin Teske };
953fe5961aSDevin Teske 
963fe5961aSDevin Teske /* Request / dump state (defined in sysconf.c) */
973fe5961aSDevin Teske extern struct request	*reqs;
983fe5961aSDevin Teske extern unsigned int	nreqs;
993fe5961aSDevin Teske extern struct dumpent	*dumps;
1003fe5961aSDevin Teske extern size_t		ndumps;
1013fe5961aSDevin Teske extern size_t		dumpsize;
1023fe5961aSDevin Teske 
1033fe5961aSDevin Teske /* Resolved target state */
1043fe5961aSDevin Teske extern char		**conf_files;
1053fe5961aSDevin Teske extern size_t		nconf_files;
1063fe5961aSDevin Teske extern size_t		conf_scanidx;
1073fe5961aSDevin Teske extern size_t		write_idx;
1083fe5961aSDevin Teske extern int		defaults_idx;
1093fe5961aSDevin Teske extern enum bsdconf_format format;
1103fe5961aSDevin Teske 
1113fe5961aSDevin Teske /* Display / mode flags */
1123fe5961aSDevin Teske extern const char	*pgm;
1133fe5961aSDevin Teske extern bool		check;
1143fe5961aSDevin Teske extern bool		defaults_only;
1153fe5961aSDevin Teske extern bool		dump_all;
1163fe5961aSDevin Teske extern bool		existing_only;
1173fe5961aSDevin Teske extern bool		ignore_unknown;
1183fe5961aSDevin Teske extern bool		list_all;
1193fe5961aSDevin Teske extern bool		list_files;
1203fe5961aSDevin Teske extern bool		name_only;
1213fe5961aSDevin Teske extern bool		quiet;
1223fe5961aSDevin Teske extern bool		remove_mode;
1233fe5961aSDevin Teske extern bool		set_knobs;
1243fe5961aSDevin Teske extern bool		show_desc;
1253fe5961aSDevin Teske extern bool		show_equals;
1263fe5961aSDevin Teske extern bool		show_file;
1273fe5961aSDevin Teske extern bool		value_only;
1283fe5961aSDevin Teske extern bool		verbose;
1293fe5961aSDevin Teske extern bool		verbose_trail;
1303fe5961aSDevin Teske extern bool		with_defaults;
1313fe5961aSDevin Teske 
1323fe5961aSDevin Teske /* Option arguments */
1333fe5961aSDevin Teske extern const char	*file;
1343fe5961aSDevin Teske extern bool		file_stdin;
1353fe5961aSDevin Teske extern const char	*jailname;
1363fe5961aSDevin Teske extern const char	*module;
1373fe5961aSDevin Teske extern const char	*rootdir;
1383fe5961aSDevin Teske 
1393fe5961aSDevin Teske /* sysconf_print.c */
1403fe5961aSDevin Teske int		 make_knob_name_p(const char *_name);
1413fe5961aSDevin Teske int		 make_knob_p(const char *_name);
1423fe5961aSDevin Teske void		 warn_with_equals_no(const char *_name, const char *_value,
1433fe5961aSDevin Teske 		    const char *_path, uint32_t _line);
1443fe5961aSDevin Teske void		 print_pair(const char *_path, const char *_directive,
1453fe5961aSDevin Teske 		    const char *_value);
1463fe5961aSDevin Teske const char	*op_str(enum bsdconf_op _op);
1473fe5961aSDevin Teske int		 trail_push(struct trail_step **_trailp, size_t *_ntrailp,
1483fe5961aSDevin Teske 		    size_t _fileidx, uint32_t _line, enum bsdconf_op _op,
1493fe5961aSDevin Teske 		    const char *_piece, const char *_effective);
1503fe5961aSDevin Teske void		 trail_free(struct trail_step *_trail, size_t _ntrail);
1513fe5961aSDevin Teske void		 print_trail(const char *_name,
1523fe5961aSDevin Teske 		    const struct trail_step *_trail, size_t _ntrail);
1533fe5961aSDevin Teske void		 print_write_echo(const char *_path, uint32_t _line,
1543fe5961aSDevin Teske 		    const char *_name, enum bsdconf_op _op, const char *_oldv,
1553fe5961aSDevin Teske 		    const char *_newv, int _changed, int _added, int _removed);
1563fe5961aSDevin Teske 
1573fe5961aSDevin Teske /* sysconf_resolve.c */
1583fe5961aSDevin Teske char		*defaults_path(void);
1593fe5961aSDevin Teske void		 resolve_target(const char *_target);
1603fe5961aSDevin Teske int		 do_list(void);
1613fe5961aSDevin Teske 
1623fe5961aSDevin Teske /* sysconf_scan.c */
1633fe5961aSDevin Teske char		*make_apply(enum bsdconf_op _op, const char *_old,
1643fe5961aSDevin Teske 		    const char *_piece);
1653fe5961aSDevin Teske int		 scan_pass(int _sandbox);
1663fe5961aSDevin Teske 
1673fe5961aSDevin Teske /* sysconf_edit_assign.c */
1683fe5961aSDevin Teske void		 split_request(char *_arg, struct request *_req, int _remove);
1693fe5961aSDevin Teske int		 list_has(const char *_list, const char *_word, size_t _wlen);
1703fe5961aSDevin Teske char		*list_merge(const char *_current, const char *_words, int _op);
1713fe5961aSDevin Teske int		 merge_list_requests(void);
1723fe5961aSDevin Teske 
1733fe5961aSDevin Teske /* sysconf_edit_make.c */
1743fe5961aSDevin Teske int		 make_strike_p(const struct request *_req);
1753fe5961aSDevin Teske int		 make_assign_push(struct request *_req, enum bsdconf_op _op,
1763fe5961aSDevin Teske 		    const char *_piece, uint32_t _line);
1773fe5961aSDevin Teske int		 do_make_strikes(int _check_only);
1783fe5961aSDevin Teske 
1793fe5961aSDevin Teske /* sysconf_edit_write.c */
1803fe5961aSDevin Teske int		 do_checks(void);
1813fe5961aSDevin Teske int		 do_writes(void);
1823fe5961aSDevin Teske 
1833fe5961aSDevin Teske /* sysconf_query_value.c */
1843fe5961aSDevin Teske int		 do_reads(void);
1853fe5961aSDevin Teske 
1863fe5961aSDevin Teske /* sysconf_query_desc.c */
1873fe5961aSDevin Teske void		 load_descriptions(void);
1883fe5961aSDevin Teske void		 print_desc(const char *_directive);
1893fe5961aSDevin Teske int		 describe_defaults(void);
1903fe5961aSDevin Teske 
1913fe5961aSDevin Teske /* sysconf_query_sysctl.c */
1923fe5961aSDevin Teske #if defined(__FreeBSD__)
1933fe5961aSDevin Teske int		 sysctl_descr(const char *_name, char *_buf, size_t _bufsize);
1943fe5961aSDevin Teske int		 describe_sysctl(void);
1953fe5961aSDevin Teske int		 sysctl_writable(const char *_name, const char *_value,
1963fe5961aSDevin Teske 		    int _quiet_unknown);
1973fe5961aSDevin Teske #endif
1983fe5961aSDevin Teske 
1993fe5961aSDevin Teske /* sysconf.c */
2003fe5961aSDevin Teske void		 usage(void);
2013fe5961aSDevin Teske void		 help(void);
2023fe5961aSDevin Teske 
2033fe5961aSDevin Teske #endif /* !_SYSCONF_PRIV_H_ */
204