📄 conffile.c
字号:
/* read_functions -- these fit into the read_function slot in a parser * table entry, and are responsible for calling getconf_token as necessary * to consume their arguments, and setting their second argument with the * result. The first argument is a copy of the parser table entry, if * needed. */static void read_int(conf_var_t *, val_t *);static void read_am64(conf_var_t *, val_t *);static void read_real(conf_var_t *, val_t *);static void read_str(conf_var_t *, val_t *);static void read_ident(conf_var_t *, val_t *);static void read_time(conf_var_t *, val_t *);static void read_size(conf_var_t *, val_t *);static void read_bool(conf_var_t *, val_t *);static void read_compress(conf_var_t *, val_t *);static void read_encrypt(conf_var_t *, val_t *);static void read_holding(conf_var_t *, val_t *);static void read_estimate(conf_var_t *, val_t *);static void read_strategy(conf_var_t *, val_t *);static void read_taperalgo(conf_var_t *, val_t *);static void read_priority(conf_var_t *, val_t *);static void read_rate(conf_var_t *, val_t *);static void read_exinclude(conf_var_t *, val_t *);static void read_intrange(conf_var_t *, val_t *);static void read_property(conf_var_t *, val_t *);/* Functions to get various types of values. These are called by * read_functions to take care of any variations in the way that these * values can be written: integers can have units, boolean values can be * specified with a number of names, etc. They form utility functions * for the read_functions, below. */static time_t get_time(void);static int get_int(void);static ssize_t get_size(void);static off_t get_am64_t(void);static int get_bool(void);/* Check the given 'seen', flagging an error if this value has already * been seen and allow_overwrites is false. Also marks the value as * seen on the current line. * * @param seen: (in/out) seen value to adjust */static void ckseen(int *seen);/* validate_functions -- these fit into the validate_function solt in * a parser table entry. They call conf_parserror if the value in their * second argument is invalid. */static void validate_nonnegative(conf_var_t *, val_t *);static void validate_positive(conf_var_t *, val_t *);static void validate_runspercycle(conf_var_t *, val_t *);static void validate_bumppercent(conf_var_t *, val_t *);static void validate_bumpmult(conf_var_t *, val_t *);static void validate_inparallel(conf_var_t *, val_t *);static void validate_displayunit(conf_var_t *, val_t *);static void validate_reserve(conf_var_t *, val_t *);static void validate_use(conf_var_t *, val_t *);static void validate_chunksize(conf_var_t *, val_t *);static void validate_blocksize(conf_var_t *, val_t *);static void validate_debug(conf_var_t *, val_t *);static void validate_port_range(val_t *, int, int);static void validate_reserved_port_range(conf_var_t *, val_t *);static void validate_unreserved_port_range(conf_var_t *, val_t *);/* * Initialization *//* Name of the current configuration (part of API) */char *config_name = NULL;/* Current configuration directory (part of API) */char *config_dir = NULL;/* Current toplevel configuration file (part of API) */char *config_filename = NULL;/* Has the config been initialized? */static gboolean config_initialized = FALSE;/* Are we running a client? (true if last init was * with CONFIG_INIT_CLIENT) */static gboolean config_client = FALSE;/* What config overwrites are applied? */static config_overwrites_t *applied_config_overwrites = NULL;/* All global parameters */static val_t conf_data[CNF_CNF];/* Linked list of holding disks */static holdingdisk_t *holdinglist = NULL;static dumptype_t *dumplist = NULL;static tapetype_t *tapelist = NULL;static interface_t *interface_list = NULL;/* storage for derived values */static long int unit_divisor = 1;int debug_amandad = 0;int debug_amidxtaped = 0;int debug_amindexd = 0;int debug_amrecover = 0;int debug_auth = 0;int debug_event = 0;int debug_holding = 0;int debug_protocol = 0;int debug_planner = 0;int debug_driver = 0;int debug_dumper = 0;int debug_chunker = 0;int debug_taper = 0;int debug_selfcheck = 0;int debug_sendsize = 0;int debug_sendbackup = 0;/* Reset all configuration values to their defaults (which, in many * cases, come from --with-foo options at build time) */static void init_defaults(void);/* Update all dervied values based on the current configuration. This * function can be called multiple times, once after each adjustment * to the current configuration. * * @param is_client: are we running a client? */static void update_derived_values(gboolean is_client);/* per-type conf_init functions, used as utilities for init_defaults * and for each subsection's init_foo_defaults. * * These set the value's type and seen flags, as well as copying * the relevant value into the 'v' field. */static void conf_init_int(val_t *val, int i);static void conf_init_am64(val_t *val, off_t l);static void conf_init_real(val_t *val, float r);static void conf_init_str(val_t *val, char *s);static void conf_init_ident(val_t *val, char *s);static void conf_init_time(val_t *val, time_t t);static void conf_init_size(val_t *val, ssize_t sz);static void conf_init_bool(val_t *val, int i);static void conf_init_compress(val_t *val, comp_t i);static void conf_init_encrypt(val_t *val, encrypt_t i);static void conf_init_holding(val_t *val, dump_holdingdisk_t i);static void conf_init_estimate(val_t *val, estimate_t i);static void conf_init_strategy(val_t *val, strategy_t);static void conf_init_taperalgo(val_t *val, taperalgo_t i);static void conf_init_priority(val_t *val, int i);static void conf_init_rate(val_t *val, float r1, float r2);static void conf_init_exinclude(val_t *val); /* to empty list */static void conf_init_intrange(val_t *val, int i1, int i2);static void conf_init_proplist(val_t *val); /* to empty list *//* * Command-line Handling */typedef struct config_overwrite_s { char *key; char *value;} config_overwrite_t;struct config_overwrites_s { int n_allocated; int n_used; config_overwrite_t *ovr;};/* * val_t Management */static void copy_val_t(val_t *, val_t *);static void free_val_t(val_t *);/* * Utilities *//* Utility functions/structs for val_t_display_strs */static char *exinclude_display_str(val_t *val, int file);static void proplist_display_str_foreach_fn(gpointer key_p, gpointer value_p, gpointer user_data_p);static void val_t_print_token(FILE *output, char *prefix, char *format, keytab_t *kt, val_t *val);/* Given a key name as used in config overwrites, return a pointer to the corresponding * conf_var_t in the current parsetable, and the val_t representing that value. This * function will access subsections if key has the form TYPE:SUBSEC:KEYWORD. Returns * false if the value does not exist. * * Assumes keytable and parsetable are set correctly, which is generally OK after * config_init has been called. * * @param key: the key to look up * @param parm: (result) the parse table entry * @param val: (result) the parameter value * @returns: true on success */static int parm_key_info(char *key, conf_var_t **parm, val_t **val);/* * Error handling *//* Have we seen a parse error yet? Parsing continues after an error, so this * flag is checked after the parse is complete. */static gboolean got_parserror;static void conf_parserror(const char *format, ...) __attribute__ ((format (printf, 1, 2)));static void conf_parswarn(const char *format, ...) __attribute__ ((format (printf, 1, 2)));/* * Tables *//* First, the keyword tables for client and server */keytab_t client_keytab[] = { { "CONF", CONF_CONF }, { "INDEX_SERVER", CONF_INDEX_SERVER }, { "TAPE_SERVER", CONF_TAPE_SERVER }, { "TAPEDEV", CONF_TAPEDEV }, { "DEVICE-PROPERTY", CONF_DEVICE_PROPERTY }, { "AUTH", CONF_AUTH }, { "SSH_KEYS", CONF_SSH_KEYS }, { "AMANDAD_PATH", CONF_AMANDAD_PATH }, { "CLIENT_USERNAME", CONF_CLIENT_USERNAME }, { "GNUTAR_LIST_DIR", CONF_GNUTAR_LIST_DIR }, { "AMANDATES", CONF_AMANDATES }, { "KRB5KEYTAB", CONF_KRB5KEYTAB }, { "KRB5PRINCIPAL", CONF_KRB5PRINCIPAL }, { "INCLUDEFILE", CONF_INCLUDEFILE }, { "CONNECT_TRIES", CONF_CONNECT_TRIES }, { "REP_TRIES", CONF_REP_TRIES }, { "REQ_TRIES", CONF_REQ_TRIES }, { "DEBUG_AMANDAD", CONF_DEBUG_AMANDAD }, { "DEBUG_AMIDXTAPED", CONF_DEBUG_AMIDXTAPED }, { "DEBUG_AMINDEXD", CONF_DEBUG_AMINDEXD }, { "DEBUG_AMRECOVER", CONF_DEBUG_AMRECOVER }, { "DEBUG_AUTH", CONF_DEBUG_AUTH }, { "DEBUG_EVENT", CONF_DEBUG_EVENT }, { "DEBUG_HOLDING", CONF_DEBUG_HOLDING }, { "DEBUG_PROTOCOL", CONF_DEBUG_PROTOCOL }, { "DEBUG_PLANNER", CONF_DEBUG_PLANNER }, { "DEBUG_DRIVER", CONF_DEBUG_DRIVER }, { "DEBUG_DUMPER", CONF_DEBUG_DUMPER }, { "DEBUG_CHUNKER", CONF_DEBUG_CHUNKER }, { "DEBUG_TAPER", CONF_DEBUG_TAPER }, { "DEBUG_SELFCHECK", CONF_DEBUG_SELFCHECK }, { "DEBUG_SENDSIZE", CONF_DEBUG_SENDSIZE }, { "DEBUG_SENDBACKUP", CONF_DEBUG_SENDBACKUP }, { "RESERVED-UDP-PORT", CONF_RESERVED_UDP_PORT }, { "RESERVED-TCP-PORT", CONF_RESERVED_TCP_PORT }, { "UNRESERVED-TCP-PORT", CONF_UNRESERVED_TCP_PORT }, { NULL, CONF_UNKNOWN },};keytab_t server_keytab[] = { { "AMANDAD_PATH", CONF_AMANDAD_PATH }, { "AMRECOVER_CHANGER", CONF_AMRECOVER_CHANGER }, { "AMRECOVER_CHECK_LABEL", CONF_AMRECOVER_CHECK_LABEL }, { "AMRECOVER_DO_FSF", CONF_AMRECOVER_DO_FSF }, { "APPEND", CONF_APPEND }, { "AUTH", CONF_AUTH }, { "AUTO", CONF_AUTO }, { "AUTOFLUSH", CONF_AUTOFLUSH }, { "BEST", CONF_BEST }, { "BLOCKSIZE", CONF_BLOCKSIZE }, { "BUMPDAYS", CONF_BUMPDAYS }, { "BUMPMULT", CONF_BUMPMULT }, { "BUMPPERCENT", CONF_BUMPPERCENT }, { "BUMPSIZE", CONF_BUMPSIZE }, { "CALCSIZE", CONF_CALCSIZE }, { "CHANGERDEV", CONF_CHANGERDEV }, { "CHANGERFILE", CONF_CHANGERFILE }, { "CHUNKSIZE", CONF_CHUNKSIZE }, { "CLIENT", CONF_CLIENT }, { "CLIENT_CUSTOM_COMPRESS", CONF_CLNTCOMPPROG }, { "CLIENT_DECRYPT_OPTION", CONF_CLNT_DECRYPT_OPT }, { "CLIENT_ENCRYPT", CONF_CLNT_ENCRYPT }, { "CLIENT_USERNAME", CONF_CLIENT_USERNAME }, { "COLUMNSPEC", CONF_COLUMNSPEC }, { "COMMENT", CONF_COMMENT }, { "COMPRATE", CONF_COMPRATE }, { "COMPRESS", CONF_COMPRESS }, { "CONNECT_TRIES", CONF_CONNECT_TRIES }, { "CTIMEOUT", CONF_CTIMEOUT }, { "CUSTOM", CONF_CUSTOM }, { "DEBUG_AMANDAD" , CONF_DEBUG_AMANDAD }, { "DEBUG_AMIDXTAPED" , CONF_DEBUG_AMIDXTAPED }, { "DEBUG_AMINDEXD" , CONF_DEBUG_AMINDEXD }, { "DEBUG_AMRECOVER" , CONF_DEBUG_AMRECOVER }, { "DEBUG_AUTH" , CONF_DEBUG_AUTH }, { "DEBUG_EVENT" , CONF_DEBUG_EVENT }, { "DEBUG_HOLDING" , CONF_DEBUG_HOLDING }, { "DEBUG_PROTOCOL" , CONF_DEBUG_PROTOCOL }, { "DEBUG_PLANNER" , CONF_DEBUG_PLANNER }, { "DEBUG_DRIVER" , CONF_DEBUG_DRIVER }, { "DEBUG_DUMPER" , CONF_DEBUG_DUMPER }, { "DEBUG_CHUNKER" , CONF_DEBUG_CHUNKER }, { "DEBUG_TAPER" , CONF_DEBUG_TAPER }, { "DEBUG_SELFCHECK" , CONF_DEBUG_SELFCHECK }, { "DEBUG_SENDSIZE" , CONF_DEBUG_SENDSIZE }, { "DEBUG_SENDBACKUP" , CONF_DEBUG_SENDBACKUP }, { "DEFINE", CONF_DEFINE }, { "DEVICE_PROPERTY", CONF_DEVICE_PROPERTY }, { "DIRECTORY", CONF_DIRECTORY }, { "DISKFILE", CONF_DISKFILE }, { "DISPLAYUNIT", CONF_DISPLAYUNIT }, { "DTIMEOUT", CONF_DTIMEOUT }, { "DUMPCYCLE", CONF_DUMPCYCLE }, { "DUMPORDER", CONF_DUMPORDER }, { "DUMPTYPE", CONF_DUMPTYPE }, { "DUMPUSER", CONF_DUMPUSER }, { "ENCRYPT", CONF_ENCRYPT }, { "ESTIMATE", CONF_ESTIMATE }, { "ETIMEOUT", CONF_ETIMEOUT }, { "EXCLUDE", CONF_EXCLUDE }, { "EXCLUDE-FILE", CONF_EXCLUDE_FILE }, { "EXCLUDE-LIST", CONF_EXCLUDE_LIST }, { "FALLBACK_SPLITSIZE", CONF_FALLBACK_SPLITSIZE }, { "FAST", CONF_FAST }, { "FILE", CONF_EFILE }, { "FILE-PAD", CONF_FILE_PAD }, { "FILEMARK", CONF_FILEMARK }, { "FIRST", CONF_FIRST }, { "FIRSTFIT", CONF_FIRSTFIT }, { "HANOI", CONF_HANOI }, { "HIGH", CONF_HIGH }, { "HOLDINGDISK", CONF_HOLDING }, { "IGNORE", CONF_IGNORE }, { "INCLUDE", CONF_INCLUDE }, { "INCLUDEFILE", CONF_INCLUDEFILE }, { "INCRONLY", CONF_INCRONLY }, { "INDEX", CONF_INDEX }, { "INDEXDIR", CONF_INDEXDIR }, { "INFOFILE", CONF_INFOFILE }, { "INPARALLEL", CONF_INPARALLEL }, { "INTERFACE", CONF_INTERFACE }, { "KENCRYPT", CONF_KENCRYPT }, { "KRB5KEYTAB", CONF_KRB5KEYTAB }, { "KRB5PRINCIPAL", CONF_KRB5PRINCIPAL }, { "LABELSTR", CONF_LABELSTR }, { "LABEL_NEW_TAPES", CONF_LABEL_NEW_TAPES }, { "LARGEST", CONF_LARGEST }, { "LARGESTFIT", CONF_LARGESTFIT }, { "LAST", CONF_LAST }, { "LBL-TEMPL", CONF_LBL_TEMPL }, { "LENGTH", CONF_LENGTH }, { "LIST", CONF_LIST }, { "LOGDIR", CONF_LOGDIR }, { "LOW", CONF_LOW }, { "MAILTO", CONF_MAILTO }, { "READBLOCKSIZE", CONF_READBLOCKSIZE }, { "MAXDUMPS", CONF_MAXDUMPS }, { "MAXDUMPSIZE", CONF_MAXDUMPSIZE },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -