]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Correct po warning message with datarootdir
authorKern Sibbald <kern@sibbald.com>
Thu, 28 Feb 2008 20:18:11 +0000 (20:18 +0000)
committerKern Sibbald <kern@sibbald.com>
Thu, 28 Feb 2008 20:18:11 +0000 (20:18 +0000)
kes  Implement more code in dird.c to put configuration parsing in
     a class rather than use globals.
kes  Restructure SD status command for implementation of bat API
     interface.

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

bacula/autoconf/Make.common.in
bacula/kernstodo
bacula/po/Makefile.in.in
bacula/src/dird/dird.c
bacula/src/lib/parse_conf.c
bacula/src/lib/parse_conf.h
bacula/src/stored/status.c
bacula/technotes-2.3

index 155e4e591edea2cfaad80f5f63eb77972777e728..c00958580e4f7562ab0c9a42ea2d37450f53c5c4 100644 (file)
@@ -23,6 +23,7 @@ prefix = @prefix@
 exec_prefix = @exec_prefix@
 binprefix =
 manprefix =
+datarootdir = @datarootdir@
 sbindir = @sbindir@
 sysconfdir = @sysconfdir@
 scriptdir = @scriptdir@
index 5a34b80e5bdde7424aadca8ffff22abd2f250130..13cf69f8f81a40f6969a31e522c1b0ccf11af00e 100644 (file)
@@ -70,11 +70,6 @@ Professional Needs:
    and http://www.openeyet.nl/scc/ for managing customer changes
 
 Priority:
-- Look at in src/filed/backup.c
->    pm_strcpy(ff_pkt->fname, ff_pkt->fname_save);
->    pm_strcpy(ff_pkt->link, ff_pkt->link_save);
-- Add Catalog = to Pool resource so that pools will exist
-  in only one catalog -- currently Pools are "global".
 - New directive "Delete purged Volumes"
 - Prune by Job
 - Prune by Job Level (Full, Differential, Incremental)
@@ -135,6 +130,31 @@ Priority:
     level attempts to start, the running job is promoted to the higher level
     of processing using the resources already allocated, and the subsequent
     job is treated as in Skip above.
+
+
+DuplicateJobs {
+  Name = "xxx"
+  Description = "xxx"
+  Allow = yes|no          (no = default)
+
+  AllowHigherLevel = yes|no    (no)
+
+  AllowLowerLevel = yes|no     (no)
+
+  AllowSameLevel = yes|no 
+
+  Cancel = Running | New        (no)
+
+  CancelledStatus = Fail | Skip  (fail)
+
+  Job Proximity = <time-interval>  (0)
+  My suggestion was to define it as the minimum guard time between
+  executions of a specific job -- ie, if a job was scheduled within Job
+  Proximity number of seconds, it would be considered a duplicate and
+  consolidated.
+
+}
+
 ===
 - the cd-command should allow complete paths
   i.e. cd /foo/bar/foo/bar
@@ -187,7 +207,6 @@ Priority:
 - Performance: despool attributes when despooling data (problem
   multiplexing Dir connection).
 - Make restore use the in-use volume reservation algorithm.
-- Add TLS to bat (should be done).
 - When Pool specifies Storage command override does not work.
 - Implement wait_for_sysop() message display in wait_for_device(), which
   now prints warnings too often.
@@ -1845,3 +1864,10 @@ Block Position: 0
 - Unicode input http://en.wikipedia.org/wiki/Byte_Order_Mark
 - Look at moving the Storage directive from the Job to the
   Pool in the default conf files.
+- Look at in src/filed/backup.c
+>    pm_strcpy(ff_pkt->fname, ff_pkt->fname_save);
+>    pm_strcpy(ff_pkt->link, ff_pkt->link_save);
+- Add Catalog = to Pool resource so that pools will exist
+  in only one catalog -- currently Pools are "global".
+- Add TLS to bat (should be done).
+
index d966318b38a4d05200271b7eb1c7f92870450be8..9ff8751cfbe29ea8035c9d61a6e403aa0274ef17 100644 (file)
@@ -25,6 +25,7 @@ VPATH = @srcdir@
 prefix = @prefix@
 exec_prefix = @exec_prefix@
 datadir = @datadir@
+datarootdir = @datarootdir@
 localedir = $(datadir)/locale
 gettextsrcdir = $(datadir)/gettext/po
 
@@ -185,23 +186,23 @@ install-data-yes: all
          for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
            if test -n "$$lc"; then \
              if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
-               link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
-               mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
-               mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
-               (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
-                for file in *; do \
-                  if test -f $$file; then \
-                    ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
-                  fi; \
-                done); \
-               rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+               link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+               mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+               mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+                for file in *; do \
+                  if test -f $$file; then \
+                    ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+                  fi; \
+                done); \
+               rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
              else \
-               if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
-                 :; \
-               else \
-                 rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
-                 mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
-               fi; \
+               if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+                 :; \
+               else \
+                 rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+                 mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               fi; \
              fi; \
              rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
              ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
@@ -234,23 +235,23 @@ installdirs-data-yes:
          for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
            if test -n "$$lc"; then \
              if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
-               link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
-               mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
-               mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
-               (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
-                for file in *; do \
-                  if test -f $$file; then \
-                    ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
-                  fi; \
-                done); \
-               rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+               link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+               mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+               mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+                for file in *; do \
+                  if test -f $$file; then \
+                    ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+                  fi; \
+                done); \
+               rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
              else \
-               if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
-                 :; \
-               else \
-                 rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
-                 mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
-               fi; \
+               if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+                 :; \
+               else \
+                 rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+                 mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               fi; \
              fi; \
            fi; \
          done; \
index 4cb1b27cb5e22870e8045350e76a2a1976c673ad..d42b00defc5899ceb95cd34001eef8d8186da1f8 100644 (file)
@@ -64,7 +64,7 @@ void init_device_resources();
 static char *runjob = NULL;
 static int background = 1;
 static void init_reload(void);
-static PARSER *parser;
+static CONFIG *config;
  
 /* Globals Exported */
 DIRRES *director;                     /* Director resource */
@@ -228,10 +228,10 @@ int main (int argc, char *argv[])
       configfile = bstrdup(CONFIG_FILE);
    }
 
-   parser = new_parser();
-   parser->init(configfile, NULL, M_ERROR_TERM, (void *)&res_all, res_all_size,
+   config = new_config_parser();
+   config->init(configfile, NULL, M_ERROR_TERM, (void *)&res_all, res_all_size,
                 r_first, r_last, resources, res_head);
-   parser->parse_config();
+   config->parse_config();
 
    if (init_crypto() != 0) {
       Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
@@ -354,8 +354,9 @@ void terminate_dird(int sig)
    if (debug_level > 5) {
       print_memory_pool_stats();
    }
-   free_config_resources();
-   free(parser);
+   config->free_resources();
+   free(config);
+   config = NULL;
    term_ua_server();
    term_msg();                        /* terminate message handler */
    cleanup_crypto();
@@ -481,7 +482,7 @@ void reload_config(int sig)
    }
 
    Dmsg1(100, "Reload_config njobs=%d\n", njobs);
-   reload_table[table].res_table = save_config_resources();
+   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 */
@@ -496,7 +497,7 @@ void reload_config(int sig)
          Jmsg(NULL, M_ERROR, 0, _("Please correct configuration file: %s\n"), configfile);
          Jmsg(NULL, M_ERROR, 0, _("Resetting previous configuration.\n"));
       }
-      reload_table[rtable].res_table = save_config_resources();
+      reload_table[rtable].res_table = config->save_resources();
       /* Now restore old resoure values */
       int num = r_last - r_first + 1;
       RES **res_tab = reload_table[table].res_table;
index 110bfec8a6e3467e0a1c4b8213f5456304dfe65a..85cb77d831cf03137215fc20c0bbbbb4b5468d54 100644 (file)
@@ -196,12 +196,12 @@ const char *res_to_str(int rcode)
  * Initialize the static structure to zeros, then
  *  apply all the default values.
  */
-static void init_resource(PARSER *parser, int type, RES_ITEM *items, int pass)
+static void init_resource(CONFIG *config, int type, RES_ITEM *items, int pass)
 {
    int i;
    int rindex = type - r_first;
 
-   memset(parser->m_res_all, 0, parser->m_res_all_size);
+   memset(config->m_res_all, 0, config->m_res_all_size);
    res_all.hdr.rcode = type;
    res_all.hdr.refcnt = 1;
 
@@ -773,15 +773,15 @@ enum parse_state {
    p_resource
 };
 
-PARSER *new_parser()
+CONFIG *new_config_parser()
 {
-   PARSER *parser;
-   parser = (PARSER *)malloc(sizeof(PARSER));
-   memset(parser, 0, sizeof(PARSER));
-   return parser;
+   CONFIG *config;
+   config = (CONFIG *)malloc(sizeof(CONFIG));
+   memset(config, 0, sizeof(CONFIG));
+   return config;
 }
 
-void PARSER::init(
+void CONFIG::init(
    const char *cf,
    LEX_ERROR_HANDLER *scan_error,
    int err_type,
@@ -815,16 +815,16 @@ int
 parse_config(const char *cf, LEX_ERROR_HANDLER *scan_error, int err_type)
 {
    int ok;
-   PARSER *parser = new_parser();
-   parser->init(cf, scan_error, err_type, (void *)&res_all, res_all_size,    
+   CONFIG *config = new_config_parser();
+   config->init(cf, scan_error, err_type, (void *)&res_all, res_all_size,    
                 r_first, r_last, resources, res_head);
-   ok = parser->parse_config();
-   free(parser);
+   ok = config->parse_config();
+   free(config);
    return ok;
 }
       
    
-bool PARSER::parse_config()
+bool CONFIG::parse_config()
 {
    LEX *lc = NULL;
    int token, i, pass;
@@ -1052,6 +1052,33 @@ find_config_file(const char *config_file, char *full_path, int max_path)
  *      Free configuration resources
  *
  */
+void CONFIG::free_resources()
+{
+   for (int i=m_r_first; i<=m_r_last; i++) {
+      free_resource(m_res_head[i-m_r_first], i);
+      m_res_head[i-m_r_first] = NULL;
+   }
+}
+
+RES **CONFIG::save_resources()
+{
+   int num = m_r_last - m_r_first + 1;
+   RES **res = (RES **)malloc(num*sizeof(RES *));
+   for (int i=0; i<num; i++) {
+      res[i] = m_res_head[i];
+      m_res_head[i] = NULL;
+   }
+   return res;
+}
+
+RES **CONFIG::new_res_head()
+{
+   int size = (m_r_last - m_r_first + 1) * sizeof(RES *);
+   RES **res = (RES **)malloc(size);
+   memset(res, 0, size);
+   return res;
+}
+
 void free_config_resources()
 {
    for (int i=r_first; i<=r_last; i++) {
@@ -1060,6 +1087,7 @@ void free_config_resources()
    }
 }
 
+#ifdef xxx
 RES **save_config_resources()
 {
    int num = r_last - r_first + 1;
@@ -1078,3 +1106,4 @@ RES **new_res_head()
    memset(res, 0, size);
    return res;
 }
+#endif
index a480844ce65d3a2068e2f1acc3496b4088df8413..6ce558666998154cbf9e49286e19b774449d3882 100644 (file)
@@ -94,36 +94,6 @@ struct RES_TABLE {
    int rcode;                         /* code if needed */
 };
 
-class PARSER {
-public:
-   const char *m_cf;                   /* config file */
-   LEX_ERROR_HANDLER *m_scan_error;    /* error handler if non-null */
-   int m_err_type;                     /* the way to terminate on failure */
-   void *m_res_all;                    /* pointer to res_all buffer */
-   int m_res_all_size;                 /* length of buffer */
-   /* The below are not yet implemented */
-   int m_r_first;                      /* first daemon resource type */
-   int m_r_last;                       /* last daemon resource type */
-   RES_TABLE *m_resources;             /* pointer to table of permitted resources */      
-   RES **m_res_head;                   /* pointer to defined resources */
-   brwlock_t m_res_lock;               /* resource lock */
-
-   /* functions */
-   void init(
-      const char *cf,
-      LEX_ERROR_HANDLER *scan_error,
-      int err_type,
-      void *vres_all,
-      int res_all_size,
-      int r_first,
-      int r_last,
-      RES_TABLE *resources,
-      RES **res_head);
-
-   bool parse_config();
-};
-
-PARSER *new_parser();
 
 
 /* Common Resource definitions */
@@ -149,13 +119,52 @@ public:
 
 inline char *MSGS::name() const { return hdr.name; }
 
-/* Configuration routines */
-
+/* 
+ * 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);
 void    free_config_resources(void);
 RES   **save_config_resources(void);
 RES   **new_res_head();
 
+/*
+ * New C++ configuration routines
+ */
+
+class CONFIG {
+public:
+   const char *m_cf;                   /* config file */
+   LEX_ERROR_HANDLER *m_scan_error;    /* error handler if non-null */
+   int m_err_type;                     /* the way to terminate on failure */
+   void *m_res_all;                    /* pointer to res_all buffer */
+   int m_res_all_size;                 /* length of buffer */
+   /* The below are not yet implemented */
+   int m_r_first;                      /* first daemon resource type */
+   int m_r_last;                       /* last daemon resource type */
+   RES_TABLE *m_resources;             /* pointer to table of permitted resources */      
+   RES **m_res_head;                   /* pointer to defined resources */
+   brwlock_t m_res_lock;               /* resource lock */
+
+   /* functions */
+   void init(
+      const char *cf,
+      LEX_ERROR_HANDLER *scan_error,
+      int err_type,
+      void *vres_all,
+      int res_all_size,
+      int r_first,
+      int r_last,
+      RES_TABLE *resources,
+      RES **res_head);
+
+   bool parse_config();
+   void free_resources();
+   RES **save_resources();
+   RES **new_res_head();
+};
+CONFIG *new_config_parser();
+
 
 /* Resource routines */
 RES *GetResWithName(int rcode, const char *name);
index cd11dab5280c5ac344b759fc2b21b64a404274bd..a6050096a4ab090df26e8ab5c60a1b31a72c2545 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2003-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2003-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.
@@ -53,85 +53,93 @@ static char DotStatusJob[] = "JobId=%d JobStatus=%c JobErrors=%d\n";
 
 
 /* Forward referenced functions */
-static void send_blocked_status(DEVICE *dev, void sendit(const char *msg, int len, void *sarg), void *arg);
-static void list_terminated_jobs(void sendit(const char *msg, int len, void *sarg), void *arg);
-static void list_running_jobs(void sendit(const char *msg, int len, void *sarg), void *arg);
-static void list_jobs_waiting_on_reservation(void sendit(const char *msg, int len, void *sarg), void *arg);
+static void sendit(const char *msg, int len, BSOCK *bs);
+static void sendit(POOL_MEM &msg, int len, BSOCK *bs);
+static void sendit(const char *msg, int len, void *arg);
+
+static void send_blocked_status(DEVICE *dev, BSOCK *bs);
+static void list_terminated_jobs(BSOCK *bs);
+static void list_running_jobs(BSOCK *bs);
+static void list_jobs_waiting_on_reservation(BSOCK *bs);
+static void list_status_header(BSOCK *bs);
+static void list_devices(BSOCK *bs);
 
 static const char *level_to_str(int level);
 
 /*
  * Status command from Director
  */
-void output_status(void sendit(const char *msg, int len, void *sarg), void *arg)
+void output_status(BSOCK *bs)
 {
-   DEVRES *device;
-   AUTOCHANGER *changer;
-   DEVICE *dev;
-   char dt[MAX_TIME_LENGTH];
-   char b1[35], b2[35], b3[35], b4[35], b5[35];
-   POOLMEM *msg;
-   int bpb;
+   POOL_MEM msg(PM_MESSAGE);
    int len;
 
-   msg = get_pool_memory(PM_MESSAGE);
-
-   len = Mmsg(msg, _("%s Version: %s (%s) %s %s %s\n"), 
-              my_name, VERSION, BDATE, HOST_OS, DISTNAME, DISTVER);
-   sendit(msg, len, arg);
-
-   bstrftime_nc(dt, sizeof(dt), daemon_start_time);
-
-
-   len = Mmsg(msg, _("Daemon started %s, %d Job%s run since started.\n"),
-        dt, num_jobs_run, num_jobs_run == 1 ? "" : "s");
-   sendit(msg, len, arg);
-
-   len = Mmsg(msg, _(" Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"),
-         edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1),
-         edit_uint64_with_commas(sm_bytes, b2),
-         edit_uint64_with_commas(sm_max_bytes, b3),
-         edit_uint64_with_commas(sm_buffers, b4),
-         edit_uint64_with_commas(sm_max_buffers, b5));
-   sendit(msg, len, arg);
-   len = Mmsg(msg, "Sizes: boffset_t=%d size_t=%d int32_t=%d int64_t=%d\n", 
-         (int)sizeof(boffset_t), (int)sizeof(size_t), (int)sizeof(int32_t),
-         (int)sizeof(int64_t));
-   sendit(msg, len, arg);
+   list_status_header(bs);
 
    /*
     * List running jobs
     */
-   list_running_jobs(sendit, arg);
+   list_running_jobs(bs);
 
    /*
     * List jobs stuck in reservation system
     */
-   list_jobs_waiting_on_reservation(sendit, arg);
+   list_jobs_waiting_on_reservation(bs);
 
    /*
     * List terminated jobs
     */
-   list_terminated_jobs(sendit, arg);
+   list_terminated_jobs(bs);
 
    /*
     * List devices
     */
+   list_devices(bs);
+
+
+   len = Mmsg(msg, _("In Use Volume status:\n"));
+   sendit(msg, len, bs);
+
+   list_volumes(sendit, (void *)bs);
+   sendit("====\n\n", 6, bs);
+
+#ifdef xxx
+   if (debug_level > 10) {
+      bs->fsend(_("====\n\n"));
+      dump_resource(R_DEVICE, resources[R_DEVICE-r_first].res_head, sendit, user);
+      bs->fsend(_("====\n\n"));
+   }
+#endif
+
+   list_spool_stats(sendit, (void *)bs);
+}
+
+
+static void list_devices(BSOCK *bs)
+{
+   DEVRES *device;
+   AUTOCHANGER *changer;
+   DEVICE *dev;
+   char b1[35], b2[35], b3[35];
+   POOL_MEM msg(PM_MESSAGE);
+   int len;
+   int bpb;
+
    len = Mmsg(msg, _("\nDevice status:\n"));
-   sendit(msg, len, arg);
+   sendit(msg, len, bs);
 
    foreach_res(changer, R_AUTOCHANGER) {
       len = Mmsg(msg, _("Autochanger \"%s\" with devices:\n"),
          changer->hdr.name);
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
 
       foreach_alist(device, changer->device) {
          if (device->dev) {
             len = Mmsg(msg, "   %s\n", device->dev->print_name());
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          } else {
             len = Mmsg(msg, "   %s\n", device->hdr.name);
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          }
       }
    }
@@ -147,13 +155,13 @@ void output_status(void sendit(const char *msg, int len, void *sarg), void *arg)
                dev->VolHdr.VolumeName, 
                dev->pool_name[0]?dev->pool_name:"*unknown*",
                dev->device->media_type);
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          } else {
             len = Mmsg(msg, _("Device %s open but no Bacula volume is currently mounted.\n"), 
                dev->print_name());
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          }
-         send_blocked_status(dev, sendit, arg);
+         send_blocked_status(dev, bs);
          if (dev->can_append()) {
             bpb = dev->VolCatInfo.VolCatBlocks;
             if (bpb <= 0) {
@@ -164,7 +172,7 @@ void output_status(void sendit(const char *msg, int len, void *sarg), void *arg)
                edit_uint64_with_commas(dev->VolCatInfo.VolCatBytes, b1),
                edit_uint64_with_commas(dev->VolCatInfo.VolCatBlocks, b2),
                edit_uint64_with_commas(bpb, b3));
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          } else {  /* reading */
             bpb = dev->VolCatInfo.VolCatReads;
             if (bpb <= 0) {
@@ -179,64 +187,76 @@ void output_status(void sendit(const char *msg, int len, void *sarg), void *arg)
                edit_uint64_with_commas(dev->VolCatInfo.VolCatRBytes, b1),
                edit_uint64_with_commas(dev->VolCatInfo.VolCatReads, b2),
                edit_uint64_with_commas(bpb, b3));
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          }
          len = Mmsg(msg, _("    Positioned at File=%s Block=%s\n"),
             edit_uint64_with_commas(dev->file, b1),
             edit_uint64_with_commas(dev->block_num, b2));
-         sendit(msg, len, arg);
+         sendit(msg, len, bs);
 
       } else {
          if (dev) {
             len = Mmsg(msg, _("Device %s is not open.\n"), dev->print_name());
-            sendit(msg, len, arg);
-            send_blocked_status(dev, sendit, arg);
+            sendit(msg, len, bs);
+            send_blocked_status(dev, bs);
         } else {
             len = Mmsg(msg, _("Device \"%s\" is not open or does not exist.\n"), device->hdr.name);
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          }
       }
    }
-   sendit("====\n\n", 6, arg);
-   len = Mmsg(msg, _("In Use Volume status:\n"));
-   sendit(msg, len, arg);
-   list_volumes(sendit, arg);
-   sendit("====\n\n", 6, arg);
+   sendit("====\n\n", 6, bs);
+}
 
-#ifdef xxx
-   if (debug_level > 10) {
-      user->fsend(_("====\n\n"));
-      dump_resource(R_DEVICE, resources[R_DEVICE-r_first].res_head, sendit, user);
-      user->fsend(_("====\n\n"));
-   }
-#endif
+static void list_status_header(BSOCK *bs)
+{
+   char dt[MAX_TIME_LENGTH];
+   char b1[35], b2[35], b3[35], b4[35], b5[35];
+   POOL_MEM msg(PM_MESSAGE);
+   int len;
+
+   len = Mmsg(msg, _("%s Version: %s (%s) %s %s %s\n"), 
+              my_name, VERSION, BDATE, HOST_OS, DISTNAME, DISTVER);
+   sendit(msg, len, bs);
 
-   list_spool_stats(sendit, arg);
+   bstrftime_nc(dt, sizeof(dt), daemon_start_time);
+
+
+   len = Mmsg(msg, _("Daemon started %s, %d Job%s run since started.\n"),
+        dt, num_jobs_run, num_jobs_run == 1 ? "" : "s");
+   sendit(msg, len, bs);
 
-   free_pool_memory(msg);
+   len = Mmsg(msg, _(" Heap: heap=%s smbytes=%s max_bytes=%s bufs=%s max_bufs=%s\n"),
+         edit_uint64_with_commas((char *)sbrk(0)-(char *)start_heap, b1),
+         edit_uint64_with_commas(sm_bytes, b2),
+         edit_uint64_with_commas(sm_max_bytes, b3),
+         edit_uint64_with_commas(sm_buffers, b4),
+         edit_uint64_with_commas(sm_max_buffers, b5));
+   sendit(msg, len, bs);
+   len = Mmsg(msg, "Sizes: boffset_t=%d size_t=%d int32_t=%d int64_t=%d\n", 
+         (int)sizeof(boffset_t), (int)sizeof(size_t), (int)sizeof(int32_t),
+         (int)sizeof(int64_t));
+   sendit(msg, len, bs);
 }
 
-static void send_blocked_status(DEVICE *dev, void sendit(const char *msg, int len, void *sarg), void *arg)
+static void send_blocked_status(DEVICE *dev, BSOCK *bs)
 {
-   char *msg;
+   POOL_MEM msg(PM_MESSAGE);
    int len;
 
-   msg = (char *)get_pool_memory(PM_MESSAGE);
-
    if (!dev) {
       len = Mmsg(msg, _("No DEVICE structure.\n\n"));
-      sendit(msg, len, arg);
-      free_pool_memory(msg);
+      sendit(msg, len, bs);
       return;
    }
    switch (dev->blocked()) {
    case BST_UNMOUNTED:
       len = Mmsg(msg, _("    Device is BLOCKED. User unmounted.\n"));
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
       break;
    case BST_UNMOUNTED_WAITING_FOR_SYSOP:
       len = Mmsg(msg, _("    Device is BLOCKED. User unmounted during wait for media/mount.\n"));
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
       break;
    case BST_WAITING_FOR_SYSOP:
       {
@@ -253,7 +273,7 @@ static void send_blocked_status(DEVICE *dev, void sendit(const char *msg, int le
                              dcr->VolumeName,
                              dcr->pool_name,
                              dcr->media_type);
-                  sendit(msg, len, arg);
+                  sendit(msg, len, bs);
                   found_jcr = true;
                } else if (dcr->jcr->JobStatus == JS_WaitMedia) {
                   len = Mmsg(msg, _("    Device is BLOCKED waiting to create a volume for:\n"
@@ -261,7 +281,7 @@ static void send_blocked_status(DEVICE *dev, void sendit(const char *msg, int le
                                     "       Media type:  %s\n"),
                              dcr->pool_name,
                              dcr->media_type);
-                  sendit(msg, len, arg);
+                  sendit(msg, len, bs);
                   found_jcr = true;
                }
             }
@@ -269,17 +289,17 @@ static void send_blocked_status(DEVICE *dev, void sendit(const char *msg, int le
 
          if (!found_jcr) {
             len = Mmsg(msg, _("    Device is BLOCKED waiting for media.\n"));
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          }
       }
       break;
    case BST_DOING_ACQUIRE:
       len = Mmsg(msg, _("    Device is being initialized.\n"));
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
       break;
    case BST_WRITING_LABEL:
       len = Mmsg(msg, _("    Device is blocked labeling a Volume.\n"));
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
       break;
    default:
       break;
@@ -289,18 +309,18 @@ static void send_blocked_status(DEVICE *dev, void sendit(const char *msg, int le
       if (dev->Slot > 0) {
          len = Mmsg(msg, _("    Slot %d is loaded in drive %d.\n"), 
             dev->Slot, dev->drive_index);
-         sendit(msg, len, arg);
+         sendit(msg, len, bs);
       } else if (dev->Slot == 0) {
          len = Mmsg(msg, _("    Drive %d is not loaded.\n"), dev->drive_index);
-         sendit(msg, len, arg);
+         sendit(msg, len, bs);
       } else {
          len = Mmsg(msg, _("    Drive %d status unknown.\n"), dev->drive_index);
-         sendit(msg, len, arg);
+         sendit(msg, len, bs);
       }
    }
    if (debug_level > 1) {
       len = Mmsg(msg, _("Configured device capabilities:\n"));
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
 
       len = Mmsg(msg, "%sEOF %sBSR %sBSF %sFSR %sFSF %sEOM %sREM %sRACCESS %sAUTOMOUNT %sLABEL %sANONVOLS %sALWAYSOPEN\n",
          dev->capabilities & CAP_EOF ? "" : "!", 
@@ -315,10 +335,10 @@ static void send_blocked_status(DEVICE *dev, void sendit(const char *msg, int le
          dev->capabilities & CAP_LABEL ? "" : "!", 
          dev->capabilities & CAP_ANONVOLS ? "" : "!", 
          dev->capabilities & CAP_ALWAYSOPEN ? "" : "!");
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
 
       len = Mmsg(msg, _("Device state:\n"));
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
 
       len = Mmsg(msg, "%sOPENED %sTAPE %sLABEL %sMALLOC %sAPPEND %sREAD %sEOT %sWEOT %sEOF %sNEXTVOL %sSHORT %sMOUNTED\n", 
          dev->is_open() ? "" : "!", 
@@ -333,48 +353,45 @@ static void send_blocked_status(DEVICE *dev, void sendit(const char *msg, int le
          dev->state & ST_NEXTVOL ? "" : "!", 
          dev->state & ST_SHORT ? "" : "!", 
          dev->state & ST_MOUNTED ? "" : "!");
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
 
       len = Mmsg(msg, _("num_writers=%d block=%d\n\n"), dev->num_writers, dev->blocked());
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
 
       len = Mmsg(msg, _("Device parameters:\n"));
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
 
       len = Mmsg(msg, _("Archive name: %s Device name: %s\n"), dev->archive_name(),
          dev->name());
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
 
       len = Mmsg(msg, _("File=%u block=%u\n"), dev->file, dev->block_num);
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
 
       len = Mmsg(msg, _("Min block=%u Max block=%u\n"), dev->min_block_size, dev->max_block_size);
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
    }
-
-   free_pool_memory(msg);
 }
 
-static void list_running_jobs(void sendit(const char *msg, int len, void *sarg), void *arg)
+static void list_running_jobs(BSOCK *bs)
 {
    bool found = false;
    int bps, sec;
    JCR *jcr;
    DCR *dcr, *rdcr;
    char JobName[MAX_NAME_LENGTH];
-   char *msg, b1[30], b2[30], b3[30];
+   char b1[30], b2[30], b3[30];
    int len;
-
-   msg = (char *)get_pool_memory(PM_MESSAGE);
+   POOL_MEM msg(PM_MESSAGE);
 
    len = Mmsg(msg, _("\nRunning Jobs:\n"));
-   sendit(msg, len, arg);
+   sendit(msg, len, bs);
 
    foreach_jcr(jcr) {
       if (jcr->JobStatus == JS_WaitFD) {
          len = Mmsg(msg, _("%s Job %s waiting for Client connection.\n"),
             job_type_to_str(jcr->JobType), jcr->Job);
-         sendit(msg, len, arg);
+         sendit(msg, len, bs);
       }
       dcr = jcr->dcr;
       rdcr = jcr->read_dcr;
@@ -398,7 +415,7 @@ static void list_running_jobs(void sendit(const char *msg, int len, void *sarg),
                    rdcr->pool_name,
                    rdcr->dev?rdcr->dev->print_name(): 
                             rdcr->device->device_name);
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          }
          if (dcr && dcr->device) {
             len = Mmsg(msg, _("Writing: %s %s job %s JobId=%d Volume=\"%s\"\n"
@@ -411,10 +428,10 @@ static void list_running_jobs(void sendit(const char *msg, int len, void *sarg),
                    dcr->pool_name,
                    dcr->dev?dcr->dev->print_name(): 
                             dcr->device->device_name);
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
             len= Mmsg(msg, _("    spooling=%d despooling=%d despool_wait=%d\n"),
                    dcr->spooling, dcr->despooling, dcr->despool_wait);
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          }
          sec = time(NULL) - jcr->run_time;
          if (sec <= 0) {
@@ -425,7 +442,7 @@ static void list_running_jobs(void sendit(const char *msg, int len, void *sarg),
             edit_uint64_with_commas(jcr->JobFiles, b1),
             edit_uint64_with_commas(jcr->JobBytes, b2),
             edit_uint64_with_commas(bps, b3));
-         sendit(msg, len, arg);
+         sendit(msg, len, bs);
          found = true;
 #ifdef DEBUG
          if (jcr->file_bsock) {
@@ -433,10 +450,10 @@ static void list_running_jobs(void sendit(const char *msg, int len, void *sarg),
                edit_uint64_with_commas(jcr->file_bsock->read_seqno, b1),
                jcr->file_bsock->in_msg_no, jcr->file_bsock->out_msg_no,
                jcr->file_bsock->m_fd);
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          } else {
             len = Mmsg(msg, _("    FDSocket closed\n"));
-            sendit(msg, len, arg);
+            sendit(msg, len, bs);
          }
 #endif
       }
@@ -445,34 +462,33 @@ static void list_running_jobs(void sendit(const char *msg, int len, void *sarg),
 
    if (!found) {
       len = Mmsg(msg, _("No Jobs running.\n"));
-      sendit(msg, len, arg);
+      sendit(msg, len, bs);
    }
-   sendit("====\n", 5, arg);
-
-   free_pool_memory(msg);
+   sendit("====\n", 5, bs);
 }
 
-static void list_jobs_waiting_on_reservation(void sendit(const char *msg, int len, void *sarg), void *arg)
+static void list_jobs_waiting_on_reservation(BSOCK *bs)
 { 
    JCR *jcr;
-   char *msg;
+   POOL_MEM msg(PM_MESSAGE);
+   int len;
 
-   msg = _("\nJobs waiting to reserve a drive:\n");
-   sendit(msg, strlen(msg), arg);
+   len = Mmsg(msg, _("\nJobs waiting to reserve a drive:\n"));
+   sendit(msg, len, bs);
 
    foreach_jcr(jcr) {
       if (!jcr->reserve_msgs) {
          continue;
       }
-      send_drive_reserve_messages(jcr, sendit, arg);
+      send_drive_reserve_messages(jcr, sendit, bs);
    }
    endeach_jcr(jcr);
 
-   sendit("====\n", 5, arg);
+   sendit("====\n", 5, bs);
 }
 
 
-static void list_terminated_jobs(void sendit(const char *msg, int len, void *sarg), void *arg)
+static void list_terminated_jobs(BSOCK *bs)
 {
    char dt[MAX_TIME_LENGTH], b1[30], b2[30];
    char level[10];
@@ -480,16 +496,16 @@ static void list_terminated_jobs(void sendit(const char *msg, int len, void *sar
    const char *msg;
 
    msg =  _("\nTerminated Jobs:\n");
-   sendit(msg, strlen(msg), arg);
+   sendit(msg, strlen(msg), bs);
    if (last_jobs->size() == 0) {
-      sendit("====\n", 5, arg);
+      sendit("====\n", 5, bs);
       return;
    }
    lock_last_jobs_list();
    msg =  _(" JobId  Level    Files      Bytes   Status   Finished        Name \n");
-   sendit(msg, strlen(msg), arg);
+   sendit(msg, strlen(msg), bs);
    msg =  _("===================================================================\n");
-   sendit(msg, strlen(msg), arg);
+   sendit(msg, strlen(msg), bs);
    foreach_dlist(je, last_jobs) {
       char JobName[MAX_NAME_LENGTH];
       const char *termstat;
@@ -542,10 +558,10 @@ static void list_terminated_jobs(void sendit(const char *msg, int len, void *sar
          edit_uint64_with_suffix(je->JobBytes, b2),
          termstat,
          dt, JobName);
-      sendit(buf, strlen(buf), arg);
+      sendit(buf, strlen(buf), bs);
    }
    unlock_last_jobs_list();
-   sendit("====\n", 5, arg);
+   sendit("====\n", 5, bs);
 }
 
 /*
@@ -598,26 +614,39 @@ static const char *level_to_str(int level)
 /*
  * Send to Director
  */
-static void dir_sendit(const char *msg, int len, void *arg)
+static void sendit(const char *msg, int len, BSOCK *bs)
+{
+   memcpy(bs->msg, msg, len+1);
+   bs->msglen = len+1;
+   bs->send();
+}
+
+static void sendit(const char *msg, int len, void *arg)
 {
-   BSOCK *user = (BSOCK *)arg;
+   BSOCK *bs = (BSOCK *)arg;
+   memcpy(bs->msg, msg, len+1);
+   bs->msglen = len+1;
+   bs->send();
+}
 
-   memcpy(user->msg, msg, len+1);
-   user->msglen = len+1;
-   user->send();
+static void sendit(POOL_MEM &msg, int len, BSOCK *bs)
+{
+   memcpy(bs->msg, msg.c_str(), len+1);
+   bs->msglen = len+1;
+   bs->send();
 }
 
+
 /*
  * Status command from Director
  */
 bool status_cmd(JCR *jcr)
 {
-   BSOCK *user = jcr->dir_bsock;
-
-   user->fsend("\n");
-   output_status(dir_sendit, (void *)user);
+   BSOCK *bs = jcr->dir_bsock;
 
-   user->signal(BNET_EOD);
+   bs->fsend("\n");
+   output_status(bs);
+   bs->signal(BNET_EOD);
    return 1;
 }
 
@@ -668,6 +697,7 @@ bool qstatus_cmd(JCR *jcr)
 #if defined(HAVE_WIN32)
 int bacstat = 0;
 
+/* Return a one line status for the tray monitor */
 char *bac_status(char *buf, int buf_len)
 {
    JCR *njcr;
index 82fd2905dbb177df88bfd2d4d21a5c65530abb81..73f260fe80d5a3e66e982512f71b2ae76d2aef50 100644 (file)
@@ -1,10 +1,16 @@
               Technical notes on version 2.3
 
 General:
+28Feb08
+kes  Correct po warning message with datarootdir
+kes  Implement more code in dird.c to put configuration parsing in
+     a class rather than use globals.
+kes  Restructure SD status command for implementation of bat API
+     interface.
 27Feb08
-kes   Suppress incorrect 'Will not descend from x into y' messages.
-kes   Eliminate FORTIFY_CODE=2 bug, and make first cut at removing 
-      daemon globals used by parser.              
+kes  Suppress incorrect 'Will not descend from x into y' messages.
+kes  Eliminate FORTIFY_CODE=2 bug, and make first cut at removing 
+     daemon globals used by parser.              
 kes  Apply Joao's patch to separate DB_TYPE and DB_PROG in configure.
 26Feb08
 kes  Fix free of plugin_list when none exists.