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