lintian doesn't like orphan packages with uploaders...
[debian/amanda] / common-src / conffile.h
index a61edd9d2f3c7c9ae5b53761bbc36a7146047bde..efb7253358ceff1109c0234f22580c73edafd7fd 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Amanda, The Advanced Maryland Automatic Network Disk Archiver
  * Copyright (c) 1991-2000 University of Maryland at College Park
+ * Copyright (c) 2007-2012 Zmanda, Inc.  All Rights Reserved.
  * All Rights Reserved.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * this works and it's here.
  */
 
+/* A "seen" struct.  Rather than allocate strings all over the place, this
+ * string is in the "parsed_filenames" GSList and will be freed when that
+ * GSList is freed.  This struct should be opaque to other modules. */
+typedef struct seen_s {
+    char *block;
+    char *filename;
+    int linenum;
+} seen_t;
+
 /* holdingdisk types */
 typedef enum {
     HOLD_NEVER,                 /* Always direct to tape  */
@@ -111,8 +121,23 @@ typedef enum {
     ES_CLIENT,          /* client estimate */
     ES_SERVER,          /* server estimate */
     ES_CALCSIZE,        /* calcsize estimate */
-    ES_ES /* sentinel */
+    ES_ES               /* sentinel */
 } estimate_t;
+/* A GSlist where each element is a element_t */
+typedef GSList *estimatelist_t;
+
+typedef enum {
+    AL_OTHER_CONFIG = 1<<0,
+    AL_NON_AMANDA   = 1<<1,
+    AL_VOLUME_ERROR = 1<<2,
+    AL_EMPTY        = 1<<3,
+} autolabel_enum_t;
+typedef int autolabel_set_t;
+
+typedef struct autolabel_s {
+    char            *template;
+    autolabel_set_t  autolabel;
+} autolabel_t;
 
 /* Dump strategies */
 typedef enum {
@@ -133,28 +158,36 @@ typedef enum {
     ALGO_LARGEST,
     ALGO_LARGESTFIT,
     ALGO_SMALLEST,
+    ALGO_SMALLESTFIT,  /* for internal use */
     ALGO_LAST,
+    ALGO_LASTFIT,      /* for internal use */
     ALGO_ALGO /* sentinel */
 } taperalgo_t;
 
 /* execute_on types */
-#define EXECUTE_ON_PRE_DLE_AMCHECK     1<<0
-#define EXECUTE_ON_PRE_HOST_AMCHECK    1<<1
-#define EXECUTE_ON_POST_DLE_AMCHECK    1<<2
-#define EXECUTE_ON_POST_HOST_AMCHECK   1<<3
-#define EXECUTE_ON_PRE_DLE_ESTIMATE    1<<4
-#define EXECUTE_ON_PRE_HOST_ESTIMATE   1<<5
-#define EXECUTE_ON_POST_DLE_ESTIMATE   1<<6
-#define EXECUTE_ON_POST_HOST_ESTIMATE  1<<7
-#define EXECUTE_ON_PRE_DLE_BACKUP      1<<8
-#define EXECUTE_ON_PRE_HOST_BACKUP     1<<9
-#define EXECUTE_ON_POST_DLE_BACKUP     1<<10
-#define EXECUTE_ON_POST_HOST_BACKUP    1<<11
-#define EXECUTE_ON_PRE_RECOVER         1<<12
-#define EXECUTE_ON_POST_RECOVER        1<<13
-#define EXECUTE_ON_PRE_LEVEL_RECOVER   1<<14
-#define EXECUTE_ON_POST_LEVEL_RECOVER  1<<15
-#define EXECUTE_ON_INTER_LEVEL_RECOVER 1<<16
+#define EXECUTE_ON_PRE_AMCHECK         1<<0
+#define EXECUTE_ON_PRE_DLE_AMCHECK     1<<1
+#define EXECUTE_ON_PRE_HOST_AMCHECK    1<<2
+#define EXECUTE_ON_POST_AMCHECK        1<<3
+#define EXECUTE_ON_POST_DLE_AMCHECK    1<<4
+#define EXECUTE_ON_POST_HOST_AMCHECK   1<<5
+#define EXECUTE_ON_PRE_ESTIMATE        1<<6
+#define EXECUTE_ON_PRE_DLE_ESTIMATE    1<<7
+#define EXECUTE_ON_PRE_HOST_ESTIMATE   1<<8
+#define EXECUTE_ON_POST_ESTIMATE       1<<9
+#define EXECUTE_ON_POST_DLE_ESTIMATE   1<<10
+#define EXECUTE_ON_POST_HOST_ESTIMATE  1<<11
+#define EXECUTE_ON_PRE_BACKUP          1<<12
+#define EXECUTE_ON_PRE_DLE_BACKUP      1<<13
+#define EXECUTE_ON_PRE_HOST_BACKUP     1<<14
+#define EXECUTE_ON_POST_BACKUP         1<<15
+#define EXECUTE_ON_POST_DLE_BACKUP     1<<16
+#define EXECUTE_ON_POST_HOST_BACKUP    1<<17
+#define EXECUTE_ON_PRE_RECOVER         1<<18
+#define EXECUTE_ON_POST_RECOVER        1<<19
+#define EXECUTE_ON_PRE_LEVEL_RECOVER   1<<20
+#define EXECUTE_ON_POST_LEVEL_RECOVER  1<<21
+#define EXECUTE_ON_INTER_LEVEL_RECOVER 1<<22
 typedef int execute_on_t;
 
 typedef int execute_where_t;
@@ -166,9 +199,14 @@ typedef enum {
     SEND_AMREPORT_NEVER
 } send_amreport_t;
 
+typedef enum {
+    DATA_PATH_AMANDA    = 1<<0,
+    DATA_PATH_DIRECTTCP = 1<<1,
+} data_path_t;
+
 typedef struct exinclude_s {
-    sl_t *sl_list;
-    sl_t *sl_file;
+    am_sl_t *sl_list;
+    am_sl_t *sl_file;
     int  optional;
 } exinclude_t;
 
@@ -176,10 +214,26 @@ typedef struct {
     int append;
     int priority;
     GSList* values;
+    seen_t seen;
 } property_t;
 
 typedef GHashTable* proplist_t;
-typedef GSList* pp_scriptlist_t;
+/* A GSlist where each element is a 'char*' */
+typedef GSList* identlist_t;
+
+/* part_cache_types */
+typedef enum {
+    PART_CACHE_TYPE_NONE,
+    PART_CACHE_TYPE_MEMORY,
+    PART_CACHE_TYPE_DISK,
+} part_cache_type_t;
+
+/* host_limit */
+typedef struct {
+    gboolean server;
+    gboolean same_host;
+    GSList *match_pats;
+} host_limit_t;
 
 /* Names for the type of value in a val_t.  Mostly for internal use, but useful
  * for wrapping val_t's, too. */
@@ -195,7 +249,7 @@ typedef enum {
     CONFTYPE_COMPRESS,
     CONFTYPE_ENCRYPT,
     CONFTYPE_HOLDING,
-    CONFTYPE_ESTIMATE,
+    CONFTYPE_ESTIMATELIST,
     CONFTYPE_STRATEGY,
     CONFTYPE_TAPERALGO,
     CONFTYPE_PRIORITY,
@@ -207,16 +261,18 @@ typedef enum {
     CONFTYPE_EXECUTE_ON,
     CONFTYPE_EXECUTE_WHERE,
     CONFTYPE_SEND_AMREPORT_ON,
-    CONFTYPE_PP_SCRIPTLIST
+    CONFTYPE_IDENTLIST,
+    CONFTYPE_DATA_PATH,
+    CONFTYPE_AUTOLABEL,
+    CONFTYPE_PART_CACHE_TYPE,
+    CONFTYPE_HOST_LIMIT,
+    CONFTYPE_NO_YES_ALL,
 } conftype_t;
 
-/* A "seen" struct.  Rather than allocate strings all over the place, this
- * string is in the "parsed_filenames" GSList and will be freed when that
- * GSList is freed.  This struct should be opaque to other modules. */
-typedef struct seen_s {
-    char *filename;
-    int linenum;
-} seen_t;
+typedef enum {
+    CONF_UNIT_NONE,
+    CONF_UNIT_K,
+} confunit_t;
 
 /* This should be considered an opaque type for any other modules.  The complete
  * struct is included here to allow quick access via macros. Access it *only* through
@@ -233,11 +289,14 @@ typedef struct val_s {
         exinclude_t    exinclude;
         int            intrange[2];
         proplist_t      proplist;
-       struct application_s  *application;
-       pp_scriptlist_t pp_scriptlist;
+       estimatelist_t  estimatelist;
+       identlist_t     identlist;
+        autolabel_t     autolabel;
+       host_limit_t    host_limit;
     } v;
     seen_t seen;
     conftype_t type;
+    confunit_t unit;
 } val_t;
 
 /* Functions to typecheck and extract a particular type of
@@ -248,13 +307,15 @@ gint64                val_t_to_int64    (val_t *);
 float                 val_t_to_real     (val_t *);
 char                 *val_t_to_str      (val_t *); /* (also converts CONFTYPE_IDENT) */
 char                 *val_t_to_ident    (val_t *); /* (also converts CONFTYPE_STR) */
+identlist_t           val_t_to_identlist(val_t *);
 time_t                val_t_to_time     (val_t *);
 ssize_t               val_t_to_size     (val_t *);
 int                   val_t_to_boolean  (val_t *);
+int                   val_t_to_no_yes_all(val_t *);
 comp_t                val_t_to_compress (val_t *);
 encrypt_t             val_t_to_encrypt  (val_t *);
 dump_holdingdisk_t    val_t_to_holding  (val_t *);
-estimate_t            val_t_to_estimate (val_t *);
+estimatelist_t        val_t_to_estimatelist (val_t *);
 strategy_t            val_t_to_strategy (val_t *);
 taperalgo_t           val_t_to_taperalgo(val_t *);
 int                   val_t_to_priority (val_t *);
@@ -262,11 +323,14 @@ float                *val_t_to_rate     (val_t *); /* array of two floats */
 exinclude_t           val_t_to_exinclude(val_t *);
 int                  *val_t_to_intrange (val_t *); /* array of two ints */
 proplist_t            val_t_to_proplist (val_t *);
-struct application_s *val_t_to_application(val_t *);
-pp_scriptlist_t       val_t_to_pp_scriptlist(val_t *);
+char                 *val_t_to_application(val_t *);
 execute_on_t          val_t_to_execute_on(val_t *);
 execute_where_t       val_t_to_execute_where(val_t *);
 send_amreport_t       val_t_to_send_amreport(val_t *);
+data_path_t           val_t_to_data_path(val_t *);
+autolabel_t           val_t_to_autolabel(val_t *);
+part_cache_type_t     val_t_to_part_cache_type(val_t *);
+host_limit_t         *val_t_to_host_limit(val_t *);
 
 /* Has the given val_t been seen in a configuration file or config overwrite?
  *
@@ -295,13 +359,15 @@ send_amreport_t       val_t_to_send_amreport(val_t *);
 #define val_t__real(val)          ((val)->v.r)
 #define val_t__str(val)           ((val)->v.s)
 #define val_t__ident(val)         ((val)->v.s)
+#define val_t__identlist(val)     ((val)->v.identlist)
 #define val_t__time(val)          ((val)->v.t)
 #define val_t__size(val)          ((val)->v.size)
 #define val_t__boolean(val)       ((val)->v.i)
+#define val_t__no_yes_all(val)    ((val)->v.i)
 #define val_t__compress(val)      ((val)->v.i)
 #define val_t__encrypt(val)       ((val)->v.i)
 #define val_t__holding(val)       ((val)->v.i)
-#define val_t__estimate(val)      ((val)->v.i)
+#define val_t__estimatelist(val)  ((val)->v.estimatelist)
 #define val_t__strategy(val)      ((val)->v.i)
 #define val_t__taperalgo(val)     ((val)->v.i)
 #define val_t__send_amreport(val) ((val)->v.i)
@@ -310,10 +376,14 @@ send_amreport_t       val_t_to_send_amreport(val_t *);
 #define val_t__exinclude(val)     ((val)->v.exinclude)
 #define val_t__intrange(val)      ((val)->v.intrange)
 #define val_t__proplist(val)      ((val)->v.proplist)
-#define val_t__pp_scriptlist(val) ((val)->v.pp_scriptlist)
 #define val_t__application(val)   ((val)->v.application)
 #define val_t__execute_on(val)    ((val)->v.i)
 #define val_t__execute_where(val) ((val)->v.i)
+#define val_t__data_path(val)     ((val)->v.i)
+#define val_t__autolabel(val)     ((val)->v.autolabel)
+#define val_t__part_cache_type(val) ((val)->v.i)
+#define val_t__host_limit(val)    ((val)->v.host_limit)
+
 /*
  * Parameters
  *
@@ -330,18 +400,20 @@ typedef enum {
     CNF_CONF,
     CNF_INDEX_SERVER,
     CNF_TAPE_SERVER,
+    CNF_AMDUMP_SERVER,
     CNF_AUTH,
     CNF_SSH_KEYS,
     CNF_AMANDAD_PATH,
     CNF_CLIENT_USERNAME,
+    CNF_CLIENT_PORT,
     CNF_GNUTAR_LIST_DIR,
     CNF_AMANDATES,
     CNF_MAILTO,
     CNF_DUMPUSER,
     CNF_TAPEDEV,
-    CNF_RAWTAPEDEV,
     CNF_DEVICE_PROPERTY,
     CNF_PROPERTY,
+    CNF_INTERACTIVITY,
     CNF_APPLICATION,
     CNF_APPLICATION_TOOL,
     CNF_EXECUTE_ON,
@@ -373,7 +445,6 @@ typedef enum {
     CNF_ETIMEOUT,
     CNF_DTIMEOUT,
     CNF_CTIMEOUT,
-    CNF_TAPEBUFS,
     CNF_DEVICE_OUTPUT_BUFFER_SIZE,
     CNF_PRINTER,
     CNF_MAILER,
@@ -398,6 +469,7 @@ typedef enum {
     CNF_CONNECT_TRIES,
     CNF_REQ_TRIES,
     CNF_DEBUG_AMANDAD,
+    CNF_DEBUG_RECOVERY,
     CNF_DEBUG_AMIDXTAPED,
     CNF_DEBUG_AMINDEXD,
     CNF_DEBUG_AMRECOVER,
@@ -416,6 +488,18 @@ typedef enum {
     CNF_RESERVED_UDP_PORT,
     CNF_RESERVED_TCP_PORT,
     CNF_UNRESERVED_TCP_PORT,
+    CNF_HOLDINGDISK,
+    CNF_AUTOLABEL,
+    CNF_META_AUTOLABEL,
+    CNF_DEBUG_DAYS,
+    CNF_TAPER_PARALLEL_WRITE,
+    CNF_RECOVERY_LIMIT,
+    CNF_TAPERSCAN,
+    CNF_MAX_DLE_BY_VOLUME,
+    CNF_EJECT_VOLUME,
+    CNF_TMPDIR,
+    CNF_REPORT_USE_MEDIA,
+    CNF_REPORT_NEXT_MEDIA,
     CNF_CNF /* sentinel */
 } confparm_key;
 
@@ -432,9 +516,10 @@ val_t *getconf(confparm_key key);
  * @returns: boolean
  */
 #define getconf_seen(key)       (val_t_seen(getconf((key))))
+#define getconf_linenum(key)       (val_t_seen(getconf((key))))
 
 /* (convenience macros)
- * Fetch a gloabl parameter of a specific type.  Note that these
+ * Fetch a global parameter of a specific type.  Note that these
  * convenience macros have a different form from those for the
  * subsections: here you specify a type and a key, while for the
  * subsections you specify only a key.  The difference is historical.
@@ -447,13 +532,15 @@ val_t *getconf(confparm_key key);
 #define getconf_real(key)         (val_t_to_real(getconf((key))))
 #define getconf_str(key)         (val_t_to_str(getconf((key))))
 #define getconf_ident(key)        (val_t_to_ident(getconf((key))))
+#define getconf_identlist(key)    (val_t_to_identlist(getconf((key))))
 #define getconf_time(key)         (val_t_to_time(getconf((key))))
 #define getconf_size(key)         (val_t_to_size(getconf((key))))
 #define getconf_boolean(key)      (val_t_to_boolean(getconf((key))))
+#define getconf_no_yes_all(key)   (val_t_to_no_yes_all(getconf((key))))
 #define getconf_compress(key)     (val_t_to_compress(getconf((key))))
 #define getconf_encrypt(key)      (val_t_to_encrypt(getconf((key))))
 #define getconf_holding(key)      (val_t_to_holding(getconf((key))))
-#define getconf_estimate(key)     (val_t_to_estimate(getconf((key))))
+#define getconf_estimatelist(key) (val_t_to_estimatelist(getconf((key))))
 #define getconf_strategy(key)     (val_t_to_strategy(getconf((key))))
 #define getconf_taperalgo(key)    (val_t_to_taperalgo(getconf((key))))
 #define getconf_priority(key)     (val_t_to_priority(getconf((key))))
@@ -462,6 +549,9 @@ val_t *getconf(confparm_key key);
 #define getconf_intrange(key)     (val_t_to_intrange(getconf((key))))
 #define getconf_proplist(key)     (val_t_to_proplist(getconf((key))))
 #define getconf_send_amreport(key) (val_t_to_send_amreport(getconf((key))))
+#define getconf_autolabel(key)    (val_t_to_autolabel(getconf((key))))
+#define getconf_part_cache_type(key) (val_t_to_part_cache_type(getconf((key))))
+#define getconf_recovery_limit(key) (val_t_to_host_limit(getconf((key))))
 
 /* Get a list of names for subsections of the given type
  *
@@ -496,6 +586,7 @@ long int getconf_unit_divisor(void);
  * desired.  */
 
 extern int debug_amandad;
+extern int debug_recovery;
 extern int debug_amidxtaped;
 extern int debug_amindexd;
 extern int debug_amrecover;
@@ -524,7 +615,10 @@ typedef enum {
     TAPETYPE_LENGTH,
     TAPETYPE_FILEMARK,
     TAPETYPE_SPEED,
-    TAPETYPE_FILE_PAD,
+    TAPETYPE_PART_SIZE,
+    TAPETYPE_PART_CACHE_TYPE,
+    TAPETYPE_PART_CACHE_DIR,
+    TAPETYPE_PART_CACHE_MAX_SIZE,
     TAPETYPE_TAPETYPE /* sentinel */
 } tapetype_key;
 
@@ -568,17 +662,22 @@ char *tapetype_name(tapetype_t *ttyp);
  * @param ttyp: the tapetype to examine
  * @returns: various
  */
-#define tapetype_get_comment(ttyp)         (val_t_to_str(tapetype_getconf((ttyp), TAPETYPE_COMMENT)))
-#define tapetype_get_lbl_templ(ttyp)       (val_t_to_str(tapetype_getconf((ttyp), TAPETYPE_LBL_TEMPL)))
-#define tapetype_get_blocksize(ttyp)       (val_t_to_size(tapetype_getconf((ttyp), TAPETYPE_BLOCKSIZE)))
-#define tapetype_get_readblocksize(ttyp)   (val_t_to_size(tapetype_getconf((ttyp), TAPETYPE_READBLOCKSIZE)))
-#define tapetype_get_length(ttyp)          (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_LENGTH)))
-#define tapetype_get_filemark(ttyp)        (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_FILEMARK)))
-#define tapetype_get_speed(ttyp)           (val_t_to_int(tapetype_getconf((ttyp), TAPETYPE_SPEED)))
-#define tapetype_get_file_pad(ttyp)        (val_t_to_boolean(tapetype_getconf((ttyp), TAPETYPE_FILE_PAD)))
+#define tapetype_get_comment(ttyp)             (val_t_to_str(tapetype_getconf((ttyp), TAPETYPE_COMMENT)))
+#define tapetype_get_lbl_templ(ttyp)           (val_t_to_str(tapetype_getconf((ttyp), TAPETYPE_LBL_TEMPL)))
+#define tapetype_get_blocksize(ttyp)           (val_t_to_size(tapetype_getconf((ttyp), TAPETYPE_BLOCKSIZE)))
+#define tapetype_get_readblocksize(ttyp)       (val_t_to_size(tapetype_getconf((ttyp), TAPETYPE_READBLOCKSIZE)))
+#define tapetype_get_length(ttyp)              (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_LENGTH)))
+#define tapetype_get_filemark(ttyp)            (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_FILEMARK)))
+#define tapetype_get_speed(ttyp)               (val_t_to_int(tapetype_getconf((ttyp), TAPETYPE_SPEED)))
+#define tapetype_get_part_size(ttyp)           (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_PART_SIZE)))
+#define tapetype_get_part_cache_type(ttyp)     (val_t_to_part_cache_type(tapetype_getconf((ttyp), TAPETYPE_PART_CACHE_TYPE)))
+#define tapetype_get_part_cache_dir(ttyp)      (val_t_to_str(tapetype_getconf((ttyp), TAPETYPE_PART_CACHE_DIR)))
+#define tapetype_get_part_cache_max_size(ttyp) (val_t_to_int64(tapetype_getconf((ttyp), TAPETYPE_PART_CACHE_MAX_SIZE)))
 
 /*
  * Dumptype parameter access
+ *
+ * Note that some parameters are generic to the host
  */
 
 typedef enum {
@@ -588,15 +687,15 @@ typedef enum {
     DUMPTYPE_CLNTCOMPPROG,
     DUMPTYPE_SRV_ENCRYPT,
     DUMPTYPE_CLNT_ENCRYPT,
-    DUMPTYPE_AMANDAD_PATH,
-    DUMPTYPE_CLIENT_USERNAME,
-    DUMPTYPE_SSH_KEYS,
-    DUMPTYPE_SECURITY_DRIVER,
+    DUMPTYPE_AMANDAD_PATH,             /* host parameter */
+    DUMPTYPE_CLIENT_USERNAME,          /* host parameter */
+    DUMPTYPE_SSH_KEYS,                 /* host parameter */
+    DUMPTYPE_AUTH,                     /* host parameter */
     DUMPTYPE_EXCLUDE,
     DUMPTYPE_INCLUDE,
     DUMPTYPE_PRIORITY,
     DUMPTYPE_DUMPCYCLE,
-    DUMPTYPE_MAXDUMPS,
+    DUMPTYPE_MAXDUMPS,                 /* host parameter */
     DUMPTYPE_MAXPROMOTEDAY,
     DUMPTYPE_BUMPPERCENT,
     DUMPTYPE_BUMPSIZE,
@@ -604,7 +703,7 @@ typedef enum {
     DUMPTYPE_BUMPMULT,
     DUMPTYPE_STARTTIME,
     DUMPTYPE_STRATEGY,
-    DUMPTYPE_ESTIMATE,
+    DUMPTYPE_ESTIMATELIST,
     DUMPTYPE_COMPRESS,
     DUMPTYPE_ENCRYPT,
     DUMPTYPE_SRV_DECRYPT_OPT,
@@ -621,8 +720,14 @@ typedef enum {
     DUMPTYPE_IGNORE,
     DUMPTYPE_INDEX,
     DUMPTYPE_APPLICATION,
-    DUMPTYPE_PP_SCRIPTLIST,
+    DUMPTYPE_SCRIPTLIST,
     DUMPTYPE_PROPERTY,
+    DUMPTYPE_CLIENT_PORT,
+    DUMPTYPE_DATA_PATH,
+    DUMPTYPE_ALLOW_SPLIT,
+    DUMPTYPE_RECOVERY_LIMIT,
+    DUMPTYPE_DUMP_LIMIT,
+    DUMPTYPE_MAX_WARNINGS,
     DUMPTYPE_DUMPTYPE /* sentinel */
 } dumptype_key;
 
@@ -675,7 +780,7 @@ char *dumptype_name(dumptype_t *dtyp);
 #define dumptype_get_amandad_path(dtyp)        (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_AMANDAD_PATH)))
 #define dumptype_get_client_username(dtyp)     (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_CLIENT_USERNAME)))
 #define dumptype_get_ssh_keys(dtyp)            (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_SSH_KEYS)))
-#define dumptype_get_security_driver(dtyp)     (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_SECURITY_DRIVER)))
+#define dumptype_get_auth(dtyp)                (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_AUTH)))
 #define dumptype_get_exclude(dtyp)             (val_t_to_exinclude(dumptype_getconf((dtyp), DUMPTYPE_EXCLUDE)))
 #define dumptype_get_include(dtyp)             (val_t_to_exinclude(dumptype_getconf((dtyp), DUMPTYPE_INCLUDE)))
 #define dumptype_get_priority(dtyp)            (val_t_to_priority(dumptype_getconf((dtyp), DUMPTYPE_PRIORITY)))
@@ -690,7 +795,7 @@ char *dumptype_name(dumptype_t *dtyp);
 #define dumptype_get_bumpmult(dtyp)            (val_t_to_real(dumptype_getconf((dtyp), DUMPTYPE_BUMPMULT)))
 #define dumptype_get_starttime(dtyp)           (val_t_to_time(dumptype_getconf((dtyp), DUMPTYPE_STARTTIME)))
 #define dumptype_get_strategy(dtyp)            (val_t_to_strategy(dumptype_getconf((dtyp), DUMPTYPE_STRATEGY)))
-#define dumptype_get_estimate(dtyp)            (val_t_to_estimate(dumptype_getconf((dtyp), DUMPTYPE_ESTIMATE)))
+#define dumptype_get_estimatelist(dtyp)        (val_t_to_estimatelist(dumptype_getconf((dtyp), DUMPTYPE_ESTIMATELIST)))
 #define dumptype_get_compress(dtyp)            (val_t_to_compress(dumptype_getconf((dtyp), DUMPTYPE_COMPRESS)))
 #define dumptype_get_encrypt(dtyp)             (val_t_to_encrypt(dumptype_getconf((dtyp), DUMPTYPE_ENCRYPT)))
 #define dumptype_get_srv_decrypt_opt(dtyp)     (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_SRV_DECRYPT_OPT)))
@@ -707,8 +812,14 @@ char *dumptype_name(dumptype_t *dtyp);
 #define dumptype_get_ignore(dtyp)              (val_t_to_boolean(dumptype_getconf((dtyp), DUMPTYPE_IGNORE)))
 #define dumptype_get_index(dtyp)               (val_t_to_boolean(dumptype_getconf((dtyp), DUMPTYPE_INDEX)))
 #define dumptype_get_application(dtyp)         (val_t_to_application(dumptype_getconf((dtyp), DUMPTYPE_APPLICATION)))
-#define dumptype_get_pp_scriptlist(dtyp)       (val_t_to_pp_scriptlist(dumptype_getconf((dtyp), DUMPTYPE_PP_SCRIPTLIST)))
+#define dumptype_get_scriptlist(dtyp)          (val_t_to_identlist(dumptype_getconf((dtyp), DUMPTYPE_SCRIPTLIST)))
 #define dumptype_get_property(dtyp)            (val_t_to_proplist(dumptype_getconf((dtyp), DUMPTYPE_PROPERTY)))
+#define dumptype_get_client_port(dtyp)         (val_t_to_str(dumptype_getconf((dtyp), DUMPTYPE_CLIENT_PORT)))
+#define dumptype_get_data_path(dtyp)           (val_t_to_data_path(dumptype_getconf((dtyp), DUMPTYPE_DATA_PATH)))
+#define dumptype_get_allow_split(dtyp)         (val_t_to_boolean(dumptype_getconf((dtyp), DUMPTYPE_ALLOW_SPLIT)))
+#define dumptype_get_recovery_limit(dtyp)      (val_t_to_host_limit(dumptype_getconf((dtyp), DUMPTYPE_RECOVERY_LIMIT)))
+#define dumptype_get_dump_limit(dtyp)          (val_t_to_host_limit(dumptype_getconf((dtyp), DUMPTYPE_DUMP_LIMIT)))
+#define dumptype_get_max_warnings(dtyp)        (val_t_to_int(dumptype_getconf((dtyp), DUMPTYPE_MAX_WARNINGS)))
 
 /*
  * Interface parameter access
@@ -786,20 +897,11 @@ typedef struct holdingdisk_s holdingdisk_t;
  */
 holdingdisk_t *lookup_holdingdisk(char *identifier);
 
-/* Return the whole linked list of holdingdisks.  Use holdingdisk_next
- * to traverse the list.
+/* Return the whole linked list of holdingdisks.
  *
  * @returns: first holding disk
  */
-holdingdisk_t *getconf_holdingdisks(void);
-
-/* Return the next holdingdisk in the list.
- *
- * @param hdisk: holding disk
- * @returns: NULL if hdisk is the last disk, otherwise the next holding
- * disk
- */
-holdingdisk_t *holdingdisk_next(holdingdisk_t *hdisk);
+GSList *getconf_holdingdisks(void);
 
 /* Given a holdingdisk and a key, return a pointer to the corresponding val_t.
  *
@@ -840,6 +942,7 @@ typedef enum application_e  {
     APPLICATION_COMMENT,
     APPLICATION_PLUGIN,
     APPLICATION_PROPERTY,
+    APPLICATION_CLIENT_NAME,
     APPLICATION_APPLICATION
 } application_key;
 
@@ -887,8 +990,7 @@ char *application_name(application_t *app);
 #define application_get_comment(application)  (val_t_to_str(application_getconf((application), APPLICATION_COMMENT))
 #define application_get_plugin(application)   (val_t_to_str(application_getconf((application), APPLICATION_PLUGIN)))
 #define application_get_property(application) (val_t_to_proplist(application_getconf((application), APPLICATION_PROPERTY)))
-
-application_t *read_application(char *name, FILE *from, char *fname, int *linenum);
+#define application_get_client_name(application) (val_t_to_str(application_getconf((application), APPLICATION_CLIENT_NAME)))
 
 /* A pp-script-tool interface */
 typedef enum pp_script_e  {
@@ -897,6 +999,9 @@ typedef enum pp_script_e  {
     PP_SCRIPT_PROPERTY,
     PP_SCRIPT_EXECUTE_ON,
     PP_SCRIPT_EXECUTE_WHERE,
+    PP_SCRIPT_ORDER,
+    PP_SCRIPT_SINGLE_EXECUTION,
+    PP_SCRIPT_CLIENT_NAME,
     PP_SCRIPT_PP_SCRIPT
 } pp_script_key;
 
@@ -947,8 +1052,10 @@ char *pp_script_name(pp_script_t *pps);
 #define pp_script_get_property(pp_script)   (val_t_to_proplist(pp_script_getconf((pp_script), PP_SCRIPT_PROPERTY)))
 #define pp_script_get_execute_on(pp_script)   (val_t_to_execute_on(pp_script_getconf((pp_script), PP_SCRIPT_EXECUTE_ON)))
 #define pp_script_get_execute_where(pp_script)   (val_t_to_execute_where(pp_script_getconf((pp_script), PP_SCRIPT_EXECUTE_WHERE)))
+#define pp_script_get_order(pp_script)   (val_t_to_int(pp_script_getconf((pp_script), PP_SCRIPT_ORDER)))
+#define pp_script_get_single_execution(pp_script)   (val_t_to_boolean(pp_script_getconf((pp_script), PP_SCRIPT_SINGLE_EXECUTION)))
+#define pp_script_get_client_name(pp_script)   (val_t_to_str(pp_script_getconf((pp_script), PP_SCRIPT_CLIENT_NAME)))
 
-pp_script_t *read_pp_script(char *name, FILE *from, char *fname, int *linenum);
 pp_script_t *lookup_pp_script(char *identifier);
 
 /* A device definition */
@@ -1005,7 +1112,6 @@ char *device_config_name(device_config_t *devconf);
 #define device_config_get_tapedev(devconf)   (val_t_to_str(device_config_getconf((devconf), DEVICE_CONFIG_TAPEDEV)))
 #define device_config_get_property(devconf)   (val_t_to_proplist(device_config_getconf((devconf), DEVICE_CONFIG_DEVICE_PROPERTY)))
 
-device_config_t *read_device_config(char *name, FILE *from, char *fname, int *linenum);
 device_config_t *lookup_device_config(char *identifier);
 
 /* A changer definition */
@@ -1015,6 +1121,8 @@ typedef enum {
     CHANGER_CONFIG_TPCHANGER,
     CHANGER_CONFIG_CHANGERDEV,
     CHANGER_CONFIG_CHANGERFILE,
+    CHANGER_CONFIG_PROPERTY,
+    CHANGER_CONFIG_DEVICE_PROPERTY,
     CHANGER_CONFIG_CHANGER_CONFIG
 } changer_config_key;
 
@@ -1060,15 +1168,123 @@ char *changer_config_name(changer_config_t *devconf);
  * @returns: various
  */
 
-#define changer_config_get_comment(devconf)   (val_t_to_str(changer_config_getconf((devconf), DEVICE_CONFIG_COMMENT)))
-#define changer_config_get_tapedev(devconf)   (val_t_to_str(changer_config_getconf((devconf), DEVICE_CONFIG_TAPEDEV)))
-#define changer_config_get_tpchanger(devconf)   (val_t_to_str(changer_config_getconf((devconf), DEVICE_CONFIG_TPCHANGER)))
-#define changer_config_get_changerdev(devconf)   (val_t_to_str(changer_config_getconf((devconf), DEVICE_CONFIG_CHANGERDEV)))
-#define changer_config_get_changerfile(devconf)   (val_t_to_str(changer_config_getconf((devconf), DEVICE_CONFIG_CHANGERFILE)))
+#define changer_config_get_comment(devconf)   (val_t_to_str(changer_config_getconf((devconf), CHANGER_CONFIG_COMMENT)))
+#define changer_config_get_tapedev(devconf)   (val_t_to_str(changer_config_getconf((devconf), CHANGER_CONFIG_TAPEDEV)))
+#define changer_config_get_tpchanger(devconf)   (val_t_to_str(changer_config_getconf((devconf), CHANGER_CONFIG_TPCHANGER)))
+#define changer_config_get_changerdev(devconf)   (val_t_to_str(changer_config_getconf((devconf), CHANGER_CONFIG_CHANGERDEV)))
+#define changer_config_get_changerfile(devconf)   (val_t_to_str(changer_config_getconf((devconf), CHANGER_CONFIG_CHANGERFILE)))
 
-changer_config_t *read_changer_config(char *name, FILE *from, char *fname, int *linenum);
 changer_config_t *lookup_changer_config(char *identifier);
 
+/* A interacrtivity interface */
+typedef enum interactivity_e  {
+    INTERACTIVITY_COMMENT,
+    INTERACTIVITY_PLUGIN,
+    INTERACTIVITY_PROPERTY,
+    INTERACTIVITY_INTERACTIVITY
+} interactivity_key;
+
+/* opaque object */
+typedef struct interactivity_s interactivity_t;
+
+/* Given the name of the interactivity, return a interactivity object.
+ *  Returns NULL if no matching interactivity exists.
+ *  Note that the match is case-insensitive.
+ *
+ * @param identifier: name of the desired interactivity
+ * @returns: object or NULL
+ */
+
+interactivity_t *lookup_interactivity(char *identifier);
+
+/* Given a interactivity and a key, return a pointer to the corresponding val_t.
+ *
+ * @param ttyp: the interactivity to examine
+ * @param key: interactivity (one of the INTERACTIVITY_* constants)
+ * @returns: pointer to value
+ */
+val_t *interactivity_getconf(interactivity_t *app, interactivity_key key);
+
+/* Get the name of this interactivity.
+ *
+ * @param ttyp: the interactivity to examine
+ * @returns: name of the interactivity
+ */
+char *interactivity_name(interactivity_t *app);
+
+/* (convenience macro) has this parameter been seen in this interactivity?
+ * This applies to the specific parameter *within* the interactivity.
+ *
+ * @param key: interactivity_key
+ * @returns: boolean
+ */
+#define interactivity_seen(app, key)       (val_t_seen(interactivity_getconf((app), (key))))
+
+/* (convenience macros)
+ * fetch a particular parameter; caller must know the correct type.
+ *
+ * @param ttyp: the interactivity to examine
+ * @returns: various
+ */
+#define interactivity_get_comment(interactivity)  (val_t_to_str(interactivity_getconf((interactivity), INTERACTIVITY_COMMENT))
+#define interactivity_get_plugin(interactivity)   (val_t_to_str(interactivity_getconf((interactivity), INTERACTIVITY_PLUGIN)))
+#define interactivity_get_property(interactivity) (val_t_to_proplist(interactivity_getconf((interactivity), INTERACTIVITY_PROPERTY)))
+
+/* A taperscan interface */
+typedef enum taperscan_e  {
+    TAPERSCAN_COMMENT,
+    TAPERSCAN_PLUGIN,
+    TAPERSCAN_PROPERTY,
+    TAPERSCAN_TAPERSCAN
+} taperscan_key;
+
+/* opaque object */
+typedef struct taperscan_s taperscan_t;
+
+/* Given the name of the taperscan, return a taperscan object.
+ *  Returns NULL if no matching taperscan exists.
+ *  Note that the match is case-insensitive.
+ *
+ * @param identifier: name of the desired taperscan
+ * @returns: object or NULL
+ */
+
+taperscan_t *lookup_taperscan(char *identifier);
+
+/* Given a taperscan and a key, return a pointer to the corresponding val_t.
+ *
+ * @param ttyp: the taperscan to examine
+ * @param key: taperscan (one of the TAPERSCAN_* constants)
+ * @returns: pointer to value
+ */
+val_t *taperscan_getconf(taperscan_t *app, taperscan_key key);
+
+/* Get the name of this taperscan.
+ *
+ * @param ttyp: the taperscan to examine
+ * @returns: name of the taperscan
+ */
+char *taperscan_name(taperscan_t *app);
+
+/* (convenience macro) has this parameter been seen in this taperscan?
+ * This applies to the specific parameter *within* the taperscan.
+ *
+ * @param key: taperscan_key
+ * @returns: boolean
+ */
+#define taperscan_seen(app, key)       (val_t_seen(taperscan_getconf((app), (key))))
+
+/* (convenience macros)
+ * fetch a particular parameter; caller must know the correct type.
+ *
+ * @param ttyp: the taperscan to examine
+ * @returns: various
+ */
+#define taperscan_get_comment(taperscan)  (val_t_to_str(taperscan_getconf((taperscan), TAPERSCAN_COMMENT))
+#define taperscan_get_plugin(taperscan)   (val_t_to_str(taperscan_getconf((taperscan), TAPERSCAN_PLUGIN)))
+#define taperscan_get_property(taperscan) (val_t_to_proplist(taperscan_getconf((taperscan), TAPERSCAN_PROPERTY)))
+
+
 /*
  * Error Handling
  */
@@ -1122,41 +1338,41 @@ void config_add_error(cfgerr_level_t level, char *errmsg);
  */
 
 /* opaque type */
-typedef struct config_overwrites_s config_overwrites_t;
+typedef struct config_overrides_s config_overrides_t;
 
-/* Create a new, empty config_overwrites object.
+/* Create a new, empty config_overrides object.
  *
  * @param size_estimate: a guess at the number of overwrites; argc/2 is a 
  *  good estimate.
  * @returns: new object
  */
-config_overwrites_t *new_config_overwrites(int size_estimate);
+config_overrides_t *new_config_overrides(int size_estimate);
 
-/* Free a config_overwrites object.  This usually won't be needed, as
- * apply_config_overwrites takes ownership of the overwrites for you.
+/* Free a config_overrides object.  This usually won't be needed, as
+ * apply_config_overrides takes ownership of the overwrites for you.
  *
- * @param co: config_overwrites object
+ * @param co: config_overrides object
  */
-void free_config_overwrites(config_overwrites_t *co);
+void free_config_overrides(config_overrides_t *co);
 
-/* Add an overwrite to a config_overwrites object.
+/* Add an overwrite to a config_overrides object.
  *
- * @param co: the config_overwrites object
+ * @param co: the config_overrides object
  * @param key: the configuration parameter's key, possibly with the format
  * SUBTYPE:NAME:KEYWORD
  * @param value: the value for the parameter, as would be seen in amanda.conf
  */
-void add_config_overwrite(config_overwrites_t *co,
+void add_config_override(config_overrides_t *co,
                         char *key,
                         char *value);
 
-/* Add an overwrite option from the command line to a config_overwrites
+/* Add an overwrite option from the command line to a config_overrides
  * object.  Calls error() with any errors
  *
- * @param co: the config_overwrites object
+ * @param co: the config_overrides object
  * @param optarg: the value of the command-line option
  */
-void add_config_overwrite_opt(config_overwrites_t *co,
+void add_config_override_opt(config_overrides_t *co,
                              char *optarg);
 
 /* Given a command line, represented as argc/argv, extract any -o options
@@ -1164,24 +1380,22 @@ void add_config_overwrite_opt(config_overwrites_t *co,
  *
  * This is the deprecated way to extract config overwrites, for applications
  * which do not use getopt.  The preferred method is to use getopt and
- * call add_config_overwrite_opt for any -o options.
+ * call add_config_override_opt for any -o options.
  *
  * @param argc: (in/out) command-line length
  * @param argv: (in/out) command-line strings
- * @returns: newly allocated config_overwrites object
+ * @returns: newly allocated config_overrides object
  */
-config_overwrites_t *
-extract_commandline_config_overwrites(int *argc,
+config_overrides_t *
+extract_commandline_config_overrides(int *argc,
                                      char ***argv);
 
-/* Apply configuration overwrites to the current configuration and take
- * ownership of the config_overwrites object.  It is the caller's
- * responsibility to handle any errors.
+/* Set configuration overwrites to the current configuration and take
+ * ownership of the config_overrides object.
  *
- * @param co: the config_overwrites object
- * @returns: current error level
+ * @param co: the config_overrides object
  */
-cfgerr_level_t apply_config_overwrites(config_overwrites_t *co);
+void set_config_overrides(config_overrides_t *co);
 
 /*
  * Initialization
@@ -1230,7 +1444,7 @@ cfgerr_level_t config_init(
  */
 void config_uninit(void);
 
-/* Encode any applied config_overwrites into a strv format suitale for
+/* Encode any applied config_overrides into a strv format suitale for
  * executing another Amanda tool.
  *
  * The * result is dynamically allocated and NULL terminated.  There is no
@@ -1281,7 +1495,10 @@ char *generic_get_security_conf(char *, void *);
  * This function only dumps the server configuration, and will fail on
  * clients.
  */
-void dump_configuration(void);
+void dump_configuration(gboolean print_default, gboolean print_source);
+
+void dump_dumptype(dumptype_t *dp, char *prefix, gboolean print_default,
+                  gboolean print_source);
 
 /* Return a sequence of strings giving the printable representation
  * of the given val_t.  If str_needs_quotes is true and each string is
@@ -1300,7 +1517,8 @@ void dump_configuration(void);
  * @param str_needs_quotes: add quotes to CONFTYPE_STR values?
  * @returns: NULL-terminated string vector
  */
-char **val_t_display_strs(val_t *val, int str_needs_quotes);
+char **val_t_display_strs(val_t *val, int str_needs_quotes, gboolean  print_source,
+                         gboolean print_unit);
 
 /* Read a dumptype; this is used by this module as well as by diskfile.c to
  * read the disklist.  The two are carefully balanced in their parsing process.
@@ -1345,18 +1563,28 @@ char *taperalgo2str(taperalgo_t taperalgo);
  */
 gint64 find_multiplier(char * casestr);
 
-/* Compute the size needed in an ARGV to pass all properties
+/* Converts a string matching any of Amanda's names for "true" or
+ * "false" to a boolean value.
  *
- * @param proplist: The property list
- * @returns: The size required for an ARGV
+ * @param str: string to match
+ * @returns: 0 or 1 (boolean) or -1 (no match)
  */
-int property_argv_size(proplist_t proplist);
+int string_to_boolean(const char *str);
+
+/* Return a pointer to a static string for the data_path */
+char *data_path_to_string(data_path_t data_path);
+
+/* Return the data_path for the string */
+data_path_t data_path_from_string(char *data);
+
+void free_property_t(gpointer p);
 
-/* Add all properties to an ARGV
+/* Converts a string into Amanda property name style.
  *
- * @param argvchild: Pointer to the ARGV.
- * @param proplist: The property list
+ * @param name: The name to convert.
+ * @returns: A newly allocated string, with name in lowercase and
+ * any instances of '_' replaced with '-'.
  */
-int property_add_to_argv(char **argvchild, proplist_t proplist);
+gchar *amandaify_property_name(const gchar *name);
 
 #endif /* ! CONFFILE_H */