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