]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Make first step toward eliminating globals from config
authorKern Sibbald <kern@sibbald.com>
Mon, 23 Jun 2008 06:41:41 +0000 (06:41 +0000)
committerKern Sibbald <kern@sibbald.com>
Mon, 23 Jun 2008 06:41:41 +0000 (06:41 +0000)
     scanning. Also should be a workaround for FORTIFY_SOURCE
     GNU C bug -- fixes bug #1042.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@7219 91ce42f0-d328-0410-95d8-f526ca767f89

38 files changed:
bacula/src/console/console.c
bacula/src/console/console_conf.c
bacula/src/dird/dird.c
bacula/src/dird/dird_conf.c
bacula/src/dird/dird_conf.h
bacula/src/dird/ua_cmds.c
bacula/src/dird/ua_dotcmds.c
bacula/src/dird/ua_output.c
bacula/src/dird/ua_server.c
bacula/src/filed/filed.c
bacula/src/filed/filed_conf.c
bacula/src/gnome2-console/console.c
bacula/src/gnome2-console/console_conf.c
bacula/src/lib/lib.h
bacula/src/lib/parse_conf.c
bacula/src/lib/parse_conf.h
bacula/src/lib/protos.h
bacula/src/lib/res.c
bacula/src/qt-console/bat_conf.cpp
bacula/src/qt-console/main.cpp
bacula/src/stored/bcopy.c
bacula/src/stored/bextract.c
bacula/src/stored/bls.c
bacula/src/stored/bscan.c
bacula/src/stored/btape.c
bacula/src/stored/dircmd.c
bacula/src/stored/status.c
bacula/src/stored/stored.c
bacula/src/stored/stored_conf.c
bacula/src/tools/dbcheck.c
bacula/src/tools/testfind.c
bacula/src/tray-monitor/tray-monitor.c
bacula/src/tray-monitor/tray_conf.c
bacula/src/version.h
bacula/src/wx-console/console_conf.c
bacula/src/wx-console/console_thread.cpp
bacula/src/wx-console/main.cpp
bacula/technotes-2.5

index 5553958b5b481c12caa2460800db4fbddd1d12b0..91849d6280df2aac8cb0c8d0b703e451b0e56f28 100644 (file)
@@ -61,6 +61,7 @@
 
 /* Imported functions */
 int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons);
+extern bool parse_cons_config(CONFIG *config, const char *configfile, int exit_code);
 
 /* Forward referenced functions */
 static void terminate_console(int sig);
@@ -91,6 +92,7 @@ static int numcon;
 static POOLMEM *args;
 static char *argk[MAX_CMD_ARGS];
 static char *argv[MAX_CMD_ARGS];
+static CONFIG *config;
 
 
 /* Command prototypes */
@@ -633,7 +635,8 @@ int main(int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_cons_config(config, configfile, M_ERROR_TERM);
 
    if (init_crypto() != 0) {
       Emsg0(M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
@@ -845,6 +848,9 @@ static void terminate_console(int sig)
       exit(1);
    }
    already_here = true;
+   config->free_resources();
+   free(config);
+   config = NULL;
    cleanup_crypto();
    free_pool_memory(args);
    if (!no_conio) {
index 73165e828f34082504696f24dc3c933ee12cb8f6..b2e1e0678da4039819760ac94a5c27d92df5c6cf 100644 (file)
@@ -54,8 +54,8 @@
  * types. Note, these should be unique for each
  * daemon though not a requirement.
  */
-int r_first = R_FIRST;
-int r_last  = R_LAST;
+int32_t r_first = R_FIRST;
+int32_t r_last  = R_LAST;
 static RES *sres_head[R_LAST - R_FIRST + 1];
 RES **res_head = sres_head;
 
@@ -74,7 +74,7 @@ extern "C" { // work around visual compiler mangling variables
 #else
 URES res_all;
 #endif
-int  res_all_size = sizeof(res_all);
+int32_t res_all_size = sizeof(res_all);
 
 /* Definition of records permitted within each
  * resource with the routine to process the record
@@ -329,3 +329,10 @@ void save_resource(int type, RES_ITEM *items, int pass)
       }
    }
 }
+
+bool parse_cons_config(CONFIG *config, const char *configfile, int exit_code)
+{
+   config->init(configfile, NULL, exit_code, (void *)&res_all, res_all_size,
+      r_first, r_last, resources, res_head);
+   return config->parse_config();
+}
index 9a0326e7dd3f102256395b9eea16e77f53acf06b..e8104b48656d3f27530eb29a259f27b790b51bf5 100644 (file)
@@ -46,7 +46,7 @@ static void dir_sql_query(JCR *jcr, const char *cmd);
 /* Exported subroutines */
 extern "C" void reload_config(int sig);
 extern void invalidate_schedules();
-
+extern bool parse_dir_config(CONFIG *config, const char *configfile, int exit_code);
 
 /* Imported subroutines */
 JCR *wait_for_next_job(char *runjob);
@@ -74,15 +74,10 @@ char *configfile = NULL;
 void *start_heap;
 
 /* Globals Imported */
-extern int r_first, r_last;           /* first and last resources */
-extern RES_TABLE resources[];
-extern RES **res_head;
 extern RES_ITEM job_items[];
-extern int  res_all_size;
-
 #if defined(_MSC_VER)
 extern "C" { // work around visual compiler mangling variables
-    extern URES res_all;
+   extern URES res_all;
 }
 #else
 extern URES res_all;
@@ -229,9 +224,7 @@ int main (int argc, char *argv[])
    }
 
    config = new_config_parser();
-   config->init(configfile, NULL, M_ERROR_TERM, (void *)&res_all, res_all_size,
-                r_first, r_last, resources, res_head);
-   config->parse_config();
+   parse_dir_config(config, configfile, M_ERROR_TERM);
 
    if (init_crypto() != 0) {
       Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
@@ -355,9 +348,11 @@ void terminate_dird(int sig)
    if (debug_level > 5) {
       print_memory_pool_stats();
    }
-   config->free_resources();
-   free(config);
-   config = NULL;
+   if (config) {
+      config->free_resources();
+      free(config);
+      config = NULL;
+   }
    term_ua_server();
    term_msg();                        /* terminate message handler */
    cleanup_crypto();
@@ -486,7 +481,7 @@ void reload_config(int sig)
    reload_table[table].res_table = config->save_resources();
    Dmsg1(100, "Saved old config in table %d\n", table);
 
-   ok = parse_config(configfile, 0, M_ERROR);  /* no exit on error */
+   ok = parse_dir_config(config, configfile, M_ERROR);
 
    Dmsg0(100, "Reloaded config file\n");
    if (!ok || !check_resources() || !check_catalog()) {
index fa9e345684ab98b3b8932c248e933084a004201f..615c2699e0b9c69e68dfe94e22f35aa57e5e34b0 100644 (file)
@@ -57,8 +57,8 @@
  * types. Note, these should be unique for each
  * daemon though not a requirement.
  */
-int r_first = R_FIRST;
-int r_last  = R_LAST;
+int32_t r_first = R_FIRST;
+int32_t r_last  = R_LAST;
 static RES *sres_head[R_LAST - R_FIRST + 1];
 RES **res_head = sres_head;
 
@@ -88,12 +88,12 @@ static void store_short_runscript(LEX *lc, RES_ITEM *item, int index, int pass);
  */
 #if defined(_MSC_VER)
 extern "C" { // work around visual compiler mangling variables
-    URES res_all;
+   URES res_all;
 }
 #else
 URES res_all;
 #endif
-int  res_all_size = sizeof(res_all);
+int32_t res_all_size = sizeof(res_all);
 
 
 /* Definition of records permitted within each
@@ -1992,3 +1992,10 @@ extern "C" char *job_code_callback_filesetname(JCR *jcr, const char* param)
       return NULL;
    }
 }
+
+bool parse_dir_config(CONFIG *config, const char *configfile, int exit_code)
+{
+   config->init(configfile, NULL, exit_code, (void *)&res_all, res_all_size,
+      r_first, r_last, resources, res_head);
+   return config->parse_config();
+}
index 8693318a7b2ef94a53bec5933356cf6438beafe5..0d10339a8d480f7aa6b40c6a63e7f6e39209245a 100644 (file)
@@ -78,14 +78,14 @@ struct s_kw {
 /* Job Level keyword structure */
 struct s_jl {
    const char *level_name;                 /* level keyword */
-   uint32_t  level;                        /* level */
-   uint32_t  job_type;                     /* JobType permitting this level */
+   int32_t  level;                         /* level */
+   int32_t  job_type;                      /* JobType permitting this level */
 };
 
 /* Job Type keyword structure */
 struct s_jt {
    const char *type_name;
-   uint32_t job_type;
+   int32_t job_type;
 };
 
 /* Definition of the contents of each Resource */
index 063a1b4c553bf0a7909249d5a83ceb98b49cc533..6952b3b9bdf41f5a5555ee93d58906a20014a68c 100644 (file)
@@ -40,9 +40,6 @@
 /* Imported subroutines */
 
 /* Imported variables */
-extern int r_first;
-extern int r_last;
-extern struct s_res resources[];
 extern jobq_t job_queue;              /* job queue */
 
 
index ced146c49a8a609127fc46f67291c5a477af26a9..da23d78a368e2c7e90713e5fe01290f8974fbe17 100644 (file)
@@ -42,9 +42,6 @@
 #include "dird.h"
 
 /* Imported variables */
-extern int r_first;
-extern int r_last;
-extern struct s_res resources[];
 
 /* Imported functions */
 extern void do_messages(UAContext *ua, const char *cmd);
index bf624fbca62329507d37ee78bb599516c32af413..f9118cce67c00d0eb54fd55fd283151d79349814 100644 (file)
 /* Imported subroutines */
 
 /* Imported variables */
-extern int r_first;
-extern int r_last;
-extern RES_TABLE resources[];
-extern RES **res_head;
 
 /* Imported functions */
 
index e7cb1002a6b3f1e903702d51b29097a48303395c..80b2f1f44210cdc19329c2097de8866413a4c66c 100644 (file)
@@ -38,9 +38,6 @@
 #include "dird.h"
 
 /* Imported variables */
-extern int r_first;
-extern int r_last;
-extern struct s_res resources[];
 
 
 /* Forward referenced functions */
index 1d731da927e5937ed6dd2d4a28cfe526249b835d..fa5efee21909f6d81f12036ce3dead7a237d430a 100644 (file)
@@ -39,6 +39,7 @@
 
 /* Imported Functions */
 extern void *handle_client_request(void *dir_sock);
+extern bool parse_fd_config(CONFIG *config, const char *configfile, int exit_code);
 
 /* Forward referenced functions */
 void terminate_filed(int sig);
@@ -56,7 +57,7 @@ char *configfile = NULL;
 static bool foreground = false;
 static workq_t dir_workq;             /* queue of work from Director */
 static pthread_t server_tid;
-
+static CONFIG *config;
 
 static void usage()
 {
@@ -181,7 +182,8 @@ int main (int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_fd_config(config, configfile, M_ERROR_TERM);
 
    if (init_crypto() != 0) {
       Emsg0(M_ERROR, 0, _("Cryptography library initialization failed.\n"));
@@ -262,8 +264,12 @@ void terminate_filed(int sig)
    if (debug_level > 0) {
       print_memory_pool_stats();
    }
+   if (config) {
+      config->free_resources();
+      free(config);
+      config = NULL;
+   }
    term_msg();
-   free_config_resources();
    cleanup_crypto();
    close_memory_pool();               /* release free memory in pool */
    sm_dump(false);                    /* dump orphaned buffers */
index 4641e9d6a4e9632320f53cdf07ecc96a416c1a39..c852236bded7b687ed9d010aeecc8884aba7e8bd 100644 (file)
@@ -56,8 +56,8 @@
  * types. Note, these should be unique for each
  * daemon though not a requirement.
  */
-int r_first = R_FIRST;
-int r_last  = R_LAST;
+int32_t r_first = R_FIRST;
+int32_t r_last  = R_LAST;
 static RES *sres_head[R_LAST - R_FIRST + 1];
 RES **res_head = sres_head;
 
@@ -72,12 +72,12 @@ RES **res_head = sres_head;
  */
 #if defined(_MSC_VER)
 extern "C" { // work around visual compiler mangling variables
-    URES res_all;
+   URES res_all;
 }
 #else
 URES res_all;
 #endif
-int  res_all_size = sizeof(res_all);
+int32_t res_all_size = sizeof(res_all);
 
 /* Definition of records permitted within each
  * resource with the routine to process the record
@@ -445,3 +445,10 @@ void save_resource(int type, RES_ITEM *items, int pass)
       }
    }
 }
+
+bool parse_fd_config(CONFIG *config, const char *configfile, int exit_code)
+{
+   config->init(configfile, NULL, exit_code, (void *)&res_all, res_all_size,
+      r_first, r_last, resources, res_head);
+   return config->parse_config();
+}
index 1916de19795e51e782e32f5d3f2077dedfdb4b76..1aa6d11672d165cb69d942ed25905a626d384518 100644 (file)
@@ -43,6 +43,8 @@
 /* Imported functions */
 int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons);
 void select_restore_setup();
+extern bool parse_gcons_config(CONFIG *config, const char *configfile, int exit_code);
+
 
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
@@ -92,6 +94,7 @@ static bool ready = false;
 static bool quit = false;
 static guint initial;
 static int numdir = 0;
+static CONFIG *config;
 
 #define CONFIG_FILE "./bgnome-console.conf"   /* default configuration file */
 
@@ -280,7 +283,8 @@ int main(int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_gcons_config(config, configfile, M_ERROR_TERM);
 
    if (init_crypto() != 0) {
       Emsg0(M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
@@ -694,6 +698,9 @@ void terminate_console(int sig)
    if (already_here)                  /* avoid recursive temination problems */
       exit(1);
    already_here = true;
+   config->free_resources();
+   free(config);
+   config = NULL;
    cleanup_crypto();
    disconnect_from_director((gpointer)NULL);
    gtk_main_quit();
index 31b9b6c04c59d42c5c89a105ee5d82e417016eb3..74c833facc24424c0c99ae552a5174be2b52285d 100644 (file)
@@ -56,8 +56,8 @@
  * types. Note, these should be unique for each
  * daemon though not a requirement.
  */
-int r_first = R_FIRST;
-int r_last  = R_LAST;
+int32_t r_first = R_FIRST;
+int32_t r_last  = R_LAST;
 static RES *sres_head[R_LAST - R_FIRST + 1];
 RES **res_head = sres_head;
 
@@ -70,7 +70,7 @@ RES **res_head = sres_head;
  * scan is complete.
  */
 URES res_all;
-int  res_all_size = sizeof(res_all);
+int32_t res_all_size = sizeof(res_all);
 
 /* Definition of records permitted within each
  * resource with the routine to process the record
@@ -334,3 +334,10 @@ void save_resource(int type, RES_ITEM *items, int pass)
       }
    }
 }
+
+bool parse_gcons_config(CONFIG *config, const char *configfile, int exit_code)
+{
+   config->init(configfile, NULL, exit_code, (void *)&res_all, res_all_size,
+      r_first, r_last, resources, res_head);
+   return config->parse_config();
+}
index 7ecc0858a64fd4133f35a003dd9ba6e84ffffc89..3820c3a3347adff47fad351c00135ee5b3ec2580 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
index 1811a5ade498b0abaf975ac32a4e5173c9d8c134..63003e8aea371f8c55d6e2f80a5346417f2b1bda 100644 (file)
 #define MAX_PATH  1024
 #endif
 
-/* Each daemon has a slightly different set of
- * resources, so it will define the following
- * global values.
- */
-extern int r_first;
-extern int r_last;
-extern RES_TABLE resources[];
-extern RES **res_head;
-
 /*
  * Define the Union of all the common resource structure definitions.
  */
@@ -93,7 +84,6 @@ extern "C" URES res_all;
 #else
 extern  URES res_all;
 #endif
-extern int res_all_size;
 
 extern brwlock_t res_lock;            /* resource lock */
 
@@ -811,6 +801,7 @@ void CONFIG::init(
  *  Note, the default behavior unless you have set an alternate
  *  scan_error handler is to die on an error.
  */
+#ifdef xxx
 int
 parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error, int err_type)
 {
@@ -822,6 +813,7 @@ parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error, int err_type)
    free(config);
    return ok;
 }
+#endif
       
    
 bool CONFIG::parse_config()
@@ -979,8 +971,8 @@ bool CONFIG::parse_config()
       }
       if (debug_level >= 900 && pass == 2) {
          int i;
-         for (i=r_first; i<=r_last; i++) {
-            dump_resource(i, res_head[i-r_first], prtmsg, NULL);
+         for (i=m_r_first; i<=m_r_last; i++) {
+            dump_resource(i, m_res_head[i-m_r_first], prtmsg, NULL);
          }
       }
       lc = lex_close_file(lc);
@@ -1079,6 +1071,8 @@ RES **CONFIG::new_res_head()
    return res;
 }
 
+
+#ifdef xxx
 void free_config_resources()
 {
    for (int i=r_first; i<=r_last; i++) {
@@ -1087,7 +1081,6 @@ void free_config_resources()
    }
 }
 
-#ifdef xxx
 RES **save_config_resources()
 {
    int num = r_last - r_first + 1;
index 898c916193e92606764b52d07f229390499c7453..8012beeca4e099318e06c8191c85534285900edf 100644 (file)
@@ -38,6 +38,7 @@ class RES;                         /* Declare forware referenced structure */
 typedef void (MSG_RES_HANDLER)(LEX *lc, RES_ITEM *item, int index, int pass);
 
 
+
 /* This is the structure that defines
  * the record types (items) permitted within each
  * resource. It is used to define the configuration
@@ -122,7 +123,7 @@ inline char *MSGS::name() const { return hdr.name; }
 /* 
  * Old C style configuration routines -- deprecated do not use.
  */
-int   parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error = NULL, int err_type=M_ERROR_TERM);
+//int   parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error = NULL, int err_type=M_ERROR_TERM);
 void    free_config_resources(void);
 RES   **save_config_resources(void);
 RES   **new_res_head();
@@ -138,6 +139,7 @@ public:
    int32_t m_err_type;                 /* the way to terminate on failure */
    void *m_res_all;                    /* pointer to res_all buffer */
    int32_t m_res_all_size;             /* length of buffer */
+
    /* The below are not yet implemented */
    int32_t m_r_first;                  /* first daemon resource type */
    int32_t m_r_last;                   /* last daemon resource type */
@@ -208,3 +210,10 @@ void store_time(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_size(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_defs(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_label(LEX *lc, RES_ITEM *item, int index, int pass);
+
+/* ***FIXME*** eliminate these globals */
+extern int32_t r_first;
+extern int32_t r_last;
+extern RES_TABLE resources[];
+extern RES **res_head;
+extern int32_t res_all_size;
index c5c153bdb67684c46881a9488bdd3f5e857eacaf..80df88a0f4f74b18c50cfe036406534084251301 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
index 4209943ffee5992c991960ced082c31279bd1681..8ba547b5a3895348d8a1b37abdda602940b4bac0 100644 (file)
  * resources, so it will define the following
  * global values.
  */
-extern int r_first;
-extern int r_last;
+extern int32_t r_first;
+extern int32_t r_last;
 extern RES_TABLE resources[];
 extern RES **res_head;
 
 brwlock_t res_lock;                   /* resource lock */
-static int res_locked = 0;            /* set when resource chains locked -- for debug */
+static int res_locked = 0;            /* resource chain lock count -- for debug */
 
 
 /* #define TRACE_RES */
index 8dca8462a3f84cbdaca501f08a8654fa7ebcaf22..403591caf216f5a34587c9e52577edb719de4703 100644 (file)
@@ -56,8 +56,8 @@
  * types. Note, these should be unique for each
  * daemon though not a requirement.
  */
-int r_first = R_FIRST;
-int r_last  = R_LAST;
+int32_t r_first = R_FIRST;
+int32_t r_last  = R_LAST;
 static RES *sres_head[R_LAST - R_FIRST + 1];
 RES **res_head = sres_head;
 
@@ -70,7 +70,7 @@ RES **res_head = sres_head;
  * scan is complete.
  */
 URES res_all;
-int  res_all_size = sizeof(res_all);
+int32_t res_all_size = sizeof(res_all);
 
 /* Definition of records permitted within each
  * resource with the routine to process the record
@@ -338,3 +338,10 @@ void save_resource(int type, RES_ITEM *items, int pass)
       }
    }
 }
+
+bool parse_bat_config(CONFIG *config, const char *configfile, int exit_code)
+{
+   config->init(configfile, NULL, exit_code, (void *)&res_all, res_all_size,
+      r_first, r_last, resources, res_head);
+   return config->parse_config();
+}
index 8a2f01667d2732ab8f47786c9caf06249110676f..6e471829f7f02fb380be18c40fe5a87b8c09d83f 100644 (file)
@@ -47,9 +47,12 @@ void terminate_console(int sig);
 static void usage();
 static int check_resources();
 
+extern bool parse_bat_config(CONFIG *config, const char *configfile, int exit_code);
+
 #define CONFIG_FILE "./bat.conf"   /* default configuration file */
 
 /* Static variables */
+static CONFIG *config;
 static char *configfile = NULL;
 
 int main(int argc, char *argv[])
@@ -136,7 +139,8 @@ int main(int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_bat_config(config, configfile, M_ERROR_TERM);
 
    if (init_crypto() != 0) {
       Emsg0(M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
index e99662477a21c5150850a74a87e6d1588b0cca52..dc302f45b2c4d081e41539243f7037b80b6b99dc 100644 (file)
@@ -40,6 +40,7 @@
 
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
+extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code);
 
 /* Forward referenced functions */
 static void get_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sessrec);
@@ -59,6 +60,7 @@ static uint32_t jobs = 0;
 static DEV_BLOCK *out_block;
 static SESSION_LABEL sessrec;
 
+static CONFIG *config;
 #define CONFIG_FILE "bacula-sd.conf"
 char *configfile = NULL;
 STORES *me = NULL;                    /* our Global resource */
@@ -74,7 +76,7 @@ PROG_COPYRIGHT
 "\nVersion: %s (%s)\n\n"
 "Usage: bcopy [-d debug_level] <input-archive> <output-archive>\n"
 "       -b bootstrap      specify a bootstrap file\n"
-"       -c <file>         specify configuration file\n"
+"       -c <file>         specify a Storage configuration file\n"
 "       -d <nn>           set debug level to <nn>\n"
 "       -dt               print timestamp in debug output\n"
 "       -i                specify input Volume names (separated by |)\n"
@@ -169,7 +171,8 @@ int main (int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_sd_config(config, configfile, M_ERROR_TERM);
 
    /* Setup and acquire input device for reading */
    Dmsg0(100, "About to setup input jcr\n");
index 7679da70af7b7756ed05e64a99d896500751c07f..b8ef13157b023c63096cb5a0795dbee9f0090c9d 100644 (file)
@@ -39,6 +39,8 @@
 #include "stored.h"
 #include "findlib/find.h"
 
+extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code);
+
 static void do_extract(char *fname);
 static bool record_cb(DCR *dcr, DEV_RECORD *rec);
 
@@ -64,6 +66,7 @@ static char *wbuf;                    /* write buffer address */
 static uint32_t wsize;                /* write size */
 static uint64_t fileAddr = 0;         /* file write address */
 
+static CONFIG *config;
 #define CONFIG_FILE "bacula-sd.conf"
 char *configfile = NULL;
 STORES *me = NULL;                    /* our Global resource */
@@ -78,7 +81,7 @@ PROG_COPYRIGHT
 "\nVersion: %s (%s)\n\n"
 "Usage: bextract <options> <bacula-archive-device-name> <directory-to-store-files>\n"
 "       -b <file>       specify a bootstrap file\n"
-"       -c <file>       specify a configuration file\n"
+"       -c <file>       specify a Storage configuration file\n"
 "       -d <nn>         set debug level to <nn>\n"
 "       -dt             print timestamp in debug output\n"
 "       -e <file>       exclude list\n"
@@ -198,7 +201,8 @@ int main (int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_sd_config(config, configfile, M_ERROR_TERM);
 
    if (!got_inc) {                            /* If no include file, */
       add_fname_to_include_list(ff, 0, "/");  /*   include everything */
@@ -343,11 +347,11 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
 
          build_attr_output_fnames(jcr, attr);
 
-        if (attr->type == FT_DELETED) { /* TODO: choose the right fname/ofname */
-           Jmsg(jcr, M_INFO, 0, _("%s was deleted.\n"), attr->fname);
-           extract = false;
-           return true;
-        }
+         if (attr->type == FT_DELETED) { /* TODO: choose the right fname/ofname */
+            Jmsg(jcr, M_INFO, 0, _("%s was deleted.\n"), attr->fname);
+            extract = false;
+            return true;
+         }
 
          extract = false;
          stat = create_file(jcr, attr, &bfd, REPLACE_ALWAYS);
@@ -521,4 +525,3 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw  writing)
    Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->VolCatInfo.VolCatName, dcr->VolCatInfo.VolCatParts);
    return 1;
 }
-
index 3e18ddb76f70fadf5d5ba03ef5217d26bea37f0e..0e3d9566f74e86617cc6a3f480cf6c8aee39d6d2 100644 (file)
@@ -40,6 +40,7 @@
 
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
+extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code);
 
 static void do_blocks(char *infname);
 static void do_jobs(char *infname);
@@ -58,6 +59,7 @@ static JCR *jcr;
 static SESSION_LABEL sessrec;
 static uint32_t num_files = 0;
 static ATTR *attr;
+static CONFIG *config;
 
 #define CONFIG_FILE "bacula-sd.conf"
 char *configfile = NULL;
@@ -78,7 +80,7 @@ PROG_COPYRIGHT
 "\nVersion: %s (%s)\n\n"
 "Usage: bls [options] <device-name>\n"
 "       -b <file>       specify a bootstrap file\n"
-"       -c <file>       specify a config file\n"
+"       -c <file>       specify a Storage configuration file\n"
 "       -d <nn>         set debug level to <nn>\n"
 "       -dt             print timestamp in debug output\n"
 "       -e <file>       exclude list\n"
@@ -214,7 +216,8 @@ int main (int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_sd_config(config, configfile, M_ERROR_TERM);
 
    if (ff->included_files_list == NULL) {
       add_fname_to_include_list(ff, 0, "/");
@@ -475,4 +478,3 @@ bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw  writing)
    Dmsg2(500, "Vol=%s num_parts=%d\n", dcr->VolCatInfo.VolCatName, dcr->VolCatInfo.VolCatParts);
    return 1;
 }
-
index fde0ba1ff06a960b1e9203d3e768e0a55c11207a..c55c0a0359356ada6b4577639541811744dcd4e6 100644 (file)
@@ -44,6 +44,7 @@
  
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
+extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code);
 
 /* Forward referenced functions */
 static void do_scan(void);
@@ -102,6 +103,7 @@ static int num_pools = 0;
 static int num_media = 0;
 static int num_files = 0;
 
+static CONFIG *config;
 #define CONFIG_FILE "bacula-sd.conf"
 char *configfile = NULL;
 STORES *me = NULL;                    /* our Global resource */
@@ -251,7 +253,8 @@ int main (int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_sd_config(config, configfile, M_ERROR_TERM);
    LockRes();
    me = (STORES *)GetNextRes(R_STORAGE, NULL);
    if (!me) {
index 95ecfc43e175ca4308d15135cad3b4dfae87a969..6a7844fcb945a6b0be7c83eb79e8164bc2be3d93 100644 (file)
@@ -50,6 +50,7 @@
 
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
+extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code);
 
 /* External subroutines */
 extern void free_config_resources();
@@ -102,6 +103,7 @@ static void do_unfill();
 
 
 /* Static variables */
+static CONFIG *config;
 #define CONFIG_FILE "bacula-sd.conf"
 char *configfile = NULL;
 
@@ -269,8 +271,8 @@ int main(int margc, char *margv[])
 
    daemon_start_time = time(NULL);
 
-   parse_config(configfile);
-
+   config = new_config_parser();
+   parse_sd_config(config, configfile, M_ERROR_TERM);
 
    /* See if we can open a device */
    if (margc == 0) {
@@ -321,7 +323,11 @@ static void terminate_btape(int stat)
    if (configfile) {
       free(configfile);
    }
-   free_config_resources();
+   if (config) {
+      config->free_resources();
+      free(config);
+      config = NULL;
+   }
    if (args) {
       free_pool_memory(args);
       args = NULL;
index b2eb57dcfd6b068159291563667700e32b5711b5..972c66fc8a4d841383c50e8e2610f1fd3382d21e 100644 (file)
@@ -54,8 +54,6 @@
 
 /* Imported variables */
 extern BSOCK *filed_chan;
-extern int r_first, r_last;
-extern struct s_res resources[];
 extern struct s_last_job last_job;
 extern bool init_done;
 
index eb02eb24188346c042e0ff3893008c51b985f6dd..82b9a4dbb60bc5dcbdf3cbf05619df9b21765414 100644 (file)
@@ -42,8 +42,6 @@
 
 /* Imported variables */
 extern BSOCK *filed_chan;
-extern int r_first, r_last;
-extern struct s_res resources[];
 extern void *start_heap;
 
 /* Static variables */
index 36ae297f397233add3cce53abebfeda2adcb3a6c..d855d61c99eaa244a67e51baa16c84c363bb8531 100644 (file)
@@ -43,7 +43,7 @@
 #include "stored.h"
 
 /* Imported functions */
-
+extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code);
 
 /* Forward referenced functions */
 void terminate_stored(int sig);
@@ -73,6 +73,7 @@ bool init_done = false;
 static bool foreground = 0;
 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 static workq_t dird_workq;            /* queue for processing connections */
+static CONFIG *config;
 
 
 static void usage()
@@ -209,7 +210,8 @@ int main (int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_sd_config(config, configfile, M_ERROR_TERM);
 
    if (init_crypto() != 0) {
       Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
@@ -614,7 +616,11 @@ void terminate_stored(int sig)
       free(configfile);
       configfile = NULL;
    }
-   free_config_resources();
+   if (config) {
+      config->free_resources();
+      free(config);
+      config = NULL;
+  }
 
    if (debug_level > 10) {
       print_memory_pool_stats();
index dc141317afb20e38a94dc7df2e5f503af1839c2e..fadf14feb9e86e9c0f5d106eda3d9eeee8755b03 100644 (file)
@@ -37,8 +37,8 @@
 #include "stored.h"
 
 /* First and last resource ids */
-int r_first = R_FIRST;
-int r_last  = R_LAST;
+int32_t r_first = R_FIRST;
+int32_t r_last  = R_LAST;
 static RES *sres_head[R_LAST - R_FIRST + 1];
 RES **res_head = sres_head;
 
@@ -56,7 +56,7 @@ extern "C" { // work around visual compiler mangling variables
 #else
 URES res_all;
 #endif
-int res_all_size = sizeof(res_all);
+int32_t res_all_size = sizeof(res_all);
 
 /* Definition of records permitted within each
  * resource with the routine to process the record
@@ -681,3 +681,10 @@ void save_resource(int type, RES_ITEM *items, int pass)
       }
    }
 }
+
+bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code)
+{
+   config->init(configfile, NULL, exit_code, (void *)&res_all, res_all_size,
+      r_first, r_last, resources, res_head);
+   return config->parse_config();
+}
index 07a501e4f7cb944c7635afbfd4c86cfb775c67af..1b6a509c49dd5cbe82887454072fd62cc3300cab 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2002-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2002-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -41,6 +41,8 @@
 #include "lib/runscript.h"
 #include "dird/dird_conf.h"
 
+extern bool parse_dir_config(CONFIG *config, const char *configfile, int exit_code);
+
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) 
    { return 1; }
@@ -71,6 +73,7 @@ static ID_LIST id_list;
 static NAME_LIST name_list;
 static char buf[20000];
 static bool quit = false;
+static CONFIG *config;
 
 #define MAX_ID_LIST_LEN 10000000
 
@@ -104,7 +107,7 @@ static void usage()
 "Usage: dbcheck [-c config] [-C catalog name] [-d debug_level] <working-directory> <bacula-database> <user> <password> [<dbhost>]\n"
 "       -b              batch mode\n"
 "       -C              catalog name in the director conf file\n"
-"       -c              director conf filename\n"
+"       -c              Director conf filename\n"
 "       -d <nn>         set debug level to <nn>\n"
 "       -dt             print timestamp in debug output\n"
 "       -f              fix inconsistencies\n"
@@ -180,7 +183,8 @@ int main (int argc, char *argv[])
       if (argc > 0) {
          Pmsg0(0, _("Warning skipping the additional parameters for working directory/dbname/user/password/host.\n"));
       }
-      parse_config(configfile);
+      config = new_config_parser();
+      parse_dir_config(config, configfile, M_ERROR_TERM);
       LockRes();
       foreach_res(catalog, R_CATALOG) {
          if (catalogname && !strcmp(catalog->hdr.name, catalogname)) {
index 246b4df8255f34a98e0b790b8690ad23a7cb502a..81dc27b131fa27f71ab1833add6ffec0868566c3 100644 (file)
@@ -44,6 +44,7 @@
 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
 int generate_job_event(JCR *jcr, const char *event) { return 1; }
 void generate_plugin_event(JCR *jcr, bEventType eventType, void *value) { }
+extern bool parse_dir_config(CONFIG *config, const char *configfile, int exit_code);
 
 /* Global variables */
 static int num_files = 0;
@@ -52,6 +53,7 @@ static int max_path_len = 0;
 static int trunc_fname = 0;
 static int trunc_path = 0;
 static int attrs = 0;
+static CONFIG *config;
 
 static JCR *jcr;
 
@@ -133,7 +135,8 @@ main (int argc, char *const *argv)
    argc -= optind;
    argv += optind;
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_dir_config(config, configfile, M_ERROR_TERM);
 
    MSGS *msg;
 
@@ -166,7 +169,12 @@ main (int argc, char *const *argv)
    find_files(jcr, ff, print_file, NULL);
 
    free_jcr(jcr);
-   free_config_resources();
+   if (config) {
+      config->free_resources();
+      free(config);
+      config = NULL;
+   }
+   
    term_last_jobs_list();
 
    /* Clean up fileset */
index df2b46f09ddedd9ef6b5d726a53768b51f4a21ca..260bbbedec958aec27c7b4aa255a620702576606 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2004-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2004-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -46,6 +46,7 @@
 int authenticate_director(JCR *jcr, MONITOR *monitor, DIRRES *director);
 int authenticate_file_daemon(JCR *jcr, MONITOR *monitor, CLIENT* client);
 int authenticate_storage_daemon(JCR *jcr, MONITOR *monitor, STORE* store);
+extern bool parse_tmon_config(CONFIG *config, const char *configfile, int exit_code);
 
 /* Dummy functions */
 int generate_daemon_event(JCR *jcr, const char *event) { return 1; }
@@ -63,6 +64,7 @@ static int nitems = 0;
 static int fullitem = 0; //Item to be display in detailled status window
 static int lastupdated = -1; //Last item updated
 static monitoritem items[32];
+static CONFIG *config;
 
 /* Data received from DIR/FD/SD */
 static char OKqstatus[]   = "%c000 OK .status\n";
@@ -253,7 +255,8 @@ int main(int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parse_config(configfile);
+   config = new_config_parser();
+   parse_tmon_config(config, configfile, M_ERROR_TERM);
 
    LockRes();
    nitems = 0;
@@ -529,6 +532,9 @@ int main(int argc, char *argv[])
    
    gtk_object_destroy(GTK_OBJECT(window));
    gtk_object_destroy(GTK_OBJECT(mTrayMenu));
+   config->free_resources();
+   free(config);
+   config = NULL;
    term_msg();
 
 #if TRAY_DEBUG_MEMORY
index d6d866ef52dd76b0396741a71f555b2801408f8c..6d0242d468e6fc2714d6086308f441a27b580791 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2004-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2004-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -56,8 +56,8 @@
 * types. Note, these should be unique for each
 * daemon though not a requirement.
 */
-int r_first = R_FIRST;
-int r_last  = R_LAST;
+int32_t r_first = R_FIRST;
+int32_t r_last  = R_LAST;
 static RES *sres_head[R_LAST - R_FIRST + 1];
 RES **res_head = sres_head;
 
@@ -67,7 +67,7 @@ RES **res_head = sres_head;
 * scan is complete.
 */
 URES res_all;
-int  res_all_size = sizeof(res_all);
+int32_t res_all_size = sizeof(res_all);
 
 
 /* Definition of records permitted within each
@@ -379,3 +379,10 @@ void save_resource(int type, RES_ITEM *items, int pass)
       }
    }
 }
+
+bool parse_tmon_config(CONFIG *config, const char *configfile, int exit_code)
+{
+   config->init(configfile, NULL, exit_code, (void *)&res_all, res_all_size,
+      r_first, r_last, resources, res_head);
+   return config->parse_config();
+}
index d9fd1b75b1f20180f71f56442c30fe18fc9249f0..8cecadb8b892b262508b8b80534be16af49e8a50 100644 (file)
@@ -4,8 +4,8 @@
 
 #undef  VERSION
 #define VERSION "2.5.1"
-#define BDATE   "20 June 2008"
-#define LSMDATE "20Jun08"
+#define BDATE   "22 June 2008"
+#define LSMDATE "22Jun08"
 
 #define PROG_COPYRIGHT "Copyright (C) %d-2008 Free Software Foundation Europe e.V.\n"
 #define BYEAR "2008"       /* year for copyright messages in progs */
index 35979f793b62dea16c0d8bcf8017516923896ca1..e9f5730a2a0043decc1a2333cffa209693288688 100644 (file)
@@ -1,28 +1,7 @@
-/*
- *   Main configuration file parser for Bacula User Agent
- *    some parts may be split into separate files such as
- *    the schedule configuration (sch_config.c).
- *
- *   Note, the configuration file parser consists of three parts
- *
- *   1. The generic lexical scanner in lib/lex.c and lib/lex.h
- *
- *   2. The generic config  scanner in lib/parse_config.c and
- * lib/parse_config.h.
- * These files contain the parser code, some utility
- * routines, and the common store routines (name, int,
- * string).
- *
- *   3. The daemon specific file, which contains the Resource
- * definitions as well as any specific store routines
- * for the resource records.
- *
- *     Kern Sibbald, January MM, September MM
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ *   Main configuration file parser for Bacula User Agent
+ *    some parts may be split into separate files such as
+ *    the schedule configuration (sch_config.c).
+ *
+ *   Note, the configuration file parser consists of three parts
+ *
+ *   1. The generic lexical scanner in lib/lex.c and lib/lex.h
+ *
+ *   2. The generic config  scanner in lib/parse_config.c and
+ * lib/parse_config.h.
+ * These files contain the parser code, some utility
+ * routines, and the common store routines (name, int,
+ * string).
+ *
+ *   3. The daemon specific file, which contains the Resource
+ * definitions as well as any specific store routines
+ * for the resource records.
+ *
+ *     Kern Sibbald, January MM, September MM
+ */
 
 /* _("...") macro returns a wxChar*, so if we need a char*, we need to convert it with:
  * wxString(_("...")).mb_str(*wxConvCurrent) */
@@ -66,8 +66,8 @@
  * types. Note, these should be unique for each
  * daemon though not a requirement.
  */
-int r_first = R_FIRST;
-int r_last  = R_LAST;
+int32_t r_first = R_FIRST;
+int32_t r_last  = R_LAST;
 static RES *sres_head[R_LAST - R_FIRST + 1];
 RES **res_head = sres_head;
 
@@ -86,7 +86,7 @@ extern "C" { // work around visual compiler mangling variables
 #else
 URES res_all;
 #endif
-int  res_all_size = sizeof(res_all);
+int32_t res_all_size = sizeof(res_all);
 
 /* Definition of records permitted within each
  * resource with the routine to process the record
@@ -335,3 +335,10 @@ void save_resource(int type, RES_ITEM *items, int pass)
       }
    }
 }
+
+bool parse_wxcons_config(CONFIG *config, const char *configfile, LEX_ERROR_HANDLER *scan_error)
+{
+   config->init(configfile, scan_error, M_ERROR_TERM, (void *)&res_all, res_all_size,
+      r_first, r_last, resources, res_head);
+   return config->parse_config();
+}
index 964a7a5aa8f1ac1b6efe1c432479f93712b9f98c..0d2c0f1294d778c28b472b89434703d59cf9ad6e 100644 (file)
@@ -1,15 +1,7 @@
-/*
- *
- *    Interaction thread between director and the GUI
- *
- *    Nicolas Boichat, April 2004
- *
- *    Version $Id$
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2004-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2004-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ *
+ *    Interaction thread between director and the GUI
+ *
+ *    Nicolas Boichat, April 2004
+ *
+ *    Version $Id$
+ */
 
 // http://66.102.9.104/search?q=cache:Djc1mPF3hRoJ:cvs.sourceforge.net/viewcvs.py/audacity/audacity-src/src/AudioIO.cpp%3Frev%3D1.102+macos+x+wxthread&hl=fr
 
@@ -65,12 +65,16 @@ char TERM_msg[] = "2999 Terminate\n";
 
 /* Imported functions */
 int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons);
+bool parse_wxcons_config(CONFIG *config, const char *cfgfile, LEX_ERROR_HANDLER *scan_error);
 
 bool console_thread::inited = false;
 bool console_thread::configloaded = false;
 wxString console_thread::working_dir = wxT(".");
 
 int numdir = 0;
+static CONFIG *config = NULL;
+static void scan_err(const char *file, int line, LEX *lc, const char *msg, ...);
+
 
 /*
  * Call-back for reading a passphrase for an encrypted PEM file
@@ -224,7 +228,10 @@ wxString console_thread::LoadConfig(wxString configfile)
          return _("Error while initializing library.");
    }
    
-   free_config_resources();
+   if (config) {
+      config->free_resources();
+      free(config);
+   }          
    
    MSGS* msgs = (MSGS *)bmalloc(sizeof(MSGS));
    memset(msgs, 0, sizeof(MSGS));
@@ -238,7 +245,8 @@ wxString console_thread::LoadConfig(wxString configfile)
    //init_console_msg(console_thread::working_dir.mb_str(*wxConvCurrent));
 
    errmsg = wxT("");
-   if (!parse_config(configfile.mb_str(*wxConvCurrent), &scan_err)) {
+   config = new_config_parser();
+   if (!parse_wxcons_config(config, configfile.mb_str(*wxConvCurrent), &scan_err)) {
       configloaded = false;
       term_msg();
       return errmsg;
index 8091076e758a87d4aae8641c1639f1eb5b4ecfe9..4b15b8021df3f32c41a5706cb8d10b298249e938 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2004-20076 Free Software Foundation Europe e.V.
+   Copyright (C) 2004-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
index 8eadc84422a466720cbefd0e633baa19fce9a3d3..7d4f3ca54376e6aba3ba20b1a2f31b2c69eb029b 100644 (file)
@@ -30,6 +30,9 @@ vtape driver
 
 
 General:
+kes  Make first step toward eliminating globals from config
+     scanning. Also should be a workaround for FORTIFY_SOURCE
+     GNU C bug -- fixes bug #1042.
 21Jun08
 kes  Apply duplicate job tests to restarted jobs.
 kes  Copy more data when restarting a job so that run