1/*
2 * Copyright (c) 2007-2013 Zmanda, Inc.  All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 *
18 * Contact information: Zmanda Inc., 465 S. Mathilda Ave., Suite 300
19 * Sunnyvale, CA 94085, USA, or: http://www.zmanda.com
20 */
21
22%module "Amanda::Config"
23%include "amglue/amglue.swg"
24%include "exception.i"
25
26%include "Amanda/Config.pod"
27
28%{
29#include "conffile.h"
30%}
31
32/*
33 * Documentation Macro
34 */
35
36%define constant_pod(DESCRIPTION, FORALL_FN)
37%perlcode %{
38
39use Amanda::Config::FoldingHash;
40
41=pod
42
43DESCRIPTION: amglue_constants_list(FORALL_FN)
44
45=cut
46%}
47%enddef
48
49/*
50 * Parameter access
51*/
52
53/* All of the CNF_ flags from conffile.h */
54
55#define FOR_ALL_CONFPARM_KEY(APPLY)\
56APPLY(CNF_ORG)\
57APPLY(CNF_CONF)\
58APPLY(CNF_AMDUMP_SERVER)\
59APPLY(CNF_INDEX_SERVER)\
60APPLY(CNF_TAPE_SERVER)\
61APPLY(CNF_AUTH)\
62APPLY(CNF_SSH_KEYS)\
63APPLY(CNF_AMANDAD_PATH)\
64APPLY(CNF_CLIENT_USERNAME)\
65APPLY(CNF_CLIENT_PORT)\
66APPLY(CNF_GNUTAR_LIST_DIR)\
67APPLY(CNF_AMANDATES)\
68APPLY(CNF_MAILER)\
69APPLY(CNF_MAILTO)\
70APPLY(CNF_DUMPUSER)\
71APPLY(CNF_TAPEDEV)\
72APPLY(CNF_DEVICE_PROPERTY)\
73APPLY(CNF_PROPERTY)\
74APPLY(CNF_CHANGERDEV)\
75APPLY(CNF_CHANGERFILE)\
76APPLY(CNF_LABELSTR)\
77APPLY(CNF_AUTOLABEL)\
78APPLY(CNF_META_AUTOLABEL)\
79APPLY(CNF_TAPELIST)\
80APPLY(CNF_DISKFILE)\
81APPLY(CNF_INFOFILE)\
82APPLY(CNF_LOGDIR)\
83APPLY(CNF_INDEXDIR)\
84APPLY(CNF_TAPETYPE)\
85APPLY(CNF_DUMPCYCLE)\
86APPLY(CNF_RUNSPERCYCLE)\
87APPLY(CNF_TAPECYCLE)\
88APPLY(CNF_NETUSAGE)\
89APPLY(CNF_INPARALLEL)\
90APPLY(CNF_DUMPORDER)\
91APPLY(CNF_BUMPPERCENT)\
92APPLY(CNF_BUMPSIZE)\
93APPLY(CNF_BUMPMULT)\
94APPLY(CNF_BUMPDAYS)\
95APPLY(CNF_TPCHANGER)\
96APPLY(CNF_RUNTAPES)\
97APPLY(CNF_MAX_DLE_BY_VOLUME)\
98APPLY(CNF_MAXDUMPS)\
99APPLY(CNF_ETIMEOUT)\
100APPLY(CNF_DTIMEOUT)\
101APPLY(CNF_CTIMEOUT)\
102APPLY(CNF_DEVICE_OUTPUT_BUFFER_SIZE)\
103APPLY(CNF_PRINTER)\
104APPLY(CNF_AUTOFLUSH)\
105APPLY(CNF_RESERVE)\
106APPLY(CNF_MAXDUMPSIZE)\
107APPLY(CNF_COLUMNSPEC)\
108APPLY(CNF_AMRECOVER_DO_FSF)\
109APPLY(CNF_AMRECOVER_CHECK_LABEL)\
110APPLY(CNF_AMRECOVER_CHANGER)\
111APPLY(CNF_TAPERALGO)\
112APPLY(CNF_FLUSH_THRESHOLD_DUMPED)\
113APPLY(CNF_FLUSH_THRESHOLD_SCHEDULED)\
114APPLY(CNF_TAPERFLUSH)\
115APPLY(CNF_DISPLAYUNIT)\
116APPLY(CNF_KRB5KEYTAB)\
117APPLY(CNF_KRB5PRINCIPAL)\
118APPLY(CNF_LABEL_NEW_TAPES)\
119APPLY(CNF_USETIMESTAMPS)\
120APPLY(CNF_REP_TRIES)\
121APPLY(CNF_CONNECT_TRIES)\
122APPLY(CNF_REQ_TRIES)\
123APPLY(CNF_DEBUG_AMANDAD)\
124APPLY(CNF_DEBUG_RECOVERY)\
125APPLY(CNF_DEBUG_AMIDXTAPED)\
126APPLY(CNF_DEBUG_AMINDEXD)\
127APPLY(CNF_DEBUG_AMRECOVER)\
128APPLY(CNF_DEBUG_AUTH)\
129APPLY(CNF_DEBUG_EVENT)\
130APPLY(CNF_DEBUG_HOLDING)\
131APPLY(CNF_DEBUG_PROTOCOL)\
132APPLY(CNF_DEBUG_PLANNER)\
133APPLY(CNF_DEBUG_DRIVER)\
134APPLY(CNF_DEBUG_DUMPER)\
135APPLY(CNF_DEBUG_CHUNKER)\
136APPLY(CNF_DEBUG_TAPER)\
137APPLY(CNF_DEBUG_SELFCHECK)\
138APPLY(CNF_DEBUG_SENDSIZE)\
139APPLY(CNF_DEBUG_SENDBACKUP)\
140APPLY(CNF_RESERVED_UDP_PORT)\
141APPLY(CNF_RESERVED_TCP_PORT)\
142APPLY(CNF_UNRESERVED_TCP_PORT)\
143APPLY(CNF_HOLDINGDISK)\
144APPLY(CNF_SEND_AMREPORT_ON)\
145APPLY(CNF_TAPER_PARALLEL_WRITE)\
146APPLY(CNF_RECOVERY_LIMIT) \
147APPLY(CNF_INTERACTIVITY) \
148APPLY(CNF_TAPERSCAN) \
149APPLY(CNF_EJECT_VOLUME) \
150APPLY(CNF_TMPDIR) \
151APPLY(CNF_REPORT_USE_MEDIA) \
152APPLY(CNF_REPORT_NEXT_MEDIA) \
153APPLY(CNF_REPORT_FORMAT)
154
155amglue_add_enum_tag_fns(confparm_key);
156amglue_add_constants(FOR_ALL_CONFPARM_KEY, confparm_key);
157amglue_copy_to_tag(confparm_key, getconf);
158constant_pod(Global Parameters, FOR_ALL_CONFPARM_KEY)
159
160#define FOR_ALL_TAPETYPE_KEY(APPLY)\
161APPLY(TAPETYPE_COMMENT)\
162APPLY(TAPETYPE_LBL_TEMPL)\
163APPLY(TAPETYPE_BLOCKSIZE)\
164APPLY(TAPETYPE_READBLOCKSIZE)\
165APPLY(TAPETYPE_LENGTH)\
166APPLY(TAPETYPE_FILEMARK)\
167APPLY(TAPETYPE_SPEED)\
168APPLY(TAPETYPE_PART_SIZE)\
169APPLY(TAPETYPE_PART_CACHE_TYPE)\
170APPLY(TAPETYPE_PART_CACHE_DIR)\
171APPLY(TAPETYPE_PART_CACHE_MAX_SIZE)
172
173amglue_add_enum_tag_fns(tapetype_key);
174amglue_add_constants(FOR_ALL_TAPETYPE_KEY, tapetype_key);
175amglue_copy_to_tag(tapetype_key, getconf);
176constant_pod(Tapetype Parameters, FOR_ALL_TAPETYPE_KEY)
177
178#define FOR_ALL_DUMPTYPE_KEY(APPLY)\
179APPLY(DUMPTYPE_COMMENT)\
180APPLY(DUMPTYPE_PROGRAM)\
181APPLY(DUMPTYPE_SRVCOMPPROG)\
182APPLY(DUMPTYPE_CLNTCOMPPROG)\
183APPLY(DUMPTYPE_SRV_ENCRYPT)\
184APPLY(DUMPTYPE_CLNT_ENCRYPT)\
185APPLY(DUMPTYPE_AMANDAD_PATH)\
186APPLY(DUMPTYPE_CLIENT_USERNAME)\
187APPLY(DUMPTYPE_CLIENT_PORT)\
188APPLY(DUMPTYPE_SSH_KEYS)\
189APPLY(DUMPTYPE_AUTH)\
190APPLY(DUMPTYPE_EXCLUDE)\
191APPLY(DUMPTYPE_INCLUDE)\
192APPLY(DUMPTYPE_PRIORITY)\
193APPLY(DUMPTYPE_DUMPCYCLE)\
194APPLY(DUMPTYPE_MAXDUMPS)\
195APPLY(DUMPTYPE_MAXPROMOTEDAY)\
196APPLY(DUMPTYPE_BUMPPERCENT)\
197APPLY(DUMPTYPE_BUMPSIZE)\
198APPLY(DUMPTYPE_BUMPDAYS)\
199APPLY(DUMPTYPE_BUMPMULT)\
200APPLY(DUMPTYPE_STARTTIME)\
201APPLY(DUMPTYPE_STRATEGY)\
202APPLY(DUMPTYPE_ESTIMATELIST)\
203APPLY(DUMPTYPE_COMPRESS)\
204APPLY(DUMPTYPE_ENCRYPT)\
205APPLY(DUMPTYPE_SRV_DECRYPT_OPT)\
206APPLY(DUMPTYPE_CLNT_DECRYPT_OPT)\
207APPLY(DUMPTYPE_COMPRATE)\
208APPLY(DUMPTYPE_TAPE_SPLITSIZE)\
209APPLY(DUMPTYPE_FALLBACK_SPLITSIZE)\
210APPLY(DUMPTYPE_SPLIT_DISKBUFFER)\
211APPLY(DUMPTYPE_RECORD)\
212APPLY(DUMPTYPE_SKIP_INCR)\
213APPLY(DUMPTYPE_SKIP_FULL)\
214APPLY(DUMPTYPE_HOLDINGDISK)\
215APPLY(DUMPTYPE_KENCRYPT)\
216APPLY(DUMPTYPE_IGNORE)\
217APPLY(DUMPTYPE_INDEX)\
218APPLY(DUMPTYPE_APPLICATION)\
219APPLY(DUMPTYPE_SCRIPTLIST)\
220APPLY(DUMPTYPE_PROPERTY)\
221APPLY(DUMPTYPE_DATA_PATH)\
222APPLY(DUMPTYPE_ALLOW_SPLIT)\
223APPLY(DUMPTYPE_MAX_WARNINGS)\
224APPLY(DUMPTYPE_RECOVERY_LIMIT) \
225APPLY(DUMPTYPE_DUMP_LIMIT)
226
227amglue_add_enum_tag_fns(dumptype_key);
228amglue_add_constants(FOR_ALL_DUMPTYPE_KEY, dumptype_key);
229amglue_copy_to_tag(dumptype_key, getconf);
230constant_pod(Dumptype Parameters, FOR_ALL_DUMPTYPE_KEY)
231
232#define FOR_ALL_INTERFACE_KEY(APPLY)\
233APPLY(INTER_COMMENT)\
234APPLY(INTER_MAXUSAGE)
235
236amglue_add_enum_tag_fns(interface_key);
237amglue_add_constants(FOR_ALL_INTERFACE_KEY, interface_key);
238amglue_copy_to_tag(interface_key, getconf);
239constant_pod(Dumptype Parameters, FOR_ALL_INTERFACE_KEY)
240
241#define FOR_ALL_HOLDINGDISK_KEY(APPLY)\
242APPLY(HOLDING_COMMENT)\
243APPLY(HOLDING_DISKDIR)\
244APPLY(HOLDING_DISKSIZE)\
245APPLY(HOLDING_CHUNKSIZE)
246
247amglue_add_enum_tag_fns(holdingdisk_key);
248amglue_add_constants(FOR_ALL_HOLDINGDISK_KEY, holdingdisk_key);
249amglue_copy_to_tag(holdingdisk_key, getconf);
250constant_pod(Holdingdisk Parameters, FOR_ALL_HOLDINGDISK_KEY)
251
252#define FOR_ALL_APPLICATION_KEY(APPLY)\
253APPLY(APPLICATION_COMMENT)\
254APPLY(APPLICATION_PLUGIN)\
255APPLY(APPLICATION_PROPERTY) \
256APPLY(APPLICATION_CLIENT_NAME)
257
258amglue_add_enum_tag_fns(application_key);
259amglue_add_constants(FOR_ALL_APPLICATION_KEY, application_key);
260amglue_copy_to_tag(application_key, getconf);
261constant_pod(Application Parameters, FOR_ALL_APPLICATION_KEY)
262
263#define FOR_ALL_PP_SCRIPT_KEY(APPLY)\
264APPLY(PP_SCRIPT_COMMENT)\
265APPLY(PP_SCRIPT_PLUGIN)\
266APPLY(PP_SCRIPT_PROPERTY)\
267APPLY(PP_SCRIPT_EXECUTE_ON)\
268APPLY(PP_SCRIPT_EXECUTE_WHERE)\
269APPLY(PP_SCRIPT_ORDER)\
270APPLY(PP_SCRIPT_SINGLE_EXECUTION)\
271APPLY(PP_SCRIPT_CLIENT_NAME)
272
273amglue_add_enum_tag_fns(pp_script_key);
274amglue_add_constants(FOR_ALL_PP_SCRIPT_KEY, pp_script_key);
275amglue_copy_to_tag(pp_script_key, getconf);
276constant_pod(Pre/Post-Script Parameters, FOR_ALL_PP_SCRIPT_KEY)
277
278#define FOR_ALL_DEVICE_CONFIG_KEY(APPLY)\
279APPLY(DEVICE_CONFIG_COMMENT)\
280APPLY(DEVICE_CONFIG_TAPEDEV)\
281APPLY(DEVICE_CONFIG_DEVICE_PROPERTY)
282
283amglue_add_enum_tag_fns(device_config_key);
284amglue_add_constants(FOR_ALL_DEVICE_CONFIG_KEY, device_config_key);
285amglue_copy_to_tag(device_config_key, getconf);
286constant_pod(Pre/Post-Script Parameters, FOR_ALL_DEVICE_CONFIG_KEY)
287
288#define FOR_ALL_CHANGER_CONFIG_KEY(APPLY)\
289APPLY(CHANGER_CONFIG_COMMENT)\
290APPLY(CHANGER_CONFIG_TAPEDEV)\
291APPLY(CHANGER_CONFIG_TPCHANGER)\
292APPLY(CHANGER_CONFIG_CHANGERDEV)\
293APPLY(CHANGER_CONFIG_CHANGERFILE)\
294APPLY(CHANGER_CONFIG_PROPERTY)\
295APPLY(CHANGER_CONFIG_DEVICE_PROPERTY)
296
297amglue_add_enum_tag_fns(changer_config_key);
298amglue_add_constants(FOR_ALL_CHANGER_CONFIG_KEY, changer_config_key);
299amglue_copy_to_tag(changer_config_key, getconf);
300constant_pod(Pre/Post-Script Parameters, FOR_ALL_CHANGER_CONFIG_KEY)
301
302#define FOR_ALL_INTERACTIVITY_KEY(APPLY)\
303APPLY(INTERACTIVITY_COMMENT)\
304APPLY(INTERACTIVITY_PLUGIN)\
305APPLY(INTERACTIVITY_PROPERTY)
306
307amglue_add_enum_tag_fns(interactivity_key);
308amglue_add_constants(FOR_ALL_INTERACTIVITY_KEY, interactivity_key);
309amglue_copy_to_tag(interactivity_key, getconf);
310constant_pod(Interactivity Parameters, FOR_ALL_INTERACTIVITY_KEY)
311
312#define FOR_ALL_TAPERSCAN_KEY(APPLY)\
313APPLY(TAPERSCAN_COMMENT)\
314APPLY(TAPERSCAN_PLUGIN)\
315APPLY(TAPERSCAN_PROPERTY)
316
317amglue_add_enum_tag_fns(taperscan_key);
318amglue_add_constants(FOR_ALL_TAPERSCAN_KEY, taperscan_key);
319amglue_copy_to_tag(taperscan_key, getconf);
320constant_pod(Taperscan Parameters, FOR_ALL_TAPERSCAN_KEY)
321
322/*
323 * Various enumerated conftypes
324 */
325
326amglue_add_enum_tag_fns(dump_holdingdisk_t);
327amglue_add_constant(HOLD_NEVER, dump_holdingdisk_t);
328amglue_add_constant(HOLD_AUTO, dump_holdingdisk_t);
329amglue_add_constant(HOLD_REQUIRED, dump_holdingdisk_t);
330amglue_copy_to_tag(dump_holdingdisk_t, getconf);
331
332amglue_add_enum_tag_fns(comp_t);
333amglue_add_constant(COMP_NONE, comp_t);
334amglue_add_constant(COMP_FAST, comp_t);
335amglue_add_constant(COMP_BEST, comp_t);
336amglue_add_constant(COMP_CUST, comp_t);
337amglue_add_constant(COMP_SERVER_FAST, comp_t);
338amglue_add_constant(COMP_SERVER_BEST, comp_t);
339amglue_add_constant(COMP_SERVER_CUST, comp_t);
340amglue_copy_to_tag(comp_t, getconf);
341
342amglue_add_enum_tag_fns(encrypt_t);
343amglue_add_constant(ENCRYPT_NONE, encrypt_t);
344amglue_add_constant(ENCRYPT_CUST, encrypt_t);
345amglue_add_constant(ENCRYPT_SERV_CUST, encrypt_t);
346amglue_copy_to_tag(encrypt_t, getconf);
347
348amglue_add_enum_tag_fns(strategy_t);
349amglue_add_constant(DS_SKIP, strategy_t);
350amglue_add_constant(DS_STANDARD, strategy_t);
351amglue_add_constant(DS_NOFULL, strategy_t);
352amglue_add_constant(DS_NOINC, strategy_t);
353amglue_add_constant(DS_4, strategy_t);
354amglue_add_constant(DS_5, strategy_t);
355amglue_add_constant(DS_HANOI, strategy_t);
356amglue_add_constant(DS_INCRONLY, strategy_t);
357amglue_copy_to_tag(strategy_t, getconf);
358
359amglue_add_enum_tag_fns(estimate_t);
360amglue_add_constant(ES_CLIENT, estimate_t);
361amglue_add_constant(ES_SERVER, estimate_t);
362amglue_add_constant(ES_CALCSIZE, estimate_t);
363amglue_copy_to_tag(estimate_t, getconf);
364
365amglue_add_enum_tag_fns(autolabel_enum_t);
366amglue_add_constant(AL_OTHER_CONFIG, autolabel_enum_t);
367amglue_add_constant(AL_NON_AMANDA, autolabel_enum_t);
368amglue_add_constant(AL_VOLUME_ERROR, autolabel_enum_t);
369amglue_add_constant(AL_EMPTY, autolabel_enum_t);
370amglue_copy_to_tag(autolabel_enum_t, getconf);
371
372amglue_add_enum_tag_fns(taperalgo_t);
373amglue_add_constant(ALGO_FIRST, taperalgo_t);
374amglue_add_constant(ALGO_FIRSTFIT, taperalgo_t);
375amglue_add_constant(ALGO_LARGEST, taperalgo_t);
376amglue_add_constant(ALGO_LARGESTFIT, taperalgo_t);
377amglue_add_constant(ALGO_SMALLEST, taperalgo_t);
378amglue_add_constant(ALGO_LAST, taperalgo_t);
379amglue_copy_to_tag(taperalgo_t, getconf);
380
381amglue_add_enum_tag_fns(execute_on_t);
382amglue_add_constant(EXECUTE_ON_PRE_AMCHECK, execute_on_t);
383amglue_add_constant(EXECUTE_ON_PRE_DLE_AMCHECK, execute_on_t);
384amglue_add_constant(EXECUTE_ON_PRE_HOST_AMCHECK, execute_on_t);
385amglue_add_constant(EXECUTE_ON_POST_AMCHECK, execute_on_t);
386amglue_add_constant(EXECUTE_ON_POST_DLE_AMCHECK, execute_on_t);
387amglue_add_constant(EXECUTE_ON_POST_HOST_AMCHECK, execute_on_t);
388amglue_add_constant(EXECUTE_ON_PRE_ESTIMATE, execute_on_t);
389amglue_add_constant(EXECUTE_ON_PRE_DLE_ESTIMATE, execute_on_t);
390amglue_add_constant(EXECUTE_ON_PRE_HOST_ESTIMATE, execute_on_t);
391amglue_add_constant(EXECUTE_ON_POST_ESTIMATE, execute_on_t);
392amglue_add_constant(EXECUTE_ON_POST_DLE_ESTIMATE, execute_on_t);
393amglue_add_constant(EXECUTE_ON_POST_HOST_ESTIMATE, execute_on_t);
394amglue_add_constant(EXECUTE_ON_PRE_BACKUP, execute_on_t);
395amglue_add_constant(EXECUTE_ON_PRE_DLE_BACKUP, execute_on_t);
396amglue_add_constant(EXECUTE_ON_PRE_HOST_BACKUP, execute_on_t);
397amglue_add_constant(EXECUTE_ON_POST_BACKUP, execute_on_t);
398amglue_add_constant(EXECUTE_ON_POST_DLE_BACKUP, execute_on_t);
399amglue_add_constant(EXECUTE_ON_POST_HOST_BACKUP, execute_on_t);
400amglue_copy_to_tag(execute_on_t, getconf);
401
402amglue_add_enum_tag_fns(send_amreport_on_t);
403amglue_add_constant(SEND_AMREPORT_ALL, send_amreport_on_t);
404amglue_add_constant(SEND_AMREPORT_STRANGE, send_amreport_on_t);
405amglue_add_constant(SEND_AMREPORT_ERROR, send_amreport_on_t);
406amglue_add_constant(SEND_AMREPORT_NEVER, send_amreport_on_t);
407amglue_copy_to_tag(send_amreport_on_t, getconf);
408
409amglue_add_enum_tag_fns(data_path_t);
410amglue_add_constant(DATA_PATH_AMANDA, data_path_t);
411amglue_add_constant(DATA_PATH_DIRECTTCP, data_path_t);
412amglue_copy_to_tag(data_path_t, getconf);
413
414amglue_add_enum_tag_fns(part_cache_type_t);
415amglue_add_constant(PART_CACHE_TYPE_NONE, part_cache_type_t);
416amglue_add_constant(PART_CACHE_TYPE_DISK, part_cache_type_t);
417amglue_add_constant(PART_CACHE_TYPE_MEMORY, part_cache_type_t);
418amglue_copy_to_tag(part_cache_type_t, getconf);
419
420/*
421 * val_t typemaps
422 */
423
424/* Typemap to convert a val_t to an SV, using a static function since it's huge.  This converts:
425 *  - CONFTYPE_SIZE, CONFTYPE_INT, CONFTYPE_INT64, CONFTYPE_NO_YES_ALL,
426 *    CONFTYPE_BOOLEAN -> IV
427 *  - CONFTYPE_REAL -> NV
428 *  - CONFTYPE_STR, CONFTYPE_IDENT -> PV
429 *  - CONFTYPE_APPLICATION -> PV
430 *  - CONFTYPE_TIME -> IV (epoch timestamp)
431 *  - CONFTYPE_COMPRESS, CONFTYPE_ENCRYPT, CONFTYPE_ESTIMATELIST, CONFTYPE_STRATEGY,
432 *    CONFTYPE_TAPERALGO, CONFTYPE_PRIORITY, CONFTYPE_HOLDING, CONFTYPE_EXECUTE_ON,
433 *    CONFTYPE_EXECUTE_WHERE, CONFTYPE_SEND_AMREPORT_ON,
434 *    CONFTYPE_DATA_PATH, CONFTYPE_PART_CACHE_TYPE -> IV (enums)
435 *  - CONFTYPE_RATE -> list of two NVs
436 *  - CONFTYPE_INTRANGE -> list of two IVs
437 *  - CONFTYPE_EXINCLUDE -> hashref with keys 'list' (listref), 'file' (listref),
438 *    and 'optional' (int)
439 *  - CONFTYPE_PROPLIST -> hashref of hashref with keys 'append' (IV), 'priority' (IV),
440 *							'values' (listref)
441 *  - CONFTYPE_HOST_LIMIT -> listref of match expressions;
442 *           "SAMEHOST-SAMEHOST-SAMEHOST" in list is taken to mean 'same-host'
443 *           "SERVER-SERVER-SERVER" in list is taken to mean 'server'
444 */
445
446%perlcode %{
447$LIMIT_SAMEHOST="SAMEHOST-SAMEHOST-SAMEHOST";
448$LIMIT_SERVER="SERVER-SERVER-SERVER";
449%}
450
451%{
452static int
453val_t_to_sv(val_t *val, SV **results) {
454    if (!val) {
455	results[0] = &PL_sv_undef;
456	return 1;
457    } else {
458	switch (val->type) {
459	    case CONFTYPE_RATE: {
460		results[0] = sv_newmortal();
461		sv_setnv(results[0], val_t__rate(val)[0]);
462
463		results[1] = sv_newmortal();
464		sv_setnv(results[1], val_t__rate(val)[1]);
465		return 2;
466	    }
467
468	    case CONFTYPE_INTRANGE: {
469		results[0] = sv_newmortal();
470		sv_setiv(results[0], val_t__intrange(val)[0]);
471
472		results[1] = sv_newmortal();
473		sv_setiv(results[1], val_t__intrange(val)[1]);
474		return 2;
475	    }
476
477	    case CONFTYPE_EXINCLUDE: {
478		/* exincludes are represented in perl as {
479		 *	'list' : [ 'list1', 'list2', ..],
480		 *	'file' : [ 'file1', 'file2', ..],
481		 *	'optional' : 1,
482		 * }
483		 */
484		exinclude_t *ei = &val_t__exinclude(val);
485		AV *list_entries = (AV *)sv_2mortal((SV *)newAV());
486		AV *file_entries = (AV *)sv_2mortal((SV *)newAV());
487		SV *optional = sv_newmortal();
488		HV *hv;
489		sle_t *iter;
490
491		/* first set up each of the hash values */
492
493		if (ei->sl_list) {
494		    for (iter = ei->sl_list->first; iter != NULL; iter = iter->next) {
495			av_push(list_entries, newSVpv(iter->name, 0));
496		    }
497		}
498
499		if(ei->sl_file) {
500		    for (iter = ei->sl_file->first; iter != NULL; iter = iter->next) {
501			av_push(file_entries, newSVpv(iter->name, 0));
502		    }
503		}
504
505		sv_setiv(optional, ei->optional);
506
507		/* now build the hash */
508		hv = (HV *)sv_2mortal((SV *)newHV());
509
510		hv_store(hv, "file", 4, newRV((SV *)file_entries), 0);
511		hv_store(hv, "list", 4, newRV((SV *)list_entries), 0);
512		hv_store(hv, "optional", 8, optional, 0);
513		SvREFCNT_inc(optional);
514
515		results[0] = sv_2mortal(newRV((SV *)hv));
516		return 1;
517	    }
518
519	    case CONFTYPE_PROPLIST:
520		results[0] = sv_2mortal(g_hash_table_to_hashref_property(val_t__proplist(val)));
521		return 1;
522
523	    case CONFTYPE_SIZE:
524		results[0] = sv_2mortal(amglue_newSVi64(val_t__size(val)));
525		return 1;
526
527	    case CONFTYPE_INT64:
528		results[0] = sv_2mortal(amglue_newSVi64(val_t__int64(val)));
529		return 1;
530
531	    case CONFTYPE_BOOLEAN:	    /* all same as INT.. */
532	    case CONFTYPE_NO_YES_ALL:
533	    case CONFTYPE_COMPRESS:
534	    case CONFTYPE_ENCRYPT:
535	    case CONFTYPE_STRATEGY:
536	    case CONFTYPE_TAPERALGO:
537	    case CONFTYPE_PRIORITY:
538	    case CONFTYPE_HOLDING:
539	    case CONFTYPE_EXECUTE_ON:
540	    case CONFTYPE_EXECUTE_WHERE:
541	    case CONFTYPE_SEND_AMREPORT_ON:
542	    case CONFTYPE_DATA_PATH:
543	    case CONFTYPE_PART_CACHE_TYPE:
544	    case CONFTYPE_INT:
545		results[0] = sv_2mortal(amglue_newSVi64(val_t__int(val)));
546		return 1;
547
548           case CONFTYPE_ESTIMATELIST: {
549		AV *elist = newAV();
550		estimatelist_t el;
551		for (el=val_t__estimatelist(val); el != NULL; el = el->next) {
552		    av_push(elist, newSVuv(GPOINTER_TO_INT(el->data)));
553		}
554		results[0] = sv_2mortal(newRV_noinc((SV *)elist));
555		return 1;
556	    }
557
558	    case CONFTYPE_TIME:
559		results[0] = sv_2mortal(amglue_newSVi64(val_t__time(val)));
560		return 1;
561
562	    case CONFTYPE_REAL:
563		results[0] = sv_newmortal();
564		sv_setnv(results[0], val_t__real(val));
565		return 1;
566
567	    case CONFTYPE_IDENT:	    /* same as STRING */
568	    case CONFTYPE_STR:
569	    case CONFTYPE_APPLICATION:
570		results[0] = sv_newmortal();
571		sv_setpv(results[0], val_t__str(val));
572		return 1;
573
574	    case CONFTYPE_IDENTLIST:
575	    case CONFTYPE_STR_LIST: {
576		AV *ilist = newAV();
577
578		identlist_t il;
579		for (il=val_t__identlist(val); il != NULL; il = il->next) {
580		    av_push(ilist, newSVpv((char *)il->data, 0));
581		}
582
583		results[0] = sv_2mortal(newRV_noinc((SV *)ilist));
584		return 1;
585	    }
586
587	    case CONFTYPE_HOST_LIMIT: {
588		AV *av;
589		GSList *iter;
590		host_limit_t *rl = &val_t__host_limit(val);
591
592		av = newAV();
593		if (rl->same_host)
594		    av_push(av, newSVpv("SAMEHOST-SAMEHOST-SAMEHOST", 0));
595		if (rl->server)
596		    av_push(av, newSVpv("SERVER-SERVER-SERVER", 0));
597		for (iter=rl->match_pats; iter != NULL; iter = iter->next) {
598		    av_push(av, newSVpv((char *)iter->data, 0));
599		}
600
601		results[0] = sv_2mortal(newRV_noinc((SV *)av));
602		return 1;
603	    }
604
605	    case CONFTYPE_AUTOLABEL: {
606		autolabel_t *autolabel = &val_t__autolabel(val);
607		HV *hv;
608
609		/* now build the hash */
610		hv = (HV *)sv_2mortal((SV *)newHV());
611		hv_store(hv, "template", 8,
612			(autolabel->template)? newSVpv(autolabel->template, 0) : newSV(0),
613			0);
614		hv_store(hv, "other_config", 12,
615			(autolabel->autolabel & AL_OTHER_CONFIG)? &PL_sv_yes : &PL_sv_no,
616			0);
617		hv_store(hv, "non_amanda", 10,
618			(autolabel->autolabel & AL_NON_AMANDA)? &PL_sv_yes : &PL_sv_no,
619			0);
620		hv_store(hv, "volume_error", 12,
621			(autolabel->autolabel & AL_VOLUME_ERROR)? &PL_sv_yes : &PL_sv_no,
622			0);
623		hv_store(hv, "empty", 5,
624			(autolabel->autolabel & AL_EMPTY)? &PL_sv_yes : &PL_sv_no,
625			0);
626
627		results[0] = sv_2mortal(newRV((SV *)hv));
628		return 1;
629	    }
630
631	    /* No match yet -> not one of the "complex" types */
632	    default:
633		SWIG_exception(SWIG_TypeError, "Unknown val_t conftype");
634		break;
635	}
636    }
637
638    return 0;
639
640fail:
641    SWIG_croak_null();
642}
643%}
644
645%typemap (out) val_t * {
646    SV *results[3], **iter;
647    int nresults;
648
649    /* save the stack, since val_t_to_sv may invoke arbitrary Perl code */
650    SP += argvi; PUTBACK;
651    nresults = val_t_to_sv($1, results);
652    SPAGAIN; SP -= argvi;
653    EXTEND(SP, nresults);
654
655    /* add val_t_to_sv's results to the stack */
656    for (iter = results; nresults; iter++, nresults--) {
657	$result = *iter;
658	argvi++;
659    }
660}
661
662/* Typemap for the return value of getconf_list; this assumes that
663 * the GSList contains strings, and that it should be freed; both
664 * are true for getconf_list.
665 */
666%typemap (out) GSList * {
667    GSList *it = $1;
668
669    EXTEND(SP, g_slist_length(it));
670    while (it) {
671	$result = sv_2mortal(newSVpv(it->data, 0));
672	argvi++;
673	it = it->next;
674    }
675
676    g_slist_free($1);
677}
678
679/* typedef and typemap for getconf_byname_strs, which is like getconf_byname,
680 * but converts the result with val_t_dispaly_strs
681 */
682%typemap (out) val_t_strs {
683    char **it = $1;
684
685    int count = 0;
686    while (it && *it) {
687	count++;
688	it++;
689    }
690    EXTEND(SP, count);
691
692    it = $1;
693    while (it && *it) {
694	$result = sv_2mortal(newSVpv(*it, 0));
695	argvi++;
696	it++;
697    }
698    g_strfreev($1);
699}
700
701data_path_t data_path_from_string(char *data);
702
703val_t *getconf(confparm_key key);
704gboolean getconf_seen(confparm_key key);
705int getconf_linenum(confparm_key key);
706val_t *getconf_byname(char *key);
707GSList *getconf_list(char *listname);
708%inline %{
709typedef char **val_t_strs;
710val_t_strs getconf_byname_strs(char *key, int str_needs_quotes) {
711    val_t *val = getconf_byname(key);
712    if (!val) return NULL;
713    return val_t_display_strs(val, str_needs_quotes, FALSE, FALSE);
714}
715%}
716
717amglue_export_tag(getconf,
718    getconf getconf_seen getconf_linenum
719    getconf_byname getconf_byname_strs
720    getconf_list
721);
722
723tapetype_t *lookup_tapetype(char *identifier);
724val_t *tapetype_getconf(tapetype_t *ttyp, tapetype_key key);
725char *tapetype_name(tapetype_t *ttyp);
726gboolean tapetype_seen(tapetype_t *ttyp, tapetype_key key);
727amglue_export_tag(getconf,
728    lookup_tapetype tapetype_getconf tapetype_name
729    tapetype_seen tapetype_seen
730);
731
732dumptype_t *lookup_dumptype(char *identifier);
733val_t *dumptype_getconf(dumptype_t *dtyp, dumptype_key key);
734char *dumptype_name(dumptype_t *dtyp);
735gboolean dumptype_seen(dumptype_t *dtyp, dumptype_key key);
736amglue_export_tag(getconf,
737    lookup_dumptype dumptype_getconf dumptype_name
738    dumptype_seen dumptype_seen
739);
740
741interface_t *lookup_interface(char *identifier);
742val_t *interface_getconf(interface_t *iface, interface_key key);
743char *interface_name(interface_t *iface);
744gboolean interface_seen(interface_t *iface, interface_key key);
745amglue_export_tag(getconf,
746    lookup_interface interface_getconf interface_name
747    interface_seen interface_seen
748);
749
750holdingdisk_t *lookup_holdingdisk(char *identifier);
751GSList *getconf_holdingdisks(void);
752val_t *holdingdisk_getconf(holdingdisk_t *hdisk, holdingdisk_key key);
753char *holdingdisk_name(holdingdisk_t *hdisk);
754gboolean holdingdisk_seen(holdingdisk_t *hdisk, holdingdisk_key key);
755amglue_export_tag(getconf,
756    lookup_holdingdisk holdingdisk_getconf holdingdisk_name
757    getconf_holdingdisks
758    holdingdisk_seen holdingdisk_seen
759);
760
761application_t *lookup_application(char *identifier);
762val_t *application_getconf(application_t *app, application_key key);
763char *application_name(application_t *app);
764gboolean application_seen(application_t *app, application_key key);
765amglue_export_tag(getconf,
766    lookup_application application_getconf application_name
767    application_seen application_seen
768);
769
770pp_script_t *lookup_pp_script(char *identifier);
771val_t *pp_script_getconf(pp_script_t *pps, pp_script_key key);
772char *pp_script_name(pp_script_t *pps);
773gboolean pp_script_seen(pp_script_t *app, pp_script_key key);
774amglue_export_tag(getconf,
775    lookup_pp_script pp_script_getconf pp_script_name
776    pp_script_seen pp_script_seen
777);
778
779device_config_t *lookup_device_config(char *identifier);
780val_t *device_config_getconf(device_config_t *pps, device_config_key key);
781char *device_config_name(device_config_t *pps);
782gboolean device_config_seen(device_config_t *app, device_config_key key);
783amglue_export_tag(getconf,
784    lookup_device_config device_config_getconf device_config_name
785    device_config_seen device_config_seen
786);
787
788changer_config_t *lookup_changer_config(char *identifier);
789val_t *changer_config_getconf(changer_config_t *pps, changer_config_key key);
790char *changer_config_name(changer_config_t *pps);
791gboolean changer_config_seen(changer_config_t *app, changer_config_key key);
792amglue_export_tag(getconf,
793    lookup_changer_config changer_config_getconf changer_config_name
794    changer_config_seen changer_config_seen
795);
796
797interactivity_t *lookup_interactivity(char *identifier);
798val_t *interactivity_getconf(interactivity_t *app, interactivity_key key);
799char *interactivity_name(interactivity_t *app);
800gboolean interactivity_seen(interactivity_t *app, interactivity_key key);
801amglue_export_tag(getconf,
802    lookup_interactivity interactivity_getconf interactivity_name
803    interactivity_seen interactivity_seen
804);
805
806taperscan_t *lookup_taperscan(char *identifier);
807val_t *taperscan_getconf(taperscan_t *app, taperscan_key key);
808char *taperscan_name(taperscan_t *app);
809gboolean taperscan_seen(taperscan_t *app, taperscan_key key);
810amglue_export_tag(getconf,
811    lookup_taperscan taperscan_getconf taperscan_name
812    taperscan_seen taperscan_seen
813);
814
815%perlcode %{
816# only those keys with a value of '1' should be shown; the
817# others are deprecated
818our %subsection_names = (
819    "tapetype" => 1,
820    "dumptype" => 1,
821    "interface" => 1,
822    "holdingdisk" => 1,
823    "application" => 1,
824    "script" => 1,
825    "application-tool" => 0,
826    "script-tool" => 0,
827    "device" => 1,
828    "changer" => 1,
829);
830%}
831amglue_export_tag(getconf, %subsection_names);
832
833long int getconf_unit_divisor(void);
834
835extern int debug_amandad;
836extern int debug_recovery;
837extern int debug_amidxtaped;
838extern int debug_amindexd;
839extern int debug_amrecover;
840extern int debug_auth;
841extern int debug_event;
842extern int debug_holding;
843extern int debug_protocol;
844extern int debug_planner;
845extern int debug_driver;
846extern int debug_dumper;
847extern int debug_chunker;
848extern int debug_taper;
849extern int debug_selfcheck;
850extern int debug_sendsize;
851extern int debug_sendbackup;
852amglue_export_tag(getconf,
853    getconf_unit_divisor
854
855    $debug_amandad $debug_recovery $debug_amidxtaped $debug_amindexd $debug_amrecover
856    $debug_auth $debug_event $debug_holding $debug_protocol
857    $debug_planner $debug_driver $debug_dumper $debug_chunker
858    $debug_taper $debug_selfcheck $debug_sendsize $debug_sendbackup
859);
860
861/*
862 * Initialization
863 */
864
865amglue_add_enum_tag_fns(cfgerr_level_t);
866amglue_add_constant(CFGERR_OK, cfgerr_level_t);
867amglue_add_constant(CFGERR_WARNINGS, cfgerr_level_t);
868amglue_add_constant(CFGERR_ERRORS, cfgerr_level_t);
869amglue_copy_to_tag(cfgerr_level_t, init);
870
871amglue_add_flag_tag_fns(config_init_flags);
872amglue_add_constant(CONFIG_INIT_EXPLICIT_NAME, config_init_flags);
873amglue_add_constant(CONFIG_INIT_USE_CWD, config_init_flags);
874amglue_add_constant(CONFIG_INIT_CLIENT, config_init_flags);
875amglue_add_constant(CONFIG_INIT_OVERLAY, config_init_flags);
876amglue_copy_to_tag(config_init_flags, init);
877
878cfgerr_level_t config_init(config_init_flags flags,
879		     char *arg_config_name);
880void config_uninit(void);
881char **get_config_options(int first);
882char *get_config_name(void);
883char *get_config_dir(void);
884char *get_config_filename(void);
885
886void config_print_errors(void);
887void config_clear_errors(void);
888
889/* Typemap for config_errors' result parameter; this is a GSList of strings
890 * which should *not* be freed. */
891%typemap(in, numinputs=0) GSList **ERRLIST (GSList *templist) {
892   templist = NULL;
893   $1 = &templist;
894}
895
896%typemap (argout) GSList **ERRLIST {
897    GSList *it = *$1;
898
899    EXTEND(SP, g_slist_length(it));
900    while (it) {
901	$result = sv_2mortal(newSVpv(it->data, 0));
902	argvi++;
903	it = it->next;
904    }
905}
906cfgerr_level_t config_errors(GSList **ERRLIST);
907
908
909config_overrides_t *new_config_overrides(int size_estimate);
910void free_config_overrides(config_overrides_t *co);
911void add_config_override(config_overrides_t *co,
912			 char *key,
913			 char *value);
914void add_config_override_opt(config_overrides_t *co,
915			      char *optarg);
916void set_config_overrides(config_overrides_t *co);
917
918amglue_export_tag(init,
919    config_init config_uninit get_config_options
920    get_config_name get_config_dir get_config_filename
921    config_print_errors config_clear_errors config_errors
922    new_config_overrides free_config_overrides add_config_override
923    add_config_override_opt set_config_overrides
924);
925
926/*
927 * Miscellaneous
928 */
929
930void dump_configuration(gboolean print_default, gboolean print_source);
931%newobject config_dir_relative;
932char *config_dir_relative(char *filename);
933char *taperalgo2str(taperalgo_t taperalgo);
934gint64 find_multiplier(char * casestr);
935
936amglue_export_ok(
937    dump_configuration config_dir_relative taperalgo2str find_multiplier
938);
939
940%rename(C_string_to_boolean) string_to_boolean;
941int string_to_boolean(const char *str);
942%perlcode %{
943
944sub string_to_boolean {
945    my ($str) = @_;
946    my $ret = C_string_to_boolean($str);
947    return undef unless $ret >= 0;
948    return $ret;
949}
950
951%}
952
953amglue_export_ok(string_to_boolean);
954
955%newobject amandaify_property_name;
956gchar * amandaify_property_name(const gchar *name);
957amglue_export_ok(amandaify_property_name);
958