2 * Amanda, The Advanced Maryland Automatic Network Disk Archiver
3 * Copyright (c) 1991-2000 University of Maryland at College Park
6 * Permission to use, copy, modify, distribute, and sell this software and its
7 * documentation for any purpose is hereby granted without fee, provided that
8 * the above copyright notice appear in all copies and that both that
9 * copyright notice and this permission notice appear in supporting
10 * documentation, and that the name of U.M. not be used in advertising or
11 * publicity pertaining to distribution of the software without specific,
12 * written prior permission. U.M. makes no representations about the
13 * suitability of this software for any purpose. It is provided "as is"
14 * without express or implied warranty.
16 * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
18 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
20 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
21 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 * Author: James da Silva, Systems Design and Analysis Group
24 * Computer Science Department
25 * University of Maryland at College Park
28 * $Id: conffile.c,v 1.156 2006/07/26 15:17:37 martinea Exp $
30 * read configuration file
43 #ifndef AMANDATES_FILE
44 #define AMANDATES_FILE "/etc/amandates"
48 #define INT_MAX 2147483647
51 /* this corresponds to the normal output of amanda, but may
52 * be adapted to any spacing as you like.
54 ColumnInfo ColumnData[] = {
55 { "HostName", 0, 12, 12, 0, "%-*.*s", "HOSTNAME" },
56 { "Disk", 1, 11, 11, 0, "%-*.*s", "DISK" },
57 { "Level", 1, 1, 1, 0, "%*.*d", "L" },
58 { "OrigKB", 1, 7, 0, 0, "%*.*lf", "ORIG-KB" },
59 { "OutKB", 1, 7, 0, 0, "%*.*lf", "OUT-KB" },
60 { "Compress", 1, 6, 1, 0, "%*.*lf", "COMP%" },
61 { "DumpTime", 1, 7, 7, 0, "%*.*s", "MMM:SS" },
62 { "DumpRate", 1, 6, 1, 0, "%*.*lf", "KB/s" },
63 { "TapeTime", 1, 6, 6, 0, "%*.*s", "MMM:SS" },
64 { "TapeRate", 1, 6, 1, 0, "%*.*lf", "KB/s" },
65 { NULL, 0, 0, 0, 0, NULL, NULL }
68 char *config_name = NULL;
69 char *config_dir = NULL;
71 int debug_amandad = 0;
72 int debug_amidxtaped = 0;
73 int debug_amindexd = 0;
74 int debug_amrecover = 0;
77 int debug_holding = 0;
78 int debug_protocol = 0;
79 int debug_planner = 0;
82 int debug_chunker = 0;
84 int debug_selfcheck = 0;
85 int debug_sendsize = 0;
86 int debug_sendbackup = 0;
88 /* visible holding disk variables */
90 holdingdisk_t *holdingdisks;
93 long int unit_divisor = 1;
95 /* configuration parameters */
97 val_t conf_data[CNF_CNF];
98 int conffile_init = 0;
100 command_option_t *program_options = NULL;
101 int program_options_size = 0;
103 /* other internal variables */
104 static holdingdisk_t hdcur;
106 static tapetype_t tpcur;
108 static dumptype_t dpcur;
110 static interface_t ifcur;
112 static dumptype_t *dumplist = NULL;
113 static tapetype_t *tapelist = NULL;
114 static interface_t *interface_list = NULL;
116 static int allow_overwrites;
117 static int token_pushed;
118 static tok_t tok, pushed_tok;
119 static val_t tokenval;
121 static int conf_line_num;
122 static int got_parserror;
123 static FILE *conf_conf = (FILE *)NULL;
124 static char *conf_confname = NULL;
125 static char *conf_line = NULL;
126 static char *conf_char = NULL;
127 static keytab_t *keytable = NULL;
129 /* predeclare local functions */
131 char *get_token_name(tok_t);
134 static void validate_positive0 (t_conf_var *, val_t *);
135 static void validate_positive1 (t_conf_var *, val_t *);
136 static void validate_runspercycle (t_conf_var *, val_t *);
137 static void validate_bumppercent (t_conf_var *, val_t *);
138 static void validate_bumpmult (t_conf_var *, val_t *);
139 static void validate_inparallel (t_conf_var *, val_t *);
140 static void validate_displayunit (t_conf_var *, val_t *);
141 static void validate_reserve (t_conf_var *, val_t *);
142 static void validate_use (t_conf_var *, val_t *);
143 static void validate_chunksize (t_conf_var *, val_t *);
144 static void validate_blocksize (t_conf_var *, val_t *);
145 static void validate_debug (t_conf_var *, val_t *);
146 static void validate_reserved_port_range (t_conf_var *, val_t *);
147 static void validate_unreserved_port_range(t_conf_var *, val_t *);
149 /*static t_conf_var *get_np(t_conf_var *get_var, int parm);*/
150 static int get_int(void);
151 /*static long get_long(void);*/
152 static time_t get_time(void);
153 static ssize_t get_size(void);
154 static off_t get_am64_t(void);
155 static int get_bool(void);
156 static void ckseen(int *seen);
157 static void conf_parserror(const char *format, ...)
158 __attribute__ ((format (printf, 1, 2)));
159 static tok_t lookup_keyword(char *str);
161 static void read_string(t_conf_var *, val_t *);
162 static void read_ident(t_conf_var *, val_t *);
163 static void read_int(t_conf_var *, val_t *);
164 /*static void read_long(t_conf_var *, val_t *);*/
165 static void read_size(t_conf_var *, val_t *);
166 static void read_am64(t_conf_var *, val_t *);
167 static void read_bool(t_conf_var *, val_t *);
168 static void read_real(t_conf_var *, val_t *);
169 static void read_time(t_conf_var *, val_t *);
170 static void read_intrange(t_conf_var *, val_t *);
171 static void conf_init_string(val_t *, char *);
172 static void conf_init_ident(val_t *, char *);
173 static void conf_init_int(val_t *, int);
174 static void conf_init_bool(val_t *, int);
175 static void conf_init_strategy(val_t *, int);
176 static void conf_init_estimate(val_t *, int);
177 static void conf_init_taperalgo(val_t *, int);
178 static void conf_init_priority(val_t *, int);
179 static void conf_init_strategy(val_t *, int);
180 static void conf_init_compress(val_t *, comp_t);
181 static void conf_init_encrypt(val_t *, encrypt_t);
182 static void conf_init_holding(val_t *, dump_holdingdisk_t);
183 /*static void conf_init_long(val_t *, long);*/
184 static void conf_init_size(val_t *, ssize_t);
185 static void conf_init_am64(val_t *, off_t);
186 static void conf_init_real(val_t *, double);
187 static void conf_init_rate(val_t *, double, double);
188 static void conf_init_intrange(val_t *, int, int);
189 static void conf_init_time(val_t *, time_t);
190 /*static void conf_init_sl(val_t *, sl_t *);*/
191 static void conf_init_exinclude(val_t *);
192 static void conf_set_string(val_t *, char *);
193 /*static void conf_set_int(val_t *, int);*/
194 static void conf_set_bool(val_t *, int);
195 static void conf_set_compress(val_t *, comp_t);
196 /*static void conf_set_encrypt(val_t *, encrypt_t);*/
197 static void conf_set_holding(val_t *, dump_holdingdisk_t);
198 static void conf_set_strategy(val_t *, int);
200 static void init_defaults(void);
201 static void read_conffile_recursively(char *filename);
202 static void read_client_conffile_recursively(char *filename);
204 static int read_confline(void);
205 static int read_client_confline(void);
207 static void read_block(command_option_t *command_options, t_conf_var *read_var,
208 keytab_t *keytab, val_t *valarray, char *prefix,
209 char *errormsg, int read_brace,
210 void (*copy_function)(void));
212 static void copy_val_t(val_t *, val_t *);
213 static void free_val_t(val_t *);
214 static char *conf_print(val_t *, int, char *);
215 static void conf_print_exinclude(val_t *, int, int, char *prefix, char **buf, int *free_space);
217 static void get_holdingdisk(void);
218 static void init_holdingdisk_defaults(void);
219 static void save_holdingdisk(void);
220 static void get_dumptype(void);
221 static void init_dumptype_defaults(void);
222 static void save_dumptype(void);
223 static void copy_dumptype(void);
224 static void get_tapetype(void);
225 static void init_tapetype_defaults(void);
226 static void save_tapetype(void);
227 static void copy_tapetype(void);
228 static void get_interface(void);
229 static void init_interface_defaults(void);
230 static void save_interface(void);
231 static void copy_interface(void);
232 static void get_comprate(t_conf_var *, val_t *);
233 static void get_compress(t_conf_var *, val_t *);
234 static void get_encrypt (t_conf_var *, val_t *);
235 static void get_holding (t_conf_var *, val_t *);
236 static void get_priority(t_conf_var *, val_t *);
237 static void get_strategy(t_conf_var *, val_t *);
238 static void get_estimate(t_conf_var *, val_t *);
239 static void get_exclude (t_conf_var *, val_t *);
240 /*static void get_include(t_conf_var *, val_t *);*/
241 static void get_taperalgo(t_conf_var *, val_t *);
243 static int conftoken_getc(void);
244 static int conftoken_ungetc(int c);
245 static void unget_conftoken(void);
246 static void get_conftoken(tok_t exp);
248 keytab_t *my_keytab = NULL;
249 t_conf_var *my_var = NULL;
251 keytab_t client_keytab[] = {
252 { "CONF", CONF_CONF },
253 { "INDEX_SERVER", CONF_INDEX_SERVER },
254 { "TAPE_SERVER", CONF_TAPE_SERVER },
255 { "TAPEDEV", CONF_TAPEDEV },
256 { "AUTH", CONF_AUTH },
257 { "SSH_KEYS", CONF_SSH_KEYS },
258 { "AMANDAD_PATH", CONF_AMANDAD_PATH },
259 { "CLIENT_USERNAME", CONF_CLIENT_USERNAME },
260 { "GNUTAR_LIST_DIR", CONF_GNUTAR_LIST_DIR },
261 { "AMANDATES", CONF_AMANDATES },
262 { "KRB5KEYTAB", CONF_KRB5KEYTAB },
263 { "KRB5PRINCIPAL", CONF_KRB5PRINCIPAL },
264 { "INCLUDEFILE", CONF_INCLUDEFILE },
265 { "CONNECT_TRIES", CONF_CONNECT_TRIES },
266 { "REP_TRIES", CONF_REP_TRIES },
267 { "REQ_TRIES", CONF_REQ_TRIES },
268 { "DEBUG_AMANDAD", CONF_DEBUG_AMANDAD },
269 { "DEBUG_AMIDXTAPED", CONF_DEBUG_AMIDXTAPED },
270 { "DEBUG_AMINDEXD", CONF_DEBUG_AMINDEXD },
271 { "DEBUG_AMRECOVER", CONF_DEBUG_AMRECOVER },
272 { "DEBUG_AUTH", CONF_DEBUG_AUTH },
273 { "DEBUG_EVENT", CONF_DEBUG_EVENT },
274 { "DEBUG_HOLDING", CONF_DEBUG_HOLDING },
275 { "DEBUG_PROTOCOL", CONF_DEBUG_PROTOCOL },
276 { "DEBUG_PLANNER", CONF_DEBUG_PLANNER },
277 { "DEBUG_DRIVER", CONF_DEBUG_DRIVER },
278 { "DEBUG_DUMPER", CONF_DEBUG_DUMPER },
279 { "DEBUG_CHUNKER", CONF_DEBUG_CHUNKER },
280 { "DEBUG_TAPER", CONF_DEBUG_TAPER },
281 { "DEBUG_SELFCHECK", CONF_DEBUG_SELFCHECK },
282 { "DEBUG_SENDSIZE", CONF_DEBUG_SENDSIZE },
283 { "DEBUG_SENDBACKUP", CONF_DEBUG_SENDBACKUP },
284 { "UNRESERVED-TCP-PORT", CONF_UNRESERVED_TCP_PORT },
285 { NULL, CONF_UNKNOWN },
288 t_conf_var client_var [] = {
289 { CONF_CONF , CONFTYPE_STRING , read_string , CNF_CONF , NULL },
290 { CONF_INDEX_SERVER , CONFTYPE_STRING , read_string , CNF_INDEX_SERVER , NULL },
291 { CONF_TAPE_SERVER , CONFTYPE_STRING , read_string , CNF_TAPE_SERVER , NULL },
292 { CONF_TAPEDEV , CONFTYPE_STRING , read_string , CNF_TAPEDEV , NULL },
293 { CONF_AUTH , CONFTYPE_STRING , read_string , CNF_AUTH , NULL },
294 { CONF_SSH_KEYS , CONFTYPE_STRING , read_string , CNF_SSH_KEYS , NULL },
295 { CONF_AMANDAD_PATH , CONFTYPE_STRING , read_string , CNF_AMANDAD_PATH , NULL },
296 { CONF_CLIENT_USERNAME , CONFTYPE_STRING , read_string , CNF_CLIENT_USERNAME , NULL },
297 { CONF_GNUTAR_LIST_DIR , CONFTYPE_STRING , read_string , CNF_GNUTAR_LIST_DIR , NULL },
298 { CONF_AMANDATES , CONFTYPE_STRING , read_string , CNF_AMANDATES , NULL },
299 { CONF_KRB5KEYTAB , CONFTYPE_STRING , read_string , CNF_KRB5KEYTAB , NULL },
300 { CONF_KRB5PRINCIPAL , CONFTYPE_STRING , read_string , CNF_KRB5PRINCIPAL , NULL },
301 { CONF_CONNECT_TRIES , CONFTYPE_INT , read_int , CNF_CONNECT_TRIES , validate_positive1 },
302 { CONF_REP_TRIES , CONFTYPE_INT , read_int , CNF_REP_TRIES , validate_positive1 },
303 { CONF_REQ_TRIES , CONFTYPE_INT , read_int , CNF_REQ_TRIES , validate_positive1 },
304 { CONF_DEBUG_AMANDAD , CONFTYPE_INT , read_int , CNF_DEBUG_AMANDAD , validate_debug },
305 { CONF_DEBUG_AMIDXTAPED , CONFTYPE_INT , read_int , CNF_DEBUG_AMIDXTAPED , validate_debug },
306 { CONF_DEBUG_AMINDEXD , CONFTYPE_INT , read_int , CNF_DEBUG_AMINDEXD , validate_debug },
307 { CONF_DEBUG_AMRECOVER , CONFTYPE_INT , read_int , CNF_DEBUG_AMRECOVER , validate_debug },
308 { CONF_DEBUG_AUTH , CONFTYPE_INT , read_int , CNF_DEBUG_AUTH , validate_debug },
309 { CONF_DEBUG_EVENT , CONFTYPE_INT , read_int , CNF_DEBUG_EVENT , validate_debug },
310 { CONF_DEBUG_HOLDING , CONFTYPE_INT , read_int , CNF_DEBUG_HOLDING , validate_debug },
311 { CONF_DEBUG_PROTOCOL , CONFTYPE_INT , read_int , CNF_DEBUG_PROTOCOL , validate_debug },
312 { CONF_DEBUG_PLANNER , CONFTYPE_INT , read_int , CNF_DEBUG_PLANNER , validate_debug },
313 { CONF_DEBUG_DRIVER , CONFTYPE_INT , read_int , CNF_DEBUG_DRIVER , validate_debug },
314 { CONF_DEBUG_DUMPER , CONFTYPE_INT , read_int , CNF_DEBUG_DUMPER , validate_debug },
315 { CONF_DEBUG_CHUNKER , CONFTYPE_INT , read_int , CNF_DEBUG_CHUNKER , validate_debug },
316 { CONF_DEBUG_TAPER , CONFTYPE_INT , read_int , CNF_DEBUG_TAPER , validate_debug },
317 { CONF_DEBUG_SELFCHECK , CONFTYPE_INT , read_int , CNF_DEBUG_SELFCHECK , validate_debug },
318 { CONF_DEBUG_SENDSIZE , CONFTYPE_INT , read_int , CNF_DEBUG_SENDSIZE , validate_debug },
319 { CONF_DEBUG_SENDBACKUP , CONFTYPE_INT , read_int , CNF_DEBUG_SENDBACKUP , validate_debug },
320 { CONF_UNRESERVED_TCP_PORT, CONFTYPE_INTRANGE, read_intrange, CNF_UNRESERVED_TCP_PORT, validate_unreserved_port_range },
321 { CONF_UNKNOWN , CONFTYPE_INT , NULL , CNF_CNF , NULL }
324 keytab_t server_keytab[] = {
325 { "AMANDAD_PATH", CONF_AMANDAD_PATH },
326 { "AMRECOVER_CHANGER", CONF_AMRECOVER_CHANGER },
327 { "AMRECOVER_CHECK_LABEL", CONF_AMRECOVER_CHECK_LABEL },
328 { "AMRECOVER_DO_FSF", CONF_AMRECOVER_DO_FSF },
329 { "APPEND", CONF_APPEND },
330 { "AUTH", CONF_AUTH },
331 { "AUTO", CONF_AUTO },
332 { "AUTOFLUSH", CONF_AUTOFLUSH },
333 { "BEST", CONF_BEST },
334 { "BLOCKSIZE", CONF_BLOCKSIZE },
335 { "BUMPDAYS", CONF_BUMPDAYS },
336 { "BUMPMULT", CONF_BUMPMULT },
337 { "BUMPPERCENT", CONF_BUMPPERCENT },
338 { "BUMPSIZE", CONF_BUMPSIZE },
339 { "CALCSIZE", CONF_CALCSIZE },
340 { "CHANGERDEV", CONF_CHNGRDEV },
341 { "CHANGERFILE", CONF_CHNGRFILE },
342 { "CHUNKSIZE", CONF_CHUNKSIZE },
343 { "CLIENT", CONF_CLIENT },
344 { "CLIENT_CUSTOM_COMPRESS", CONF_CLNTCOMPPROG },
345 { "CLIENT_DECRYPT_OPTION", CONF_CLNT_DECRYPT_OPT },
346 { "CLIENT_ENCRYPT", CONF_CLNT_ENCRYPT },
347 { "CLIENT_USERNAME", CONF_CLIENT_USERNAME },
348 { "COLUMNSPEC", CONF_COLUMNSPEC },
349 { "COMMENT", CONF_COMMENT },
350 { "COMPRATE", CONF_COMPRATE },
351 { "COMPRESS", CONF_COMPRESS },
352 { "CONNECT_TRIES", CONF_CONNECT_TRIES },
353 { "CTIMEOUT", CONF_CTIMEOUT },
354 { "CUSTOM", CONF_CUSTOM },
355 { "DEBUG_AMANDAD" , CONF_DEBUG_AMANDAD },
356 { "DEBUG_AMIDXTAPED" , CONF_DEBUG_AMIDXTAPED },
357 { "DEBUG_AMINDEXD" , CONF_DEBUG_AMINDEXD },
358 { "DEBUG_AMRECOVER" , CONF_DEBUG_AMRECOVER },
359 { "DEBUG_AUTH" , CONF_DEBUG_AUTH },
360 { "DEBUG_EVENT" , CONF_DEBUG_EVENT },
361 { "DEBUG_HOLDING" , CONF_DEBUG_HOLDING },
362 { "DEBUG_PROTOCOL" , CONF_DEBUG_PROTOCOL },
363 { "DEBUG_PLANNER" , CONF_DEBUG_PLANNER },
364 { "DEBUG_DRIVER" , CONF_DEBUG_DRIVER },
365 { "DEBUG_DUMPER" , CONF_DEBUG_DUMPER },
366 { "DEBUG_CHUNKER" , CONF_DEBUG_CHUNKER },
367 { "DEBUG_TAPER" , CONF_DEBUG_TAPER },
368 { "DEBUG_SELFCHECK" , CONF_DEBUG_SELFCHECK },
369 { "DEBUG_SENDSIZE" , CONF_DEBUG_SENDSIZE },
370 { "DEBUG_SENDBACKUP" , CONF_DEBUG_SENDBACKUP },
371 { "DEFINE", CONF_DEFINE },
372 { "DIRECTORY", CONF_DIRECTORY },
373 { "DISKFILE", CONF_DISKFILE },
374 { "DISPLAYUNIT", CONF_DISPLAYUNIT },
375 { "DTIMEOUT", CONF_DTIMEOUT },
376 { "DUMPCYCLE", CONF_DUMPCYCLE },
377 { "DUMPORDER", CONF_DUMPORDER },
378 { "DUMPTYPE", CONF_DUMPTYPE },
379 { "DUMPUSER", CONF_DUMPUSER },
380 { "ENCRYPT", CONF_ENCRYPT },
381 { "ESTIMATE", CONF_ESTIMATE },
382 { "ETIMEOUT", CONF_ETIMEOUT },
383 { "EXCLUDE", CONF_EXCLUDE },
384 { "EXCLUDE-FILE", CONF_EXCLUDE_FILE },
385 { "EXCLUDE-LIST", CONF_EXCLUDE_LIST },
386 { "FALLBACK_SPLITSIZE", CONF_FALLBACK_SPLITSIZE },
387 { "FAST", CONF_FAST },
388 { "FILE", CONF_EFILE },
389 { "FILE-PAD", CONF_FILE_PAD },
390 { "FILEMARK", CONF_FILEMARK },
391 { "FIRST", CONF_FIRST },
392 { "FIRSTFIT", CONF_FIRSTFIT },
393 { "HANOI", CONF_HANOI },
394 { "HIGH", CONF_HIGH },
395 { "HOLDINGDISK", CONF_HOLDING },
396 { "IGNORE", CONF_IGNORE },
397 { "INCLUDE", CONF_INCLUDE },
398 { "INCLUDEFILE", CONF_INCLUDEFILE },
399 { "INCRONLY", CONF_INCRONLY },
400 { "INDEX", CONF_INDEX },
401 { "INDEXDIR", CONF_INDEXDIR },
402 { "INFOFILE", CONF_INFOFILE },
403 { "INPARALLEL", CONF_INPARALLEL },
404 { "INTERFACE", CONF_INTERFACE },
405 { "KENCRYPT", CONF_KENCRYPT },
406 { "KRB5KEYTAB", CONF_KRB5KEYTAB },
407 { "KRB5PRINCIPAL", CONF_KRB5PRINCIPAL },
408 { "LABELSTR", CONF_LABELSTR },
409 { "LABEL_NEW_TAPES", CONF_LABEL_NEW_TAPES },
410 { "LARGEST", CONF_LARGEST },
411 { "LARGESTFIT", CONF_LARGESTFIT },
412 { "LAST", CONF_LAST },
413 { "LBL-TEMPL", CONF_LBL_TEMPL },
414 { "LENGTH", CONF_LENGTH },
415 { "LIST", CONF_LIST },
416 { "LOGDIR", CONF_LOGDIR },
418 { "MAILTO", CONF_MAILTO },
419 { "READBLOCKSIZE", CONF_READBLOCKSIZE },
420 { "MAXDUMPS", CONF_MAXDUMPS },
421 { "MAXDUMPSIZE", CONF_MAXDUMPSIZE },
422 { "MAXPROMOTEDAY", CONF_MAXPROMOTEDAY },
423 { "MEDIUM", CONF_MEDIUM },
424 { "NETUSAGE", CONF_NETUSAGE }, /* XXX - historical */
425 { "NEVER", CONF_NEVER },
426 { "NOFULL", CONF_NOFULL },
427 { "NOINC", CONF_NOINC },
428 { "NONE", CONF_NONE },
429 { "OPTIONAL", CONF_OPTIONAL },
431 { "PRINTER", CONF_PRINTER },
432 { "PRIORITY", CONF_PRIORITY },
433 { "PROGRAM", CONF_PROGRAM },
434 { "RAWTAPEDEV", CONF_RAWTAPEDEV },
435 { "RECORD", CONF_RECORD },
436 { "REP_TRIES", CONF_REP_TRIES },
437 { "REQ_TRIES", CONF_REQ_TRIES },
438 { "REQUIRED", CONF_REQUIRED },
439 { "RESERVE", CONF_RESERVE },
440 { "RESERVED-UDP-PORT", CONF_RESERVED_UDP_PORT },
441 { "RESERVED-TCP-PORT", CONF_RESERVED_TCP_PORT },
442 { "RUNSPERCYCLE", CONF_RUNSPERCYCLE },
443 { "RUNTAPES", CONF_RUNTAPES },
444 { "SERVER", CONF_SERVER },
445 { "SERVER_CUSTOM_COMPRESS", CONF_SRVCOMPPROG },
446 { "SERVER_DECRYPT_OPTION", CONF_SRV_DECRYPT_OPT },
447 { "SERVER_ENCRYPT", CONF_SRV_ENCRYPT },
448 { "SKIP", CONF_SKIP },
449 { "SKIP-FULL", CONF_SKIP_FULL },
450 { "SKIP-INCR", CONF_SKIP_INCR },
451 { "SMALLEST", CONF_SMALLEST },
452 { "SPEED", CONF_SPEED },
453 { "SPLIT_DISKBUFFER", CONF_SPLIT_DISKBUFFER },
454 { "SSH_KEYS", CONF_SSH_KEYS },
455 { "STANDARD", CONF_STANDARD },
456 { "STARTTIME", CONF_STARTTIME },
457 { "STRATEGY", CONF_STRATEGY },
458 { "TAPEBUFS", CONF_TAPEBUFS },
459 { "TAPECYCLE", CONF_TAPECYCLE },
460 { "TAPEDEV", CONF_TAPEDEV },
461 { "TAPELIST", CONF_TAPELIST },
462 { "TAPERALGO", CONF_TAPERALGO },
463 { "TAPETYPE", CONF_TAPETYPE },
464 { "TAPE_SPLITSIZE", CONF_TAPE_SPLITSIZE },
465 { "TPCHANGER", CONF_TPCHANGER },
466 { "UNRESERVED-TCP-PORT", CONF_UNRESERVED_TCP_PORT },
468 { "USETIMESTAMPS", CONF_USETIMESTAMPS },
469 { NULL, CONF_IDENT },
470 { NULL, CONF_UNKNOWN }
473 t_conf_var server_var [] = {
474 { CONF_ORG , CONFTYPE_STRING , read_string , CNF_ORG , NULL },
475 { CONF_MAILTO , CONFTYPE_STRING , read_string , CNF_MAILTO , NULL },
476 { CONF_DUMPUSER , CONFTYPE_STRING , read_string , CNF_DUMPUSER , NULL },
477 { CONF_PRINTER , CONFTYPE_STRING , read_string , CNF_PRINTER , NULL },
478 { CONF_TAPEDEV , CONFTYPE_STRING , read_string , CNF_TAPEDEV , NULL },
479 { CONF_TPCHANGER , CONFTYPE_STRING , read_string , CNF_TPCHANGER , NULL },
480 { CONF_CHNGRDEV , CONFTYPE_STRING , read_string , CNF_CHNGRDEV , NULL },
481 { CONF_CHNGRFILE , CONFTYPE_STRING , read_string , CNF_CHNGRFILE , NULL },
482 { CONF_LABELSTR , CONFTYPE_STRING , read_string , CNF_LABELSTR , NULL },
483 { CONF_TAPELIST , CONFTYPE_STRING , read_string , CNF_TAPELIST , NULL },
484 { CONF_DISKFILE , CONFTYPE_STRING , read_string , CNF_DISKFILE , NULL },
485 { CONF_INFOFILE , CONFTYPE_STRING , read_string , CNF_INFOFILE , NULL },
486 { CONF_LOGDIR , CONFTYPE_STRING , read_string , CNF_LOGDIR , NULL },
487 { CONF_INDEXDIR , CONFTYPE_STRING , read_string , CNF_INDEXDIR , NULL },
488 { CONF_TAPETYPE , CONFTYPE_IDENT , read_ident , CNF_TAPETYPE , NULL },
489 { CONF_DUMPCYCLE , CONFTYPE_INT , read_int , CNF_DUMPCYCLE , validate_positive0 },
490 { CONF_RUNSPERCYCLE , CONFTYPE_INT , read_int , CNF_RUNSPERCYCLE , validate_runspercycle },
491 { CONF_RUNTAPES , CONFTYPE_INT , read_int , CNF_RUNTAPES , validate_positive0 },
492 { CONF_TAPECYCLE , CONFTYPE_INT , read_int , CNF_TAPECYCLE , validate_positive1 },
493 { CONF_BUMPDAYS , CONFTYPE_INT , read_int , CNF_BUMPDAYS , validate_positive1 },
494 { CONF_BUMPSIZE , CONFTYPE_AM64 , read_am64 , CNF_BUMPSIZE , validate_positive1 },
495 { CONF_BUMPPERCENT , CONFTYPE_INT , read_int , CNF_BUMPPERCENT , validate_bumppercent },
496 { CONF_BUMPMULT , CONFTYPE_REAL , read_real , CNF_BUMPMULT , validate_bumpmult },
497 { CONF_NETUSAGE , CONFTYPE_INT , read_int , CNF_NETUSAGE , validate_positive1 },
498 { CONF_INPARALLEL , CONFTYPE_INT , read_int , CNF_INPARALLEL , validate_inparallel },
499 { CONF_DUMPORDER , CONFTYPE_STRING , read_string , CNF_DUMPORDER , NULL },
500 { CONF_MAXDUMPS , CONFTYPE_INT , read_int , CNF_MAXDUMPS , validate_positive1 },
501 { CONF_ETIMEOUT , CONFTYPE_INT , read_int , CNF_ETIMEOUT , NULL },
502 { CONF_DTIMEOUT , CONFTYPE_INT , read_int , CNF_DTIMEOUT , validate_positive1 },
503 { CONF_CTIMEOUT , CONFTYPE_INT , read_int , CNF_CTIMEOUT , validate_positive1 },
504 { CONF_TAPEBUFS , CONFTYPE_INT , read_int , CNF_TAPEBUFS , validate_positive1 },
505 { CONF_RAWTAPEDEV , CONFTYPE_STRING , read_string , CNF_RAWTAPEDEV , NULL },
506 { CONF_COLUMNSPEC , CONFTYPE_STRING , read_string , CNF_COLUMNSPEC , NULL },
507 { CONF_TAPERALGO , CONFTYPE_TAPERALGO, get_taperalgo, CNF_TAPERALGO , NULL },
508 { CONF_DISPLAYUNIT , CONFTYPE_STRING , read_string , CNF_DISPLAYUNIT , validate_displayunit },
509 { CONF_AUTOFLUSH , CONFTYPE_BOOL , read_bool , CNF_AUTOFLUSH , NULL },
510 { CONF_RESERVE , CONFTYPE_INT , read_int , CNF_RESERVE , validate_reserve },
511 { CONF_MAXDUMPSIZE , CONFTYPE_AM64 , read_am64 , CNF_MAXDUMPSIZE , NULL },
512 { CONF_KRB5KEYTAB , CONFTYPE_STRING , read_string , CNF_KRB5KEYTAB , NULL },
513 { CONF_KRB5PRINCIPAL , CONFTYPE_STRING , read_string , CNF_KRB5PRINCIPAL , NULL },
514 { CONF_LABEL_NEW_TAPES , CONFTYPE_STRING , read_string , CNF_LABEL_NEW_TAPES , NULL },
515 { CONF_USETIMESTAMPS , CONFTYPE_BOOL , read_bool , CNF_USETIMESTAMPS , NULL },
516 { CONF_AMRECOVER_DO_FSF , CONFTYPE_BOOL , read_bool , CNF_AMRECOVER_DO_FSF , NULL },
517 { CONF_AMRECOVER_CHANGER , CONFTYPE_STRING , read_string , CNF_AMRECOVER_CHANGER , NULL },
518 { CONF_AMRECOVER_CHECK_LABEL, CONFTYPE_BOOL , read_bool , CNF_AMRECOVER_CHECK_LABEL, NULL },
519 { CONF_CONNECT_TRIES , CONFTYPE_INT , read_int , CNF_CONNECT_TRIES , validate_positive1 },
520 { CONF_REP_TRIES , CONFTYPE_INT , read_int , CNF_REP_TRIES , validate_positive1 },
521 { CONF_REQ_TRIES , CONFTYPE_INT , read_int , CNF_REQ_TRIES , validate_positive1 },
522 { CONF_DEBUG_AMANDAD , CONFTYPE_INT , read_int , CNF_DEBUG_AMANDAD , validate_debug },
523 { CONF_DEBUG_AMIDXTAPED , CONFTYPE_INT , read_int , CNF_DEBUG_AMIDXTAPED , validate_debug },
524 { CONF_DEBUG_AMINDEXD , CONFTYPE_INT , read_int , CNF_DEBUG_AMINDEXD , validate_debug },
525 { CONF_DEBUG_AMRECOVER , CONFTYPE_INT , read_int , CNF_DEBUG_AMRECOVER , validate_debug },
526 { CONF_DEBUG_AUTH , CONFTYPE_INT , read_int , CNF_DEBUG_AUTH , validate_debug },
527 { CONF_DEBUG_EVENT , CONFTYPE_INT , read_int , CNF_DEBUG_EVENT , validate_debug },
528 { CONF_DEBUG_HOLDING , CONFTYPE_INT , read_int , CNF_DEBUG_HOLDING , validate_debug },
529 { CONF_DEBUG_PROTOCOL , CONFTYPE_INT , read_int , CNF_DEBUG_PROTOCOL , validate_debug },
530 { CONF_DEBUG_PLANNER , CONFTYPE_INT , read_int , CNF_DEBUG_PLANNER , validate_debug },
531 { CONF_DEBUG_DRIVER , CONFTYPE_INT , read_int , CNF_DEBUG_DRIVER , validate_debug },
532 { CONF_DEBUG_DUMPER , CONFTYPE_INT , read_int , CNF_DEBUG_DUMPER , validate_debug },
533 { CONF_DEBUG_CHUNKER , CONFTYPE_INT , read_int , CNF_DEBUG_CHUNKER , validate_debug },
534 { CONF_DEBUG_TAPER , CONFTYPE_INT , read_int , CNF_DEBUG_TAPER , validate_debug },
535 { CONF_DEBUG_SELFCHECK , CONFTYPE_INT , read_int , CNF_DEBUG_SELFCHECK , validate_debug },
536 { CONF_DEBUG_SENDSIZE , CONFTYPE_INT , read_int , CNF_DEBUG_SENDSIZE , validate_debug },
537 { CONF_DEBUG_SENDBACKUP , CONFTYPE_INT , read_int , CNF_DEBUG_SENDBACKUP , validate_debug },
538 { CONF_RESERVED_UDP_PORT , CONFTYPE_INTRANGE , read_intrange, CNF_RESERVED_UDP_PORT , validate_reserved_port_range },
539 { CONF_RESERVED_TCP_PORT , CONFTYPE_INTRANGE , read_intrange, CNF_RESERVED_TCP_PORT , validate_reserved_port_range },
540 { CONF_UNRESERVED_TCP_PORT , CONFTYPE_INTRANGE , read_intrange, CNF_UNRESERVED_TCP_PORT , validate_unreserved_port_range },
541 { CONF_UNKNOWN , CONFTYPE_INT , NULL , CNF_CNF , NULL }
544 t_conf_var tapetype_var [] = {
545 { CONF_COMMENT , CONFTYPE_STRING, read_string, TAPETYPE_COMMENT , NULL },
546 { CONF_LBL_TEMPL , CONFTYPE_STRING, read_string, TAPETYPE_LBL_TEMPL , NULL },
547 { CONF_BLOCKSIZE , CONFTYPE_SIZE , read_size , TAPETYPE_BLOCKSIZE , validate_blocksize },
548 { CONF_READBLOCKSIZE, CONFTYPE_SIZE , read_size , TAPETYPE_READBLOCKSIZE, validate_blocksize },
549 { CONF_LENGTH , CONFTYPE_AM64 , read_am64 , TAPETYPE_LENGTH , validate_positive0 },
550 { CONF_FILEMARK , CONFTYPE_AM64 , read_am64 , TAPETYPE_FILEMARK , NULL },
551 { CONF_SPEED , CONFTYPE_INT , read_int , TAPETYPE_SPEED , validate_positive0 },
552 { CONF_FILE_PAD , CONFTYPE_BOOL , read_bool , TAPETYPE_FILE_PAD , NULL },
553 { CONF_UNKNOWN , CONFTYPE_INT , NULL , TAPETYPE_TAPETYPE , NULL }
556 t_conf_var dumptype_var [] = {
557 { CONF_COMMENT , CONFTYPE_STRING , read_string , DUMPTYPE_COMMENT , NULL },
558 { CONF_AUTH , CONFTYPE_STRING , read_string , DUMPTYPE_SECURITY_DRIVER , NULL },
559 { CONF_BUMPDAYS , CONFTYPE_INT , read_int , DUMPTYPE_BUMPDAYS , NULL },
560 { CONF_BUMPMULT , CONFTYPE_REAL , read_real , DUMPTYPE_BUMPMULT , NULL },
561 { CONF_BUMPSIZE , CONFTYPE_AM64 , read_am64 , DUMPTYPE_BUMPSIZE , NULL },
562 { CONF_BUMPPERCENT , CONFTYPE_INT , read_int , DUMPTYPE_BUMPPERCENT , NULL },
563 { CONF_COMPRATE , CONFTYPE_REAL , get_comprate, DUMPTYPE_COMPRATE , NULL },
564 { CONF_COMPRESS , CONFTYPE_INT , get_compress, DUMPTYPE_COMPRESS , NULL },
565 { CONF_ENCRYPT , CONFTYPE_INT , get_encrypt , DUMPTYPE_ENCRYPT , NULL },
566 { CONF_DUMPCYCLE , CONFTYPE_INT , read_int , DUMPTYPE_DUMPCYCLE , validate_positive0 },
567 { CONF_EXCLUDE , CONFTYPE_EXINCLUDE, get_exclude , DUMPTYPE_EXCLUDE , NULL },
568 { CONF_INCLUDE , CONFTYPE_EXINCLUDE, get_exclude , DUMPTYPE_INCLUDE , NULL },
569 { CONF_IGNORE , CONFTYPE_BOOL , read_bool , DUMPTYPE_IGNORE , NULL },
570 { CONF_HOLDING , CONFTYPE_HOLDING , get_holding , DUMPTYPE_HOLDINGDISK , NULL },
571 { CONF_INDEX , CONFTYPE_BOOL , read_bool , DUMPTYPE_INDEX , NULL },
572 { CONF_KENCRYPT , CONFTYPE_BOOL , read_bool , DUMPTYPE_KENCRYPT , NULL },
573 { CONF_MAXDUMPS , CONFTYPE_INT , read_int , DUMPTYPE_MAXDUMPS , validate_positive1 },
574 { CONF_MAXPROMOTEDAY , CONFTYPE_INT , read_int , DUMPTYPE_MAXPROMOTEDAY , validate_positive0 },
575 { CONF_PRIORITY , CONFTYPE_PRIORITY , get_priority, DUMPTYPE_PRIORITY , NULL },
576 { CONF_PROGRAM , CONFTYPE_STRING , read_string , DUMPTYPE_PROGRAM , NULL },
577 { CONF_RECORD , CONFTYPE_BOOL , read_bool , DUMPTYPE_RECORD , NULL },
578 { CONF_SKIP_FULL , CONFTYPE_BOOL , read_bool , DUMPTYPE_SKIP_FULL , NULL },
579 { CONF_SKIP_INCR , CONFTYPE_BOOL , read_bool , DUMPTYPE_SKIP_INCR , NULL },
580 { CONF_STARTTIME , CONFTYPE_TIME , read_time , DUMPTYPE_STARTTIME , NULL },
581 { CONF_STRATEGY , CONFTYPE_INT , get_strategy, DUMPTYPE_STRATEGY , NULL },
582 { CONF_TAPE_SPLITSIZE , CONFTYPE_AM64 , read_am64 , DUMPTYPE_TAPE_SPLITSIZE , validate_positive0 },
583 { CONF_SPLIT_DISKBUFFER , CONFTYPE_STRING , read_string , DUMPTYPE_SPLIT_DISKBUFFER , NULL },
584 { CONF_ESTIMATE , CONFTYPE_INT , get_estimate, DUMPTYPE_ESTIMATE , NULL },
585 { CONF_SRV_ENCRYPT , CONFTYPE_STRING , read_string , DUMPTYPE_SRV_ENCRYPT , NULL },
586 { CONF_CLNT_ENCRYPT , CONFTYPE_STRING , read_string , DUMPTYPE_CLNT_ENCRYPT , NULL },
587 { CONF_AMANDAD_PATH , CONFTYPE_STRING , read_string , DUMPTYPE_AMANDAD_PATH , NULL },
588 { CONF_CLIENT_USERNAME , CONFTYPE_STRING , read_string , DUMPTYPE_CLIENT_USERNAME , NULL },
589 { CONF_SSH_KEYS , CONFTYPE_STRING , read_string , DUMPTYPE_SSH_KEYS , NULL },
590 { CONF_SRVCOMPPROG , CONFTYPE_STRING , read_string , DUMPTYPE_SRVCOMPPROG , NULL },
591 { CONF_CLNTCOMPPROG , CONFTYPE_STRING , read_string , DUMPTYPE_CLNTCOMPPROG , NULL },
592 { CONF_FALLBACK_SPLITSIZE, CONFTYPE_AM64 , read_am64 , DUMPTYPE_FALLBACK_SPLITSIZE, NULL },
593 { CONF_SRV_DECRYPT_OPT , CONFTYPE_STRING , read_string , DUMPTYPE_SRV_DECRYPT_OPT , NULL },
594 { CONF_CLNT_DECRYPT_OPT , CONFTYPE_STRING , read_string , DUMPTYPE_CLNT_DECRYPT_OPT , NULL },
595 { CONF_UNKNOWN , CONFTYPE_INT , NULL , DUMPTYPE_DUMPTYPE , NULL }
598 t_conf_var holding_var [] = {
599 { CONF_DIRECTORY, CONFTYPE_STRING, read_string, HOLDING_DISKDIR , NULL },
600 { CONF_COMMENT , CONFTYPE_STRING, read_string, HOLDING_COMMENT , NULL },
601 { CONF_USE , CONFTYPE_AM64 , read_am64 , HOLDING_DISKSIZE , validate_use },
602 { CONF_CHUNKSIZE, CONFTYPE_AM64 , read_am64 , HOLDING_CHUNKSIZE, validate_chunksize },
603 { CONF_UNKNOWN , CONFTYPE_INT , NULL , HOLDING_HOLDING , NULL }
607 ** ------------------------
608 ** External entry points
609 ** ------------------------
618 my_keytab = server_keytab;
622 /* We assume that conf_confname & conf are initialized to NULL above */
623 read_conffile_recursively(filename);
625 /* overwrite with command line option */
626 command_overwrite(program_options, my_var, my_keytab, conf_data,
629 if(got_parserror != -1 ) {
630 if(lookup_tapetype(conf_data[CNF_TAPETYPE].v.s) == NULL) {
631 char *save_confname = conf_confname;
633 conf_confname = filename;
634 if(!conf_data[CNF_TAPETYPE].seen)
635 conf_parserror("default tapetype %s not defined", conf_data[CNF_TAPETYPE].v.s);
637 conf_line_num = conf_data[CNF_TAPETYPE].seen;
638 conf_parserror("tapetype %s not defined", conf_data[CNF_TAPETYPE].v.s);
640 conf_confname = save_confname;
644 ip = alloc(SIZEOF(interface_t));
645 ip->name = stralloc("default");
646 ip->seen = conf_data[CNF_NETUSAGE].seen;
647 conf_init_string(&ip->value[INTER_COMMENT], "implicit from NETUSAGE");
648 conf_init_int(&ip->value[INTER_MAXUSAGE], conf_data[CNF_NETUSAGE].v.i);
650 ip->next = interface_list;
653 debug_amandad = getconf_int(CNF_DEBUG_AMANDAD);
654 debug_amidxtaped = getconf_int(CNF_DEBUG_AMIDXTAPED);
655 debug_amindexd = getconf_int(CNF_DEBUG_AMINDEXD);
656 debug_amrecover = getconf_int(CNF_DEBUG_AMRECOVER);
657 debug_auth = getconf_int(CNF_DEBUG_AUTH);
658 debug_event = getconf_int(CNF_DEBUG_EVENT);
659 debug_holding = getconf_int(CNF_DEBUG_HOLDING);
660 debug_protocol = getconf_int(CNF_DEBUG_PROTOCOL);
661 debug_planner = getconf_int(CNF_DEBUG_PLANNER);
662 debug_driver = getconf_int(CNF_DEBUG_DRIVER);
663 debug_dumper = getconf_int(CNF_DEBUG_DUMPER);
664 debug_chunker = getconf_int(CNF_DEBUG_CHUNKER);
665 debug_taper = getconf_int(CNF_DEBUG_TAPER);
666 debug_selfcheck = getconf_int(CNF_DEBUG_SELFCHECK);
667 debug_sendsize = getconf_int(CNF_DEBUG_SENDSIZE);
668 debug_sendbackup = getconf_int(CNF_DEBUG_SENDBACKUP);
670 return got_parserror;
675 struct s_conf_var *np,
681 conf_parserror("%s must be positive", get_token_name(np->token));
685 conf_parserror("%s must be positive", get_token_name(np->token));
689 conf_parserror("%s must be positive", get_token_name(np->token));
692 conf_parserror("validate_positive0 invalid type %d\n", val->type);
698 struct s_conf_var *np,
704 conf_parserror("%s must be positive", get_token_name(np->token));
708 conf_parserror("%s must be positive", get_token_name(np->token));
712 conf_parserror("%s must be positive", get_token_name(np->token));
716 conf_parserror("%s must be positive", get_token_name(np->token));
719 conf_parserror("validate_positive1 invalid type %d\n", val->type);
724 validate_runspercycle(
725 struct s_conf_var *np,
730 conf_parserror("runspercycle must be >= -1");
734 validate_bumppercent(
735 struct s_conf_var *np,
739 if(val->v.i < 0 || val->v.i > 100)
740 conf_parserror("bumppercent must be between 0 and 100");
745 struct s_conf_var *np,
749 if(val->v.i < 1 || val->v.i >MAX_DUMPERS)
750 conf_parserror("inparallel must be between 1 and MAX_DUMPERS (%d)",
756 struct s_conf_var *np,
760 if(val->v.r < 0.999) {
761 conf_parserror("bumpmult must be positive");
766 validate_displayunit(
767 struct s_conf_var *np,
771 if(strcmp(val->v.s, "k") == 0 ||
772 strcmp(val->v.s, "K") == 0) {
773 val->v.s[0] = (char)toupper(val->v.s[0]);
776 else if(strcmp(val->v.s, "m") == 0 ||
777 strcmp(val->v.s, "M") == 0) {
778 val->v.s[0] = (char)toupper(val->v.s[0]);
781 else if(strcmp(val->v.s, "g") == 0 ||
782 strcmp(val->v.s, "G") == 0) {
783 val->v.s[0] = (char)toupper(val->v.s[0]);
784 unit_divisor=1024*1024;
786 else if(strcmp(val->v.s, "t") == 0 ||
787 strcmp(val->v.s, "T") == 0) {
788 val->v.s[0] = (char)toupper(val->v.s[0]);
789 unit_divisor=1024*1024*1024;
792 conf_parserror("displayunit must be k,m,g or t.");
798 struct s_conf_var *np,
802 if(val->v.i < 0 || val->v.i > 100)
803 conf_parserror("reserve must be between 0 and 100");
808 struct s_conf_var *np,
812 val->v.am64 = am_floor(val->v.am64, DISK_BLOCK_KB);
817 struct s_conf_var *np,
821 if(val->v.am64 == 0) {
822 val->v.am64 = ((AM64_MAX / 1024) - (2 * DISK_BLOCK_KB));
824 else if(val->v.am64 < 0) {
825 conf_parserror("Negative chunksize (" OFF_T_FMT
826 ") is no longer supported", val->v.am64);
828 val->v.am64 = am_floor(val->v.am64, (off_t)DISK_BLOCK_KB);
829 if (val->v.am64 < 2*DISK_BLOCK_KB) {
830 conf_parserror("chunksize must be at least %dkb", 2*DISK_BLOCK_KB);
836 struct s_conf_var *np,
840 if(val->v.l < DISK_BLOCK_KB) {
841 conf_parserror("Tape blocksize must be at least %d KBytes",
843 } else if(val->v.l > MAX_TAPE_BLOCK_KB) {
844 conf_parserror("Tape blocksize must not be larger than %d KBytes",
851 struct s_conf_var *np,
855 if(val->v.i < 0 || val->v.i > 9) {
856 conf_parserror("Debug must be between 0 and 9");
861 validate_reserved_port_range(
862 struct s_conf_var *np,
866 if(val->v.intrange[0] < 1 || val->v.intrange[0] > IPPORT_RESERVED-1) {
867 conf_parserror("portrange must be between 1 and %d", IPPORT_RESERVED-1);
868 } else if(val->v.intrange[1] < 1 || val->v.intrange[1] > IPPORT_RESERVED-1) {
869 conf_parserror("portrange must be between 1 and IPPORT_RESERVED-1");
874 validate_unreserved_port_range(
875 struct s_conf_var *np,
879 if(val->v.intrange[0] < IPPORT_RESERVED+1 || val->v.intrange[0] > 65536) {
880 conf_parserror("portrange must be between %d and 65536", IPPORT_RESERVED+1);
881 } else if(val->v.intrange[1] < IPPORT_RESERVED+1 || val->v.intrange[1] > 65536) {
882 conf_parserror("portrange must be between %d and 65536", IPPORT_RESERVED+1);
902 tmpstr = stralloc(str);
904 while((ch = *s++) != '\0') {
906 s[-1] = (char)toupper(ch);
909 first_delim = strchr(tmpstr, ':');
913 second_delim = strchr(first_delim,':');
918 *second_delim = '\0';
921 for(kt = my_keytab; kt->token != CONF_UNKNOWN; kt++) {
922 if(kt->keyword && strcmp(kt->keyword, second_delim) == 0)
926 if(kt->token == CONF_UNKNOWN)
929 if (strcmp(tmpstr, "TAPETYPE") == 0) {
930 tp = lookup_tapetype(first_delim);
935 for(np = tapetype_var; np->token != CONF_UNKNOWN; np++) {
936 if(np->token == kt->token)
939 if (np->token == CONF_UNKNOWN) return NULL;
940 tmpstr = stralloc(conf_print(&tp->value[np->parm], 0, ""));
941 } else if (strcmp(tmpstr, "DUMPTYPE") == 0) {
942 dp = lookup_dumptype(first_delim);
947 for(np = dumptype_var; np->token != CONF_UNKNOWN; np++) {
948 if(np->token == kt->token)
951 if (np->token == CONF_UNKNOWN) return NULL;
952 tmpstr = stralloc(conf_print(&dp->value[np->parm], 0, ""));
953 } else if (strcmp(tmpstr, "HOLDINGDISK") == 0) {
954 hp = lookup_holdingdisk(first_delim);
959 for(np = holding_var; np->token != CONF_UNKNOWN; np++) {
960 if(np->token == kt->token)
963 if (np->token == CONF_UNKNOWN) return NULL;
964 tmpstr = stralloc(conf_print(&hp->value[np->parm], 0, ""));
965 } else if (strcmp(tmpstr, "INTERFACE") == 0) {
966 ip = lookup_interface(first_delim);
971 for(np = holding_var; np->token != CONF_UNKNOWN; np++) {
972 if(np->token == kt->token)
975 if (np->token == CONF_UNKNOWN) return NULL;
976 tmpstr = stralloc(conf_print(&ip->value[np->parm], 0, ""));
982 for(kt = my_keytab; kt->token != CONF_UNKNOWN; kt++) {
983 if(kt->keyword && strcmp(kt->keyword, tmpstr) == 0)
987 if(kt->token == CONF_UNKNOWN)
990 for(np = my_var; np->token != CONF_UNKNOWN; np++) {
991 if(np->token == kt->token)
995 if(np->token == CONF_UNKNOWN) return NULL;
997 tmpstr = stralloc(conf_print(&conf_data[np->parm], 0, ""));
1008 char *result = NULL;
1014 if (strcasecmp(listname,"tapetype") == 0) {
1015 result = stralloc("");
1016 for(tp = tapelist; tp != NULL; tp=tp->next) {
1017 result = vstrextend(&result, tp->name, "\n", NULL);
1019 } else if (strcasecmp(listname,"dumptype") == 0) {
1020 result = stralloc("");
1021 for(dp = dumplist; dp != NULL; dp=dp->next) {
1022 result = vstrextend(&result, dp->name, "\n", NULL);
1024 } else if (strcasecmp(listname,"holdingdisk") == 0) {
1025 result = stralloc("");
1026 for(hp = holdingdisks; hp != NULL; hp=hp->next) {
1027 result = vstrextend(&result, hp->name, "\n", NULL);
1029 } else if (strcasecmp(listname,"interface") == 0) {
1030 result = stralloc("");
1031 for(ip = interface_list; ip != NULL; ip=ip->next) {
1032 result = vstrextend(&result, ip->name, "\n", NULL);
1043 return(conf_data[parm].seen);
1050 if (conf_data[parm].type != CONFTYPE_BOOL) {
1051 error("getconf_boolean: parm is not a CONFTYPE_BOOL");
1054 return(conf_data[parm].v.i != 0);
1061 if (conf_data[parm].type != CONFTYPE_INT) {
1062 error("getconf_int: parm is not a CONFTYPE_INT");
1065 return(conf_data[parm].v.i);
1072 if (conf_data[parm].type != CONFTYPE_LONG) {
1073 error("getconf_long: parm is not a CONFTYPE_LONG");
1076 return(conf_data[parm].v.l);
1083 if (conf_data[parm].type != CONFTYPE_TIME) {
1084 error("getconf_time: parm is not a CONFTYPE_TIME");
1087 return(conf_data[parm].v.t);
1094 if (conf_data[parm].type != CONFTYPE_SIZE) {
1095 error("getconf_size: parm is not a CONFTYPE_SIZE");
1098 return(conf_data[parm].v.size);
1105 if (conf_data[parm].type != CONFTYPE_AM64) {
1106 error("getconf_am64: parm is not a CONFTYPE_AM64");
1109 return(conf_data[parm].v.am64);
1116 if (conf_data[parm].type != CONFTYPE_REAL) {
1117 error("getconf_real: parm is not a CONFTYPE_REAL");
1120 return(conf_data[parm].v.r);
1127 if (conf_data[parm].type != CONFTYPE_STRING &&
1128 conf_data[parm].type != CONFTYPE_IDENT) {
1129 error("getconf_str: parm is not a CONFTYPE_STRING|CONFTYPE_IDENT: %d", parm);
1132 return(conf_data[parm].v.s);
1139 if (conf_data[parm].type != CONFTYPE_TAPERALGO) {
1140 error("getconf_taperalgo: parm is not a CONFTYPE_TAPERALGO");
1143 return(conf_data[parm].v.i);
1150 if (conf_data[parm].type != CONFTYPE_INTRANGE) {
1151 error("getconf_intrange: parm is not a CONFTYPE_INTRANGE");
1154 return(conf_data[parm].v.intrange);
1158 getconf_holdingdisks(
1161 return holdingdisks;
1170 for(p = dumplist; p != NULL; p = p->next) {
1171 if(strcasecmp(p->name, str) == 0) return p;
1182 for(p = tapelist; p != NULL; p = p->next) {
1183 if(strcasecmp(p->name, str) == 0) return p;
1194 for(p = holdingdisks; p != NULL; p = p->next) {
1195 if(strcasecmp(p->name, str) == 0) return p;
1209 return interface_list;
1212 for (p = interface_list; p != NULL; p = p->next) {
1213 if (strcasecmp(p->name, str) == 0)
1222 ** ------------------------
1223 ** Internal routines
1224 ** ------------------------
1234 /* defaults for exported variables */
1236 #ifdef DEFAULT_CONFIG
1241 #ifdef DEFAULT_CONFIG
1246 conf_init_string(&conf_data[CNF_CONF], s);
1247 #ifdef DEFAULT_SERVER
1252 conf_init_string(&conf_data[CNF_INDEX_SERVER], s);
1255 #ifdef DEFAULT_TAPE_SERVER
1256 s = DEFAULT_TAPE_SERVER;
1258 #ifdef DEFAULT_SERVER
1264 conf_init_string(&conf_data[CNF_TAPE_SERVER], s);
1265 conf_init_string(&conf_data[CNF_AUTH], "bsd");
1266 conf_init_string(&conf_data[CNF_SSH_KEYS], "");
1267 conf_init_string(&conf_data[CNF_AMANDAD_PATH], "");
1268 conf_init_string(&conf_data[CNF_CLIENT_USERNAME], "");
1269 #ifdef GNUTAR_LISTED_INCREMENTAL_DIR
1270 conf_init_string(&conf_data[CNF_GNUTAR_LIST_DIR],
1271 GNUTAR_LISTED_INCREMENTAL_DIR);
1273 conf_init_string(&conf_data[CNF_GNUTAR_LIST_DIR], NULL);
1275 conf_init_string(&conf_data[CNF_AMANDATES], AMANDATES_FILE);
1276 conf_init_string(&conf_data[CNF_KRB5KEYTAB], "/.amanda-v5-keytab");
1277 conf_init_string(&conf_data[CNF_KRB5PRINCIPAL], "service/amanda");
1279 conf_init_string(&conf_data[CNF_ORG], s);
1280 conf_init_string(&conf_data[CNF_MAILTO], "operators");
1281 conf_init_string(&conf_data[CNF_DUMPUSER], CLIENT_LOGIN);
1282 #ifdef DEFAULT_TAPE_DEVICE
1283 s = DEFAULT_TAPE_DEVICE;
1287 conf_init_string(&conf_data[CNF_TAPEDEV], s);
1288 #ifdef DEFAULT_CHANGER_DEVICE
1289 s = DEFAULT_CHANGER_DEVICE;
1293 conf_init_string(&conf_data[CNF_CHNGRDEV], s);
1294 conf_init_string(&conf_data[CNF_CHNGRFILE], "/usr/adm/amanda/changer-status");
1295 #ifdef DEFAULT_RAW_TAPE_DEVICE
1296 s = DEFAULT_RAW_TAPE_DEVICE;
1300 conf_init_string (&conf_data[CNF_LABELSTR] , ".*");
1301 conf_init_string (&conf_data[CNF_TAPELIST] , "tapelist");
1302 conf_init_string (&conf_data[CNF_DISKFILE] , "disklist");
1303 conf_init_string (&conf_data[CNF_INFOFILE] , "/usr/adm/amanda/curinfo");
1304 conf_init_string (&conf_data[CNF_LOGDIR] , "/usr/adm/amanda");
1305 conf_init_string (&conf_data[CNF_INDEXDIR] , "/usr/adm/amanda/index");
1306 conf_init_ident (&conf_data[CNF_TAPETYPE] , "EXABYTE");
1307 conf_init_int (&conf_data[CNF_DUMPCYCLE] , 10);
1308 conf_init_int (&conf_data[CNF_RUNSPERCYCLE] , 0);
1309 conf_init_int (&conf_data[CNF_TAPECYCLE] , 15);
1310 conf_init_int (&conf_data[CNF_NETUSAGE] , 300);
1311 conf_init_int (&conf_data[CNF_INPARALLEL] , 10);
1312 conf_init_string (&conf_data[CNF_DUMPORDER] , "ttt");
1313 conf_init_int (&conf_data[CNF_BUMPPERCENT] , 0);
1314 conf_init_am64 (&conf_data[CNF_BUMPSIZE] , (off_t)10*1024);
1315 conf_init_real (&conf_data[CNF_BUMPMULT] , 1.5);
1316 conf_init_int (&conf_data[CNF_BUMPDAYS] , 2);
1317 conf_init_string (&conf_data[CNF_TPCHANGER] , "");
1318 conf_init_int (&conf_data[CNF_RUNTAPES] , 1);
1319 conf_init_int (&conf_data[CNF_MAXDUMPS] , 1);
1320 conf_init_int (&conf_data[CNF_ETIMEOUT] , 300);
1321 conf_init_int (&conf_data[CNF_DTIMEOUT] , 1800);
1322 conf_init_int (&conf_data[CNF_CTIMEOUT] , 30);
1323 conf_init_int (&conf_data[CNF_TAPEBUFS] , 20);
1324 conf_init_string (&conf_data[CNF_RAWTAPEDEV] , s);
1325 conf_init_string (&conf_data[CNF_PRINTER] , "");
1326 conf_init_bool (&conf_data[CNF_AUTOFLUSH] , 0);
1327 conf_init_int (&conf_data[CNF_RESERVE] , 100);
1328 conf_init_am64 (&conf_data[CNF_MAXDUMPSIZE] , (off_t)-1);
1329 conf_init_string (&conf_data[CNF_COLUMNSPEC] , "");
1330 conf_init_bool (&conf_data[CNF_AMRECOVER_DO_FSF] , 1);
1331 conf_init_string (&conf_data[CNF_AMRECOVER_CHANGER] , "");
1332 conf_init_bool (&conf_data[CNF_AMRECOVER_CHECK_LABEL], 1);
1333 conf_init_taperalgo(&conf_data[CNF_TAPERALGO] , 0);
1334 conf_init_string (&conf_data[CNF_DISPLAYUNIT] , "k");
1335 conf_init_string (&conf_data[CNF_KRB5KEYTAB] , "/.amanda-v5-keytab");
1336 conf_init_string (&conf_data[CNF_KRB5PRINCIPAL] , "service/amanda");
1337 conf_init_string (&conf_data[CNF_LABEL_NEW_TAPES] , "");
1338 conf_init_bool (&conf_data[CNF_USETIMESTAMPS] , 0);
1339 conf_init_int (&conf_data[CNF_CONNECT_TRIES] , 3);
1340 conf_init_int (&conf_data[CNF_REP_TRIES] , 5);
1341 conf_init_int (&conf_data[CNF_REQ_TRIES] , 3);
1342 conf_init_int (&conf_data[CNF_DEBUG_AMANDAD] , 0);
1343 conf_init_int (&conf_data[CNF_DEBUG_AMIDXTAPED] , 0);
1344 conf_init_int (&conf_data[CNF_DEBUG_AMINDEXD] , 0);
1345 conf_init_int (&conf_data[CNF_DEBUG_AMRECOVER] , 0);
1346 conf_init_int (&conf_data[CNF_DEBUG_AUTH] , 0);
1347 conf_init_int (&conf_data[CNF_DEBUG_EVENT] , 0);
1348 conf_init_int (&conf_data[CNF_DEBUG_HOLDING] , 0);
1349 conf_init_int (&conf_data[CNF_DEBUG_PROTOCOL] , 0);
1350 conf_init_int (&conf_data[CNF_DEBUG_PLANNER] , 0);
1351 conf_init_int (&conf_data[CNF_DEBUG_DRIVER] , 0);
1352 conf_init_int (&conf_data[CNF_DEBUG_DUMPER] , 0);
1353 conf_init_int (&conf_data[CNF_DEBUG_CHUNKER] , 0);
1354 conf_init_int (&conf_data[CNF_DEBUG_TAPER] , 0);
1355 conf_init_int (&conf_data[CNF_DEBUG_SELFCHECK] , 0);
1356 conf_init_int (&conf_data[CNF_DEBUG_SENDSIZE] , 0);
1357 conf_init_int (&conf_data[CNF_DEBUG_SENDBACKUP] , 0);
1359 conf_init_intrange (&conf_data[CNF_RESERVED_UDP_PORT] , UDPPORTRANGE);
1361 conf_init_intrange (&conf_data[CNF_RESERVED_UDP_PORT] , 512, 1023);
1363 #ifdef LOW_TCPPORTRANGE
1364 conf_init_intrange (&conf_data[CNF_RESERVED_TCP_PORT] , LOW_TCPPORTRANGE);
1366 conf_init_intrange (&conf_data[CNF_RESERVED_TCP_PORT] , 512, 1023);
1369 conf_init_intrange (&conf_data[CNF_UNRESERVED_TCP_PORT] , TCPPORTRANGE);
1371 conf_init_intrange (&conf_data[CNF_UNRESERVED_TCP_PORT] , 0, 0);
1374 /* defaults for internal variables */
1376 conf_line_num = got_parserror = 0;
1377 allow_overwrites = 0;
1380 while(holdingdisks != NULL) {
1384 holdingdisks = holdingdisks->next;
1387 num_holdingdisks = 0;
1389 /* free any previously declared dump, tape and interface types */
1391 while(dumplist != NULL) {
1395 dumplist = dumplist->next;
1398 while(tapelist != NULL) {
1402 tapelist = tapelist->next;
1405 while(interface_list != NULL) {
1408 ip = interface_list;
1409 interface_list = interface_list->next;
1413 /* create some predefined dumptypes for backwards compatability */
1414 init_dumptype_defaults();
1415 dpcur.name = stralloc("NO-COMPRESS");
1417 conf_set_compress(&dpcur.value[DUMPTYPE_COMPRESS], COMP_NONE);
1420 init_dumptype_defaults();
1421 dpcur.name = stralloc("COMPRESS-FAST");
1423 conf_set_compress(&dpcur.value[DUMPTYPE_COMPRESS], COMP_FAST);
1426 init_dumptype_defaults();
1427 dpcur.name = stralloc("COMPRESS-BEST");
1429 conf_set_compress(&dpcur.value[DUMPTYPE_COMPRESS], COMP_BEST);
1432 init_dumptype_defaults();
1433 dpcur.name = stralloc("COMPRESS-CUST");
1435 conf_set_compress(&dpcur.value[DUMPTYPE_COMPRESS], COMP_CUST);
1438 init_dumptype_defaults();
1439 dpcur.name = stralloc("SRVCOMPRESS");
1441 conf_set_compress(&dpcur.value[DUMPTYPE_COMPRESS], COMP_SERVER_FAST);
1444 init_dumptype_defaults();
1445 dpcur.name = stralloc("BSD-AUTH");
1447 conf_set_string(&dpcur.value[DUMPTYPE_SECURITY_DRIVER], "BSD");
1450 init_dumptype_defaults();
1451 dpcur.name = stralloc("KRB4-AUTH");
1453 conf_set_string(&dpcur.value[DUMPTYPE_SECURITY_DRIVER], "KRB4");
1456 init_dumptype_defaults();
1457 dpcur.name = stralloc("NO-RECORD");
1459 conf_set_bool(&dpcur.value[DUMPTYPE_RECORD], 0);
1462 init_dumptype_defaults();
1463 dpcur.name = stralloc("NO-HOLD");
1465 conf_set_holding(&dpcur.value[DUMPTYPE_HOLDINGDISK], HOLD_NEVER);
1468 init_dumptype_defaults();
1469 dpcur.name = stralloc("NO-FULL");
1471 conf_set_strategy(&dpcur.value[DUMPTYPE_STRATEGY], DS_NOFULL);
1477 read_conffile_recursively(
1480 /* Save globals used in read_confline(), elsewhere. */
1481 int save_line_num = conf_line_num;
1482 FILE *save_conf = conf_conf;
1483 char *save_confname = conf_confname;
1486 if (*filename == '/' || config_dir == NULL) {
1487 conf_confname = stralloc(filename);
1489 conf_confname = stralloc2(config_dir, filename);
1492 if((conf_conf = fopen(conf_confname, "r")) == NULL) {
1493 fprintf(stderr, "could not open conf file \"%s\": %s\n", conf_confname,
1495 amfree(conf_confname);
1502 /* read_confline() can invoke us recursively via "includefile" */
1504 rc = read_confline();
1508 amfree(conf_confname);
1510 /* Restore servers */
1511 conf_line_num = save_line_num;
1512 conf_conf = save_conf;
1513 conf_confname = save_confname;
1517 /* ------------------------ */
1526 keytable = server_keytab;
1529 get_conftoken(CONF_ANY);
1531 case CONF_INCLUDEFILE:
1536 get_conftoken(CONF_STRING);
1538 if (*fn == '/' || config_dir == NULL) {
1539 cname = stralloc(fn);
1541 cname = stralloc2(config_dir, fn);
1543 if ( cname != NULL && (access(cname, R_OK) == 0)) {
1544 read_conffile_recursively(cname);
1547 conf_parserror("cannot open %s: %s\n", fn, strerror(errno));
1559 get_conftoken(CONF_ANY);
1560 if(tok == CONF_DUMPTYPE) get_dumptype();
1561 else if(tok == CONF_TAPETYPE) get_tapetype();
1562 else if(tok == CONF_INTERFACE) get_interface();
1563 else conf_parserror("DUMPTYPE, INTERFACE or TAPETYPE expected");
1566 case CONF_NL: /* empty line */
1569 case CONF_END: /* end of file */
1574 for(np = server_var; np->token != CONF_UNKNOWN; np++)
1575 if(np->token == tok) break;
1577 if(np->token == CONF_UNKNOWN) {
1578 conf_parserror("configuration keyword expected");
1580 np->read_function(np, &conf_data[np->parm]);
1582 np->validate(np, &conf_data[np->parm]);
1587 get_conftoken(CONF_NL);
1596 int save_overwrites;
1598 save_overwrites = allow_overwrites;
1599 allow_overwrites = 1;
1601 init_holdingdisk_defaults();
1603 get_conftoken(CONF_IDENT);
1604 hdcur.name = stralloc(tokenval.v.s);
1605 hdcur.seen = conf_line_num;
1607 prefix = vstralloc( "HOLDINGDISK:", hdcur.name, ":", NULL);
1608 read_block(program_options, holding_var, server_keytab, hdcur.value, prefix,
1609 "holding disk parameter expected", 1, NULL);
1611 get_conftoken(CONF_NL);
1613 hdcur.disksize = holdingdisk_get_disksize(&hdcur);
1616 allow_overwrites = save_overwrites;
1620 init_holdingdisk_defaults(
1623 conf_init_string(&hdcur.value[HOLDING_COMMENT] , "");
1624 conf_init_string(&hdcur.value[HOLDING_DISKDIR] , "");
1625 conf_init_am64(&hdcur.value[HOLDING_DISKSIZE] , (off_t)0);
1626 /* 1 Gb = 1M counted in 1Kb blocks */
1627 conf_init_am64(&hdcur.value[HOLDING_CHUNKSIZE], (off_t)1024*1024);
1629 hdcur.up = (void *)0;
1630 hdcur.disksize = 0LL;
1639 hp = alloc(sizeof(holdingdisk_t));
1641 hp->next = holdingdisks;
1655 int save_overwrites;
1656 FILE *saved_conf = NULL;
1657 char *saved_fname = NULL;
1661 saved_conf = conf_conf;
1666 saved_fname = conf_confname;
1667 conf_confname = fname;
1671 conf_line_num = *linenum;
1673 save_overwrites = allow_overwrites;
1674 allow_overwrites = 1;
1676 init_dumptype_defaults();
1680 get_conftoken(CONF_IDENT);
1681 dpcur.name = stralloc(tokenval.v.s);
1683 dpcur.seen = conf_line_num;
1685 prefix = vstralloc( "DUMPTYPE:", dpcur.name, ":", NULL);
1686 read_block(program_options, dumptype_var, server_keytab, dpcur.value,
1687 prefix, "dumptype parameter expected",
1688 (name == NULL), *copy_dumptype);
1691 get_conftoken(CONF_NL);
1693 /* XXX - there was a stupidity check in here for skip-incr and
1694 ** skip-full. This check should probably be somewhere else. */
1698 allow_overwrites = save_overwrites;
1701 *linenum = conf_line_num;
1704 conf_confname = saved_fname;
1707 conf_conf = saved_conf;
1709 return lookup_dumptype(dpcur.name);
1715 read_dumptype(NULL, NULL, NULL, NULL);
1719 init_dumptype_defaults(void)
1722 conf_init_string (&dpcur.value[DUMPTYPE_COMMENT] , "");
1723 conf_init_string (&dpcur.value[DUMPTYPE_PROGRAM] , "DUMP");
1724 conf_init_string (&dpcur.value[DUMPTYPE_SRVCOMPPROG] , "");
1725 conf_init_string (&dpcur.value[DUMPTYPE_CLNTCOMPPROG] , "");
1726 conf_init_string (&dpcur.value[DUMPTYPE_SRV_ENCRYPT] , "");
1727 conf_init_string (&dpcur.value[DUMPTYPE_CLNT_ENCRYPT] , "");
1728 conf_init_string (&dpcur.value[DUMPTYPE_AMANDAD_PATH] , "X");
1729 conf_init_string (&dpcur.value[DUMPTYPE_CLIENT_USERNAME] , "X");
1730 conf_init_string (&dpcur.value[DUMPTYPE_SSH_KEYS] , "X");
1731 conf_init_string (&dpcur.value[DUMPTYPE_SECURITY_DRIVER] , "BSD");
1732 conf_init_exinclude(&dpcur.value[DUMPTYPE_EXCLUDE]);
1733 conf_init_exinclude(&dpcur.value[DUMPTYPE_INCLUDE]);
1734 conf_init_priority (&dpcur.value[DUMPTYPE_PRIORITY] , 1);
1735 conf_init_int (&dpcur.value[DUMPTYPE_DUMPCYCLE] , conf_data[CNF_DUMPCYCLE].v.i);
1736 conf_init_int (&dpcur.value[DUMPTYPE_MAXDUMPS] , conf_data[CNF_MAXDUMPS].v.i);
1737 conf_init_int (&dpcur.value[DUMPTYPE_MAXPROMOTEDAY] , 10000);
1738 conf_init_int (&dpcur.value[DUMPTYPE_BUMPPERCENT] , conf_data[CNF_BUMPPERCENT].v.i);
1739 conf_init_am64 (&dpcur.value[DUMPTYPE_BUMPSIZE] , conf_data[CNF_BUMPSIZE].v.am64);
1740 conf_init_int (&dpcur.value[DUMPTYPE_BUMPDAYS] , conf_data[CNF_BUMPDAYS].v.i);
1741 conf_init_real (&dpcur.value[DUMPTYPE_BUMPMULT] , conf_data[CNF_BUMPMULT].v.r);
1742 conf_init_time (&dpcur.value[DUMPTYPE_STARTTIME] , (time_t)0);
1743 conf_init_strategy (&dpcur.value[DUMPTYPE_STRATEGY] , DS_STANDARD);
1744 conf_init_estimate (&dpcur.value[DUMPTYPE_ESTIMATE] , ES_CLIENT);
1745 conf_init_compress (&dpcur.value[DUMPTYPE_COMPRESS] , COMP_FAST);
1746 conf_init_encrypt (&dpcur.value[DUMPTYPE_ENCRYPT] , ENCRYPT_NONE);
1747 conf_init_string (&dpcur.value[DUMPTYPE_SRV_DECRYPT_OPT] , "-d");
1748 conf_init_string (&dpcur.value[DUMPTYPE_CLNT_DECRYPT_OPT] , "-d");
1749 conf_init_rate (&dpcur.value[DUMPTYPE_COMPRATE] , 0.50, 0.50);
1750 conf_init_am64 (&dpcur.value[DUMPTYPE_TAPE_SPLITSIZE] , (off_t)0);
1751 conf_init_am64 (&dpcur.value[DUMPTYPE_FALLBACK_SPLITSIZE], (off_t)10 * 1024);
1752 conf_init_string (&dpcur.value[DUMPTYPE_SPLIT_DISKBUFFER] , NULL);
1753 conf_init_bool (&dpcur.value[DUMPTYPE_RECORD] , 1);
1754 conf_init_bool (&dpcur.value[DUMPTYPE_SKIP_INCR] , 0);
1755 conf_init_bool (&dpcur.value[DUMPTYPE_SKIP_FULL] , 0);
1756 conf_init_holding (&dpcur.value[DUMPTYPE_HOLDINGDISK] , HOLD_AUTO);
1757 conf_init_bool (&dpcur.value[DUMPTYPE_KENCRYPT] , 0);
1758 conf_init_bool (&dpcur.value[DUMPTYPE_IGNORE] , 0);
1759 conf_init_bool (&dpcur.value[DUMPTYPE_INDEX] , 1);
1765 dumptype_t *dp, *dp1;;
1767 dp = lookup_dumptype(dpcur.name);
1769 if(dp != (dumptype_t *)0) {
1770 conf_parserror("dumptype %s already defined on line %d", dp->name, dp->seen);
1774 dp = alloc(sizeof(dumptype_t));
1777 /* add at end of list */
1782 while (dp1->next != NULL) {
1795 dt = lookup_dumptype(tokenval.v.s);
1798 conf_parserror("dumptype parameter expected");
1802 for(i=0; i < DUMPTYPE_DUMPTYPE; i++) {
1803 if(dt->value[i].seen) {
1804 free_val_t(&dpcur.value[i]);
1805 copy_val_t(&dpcur.value[i], &dt->value[i]);
1813 int save_overwrites;
1816 save_overwrites = allow_overwrites;
1817 allow_overwrites = 1;
1819 init_tapetype_defaults();
1821 get_conftoken(CONF_IDENT);
1822 tpcur.name = stralloc(tokenval.v.s);
1823 tpcur.seen = conf_line_num;
1825 prefix = vstralloc( "TAPETYPE:", tpcur.name, ":", NULL);
1826 read_block(program_options, tapetype_var, server_keytab, tpcur.value,
1827 prefix, "tapetype parameter expected", 1, ©_tapetype);
1829 get_conftoken(CONF_NL);
1833 allow_overwrites = save_overwrites;
1837 init_tapetype_defaults(void)
1839 conf_init_string(&tpcur.value[TAPETYPE_COMMENT] , "");
1840 conf_init_string(&tpcur.value[TAPETYPE_LBL_TEMPL] , "");
1841 conf_init_size (&tpcur.value[TAPETYPE_BLOCKSIZE] , DISK_BLOCK_KB);
1842 conf_init_size (&tpcur.value[TAPETYPE_READBLOCKSIZE], MAX_TAPE_BLOCK_KB);
1843 conf_init_am64 (&tpcur.value[TAPETYPE_LENGTH] , (off_t)2000);
1844 conf_init_am64 (&tpcur.value[TAPETYPE_FILEMARK] , (off_t)1);
1845 conf_init_int (&tpcur.value[TAPETYPE_SPEED] , 200);
1846 conf_init_bool (&tpcur.value[TAPETYPE_FILE_PAD] , 1);
1852 tapetype_t *tp, *tp1;
1854 tp = lookup_tapetype(tpcur.name);
1856 if(tp != (tapetype_t *)0) {
1858 conf_parserror("tapetype %s already defined on line %d", tp->name, tp->seen);
1862 tp = alloc(sizeof(tapetype_t));
1864 /* add at end of list */
1869 while (tp1->next != NULL) {
1882 tp = lookup_tapetype(tokenval.v.s);
1885 conf_parserror("tape type parameter expected");
1889 for(i=0; i < TAPETYPE_TAPETYPE; i++) {
1890 if(tp->value[i].seen) {
1891 free_val_t(&tpcur.value[i]);
1892 copy_val_t(&tpcur.value[i], &tp->value[i]);
1897 t_conf_var interface_var [] = {
1898 { CONF_COMMENT, CONFTYPE_STRING, read_string, INTER_COMMENT , NULL },
1899 { CONF_USE , CONFTYPE_INT , read_int , INTER_MAXUSAGE, validate_positive1 },
1900 { CONF_UNKNOWN, CONFTYPE_INT , NULL , INTER_INTER , NULL }
1906 int save_overwrites;
1909 save_overwrites = allow_overwrites;
1910 allow_overwrites = 1;
1912 init_interface_defaults();
1914 get_conftoken(CONF_IDENT);
1915 ifcur.name = stralloc(tokenval.v.s);
1916 ifcur.seen = conf_line_num;
1918 prefix = vstralloc( "INTERFACE:", ifcur.name, ":", NULL);
1919 read_block(program_options, interface_var, server_keytab, ifcur.value,
1920 prefix, "interface parameter expected", 1, ©_interface);
1922 get_conftoken(CONF_NL);
1926 allow_overwrites = save_overwrites;
1932 init_interface_defaults(void)
1934 conf_init_string(&ifcur.value[INTER_COMMENT] , "");
1935 conf_init_int (&ifcur.value[INTER_MAXUSAGE], 300);
1941 save_interface(void)
1943 interface_t *ip, *ip1;
1945 ip = lookup_interface(ifcur.name);
1947 if(ip != (interface_t *)0) {
1948 conf_parserror("interface %s already defined on line %d", ip->name,
1953 ip = alloc(sizeof(interface_t));
1955 /* add at end of list */
1956 if(!interface_list) {
1957 interface_list = ip;
1959 ip1 = interface_list;
1960 while (ip1->next != NULL) {
1968 copy_interface(void)
1980 ip = lookup_interface(tokenval.v.s);
1983 conf_parserror("interface parameter expected");
1987 for(i=0; i < INTER_INTER; i++) {
1988 if(ip->value[i].seen) {
1989 free_val_t(&ifcur.value[i]);
1990 copy_val_t(&ifcur.value[i], &ip->value[i]);
2001 get_conftoken(CONF_REAL);
2002 val->v.rate[0] = tokenval.v.r;
2003 val->v.rate[1] = tokenval.v.r;
2004 val->seen = tokenval.seen;
2005 if(tokenval.v.r < 0) {
2006 conf_parserror("full compression rate must be >= 0");
2009 get_conftoken(CONF_ANY);
2024 get_conftoken(CONF_REAL);
2025 val->v.rate[1] = tokenval.v.r;
2026 if(tokenval.v.r < 0) {
2027 conf_parserror("incremental compression rate must be >= 0");
2037 get_conftoken(CONF_INT);
2038 val->v.intrange[0] = tokenval.v.i;
2039 val->v.intrange[1] = tokenval.v.i;
2040 val->seen = tokenval.seen;
2042 get_conftoken(CONF_ANY);
2057 get_conftoken(CONF_INT);
2058 val->v.intrange[1] = tokenval.v.i;
2066 int serv, clie, none, fast, best, custom;
2073 serv = clie = none = fast = best = custom = 0;
2077 get_conftoken(CONF_ANY);
2079 case CONF_NONE: none = 1; break;
2080 case CONF_FAST: fast = 1; break;
2081 case CONF_BEST: best = 1; break;
2082 case CONF_CLIENT: clie = 1; break;
2083 case CONF_SERVER: serv = 1; break;
2084 case CONF_CUSTOM: custom=1; break;
2085 case CONF_NL: done = 1; break;
2086 case CONF_END: done = 1; break;
2089 serv = clie = 1; /* force an error */
2093 if(serv + clie == 0) clie = 1; /* default to client */
2094 if(none + fast + best + custom == 0) fast = 1; /* default to fast */
2099 if(none && !fast && !best && !custom) comp = COMP_NONE;
2100 if(!none && fast && !best && !custom) comp = COMP_FAST;
2101 if(!none && !fast && best && !custom) comp = COMP_BEST;
2102 if(!none && !fast && !best && custom) comp = COMP_CUST;
2106 if(none && !fast && !best && !custom) comp = COMP_NONE;
2107 if(!none && fast && !best && !custom) comp = COMP_SERVER_FAST;
2108 if(!none && !fast && best && !custom) comp = COMP_SERVER_BEST;
2109 if(!none && !fast && !best && custom) comp = COMP_SERVER_CUST;
2112 if((int)comp == -1) {
2113 conf_parserror("NONE, CLIENT FAST, CLIENT BEST, CLIENT CUSTOM, SERVER FAST, SERVER BEST or SERVER CUSTOM expected");
2117 val->v.i = (int)comp;
2130 get_conftoken(CONF_ANY);
2133 encrypt = ENCRYPT_NONE;
2137 encrypt = ENCRYPT_CUST;
2141 encrypt = ENCRYPT_SERV_CUST;
2145 conf_parserror("NONE, CLIENT or SERVER expected");
2146 encrypt = ENCRYPT_NONE;
2150 val->v.i = (int)encrypt;
2158 dump_holdingdisk_t holding;
2163 get_conftoken(CONF_ANY);
2166 holding = HOLD_NEVER;
2170 holding = HOLD_AUTO;
2174 holding = HOLD_REQUIRED;
2177 default: /* can be a BOOLEAN */
2179 holding = (dump_holdingdisk_t)get_bool();
2181 holding = HOLD_NEVER;
2182 else if (holding == 1 || holding == 2)
2183 holding = HOLD_AUTO;
2185 conf_parserror("NEVER, AUTO or REQUIRED expected");
2189 val->v.i = (int)holding;
2200 get_conftoken(CONF_ANY);
2202 case CONF_FIRST: val->v.i = ALGO_FIRST; break;
2203 case CONF_FIRSTFIT: val->v.i = ALGO_FIRSTFIT; break;
2204 case CONF_LARGEST: val->v.i = ALGO_LARGEST; break;
2205 case CONF_LARGESTFIT: val->v.i = ALGO_LARGESTFIT; break;
2206 case CONF_SMALLEST: val->v.i = ALGO_SMALLEST; break;
2207 case CONF_LAST: val->v.i = ALGO_LAST; break;
2209 conf_parserror("FIRST, FIRSTFIT, LARGEST, LARGESTFIT, SMALLEST or LAST expected");
2223 get_conftoken(CONF_ANY);
2225 case CONF_LOW: pri = 0; break;
2226 case CONF_MEDIUM: pri = 1; break;
2227 case CONF_HIGH: pri = 2; break;
2228 case CONF_INT: pri = tokenval.v.i; break;
2230 conf_parserror("LOW, MEDIUM, HIGH or integer expected");
2246 get_conftoken(CONF_ANY);
2252 strat = DS_STANDARD;
2264 strat = DS_INCRONLY;
2267 conf_parserror("STANDARD or NOFULL expected");
2268 strat = DS_STANDARD;
2283 get_conftoken(CONF_ANY);
2292 estime = ES_CALCSIZE;
2295 conf_parserror("CLIENT, SERVER or CALCSIZE expected");
2306 int file, got_one = 0;
2311 get_conftoken(CONF_ANY);
2312 if(tok == CONF_LIST) {
2314 get_conftoken(CONF_ANY);
2315 exclude = val->v.exinclude.sl_list;
2319 if(tok == CONF_EFILE) get_conftoken(CONF_ANY);
2320 exclude = val->v.exinclude.sl_file;
2324 if(tok == CONF_OPTIONAL) {
2325 get_conftoken(CONF_ANY);
2329 if(tok == CONF_APPEND) {
2330 get_conftoken(CONF_ANY);
2337 while(tok == CONF_STRING) {
2338 exclude = append_sl(exclude, tokenval.v.s);
2340 get_conftoken(CONF_ANY);
2344 if(got_one == 0) { free_sl(exclude); exclude = NULL; }
2347 val->v.exinclude.sl_list = exclude;
2349 val->v.exinclude.sl_file = exclude;
2350 val->v.exinclude.optional = optional;
2354 static void get_include(np, val)
2358 int list, got_one = 0;
2363 get_conftoken(CONF_ANY);
2364 if(tok == CONF_LIST) {
2366 include = dpcur.value[DUMPTYPE_INCLUDE_LIST].v.sl;
2367 ckseen(&dpcur.value[DUMPTYPE_INCLUDE_LIST].seen);
2368 get_conftoken(CONF_ANY);
2372 include = dpcur.value[DUMPTYPE_INCLUDE_FILE].v.sl;
2373 ckseen(&dpcur.value[DUMPTYPE_INCLUDE_FILE].seen);
2374 if(tok == CONF_EFILE) get_conftoken(CONF_ANY);
2377 if(tok == CONF_OPTIONAL) {
2378 get_conftoken(CONF_ANY);
2382 if(tok == CONF_APPEND) {
2383 get_conftoken(CONF_ANY);
2392 while(tok == CONF_STRING) {
2393 include = append_sl(include, tokenval.v.s);
2395 get_conftoken(CONF_ANY);
2399 if(got_one == 0) { free_sl(include); include = NULL; }
2402 dpcur.value[DUMPTYPE_INCLUDE_FILE].v.sl = include;
2404 dpcur.value[DUMPTYPE_INCLUDE_LIST].v.sl = include;
2405 if(!append || optional)
2406 dpcur.value[DUMPTYPE_INCLUDE_OPTIONAL].v.i = optional;
2411 /* ------------------------ */
2414 ColumnDataCount(void )
2416 return (int)(SIZEOF(ColumnData) / SIZEOF(ColumnData[0]));
2419 /* conversion from string to table index
2427 for (cn=0; ColumnData[cn].Name != NULL; cn++) {
2428 if (strcasecmp(s, ColumnData[cn].Name) == 0) {
2439 return s[strlen(s)-1];
2443 SetColumDataFromString(
2449 char *myname= "SetColumDataFromString";
2453 /* Convert from a Columspec string to our internal format
2454 * of columspec. The purpose is to provide this string
2455 * as configuration paramter in the amanda.conf file or
2456 * (maybe) as environment variable.
2458 * This text should go as comment into the sample amanda.conf
2460 * The format for such a ColumnSpec string s is a ',' seperated
2461 * list of triples. Each triple consists of
2462 * -the name of the column (as in ColumnData.Name)
2463 * -prefix before the column
2464 * -the width of the column
2465 * if set to -1 it will be recalculated
2466 * to the maximum length of a line to print.
2468 * "Disk=1:17,HostName=1:10,OutKB=1:7"
2470 * "Disk=1:-1,HostName=1:10,OutKB=1:7"
2472 * You need only specify those colums that should be changed from
2473 * the default. If nothing is specified in the configfile, the
2474 * above compiled in values will be in effect, resulting in an
2475 * output as it was all the time.
2482 char *eon= strchr(s, '=');
2485 *errstr = stralloc2("invalid columnspec: ", s);
2487 fprintf(stderr, "%s: %s\n", myname, *errstr);
2492 cn=StringToColumn(s);
2493 if (ColumnData[cn].Name == NULL) {
2494 *errstr = stralloc2("invalid column name: ", s);
2496 fprintf(stderr, "%s: %s\n", myname, *errstr);
2500 if (sscanf(eon+1, "%d:%d", &Space, &Width) != 2) {
2501 *errstr = stralloc2("invalid format: ", eon + 1);
2503 fprintf(stderr, "%s: %s\n", myname, *errstr);
2507 ColumnData[cn].Width= Width;
2508 ColumnData[cn].PrefixSpace = Space;
2509 if (LastChar(ColumnData[cn].Format) == 's') {
2511 ColumnData[cn].MaxWidth= 1;
2513 if (Width > ColumnData[cn].Precision)
2514 ColumnData[cn].Precision= Width;
2516 else if (Width < ColumnData[cn].Precision)
2517 ColumnData[cn].Precision = Width;
2518 s= strchr(eon+1, ',');
2527 getconf_unit_divisor(void)
2529 return unit_divisor;
2532 /* ------------------------ */
2547 char kt_prefix[100];
2549 printf("AMANDA CONFIGURATION FROM FILE \"%s\":\n\n", filename);
2551 for(np=server_var; np->token != CONF_UNKNOWN; np++) {
2552 for(kt = server_keytab; kt->token != CONF_UNKNOWN; kt++)
2553 if (np->token == kt->token) break;
2555 if(kt->token == CONF_UNKNOWN)
2556 error("server bad token");
2558 if (kt->token != CONF_IDENT)
2559 snprintf(kt_prefix, 100, "%-21s ", kt->keyword);
2561 conf_print(&conf_data[np->parm], 1, kt_prefix));
2564 for(hp = holdingdisks; hp != NULL; hp = hp->next) {
2565 printf("\nHOLDINGDISK %s {\n", hp->name);
2566 for(i=0; i < HOLDING_HOLDING; i++) {
2567 for(np=holding_var; np->token != CONF_UNKNOWN; np++) {
2571 if(np->token == CONF_UNKNOWN)
2572 error("holding bad value");
2574 for(kt = server_keytab; kt->token != CONF_UNKNOWN; kt++) {
2575 if(kt->token == np->token)
2578 if(kt->token == CONF_UNKNOWN)
2579 error("holding bad token");
2581 snprintf(kt_prefix, 100, " %-9s ", kt->keyword);
2582 printf("%s\n", conf_print(&hp->value[i], 1, kt_prefix));
2587 for(tp = tapelist; tp != NULL; tp = tp->next) {
2588 printf("\nDEFINE TAPETYPE %s {\n", tp->name);
2589 for(i=0; i < TAPETYPE_TAPETYPE; i++) {
2590 for(np=tapetype_var; np->token != CONF_UNKNOWN; np++)
2591 if(np->parm == i) break;
2592 if(np->token == CONF_UNKNOWN)
2593 error("tapetype bad value");
2595 for(kt = server_keytab; kt->token != CONF_UNKNOWN; kt++)
2596 if(kt->token == np->token) break;
2597 if(kt->token == CONF_UNKNOWN)
2598 error("tapetype bad token");
2600 snprintf(kt_prefix, 100, " %-9s ", kt->keyword);
2601 printf("%s\n", conf_print(&tp->value[i], 1, kt_prefix));
2606 for(dp = dumplist; dp != NULL; dp = dp->next) {
2607 if (strncmp(dp->name, "custom(", 7) != 0) {
2612 printf("\n%sDEFINE DUMPTYPE %s {\n", prefix, dp->name);
2613 for(i=0; i < DUMPTYPE_DUMPTYPE; i++) {
2614 for(np=dumptype_var; np->token != CONF_UNKNOWN; np++)
2615 if(np->parm == i) break;
2616 if(np->token == CONF_UNKNOWN)
2617 error("dumptype bad value");
2619 for(kt = server_keytab; kt->token != CONF_UNKNOWN; kt++)
2620 if(kt->token == np->token) break;
2621 if(kt->token == CONF_UNKNOWN)
2622 error("dumptype bad token");
2624 snprintf(kt_prefix, 100, "%s %-19s ", prefix,kt->keyword);
2625 printf("%s\n", conf_print(&dp->value[i], 1, kt_prefix));
2627 printf("%s}\n", prefix);
2631 for(ip = interface_list; ip != NULL; ip = ip->next) {
2632 if(strcmp(ip->name,"default") == 0)
2636 printf("\n%sDEFINE INTERFACE %s {\n", prefix, ip->name);
2637 for(i=0; i < INTER_INTER; i++) {
2638 for(np=interface_var; np->token != CONF_UNKNOWN; np++)
2639 if(np->parm == i) break;
2640 if(np->token == CONF_UNKNOWN)
2641 error("interface bad value");
2643 for(kt = server_keytab; kt->token != CONF_UNKNOWN; kt++)
2644 if(kt->token == np->token) break;
2645 if(kt->token == CONF_UNKNOWN)
2646 error("interface bad token");
2648 snprintf(kt_prefix, 100, "%s %-19s ", prefix, kt->keyword);
2649 printf("%s\n", conf_print(&ip->value[i], 1, kt_prefix));
2651 printf("%s}\n",prefix);
2657 generic_get_security_conf(
2662 if(!string || !*string)
2665 if(strcmp(string, "krb5principal")==0) {
2666 return(getconf_str(CNF_KRB5PRINCIPAL));
2667 } else if(strcmp(string, "krb5keytab")==0) {
2668 return(getconf_str(CNF_KRB5KEYTAB));
2679 if (my_keytab == NULL) {
2680 error("my_keytab == NULL");
2684 for(kt = my_keytab; kt->token != CONF_UNKNOWN; kt++)
2685 if(kt->token == token) break;
2687 if(kt->token == CONF_UNKNOWN)
2689 return(kt->keyword);
2701 char *myarg, *value;
2702 command_option_t *program_option;
2704 program_options = alloc((size_t)(parse_argc+1) * SIZEOF(*program_options));
2705 program_options_size = parse_argc+1;
2706 program_option = program_options;
2707 program_option->name = NULL;
2709 my_argv = alloc((size_t)parse_argc * SIZEOF(char *));
2710 *new_argv = my_argv;
2713 while(i<parse_argc) {
2714 if(strncmp(parse_argv[i],"-o",2) == 0) {
2715 if(strlen(parse_argv[i]) > 2)
2716 myarg = &parse_argv[i][2];
2720 error("expect something after -o");
2721 myarg = parse_argv[i];
2723 value = index(myarg,'=');
2724 if (value == NULL) {
2725 conf_parserror("Must specify a value for %s.\n", myarg);
2729 program_option->used = 0;
2730 program_option->name = stralloc(myarg);
2731 program_option->value = stralloc(value);
2733 program_option->name = NULL;
2737 my_argv[*new_argc] = stralloc(parse_argv[i]);
2748 char **config_options;
2749 char **config_option;
2750 command_option_t *command_options;
2752 config_options = alloc((first+program_options_size+1)*SIZEOF(char *));
2753 for(command_options = program_options,
2754 config_option = config_options + first;
2755 command_options->name != NULL; command_options++) {
2756 *config_option = vstralloc("-o", command_options->name, "=",
2757 command_options->value, NULL);
2760 *config_option = NULL;
2761 return(config_options);
2765 report_bad_conf_arg(void)
2767 command_option_t *command_option;
2769 for(command_option = program_options; command_option->name != NULL;
2771 if(command_option->used == 0) {
2772 fprintf(stderr,"argument -o%s=%s not used\n",
2773 command_option->name, command_option->value);
2779 free_server_config(void)
2781 holdingdisk_t *hp, *hpnext;
2782 dumptype_t *dp, *dpnext;
2783 tapetype_t *tp, *tpnext;
2784 interface_t *ip, *ipnext;
2785 command_option_t *server_option;
2788 for(hp=holdingdisks; hp != NULL; hp = hpnext) {
2790 for(i=0; i<HOLDING_HOLDING-1; i++) {
2791 free_val_t(&hp->value[i]);
2797 for(dp=dumplist; dp != NULL; dp = dpnext) {
2799 for(i=0; i<DUMPTYPE_DUMPTYPE-1; i++) {
2800 free_val_t(&dp->value[i]);
2806 for(tp=tapelist; tp != NULL; tp = tpnext) {
2808 for(i=0; i<TAPETYPE_TAPETYPE-1; i++) {
2809 free_val_t(&tp->value[i]);
2815 for(ip=interface_list; ip != NULL; ip = ipnext) {
2817 for(i=0; i<INTER_INTER-1; i++) {
2818 free_val_t(&ip->value[i]);
2824 if(program_options) {
2825 for(server_option = program_options; server_option->name != NULL;
2827 amfree(server_option->name);
2828 amfree(server_option->value);
2830 amfree(program_options);
2833 for(i=0; i<CNF_CNF-1; i++)
2834 free_val_t(&conf_data[i]);
2839 /* configuration parameters */
2840 static char *cln_config_dir = NULL;
2842 /* predeclare local functions */
2844 static void read_client_conffile_recursively(char *filename);
2845 static int read_client_confline(void);
2847 static int first_file = 1;
2850 ** ------------------------
2851 ** External entry points
2852 ** ------------------------
2855 /* return 0 on success */
2856 /* return 1 on error */
2857 /* return -1 if file not found */
2859 int read_clientconf(
2862 my_keytab = server_keytab;
2863 my_var = client_var;
2865 if(first_file == 1) {
2869 allow_overwrites = 1;
2872 /* We assume that conf_confname & conf are initialized to NULL above */
2873 read_client_conffile_recursively(filename);
2875 command_overwrite(program_options, client_var, client_keytab, conf_data,
2878 debug_amandad = getconf_int(CNF_DEBUG_AMANDAD);
2879 debug_amidxtaped = getconf_int(CNF_DEBUG_AMIDXTAPED);
2880 debug_amindexd = getconf_int(CNF_DEBUG_AMINDEXD);
2881 debug_amrecover = getconf_int(CNF_DEBUG_AMRECOVER);
2882 debug_auth = getconf_int(CNF_DEBUG_AUTH);
2883 debug_event = getconf_int(CNF_DEBUG_EVENT);
2884 debug_holding = getconf_int(CNF_DEBUG_HOLDING);
2885 debug_protocol = getconf_int(CNF_DEBUG_PROTOCOL);
2886 debug_planner = getconf_int(CNF_DEBUG_PLANNER);
2887 debug_driver = getconf_int(CNF_DEBUG_DRIVER);
2888 debug_dumper = getconf_int(CNF_DEBUG_DUMPER);
2889 debug_chunker = getconf_int(CNF_DEBUG_CHUNKER);
2890 debug_taper = getconf_int(CNF_DEBUG_TAPER);
2891 debug_selfcheck = getconf_int(CNF_DEBUG_SELFCHECK);
2892 debug_sendsize = getconf_int(CNF_DEBUG_SENDSIZE);
2893 debug_sendbackup = getconf_int(CNF_DEBUG_SENDBACKUP);
2895 return got_parserror;
2900 ** ------------------------
2901 ** Internal routines
2902 ** ------------------------
2907 read_client_conffile_recursively(
2910 /* Save globals used in read_client_confline(), elsewhere. */
2911 int save_line_num = conf_line_num;
2912 FILE *save_conf = conf_conf;
2913 char *save_confname = conf_confname;
2916 if (*filename == '/' || cln_config_dir == NULL) {
2917 conf_confname = stralloc(filename);
2919 conf_confname = stralloc2(cln_config_dir, filename);
2922 if((conf_conf = fopen(conf_confname, "r")) == NULL) {
2923 dbprintf(("Could not open conf file \"%s\": %s\n", conf_confname,
2925 amfree(conf_confname);
2929 dbprintf(("Reading conf file \"%s\".\n", conf_confname));
2933 /* read_client_confline() can invoke us recursively via "includefile" */
2935 rc = read_client_confline();
2939 amfree(conf_confname);
2941 /* Restore globals */
2942 conf_line_num = save_line_num;
2943 conf_conf = save_conf;
2944 conf_confname = save_confname;
2948 /* ------------------------ */
2952 read_client_confline(void)
2956 keytable = client_keytab;
2959 get_conftoken(CONF_ANY);
2961 case CONF_INCLUDEFILE:
2965 get_conftoken(CONF_STRING);
2967 read_client_conffile_recursively(fn);
2971 case CONF_NL: /* empty line */
2974 case CONF_END: /* end of file */
2979 for(np = client_var; np->token != CONF_UNKNOWN; np++)
2980 if(np->token == tok) break;
2982 if(np->token == CONF_UNKNOWN) {
2983 conf_parserror("configuration keyword expected");
2985 np->read_function(np, &conf_data[np->parm]);
2987 np->validate(np, &conf_data[np->parm]);
2992 get_conftoken(CONF_NL);
2998 generic_client_get_security_conf(
3002 (void)arg; /* Quiet unused parameter warning */
3004 if(!string || !*string)
3007 if(strcmp(string, "conf")==0) {
3008 return(getconf_str(CNF_CONF));
3009 } else if(strcmp(string, "index_server")==0) {
3010 return(getconf_str(CNF_INDEX_SERVER));
3011 } else if(strcmp(string, "tape_server")==0) {
3012 return(getconf_str(CNF_TAPE_SERVER));
3013 } else if(strcmp(string, "tapedev")==0) {
3014 return(getconf_str(CNF_TAPEDEV));
3015 } else if(strcmp(string, "auth")==0) {
3016 return(getconf_str(CNF_AUTH));
3017 } else if(strcmp(string, "ssh_keys")==0) {
3018 return(getconf_str(CNF_SSH_KEYS));
3019 } else if(strcmp(string, "amandad_path")==0) {
3020 return(getconf_str(CNF_AMANDAD_PATH));
3021 } else if(strcmp(string, "client_username")==0) {
3022 return(getconf_str(CNF_CLIENT_USERNAME));
3023 } else if(strcmp(string, "gnutar_list_dir")==0) {
3024 return(getconf_str(CNF_GNUTAR_LIST_DIR));
3025 } else if(strcmp(string, "amandates")==0) {
3026 return(getconf_str(CNF_AMANDATES));
3027 } else if(strcmp(string, "krb5principal")==0) {
3028 return(getconf_str(CNF_KRB5PRINCIPAL));
3029 } else if(strcmp(string, "krb5keytab")==0) {
3030 return(getconf_str(CNF_KRB5KEYTAB));
3036 /* return 0 on success */
3037 /* return -1 if it is already there */
3038 /* return -2 if other failure */
3046 command_option_t *command_option;
3049 for(np = client_var; np->token != CONF_UNKNOWN; np++)
3050 if(np->parm == (int)parm) break;
3052 if(np->token == CONF_UNKNOWN) return -2;
3054 for(kt = client_keytab; kt->token != CONF_UNKNOWN; kt++)
3055 if(kt->token == np->token) break;
3057 if(kt->token == CONF_UNKNOWN) return -2;
3059 /* Try to find it */
3061 for(command_option = program_options; command_option->name != NULL;
3066 /* Increase size of program_options if needed */
3067 if(nb_option >= program_options_size-1) {
3068 program_options_size *= 2;
3069 program_options = realloc(program_options,
3070 program_options_size * SIZEOF(*program_options));
3071 if (program_options == NULL) {
3072 error("Can't realloc program_options: %s\n", strerror(errno));
3075 for(command_option = program_options; command_option->name != NULL;
3081 command_option->used = 0;
3082 command_option->name = stralloc(kt->keyword);
3083 command_option->value = stralloc(value);
3085 command_option->name = NULL;
3092 t_conf_var *get_var,
3097 for(np = get_var; np->token != CONF_UNKNOWN; np++) {
3098 if(np->parm == parm)
3102 if(np->token == CONF_UNKNOWN) {
3103 error("error [unknown get_np parm: %d]", parm);
3115 get_conftoken(CONF_ANY);
3118 #if SIZEOF_TIME_T < SIZEOF_INT
3119 if ((off_t)tokenval.v.i >= (off_t)TIME_MAX)
3120 conf_parserror("value too large");
3122 hhmm = (time_t)tokenval.v.i;
3126 #if SIZEOF_TIME_T < SIZEOF_LONG
3127 if ((off_t)tokenval.v.l >= (off_t)TIME_MAX)
3128 conf_parserror("value too large");
3130 hhmm = (time_t)tokenval.v.l;
3134 #if SIZEOF_TIME_T < SIZEOF_SSIZE_T
3135 if ((off_t)tokenval.v.size >= (off_t)TIME_MAX)
3136 conf_parserror("value too large");
3138 hhmm = (time_t)tokenval.v.size;
3142 #if SIZEOF_TIME_T < SIZEOF_LONG_LONG
3143 if ((off_t)tokenval.v.am64 >= (off_t)TIME_MAX)
3144 conf_parserror("value too large");
3146 hhmm = (time_t)tokenval.v.am64;
3149 case CONF_AMINFINITY:
3154 conf_parserror("a time is expected");
3161 keytab_t numb_keytable[] = {
3162 { "B", CONF_MULT1 },
3163 { "BPS", CONF_MULT1 },
3164 { "BYTE", CONF_MULT1 },
3165 { "BYTES", CONF_MULT1 },
3166 { "DAY", CONF_MULT1 },
3167 { "DAYS", CONF_MULT1 },
3168 { "INF", CONF_AMINFINITY },
3169 { "K", CONF_MULT1K },
3170 { "KB", CONF_MULT1K },
3171 { "KBPS", CONF_MULT1K },
3172 { "KBYTE", CONF_MULT1K },
3173 { "KBYTES", CONF_MULT1K },
3174 { "KILOBYTE", CONF_MULT1K },
3175 { "KILOBYTES", CONF_MULT1K },
3176 { "KPS", CONF_MULT1K },
3177 { "M", CONF_MULT1M },
3178 { "MB", CONF_MULT1M },
3179 { "MBPS", CONF_MULT1M },
3180 { "MBYTE", CONF_MULT1M },
3181 { "MBYTES", CONF_MULT1M },
3182 { "MEG", CONF_MULT1M },
3183 { "MEGABYTE", CONF_MULT1M },
3184 { "MEGABYTES", CONF_MULT1M },
3185 { "G", CONF_MULT1G },
3186 { "GB", CONF_MULT1G },
3187 { "GBPS", CONF_MULT1G },
3188 { "GBYTE", CONF_MULT1G },
3189 { "GBYTES", CONF_MULT1G },
3190 { "GIG", CONF_MULT1G },
3191 { "GIGABYTE", CONF_MULT1G },
3192 { "GIGABYTES", CONF_MULT1G },
3193 { "MPS", CONF_MULT1M },
3194 { "TAPE", CONF_MULT1 },
3195 { "TAPES", CONF_MULT1 },
3196 { "WEEK", CONF_MULT7 },
3197 { "WEEKS", CONF_MULT7 },
3198 { NULL, CONF_IDENT }
3208 keytable = numb_keytable;
3210 get_conftoken(CONF_ANY);
3217 #if SIZEOF_INT < SIZEOF_LONG
3218 if ((off_t)tokenval.v.l > (off_t)INT_MAX)
3219 conf_parserror("value too large");
3220 if ((off_t)tokenval.v.l < (off_t)INT_MIN)
3221 conf_parserror("value too small");
3223 val = (int)tokenval.v.l;
3227 #if SIZEOF_INT < SIZEOF_SSIZE_T
3228 if ((off_t)tokenval.v.size > (off_t)INT_MAX)
3229 conf_parserror("value too large");
3230 if ((off_t)tokenval.v.size < (off_t)INT_MIN)
3231 conf_parserror("value too small");
3233 val = (int)tokenval.v.size;
3237 #if SIZEOF_INT < SIZEOF_LONG_LONG
3238 if (tokenval.v.am64 > (off_t)INT_MAX)
3239 conf_parserror("value too large");
3240 if (tokenval.v.am64 < (off_t)INT_MIN)
3241 conf_parserror("value too small");
3243 val = (int)tokenval.v.am64;
3246 case CONF_AMINFINITY:
3251 conf_parserror("an integer is expected");
3256 /* get multiplier, if any */
3257 get_conftoken(CONF_ANY);
3259 case CONF_NL: /* multiply by one */
3266 if (val > (INT_MAX / 7))
3267 conf_parserror("value too large");
3268 if (val < (INT_MIN / 7))
3269 conf_parserror("value too small");
3274 if (val > (INT_MAX / 1024))
3275 conf_parserror("value too large");
3276 if (val < (INT_MIN / 1024))
3277 conf_parserror("value too small");
3282 if (val > (INT_MAX / (1024 * 1024)))
3283 conf_parserror("value too large");
3284 if (val < (INT_MIN / (1024 * 1024)))
3285 conf_parserror("value too small");
3289 default: /* it was not a multiplier */
3306 keytable = numb_keytable;
3308 get_conftoken(CONF_ANY);
3316 #if SIZEOF_LONG < SIZEOF_INT
3317 if ((off_t)tokenval.v.i > (off_t)LONG_MAX)
3318 conf_parserror("value too large");
3319 if ((off_t)tokenval.v.i < (off_t)LONG_MIN)
3320 conf_parserror("value too small");
3322 val = (long)tokenval.v.i;
3326 #if SIZEOF_LONG < SIZEOF_SSIZE_T
3327 if ((off_t)tokenval.v.size > (off_t)LONG_MAX)
3328 conf_parserror("value too large");
3329 if ((off_t)tokenval.v.size < (off_t)LONG_MIN)
3330 conf_parserror("value too small");
3332 val = (long)tokenval.v.size;
3336 #if SIZEOF_LONG < SIZEOF_LONG_LONG
3337 if (tokenval.v.am64 > (off_t)LONG_MAX)
3338 conf_parserror("value too large");
3339 if (tokenval.v.am64 < (off_t)LONG_MIN)
3340 conf_parserror("value too small");
3342 val = (long)tokenval.v.am64;
3345 case CONF_AMINFINITY:
3346 val = (long)LONG_MAX;
3350 conf_parserror("an integer is expected");
3355 get_conftoken(CONF_ANY);
3364 if (val > (LONG_MAX / 7L))
3365 conf_parserror("value too large");
3366 if (val < (LONG_MIN / 7L))
3367 conf_parserror("value too small");
3372 if (val > (LONG_MAX / 1024L))
3373 conf_parserror("value too large");
3374 if (val < (LONG_MIN / 1024L))
3375 conf_parserror("value too small");
3380 if (val > (LONG_MAX / (1024L * 1024L)))
3381 conf_parserror("value too large");
3382 if (val < (LONG_MIN / (1024L * 1024L)))
3383 conf_parserror("value too small");
3384 val *= 1024L * 1024L;
3404 keytable = numb_keytable;
3406 get_conftoken(CONF_ANY);
3410 val = tokenval.v.size;
3414 #if SIZEOF_SIZE_T < SIZEOF_INT
3415 if ((off_t)tokenval.v.i > (off_t)SSIZE_MAX)
3416 conf_parserror("value too large");
3417 if ((off_t)tokenval.v.i < (off_t)SSIZE_MIN)
3418 conf_parserror("value too small");
3420 val = (ssize_t)tokenval.v.i;
3424 #if SIZEOF_SIZE_T < SIZEOF_LONG
3425 if ((off_t)tokenval.v.l > (off_t)SSIZE_MAX)
3426 conf_parserror("value too large");
3427 if ((off_t)tokenval.v.l < (off_t)SSIZE_MIN)
3428 conf_parserror("value too small");
3430 val = (ssize_t)tokenval.v.l;
3434 #if SIZEOF_SIZE_T < SIZEOF_LONG_LONG
3435 if (tokenval.v.am64 > (off_t)SSIZE_MAX)
3436 conf_parserror("value too large");
3437 if (tokenval.v.am64 < (off_t)SSIZE_MIN)
3438 conf_parserror("value too small");
3440 val = (ssize_t)tokenval.v.am64;
3443 case CONF_AMINFINITY:
3444 val = (ssize_t)SSIZE_MAX;
3448 conf_parserror("an integer is expected");
3453 /* get multiplier, if any */
3454 get_conftoken(CONF_ANY);
3457 case CONF_NL: /* multiply by one */
3463 if (val > (ssize_t)(SSIZE_MAX / 7))
3464 conf_parserror("value too large");
3465 if (val < (ssize_t)(SSIZE_MIN / 7))
3466 conf_parserror("value too small");
3471 if (val > (ssize_t)(SSIZE_MAX / (ssize_t)1024))
3472 conf_parserror("value too large");
3473 if (val < (ssize_t)(SSIZE_MIN / (ssize_t)1024))
3474 conf_parserror("value too small");
3475 val *= (ssize_t)1024;
3479 if (val > (ssize_t)(SSIZE_MAX / (1024 * 1024)))
3480 conf_parserror("value too large");
3481 if (val < (ssize_t)(SSIZE_MIN / (1024 * 1024)))
3482 conf_parserror("value too small");
3483 val *= (ssize_t)(1024 * 1024);
3486 default: /* it was not a multiplier */
3502 keytable = numb_keytable;
3504 get_conftoken(CONF_ANY);
3508 val = (off_t)tokenval.v.i;
3512 val = (off_t)tokenval.v.l;
3516 val = (off_t)tokenval.v.size;
3520 val = tokenval.v.am64;
3523 case CONF_AMINFINITY:
3528 conf_parserror("an integer is expected");
3533 /* get multiplier, if any */
3534 get_conftoken(CONF_ANY);
3537 case CONF_NL: /* multiply by one */
3543 if (val > AM64_MAX/7 || val < AM64_MIN/7)
3544 conf_parserror("value too large");
3549 if (val > AM64_MAX/1024 || val < AM64_MIN/1024)
3550 conf_parserror("value too large");
3555 if (val > AM64_MAX/(1024*1024) || val < AM64_MIN/(1024*1024))
3556 conf_parserror("value too large");
3560 default: /* it was not a multiplier */
3570 keytab_t bool_keytable[] = {
3571 { "Y", CONF_ATRUE },
3572 { "YES", CONF_ATRUE },
3573 { "T", CONF_ATRUE },
3574 { "TRUE", CONF_ATRUE },
3575 { "ON", CONF_ATRUE },
3576 { "N", CONF_AFALSE },
3577 { "NO", CONF_AFALSE },
3578 { "F", CONF_AFALSE },
3579 { "FALSE", CONF_AFALSE },
3580 { "OFF", CONF_AFALSE },
3581 { NULL, CONF_IDENT }
3591 keytable = bool_keytable;
3593 get_conftoken(CONF_ANY);
3597 if (tokenval.v.i != 0)
3604 if (tokenval.v.l != 0L)
3611 if (tokenval.v.size != (size_t)0)
3618 if (tokenval.v.am64 != (off_t)0)
3634 val = 2; /* no argument - most likely TRUE */
3638 val = 3; /* a bad argument - most likely TRUE */
3639 conf_parserror("YES, NO, TRUE, FALSE, ON, OFF expected");
3651 if (*seen && !allow_overwrites && conf_line_num != -2) {
3652 conf_parserror("duplicate parameter, prev def on line %d", *seen);
3654 *seen = conf_line_num;
3657 printf_arglist_function(void conf_parserror, const char *, format)
3661 /* print error message */
3664 fprintf(stderr, "argument \"%s\": ", conf_line);
3666 fprintf(stderr, "\"%s\", line %d: ", conf_confname, conf_line_num);
3667 arglist_start(argp, format);
3668 vfprintf(stderr, format, argp);
3670 fputc('\n', stderr);
3681 /* switch to binary search if performance warrants */
3683 for(kwp = keytable; kwp->keyword != NULL; kwp++) {
3684 if (strcasecmp(kwp->keyword, str) == 0) break;
3691 /* push the last token back (can only unget ANY tokens) */
3693 unget_conftoken(void)
3702 conftoken_getc(void)
3704 if(conf_line == NULL)
3705 return getc(conf_conf);
3706 if(*conf_char == '\0')
3708 return(*conf_char++);
3715 if(conf_line == NULL)
3716 return ungetc(c, conf_conf);
3717 else if(conf_char > conf_line) {
3721 if(*conf_char != c) {
3722 error("*conf_char != c : %c %c", *conf_char, c);
3726 error("conf_char == conf_line");
3750 ** If it looked like a key word before then look it
3751 ** up again in the current keyword table.
3754 case CONF_LONG: case CONF_AM64: case CONF_SIZE:
3755 case CONF_INT: case CONF_REAL: case CONF_STRING:
3756 case CONF_LBRACE: case CONF_RBRACE: case CONF_COMMA:
3757 case CONF_NL: case CONF_END: case CONF_UNKNOWN:
3762 if (exp == CONF_IDENT)
3765 tok = lookup_keyword(tokenval.v.s);
3770 ch = conftoken_getc();
3772 while(ch != EOF && ch != '\n' && isspace(ch))
3773 ch = conftoken_getc();
3774 if (ch == '#') { /* comment - eat everything but eol/eof */
3775 while((ch = conftoken_getc()) != EOF && ch != '\n') {
3776 (void)ch; /* Quiet empty loop complaints */
3780 if (isalpha(ch)) { /* identifier */
3784 if (buf < tkbuf+sizeof(tkbuf)-1) {
3788 if (!token_overflow) {
3789 conf_parserror("token too long: %.20s...", tkbuf);
3793 ch = conftoken_getc();
3794 } while(isalnum(ch) || ch == '_' || ch == '-');
3796 if (ch != EOF && conftoken_ungetc(ch) == EOF) {
3797 if (ferror(conf_conf)) {
3798 conf_parserror("Pushback of '%c' failed: %s",
3799 ch, strerror(ferror(conf_conf)));
3801 conf_parserror("Pushback of '%c' failed: EOF", ch);
3806 tokenval.v.s = tkbuf;
3808 if (token_overflow) tok = CONF_UNKNOWN;
3809 else if (exp == CONF_IDENT) tok = CONF_IDENT;
3810 else tok = lookup_keyword(tokenval.v.s);
3812 else if (isdigit(ch)) { /* integer */
3815 negative_number: /* look for goto negative_number below sign is set there */
3818 am64 = am64 * 10 + (ch - '0');
3819 ch = conftoken_getc();
3820 } while (isdigit(ch));
3823 if (exp == CONF_INT) {
3825 tokenval.v.i = sign * (int)am64;
3826 } else if (exp == CONF_LONG) {
3828 tokenval.v.l = (long)sign * (long)am64;
3829 } else if (exp != CONF_REAL) {
3831 tokenval.v.am64 = (off_t)sign * am64;
3833 /* automatically convert to real when expected */
3834 tokenval.v.r = (double)sign * (double)am64;
3838 /* got a real number, not an int */
3839 tokenval.v.r = sign * (double) am64;
3842 ch = conftoken_getc();
3843 while (isdigit(ch)) {
3844 am64 = am64 * 10 + (ch - '0');
3846 ch = conftoken_getc();
3848 tokenval.v.r += sign * ((double)am64) / d;
3852 if (ch != EOF && conftoken_ungetc(ch) == EOF) {
3853 if (ferror(conf_conf)) {
3854 conf_parserror("Pushback of '%c' failed: %s",
3855 ch, strerror(ferror(conf_conf)));
3857 conf_parserror("Pushback of '%c' failed: EOF", ch);
3861 case '"': /* string */
3866 while (inquote && ((ch = conftoken_getc()) != EOF)) {
3871 buf--; /* Consume escape in buffer */
3872 } else if (ch == '\\') {
3882 if(buf >= &tkbuf[sizeof(tkbuf) - 1]) {
3883 if (!token_overflow) {
3884 conf_parserror("string too long: %.20s...", tkbuf);
3894 * A little manuver to leave a fully unquoted, unallocated string
3897 tmps = unquote_string(tkbuf);
3898 strncpy(tkbuf, tmps, sizeof(tkbuf));
3900 tokenval.v.s = tkbuf;
3902 tok = (token_overflow) ? CONF_UNKNOWN :
3903 (exp == CONF_IDENT) ? CONF_IDENT : CONF_STRING;
3907 ch = conftoken_getc();
3910 goto negative_number;
3913 if (ch != EOF && conftoken_ungetc(ch) == EOF) {
3914 if (ferror(conf_conf)) {
3915 conf_parserror("Pushback of '%c' failed: %s",
3916 ch, strerror(ferror(conf_conf)));
3918 conf_parserror("Pushback of '%c' failed: EOF", ch);
3951 if (exp != CONF_ANY && tok != exp) {
3969 str = "end of line";
3973 str = "end of file";
3981 str = "a real number";
3985 str = "a quoted string";
3989 str = "an identifier";
3993 for(kwp = keytable; kwp->keyword != NULL; kwp++) {
3994 if (exp == kwp->token)
3997 if (kwp->keyword == NULL)
4003 conf_parserror("%s is expected", str);
4005 if (tok == CONF_INT)
4020 get_conftoken(CONF_STRING);
4021 val->v.s = newstralloc(val->v.s, tokenval.v.s);
4031 get_conftoken(CONF_IDENT);
4032 val->v.s = newstralloc(val->v.s, tokenval.v.s);
4042 val->v.i = get_int();
4053 val->v.l = get_long();
4064 val->v.size = get_size();
4074 val->v.am64 = get_am64_t();
4084 val->v.i = get_bool();
4094 get_conftoken(CONF_REAL);
4095 val->v.r = tokenval.v.r;
4105 val->v.t = get_time();
4114 valdst->type = valsrc->type;
4115 valdst->seen = valsrc->seen;
4116 switch(valsrc->type) {
4119 case CONFTYPE_COMPRESS:
4120 case CONFTYPE_ENCRYPT:
4121 case CONFTYPE_HOLDING:
4122 case CONFTYPE_ESTIMATE:
4123 case CONFTYPE_STRATEGY:
4124 case CONFTYPE_TAPERALGO:
4125 case CONFTYPE_PRIORITY:
4126 valdst->v.i = valsrc->v.i;
4130 valdst->v.l = valsrc->v.l;
4134 valdst->v.size = valsrc->v.size;
4138 valdst->v.am64 = valsrc->v.am64;
4142 valdst->v.r = valsrc->v.r;
4146 valdst->v.rate[0] = valsrc->v.rate[0];
4147 valdst->v.rate[1] = valsrc->v.rate[1];
4150 case CONFTYPE_IDENT:
4151 case CONFTYPE_STRING:
4152 valdst->v.s = stralloc(valsrc->v.s);
4156 valdst->v.t = valsrc->v.t;
4160 valdst->v.sl = duplicate_sl(valsrc->v.sl);
4163 case CONFTYPE_EXINCLUDE:
4164 valdst->v.exinclude.optional = valsrc->v.exinclude.optional;
4165 valdst->v.exinclude.sl_list = duplicate_sl(valsrc->v.exinclude.sl_list);
4166 valdst->v.exinclude.sl_file = duplicate_sl(valsrc->v.exinclude.sl_file);
4169 case CONFTYPE_INTRANGE:
4170 valdst->v.intrange[0] = valsrc->v.intrange[0];
4171 valdst->v.intrange[1] = valsrc->v.intrange[1];
4185 case CONFTYPE_COMPRESS:
4186 case CONFTYPE_ENCRYPT:
4187 case CONFTYPE_HOLDING:
4188 case CONFTYPE_ESTIMATE:
4189 case CONFTYPE_STRATEGY:
4191 case CONFTYPE_TAPERALGO:
4192 case CONFTYPE_PRIORITY:
4197 case CONFTYPE_INTRANGE:
4200 case CONFTYPE_IDENT:
4201 case CONFTYPE_STRING:
4212 case CONFTYPE_EXINCLUDE:
4213 free_sl(val->v.exinclude.sl_list);
4214 free_sl(val->v.exinclude.sl_file);
4224 if(taperalgo == ALGO_FIRST) return "FIRST";
4225 if(taperalgo == ALGO_FIRSTFIT) return "FIRSTFIT";
4226 if(taperalgo == ALGO_LARGEST) return "LARGEST";
4227 if(taperalgo == ALGO_LARGESTFIT) return "LARGESTFIT";
4228 if(taperalgo == ALGO_SMALLEST) return "SMALLEST";
4229 if(taperalgo == ALGO_LAST) return "LAST";
4233 static char buffer_conf_print[2049];
4244 buffer_conf_print[0] = '\0';
4245 snprintf(buffer_conf_print, SIZEOF(buffer_conf_print), prefix);
4246 free_space = SIZEOF(buffer_conf_print) - strlen(buffer_conf_print);
4247 buf = buffer_conf_print + strlen(buffer_conf_print);
4250 snprintf(buf, free_space, "%d", val->v.i);
4254 snprintf(buf, free_space, "%ld", val->v.l);
4258 snprintf(buf, free_space, SSIZE_T_FMT, (SSIZE_T_FMT_TYPE)val->v.size);
4262 snprintf(buf, free_space, OFF_T_FMT, (OFF_T_FMT_TYPE)val->v.am64);
4266 snprintf(buf, free_space, "%0.5f" , val->v.r);
4270 snprintf(buf, free_space, "%0.5f %0.5f",
4271 val->v.rate[0], val->v.rate[1]);
4274 case CONFTYPE_INTRANGE:
4275 snprintf(buf, free_space, "%d,%d",
4276 val->v.intrange[0], val->v.intrange[1]);
4279 case CONFTYPE_IDENT:
4281 strncpy(buf, val->v.s, free_space);
4285 case CONFTYPE_STRING:
4286 if(str_need_quote) {
4290 strncpy(buf, val->v.s, free_space);
4291 buffer_conf_print[SIZEOF(buffer_conf_print) - 2] = '\0';
4292 buffer_conf_print[strlen(buffer_conf_print)] = '"';
4293 buffer_conf_print[strlen(buffer_conf_print) + 1] = '\0';
4301 strncpy(buf, val->v.s, free_space);
4307 snprintf(buf, free_space, "%2d%02d",
4308 (int)val->v.t/100, (int)val->v.t % 100);
4314 case CONFTYPE_EXINCLUDE:
4315 buf = buffer_conf_print;
4316 free_space = SIZEOF(buffer_conf_print);
4318 conf_print_exinclude(val, 1, 0, prefix, &buf ,&free_space);
4322 conf_print_exinclude(val, 1, 1, prefix, &buf, &free_space);
4327 strncpy(buf, "yes", free_space);
4329 strncpy(buf, "no", free_space);
4332 case CONFTYPE_STRATEGY:
4335 strncpy(buf, "SKIP", free_space);
4339 strncpy(buf, "STANDARD", free_space);
4343 strncpy(buf, "NOFULL", free_space);
4347 strncpy(buf, "NOINC", free_space);
4351 strncpy(buf, "HANOI", free_space);
4355 strncpy(buf, "INCRONLY", free_space);
4360 case CONFTYPE_COMPRESS:
4363 strncpy(buf, "NONE", free_space);
4367 strncpy(buf, "CLIENT FAST", free_space);
4371 strncpy(buf, "CLIENT BEST", free_space);
4375 strncpy(buf, "CLIENT CUSTOM", free_space);
4378 case COMP_SERVER_FAST:
4379 strncpy(buf, "SERVER FAST", free_space);
4382 case COMP_SERVER_BEST:
4383 strncpy(buf, "SERVER FAST", free_space);
4386 case COMP_SERVER_CUST:
4387 strncpy(buf, "SERVER CUSTOM", free_space);
4392 case CONFTYPE_ESTIMATE:
4395 strncpy(buf, "CLIENT", free_space);
4399 strncpy(buf, "SERVER", free_space);
4403 strncpy(buf, "CALCSIZE", free_space);
4408 case CONFTYPE_ENCRYPT:
4411 strncpy(buf, "NONE", free_space);
4415 strncpy(buf, "CLIENT", free_space);
4418 case ENCRYPT_SERV_CUST:
4419 strncpy(buf, "SERVER", free_space);
4424 case CONFTYPE_HOLDING:
4427 strncpy(buf, "NEVER", free_space);
4431 strncpy(buf, "AUTO", free_space);
4435 strncpy(buf, "REQUIRED", free_space);
4440 case CONFTYPE_TAPERALGO:
4441 strncpy(buf, taperalgo2str(val->v.i), free_space);
4444 case CONFTYPE_PRIORITY:
4447 strncpy(buf, "LOW", free_space);
4451 strncpy(buf, "MEDIUM", free_space);
4455 strncpy(buf, "HIGH", free_space);
4460 buffer_conf_print[SIZEOF(buffer_conf_print) - 1] = '\0';
4461 return buffer_conf_print;
4464 void conf_print_exinclude(
4475 (void)str_need_quote;
4477 snprintf(*buf, *free_space, prefix);
4478 *free_space -= strlen(prefix);
4479 *buf += strlen(prefix);
4481 if (val->type != CONFTYPE_EXINCLUDE) {
4483 "ERROR: conf_print_exinclude called for type != CONFTYPE_EXINCLUDE");
4488 sl = val->v.exinclude.sl_list;
4489 strncpy(*buf, "LIST ", *free_space);
4493 sl = val->v.exinclude.sl_file;
4494 strncpy(*buf, "FILE ", *free_space);
4499 if (val->v.exinclude.optional == 1) {
4500 strncpy(*buf, "OPTIONAL ", *free_space);
4506 for(excl = sl->first; excl != NULL; excl = excl->next) {
4507 if (3 + (int)strlen(excl->name) < *free_space) {
4510 strcpy(*buf, excl->name);
4511 *buf += strlen(excl->name);
4513 *free_space -= 3 + strlen(excl->name);
4527 val->type = CONFTYPE_STRING;
4529 val->v.s = stralloc(s);
4540 val->type = CONFTYPE_IDENT;
4542 val->v.s = stralloc(s);
4553 val->type = CONFTYPE_INT;
4563 val->type = CONFTYPE_BOOL;
4573 val->type = CONFTYPE_STRATEGY;
4583 val->type = CONFTYPE_ESTIMATE;
4588 conf_init_taperalgo(
4593 val->type = CONFTYPE_TAPERALGO;
4603 val->type = CONFTYPE_PRIORITY;
4613 val->type = CONFTYPE_COMPRESS;
4623 val->type = CONFTYPE_ENCRYPT;
4630 dump_holdingdisk_t i)
4633 val->type = CONFTYPE_HOLDING;
4644 val->type = CONFTYPE_LONG;
4655 val->type = CONFTYPE_SIZE;
4665 val->type = CONFTYPE_AM64;
4675 val->type = CONFTYPE_REAL;
4686 val->type = CONFTYPE_RATE;
4687 val->v.rate[0] = r1;
4688 val->v.rate[1] = r2;
4698 val->type = CONFTYPE_INTRANGE;
4699 val->v.intrange[0] = i1;
4700 val->v.intrange[1] = i2;
4709 val->type = CONFTYPE_TIME;
4720 val->type = CONFTYPE_AM64;
4726 conf_init_exinclude(
4730 val->type = CONFTYPE_EXINCLUDE;
4731 val->v.exinclude.optional = 0;
4732 val->v.exinclude.sl_list = NULL;
4733 val->v.exinclude.sl_file = NULL;
4742 val->type = CONFTYPE_STRING;
4744 val->v.s = stralloc(s);
4754 val->type = CONFTYPE_INT;
4765 val->type = CONFTYPE_BOOL;
4775 val->type = CONFTYPE_COMPRESS;
4786 val->type = CONFTYPE_COMPRESS;
4794 dump_holdingdisk_t i)
4797 val->type = CONFTYPE_HOLDING;
4807 val->type = CONFTYPE_STRATEGY;
4816 if (val->type != CONFTYPE_INT) {
4817 error("get_conftype_int: val.type is not CONFTYPE_INT");
4827 if (val->type != CONFTYPE_LONG) {
4828 error("get_conftype_long: val.type is not CONFTYPE_LONG");
4838 if (val->type != CONFTYPE_AM64) {
4839 error("get_conftype_am64: val.type is not CONFTYPE_AM64");
4849 if (val->type != CONFTYPE_REAL) {
4850 error("get_conftype_real: val.type is not CONFTYPE_REAL");
4857 get_conftype_string(
4860 if (val->type != CONFTYPE_STRING) {
4861 error("get_conftype_string: val.type is not CONFTYPE_STRING");
4871 if (val->type != CONFTYPE_IDENT) {
4872 error("get_conftype_ident: val.type is not CONFTYPE_IDENT");
4882 if (val->type != CONFTYPE_TIME) {
4883 error("get_conftype_time: val.type is not CONFTYPE_TIME");
4893 if (val->type != CONFTYPE_SIZE) {
4894 error("get_conftype_size: val.type is not CONFTYPE_SIZE");
4904 if (val->type != CONFTYPE_SL) {
4905 error("get_conftype_size: val.type is not CONFTYPE_SL");
4915 if (val->type != CONFTYPE_BOOL) {
4916 error("get_conftype_bool: val.type is not CONFTYPE_BOOL");
4926 if (val->type != CONFTYPE_HOLDING) {
4927 error("get_conftype_hold: val.type is not CONFTYPE_HOLDING");
4934 get_conftype_compress(
4937 if (val->type != CONFTYPE_COMPRESS) {
4938 error("get_conftype_compress: val.type is not CONFTYPE_COMPRESS");
4945 get_conftype_encrypt(
4948 if (val->type != CONFTYPE_ENCRYPT) {
4949 error("get_conftype_encrypt: val.type is not CONFTYPE_ENCRYPT");
4956 get_conftype_estimate(
4959 if (val->type != CONFTYPE_ESTIMATE) {
4960 error("get_conftype_extimate: val.type is not CONFTYPE_ESTIMATE");
4967 get_conftype_strategy(
4970 if (val->type != CONFTYPE_STRATEGY) {
4971 error("get_conftype_strategy: val.type is not CONFTYPE_STRATEGY");
4978 get_conftype_taperalgo(
4981 if (val->type != CONFTYPE_TAPERALGO) {
4982 error("get_conftype_taperalgo: val.type is not CONFTYPE_TAPERALGO");
4989 get_conftype_priority(
4992 if (val->type != CONFTYPE_PRIORITY) {
4993 error("get_conftype_priority: val.type is not CONFTYPE_PRIORITY");
5000 get_conftype_exinclude(
5003 if (val->type != CONFTYPE_EXINCLUDE) {
5004 error("get_conftype_exinclude: val.type is not CONFTYPE_EXINCLUDE");
5007 return val->v.exinclude;
5013 command_option_t *command_options,
5014 t_conf_var *read_var,
5020 void (*copy_function)(void))
5023 int saved_conf_line_num;
5027 get_conftoken(CONF_LBRACE);
5028 get_conftoken(CONF_NL);
5034 get_conftoken(CONF_ANY);
5039 case CONF_NL: /* empty line */
5041 case CONF_END: /* end of file */
5049 conf_parserror("ident not expected");
5053 for(np = read_var; np->token != CONF_UNKNOWN; np++)
5054 if(np->token == tok) break;
5056 if(np->token == CONF_UNKNOWN)
5057 conf_parserror(errormsg);
5059 np->read_function(np, &valarray[np->parm]);
5061 np->validate(np, &valarray[np->parm]);
5065 if(tok != CONF_NL && tok != CONF_END && tok != CONF_RBRACE)
5066 get_conftoken(CONF_NL);
5069 /* overwrite with command line option */
5070 saved_conf_line_num = conf_line_num;
5071 command_overwrite(command_options, read_var, keytab, valarray, prefix);
5072 conf_line_num = saved_conf_line_num;
5077 command_option_t *command_options,
5078 t_conf_var *overwrite_var,
5086 command_option_t *command_option;
5089 if(!command_options) return;
5091 for(np = overwrite_var; np->token != CONF_UNKNOWN; np++) {
5092 for(kt = keytab; kt->token != CONF_UNKNOWN; kt++)
5093 if(kt->token == np->token) break;
5095 if(kt->token == CONF_UNKNOWN) {
5096 error("command_overwrite: invalid token");
5100 for(command_option = command_options; command_option->name != NULL;
5102 myprefix = stralloc2(prefix, kt->keyword);
5103 if(strcasecmp(myprefix, command_option->name) == 0) {
5105 if (command_option->used == 0 &&
5106 valarray[np->parm].seen == -2) {
5109 command_option->used = 1;
5110 valarray[np->parm].seen = -2;
5111 if(np->type == CONFTYPE_STRING &&
5112 command_option->value[0] != '"') {
5113 conf_line = vstralloc("\"", command_option->value, "\"",
5117 conf_line = stralloc(command_option->value);
5119 conf_char = conf_line;
5122 np->read_function(np, &valarray[np->parm]);
5124 conf_line = conf_char = NULL;
5127 np->validate(np, &valarray[np->parm]);
5128 if (duplicate == 1) {
5129 fprintf(stderr,"Duplicate %s option, using %s\n",
5130 command_option->name, command_option->value);
5144 for(i=0; i<new_argc; i++)
5145 amfree(new_argv[i]);
5150 getconf_readblocksize(void)
5153 char *conf_tapetype;
5155 if (conffile_init == 1) {
5156 conf_tapetype = getconf_str(CNF_TAPETYPE);
5158 if (!conf_tapetype || strlen(conf_tapetype) == 0)
5159 return MAX_TAPE_BLOCK_KB;
5161 tape = lookup_tapetype(conf_tapetype);
5163 return MAX_TAPE_BLOCK_KB;
5164 return tapetype_get_readblocksize(tape);
5167 return MAX_TAPE_BLOCK_KB;