]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/ua_output.c
ebl Fix new runscript multiple command
[bacula/bacula] / bacula / src / dird / ua_output.c
index c6744370d91472fbd75848753e9c9a466ccdf5ac..a32fbe0243bccfd622a8ac526e649dc32784a55d 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.
@@ -473,6 +473,10 @@ static bool list_nextvol(UAContext *ua, int ndays)
       if (!complete_jcr_for_job(jcr, job, run->pool)) {
          return false;
       }
+      if (!jcr->jr.PoolId) {
+         ua->error_msg(_("Could not Pool Job %s\n"), job->name());
+         continue;
+      }
       memset(&pr, 0, sizeof(pr));
       pr.PoolId = jcr->jr.PoolId;
       if (!db_get_pool_record(ua->jcr, ua->db, &pr)) {
@@ -482,12 +486,12 @@ static bool list_nextvol(UAContext *ua, int ndays)
       get_job_storage(&store, job, run);
       mr.StorageId = store.store->StorageId;
       if (!find_next_volume_for_append(jcr, &mr, 1, fnv_no_create_vol, fnv_prune)) {
-         ua->error_msg(_("Could not find next Volume for Job %s (%s, %s).\n"),
-            job->hdr.name, pr.Name, level_to_str(run->level));
+         ua->error_msg(_("Could not find next Volume for Job %s (Pool=%s, Level=%s).\n"),
+            job->name(), pr.Name, level_to_str(run->level));
       } else {
          ua->send_msg(
-            _("The next Volume to be used by Job \"%s\" (%s, %s) will be %s\n"),
-            job->hdr.name, pr.Name, level_to_str(run->level), mr.VolumeName);
+            _("The next Volume to be used by Job \"%s\" (Pool=%s, Level=%s) will be %s\n"),
+            job->name(), pr.Name, level_to_str(run->level), mr.VolumeName);
          found = true;
       }
       if (jcr->db && jcr->db != ua->db) {
@@ -553,12 +557,12 @@ RUN *find_next_run(RUN *run, JOB *job, time_t &runtime, int ndays)
             bit_is_set(woy, run->woy);
  
 #ifdef xxx
-         Dmsg2(000, "day=%d is_scheduled=%d\n", day, is_scheduled);
-         Dmsg1(000, "bit_set_mday=%d\n", bit_is_set(mday, run->mday));
-         Dmsg1(000, "bit_set_wday=%d\n", bit_is_set(wday, run->wday));
-         Dmsg1(000, "bit_set_month=%d\n", bit_is_set(month, run->month));
-         Dmsg1(000, "bit_set_wom=%d\n", bit_is_set(wom, run->wom));
-         Dmsg1(000, "bit_set_woy=%d\n", bit_is_set(woy, run->woy));
+         Pmsg2(000, "day=%d is_scheduled=%d\n", day, is_scheduled);
+         Pmsg1(000, "bit_set_mday=%d\n", bit_is_set(mday, run->mday));
+         Pmsg1(000, "bit_set_wday=%d\n", bit_is_set(wday, run->wday));
+         Pmsg1(000, "bit_set_month=%d\n", bit_is_set(month, run->month));
+         Pmsg1(000, "bit_set_wom=%d\n", bit_is_set(wom, run->wom));
+         Pmsg1(000, "bit_set_woy=%d\n", bit_is_set(woy, run->woy));
 #endif
 
          if (is_scheduled) { /* Jobs scheduled on that day */
@@ -572,7 +576,7 @@ RUN *find_next_run(RUN *run, JOB *job, time_t &runtime, int ndays)
                }
             }
             bstrncat(buf, "\n", sizeof(buf));
-            Dmsg1(000, "%s", buf);
+            Pmsg1(000, "%s", buf);
 #endif
             /* find time (time_t) job is to be run */
             (void)localtime_r(&future, &runtm);
@@ -616,7 +620,8 @@ bool complete_jcr_for_job(JCR *jcr, JOB *job, POOL *pool)
    }
 
    Dmsg0(100, "complete_jcr open db\n");
-   jcr->db = jcr->db=db_init_database(jcr, jcr->catalog->db_name, jcr->catalog->db_user,
+   jcr->db = jcr->db=db_init(jcr, jcr->catalog->db_driver, jcr->catalog->db_name, 
+                      jcr->catalog->db_user,
                       jcr->catalog->db_password, jcr->catalog->db_address,
                       jcr->catalog->db_port, jcr->catalog->db_socket,
                       jcr->catalog->mult_db_connections);
@@ -669,7 +674,7 @@ void do_messages(UAContext *ua, const char *cmd)
       ua->UA_sock->msg = check_pool_memory_size(ua->UA_sock->msg, mlen+1);
       strcpy(ua->UA_sock->msg, msg);
       ua->UA_sock->msglen = mlen;
-      bnet_send(ua->UA_sock);
+      ua->UA_sock->send();
       do_truncate = true;
    }
    if (do_truncate) {
@@ -695,7 +700,7 @@ int messagescmd(UAContext *ua, const char *cmd)
    if (console_msg_pending) {
       do_messages(ua, cmd);
    } else {
-      bnet_fsend(ua->UA_sock, _("You have no messages.\n"));
+      ua->UA_sock->fsend(_("You have no messages.\n"));
    }
    return 1;
 }
@@ -707,7 +712,7 @@ void prtit(void *ctx, const char *msg)
 {
    UAContext *ua = (UAContext *)ctx;
 
-   bnet_fsend(ua->UA_sock, "%s", msg);
+   ua->UA_sock->fsend("%s", msg);
 }
 
 /*
@@ -717,21 +722,26 @@ void prtit(void *ctx, const char *msg)
  * agent, so we are being called from Bacula core. In
  * that case direct the messages to the Job.
  */
+#ifdef HAVE_VA_COPY
 void bmsg(UAContext *ua, const char *fmt, va_list arg_ptr)
 {
    BSOCK *bs = ua->UA_sock;
    int maxlen, len;
-   POOLMEM *msg;
+   POOLMEM *msg = NULL;
+   va_list ap;
 
    if (bs) {
       msg = bs->msg;
-   } else {
+   }
+   if (!msg) {
       msg = get_pool_memory(PM_EMSG);
    }
 
 again:
    maxlen = sizeof_pool_memory(msg) - 1;
-   len = bvsnprintf(msg, maxlen, fmt, arg_ptr);
+   va_copy(ap, arg_ptr);
+   len = bvsnprintf(msg, maxlen, fmt, ap);
+   va_end(ap);
    if (len < 0 || len >= maxlen) {
       msg = realloc_pool_memory(msg, maxlen + maxlen/2);
       goto again;
@@ -740,13 +750,51 @@ again:
    if (bs) {
       bs->msg = msg;
       bs->msglen = len;
-      bnet_send(bs);
+      bs->send();
    } else {                           /* No UA, send to Job */
       Jmsg(ua->jcr, M_INFO, 0, "%s", msg);
       free_pool_memory(msg);
    }
 
 }
+
+#else /* no va_copy() -- brain damaged version of variable arguments */
+
+void bmsg(UAContext *ua, const char *fmt, va_list arg_ptr)
+{
+   BSOCK *bs = ua->UA_sock;
+   int maxlen, len;
+   POOLMEM *msg = NULL;
+
+   if (bs) {
+      msg = bs->msg;
+   }
+   if (!msg) {
+      msg = get_memory(5000);
+   }
+
+   maxlen = sizeof_pool_memory(msg) - 1;
+   if (maxlen < 4999) {
+      msg = realloc_pool_memory(msg, 5000);
+      maxlen = 4999;
+   }
+   len = bvsnprintf(msg, maxlen, fmt, arg_ptr);
+   if (len < 0 || len >= maxlen) {
+      pm_strcpy(msg, _("Message too long to display.\n"));
+      len = strlen(msg);
+   }
+
+   if (bs) {
+      bs->msg = msg;
+      bs->msglen = len;
+      bs->send();
+   } else {                           /* No UA, send to Job */
+      Jmsg(ua->jcr, M_INFO, 0, "%s", msg);
+      free_pool_memory(msg);
+   }
+
+}
+#endif
  
 void bsendmsg(void *ctx, const char *fmt, ...)
 {
@@ -781,8 +829,9 @@ void UAContext::error_msg(const char *fmt, ...)
 {
    BSOCK *bs = UA_sock;
    va_list arg_ptr;
-   va_start(arg_ptr, fmt);
+
    if (bs && api) bs->signal(BNET_ERROR_MSG);
+   va_start(arg_ptr, fmt);
    bmsg(this, fmt, arg_ptr);
    va_end(arg_ptr);
 }
@@ -796,8 +845,9 @@ void UAContext::warning_msg(const char *fmt, ...)
 {
    BSOCK *bs = UA_sock;
    va_list arg_ptr;
-   va_start(arg_ptr, fmt);
+
    if (bs && api) bs->signal(BNET_WARNING_MSG);
+   va_start(arg_ptr, fmt);
    bmsg(this, fmt, arg_ptr);
    va_end(arg_ptr);
 }
@@ -810,8 +860,9 @@ void UAContext::info_msg(const char *fmt, ...)
 {
    BSOCK *bs = UA_sock;
    va_list arg_ptr;
-   va_start(arg_ptr, fmt);
+
    if (bs && api) bs->signal(BNET_INFO_MSG);
+   va_start(arg_ptr, fmt);
    bmsg(this, fmt, arg_ptr);
    va_end(arg_ptr);
 }