]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Rework bmsg in ua_output to use va_copy() so that bvsnprintf()
authorKern Sibbald <kern@sibbald.com>
Wed, 29 Aug 2007 09:30:22 +0000 (09:30 +0000)
committerKern Sibbald <kern@sibbald.com>
Wed, 29 Aug 2007 09:30:22 +0000 (09:30 +0000)
     can be called multiple times.  Implement a version for machines
     without va_copy() that gets a big buffer.

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

bacula/src/baconfig.h
bacula/src/dird/ua_output.c
bacula/src/lib/bsnprintf.c
bacula/src/version.h

index ae5bddbf9fda7153c75f02c89fca4958c3c76109..df14b3ce978f47dcc94abf60d3d9af3ab57dc3dd 100644 (file)
@@ -38,6 +38,8 @@
 
 /* Bacula common configuration defines */
 
+#define HAVE_VA_COPY
+
 #undef  TRUE
 #undef  FALSE
 #define TRUE  1
@@ -627,13 +629,11 @@ extern int thr_setconcurrency(int);
 #endif
 
 #if defined(HAVE_DARWIN_OS) || defined(HAVE_OSF1_OS)
+#undef HAVE_VA_COPY
 /* Apparently someone forgot to wrap getdomainname as a C function */
 extern "C" int getdomainname(char *name, int len);
 #endif
 
-#ifdef HAVE_OSF1_OS
-extern "C" int mknod ( const char *path, int mode, dev_t device );
-#endif
 
 
 #if defined(HAVE_WIN32)
@@ -661,6 +661,7 @@ inline const char *first_path_separator(const char *path) { return strchr(path,
 
 #ifdef HAVE_HPUX_OS
 # undef h_errno
+#undef HAVE_VA_COPY
 extern int h_errno;
 /* the {get,set}domainname() functions exist in HPUX's libc.
  * the configure script detects that correctly.
@@ -673,9 +674,10 @@ extern "C" int setdomainname(char *name, int namelen);
 
 
 #ifdef HAVE_OSF1_OS
-#undef HAVE_CHFLAGS  /* chflags is incorrectly detected */
+#undef HAVE_VA_COPY
 extern "C" int fchdir(int filedes);
 extern "C" long gethostid(void);
+extern "C" int mknod ( const char *path, int mode, dev_t device );
 #endif
 
 
index 8bf7178d22bddc43a28989b8b3fab1d13d29df42..ab33393a1971787160b106d3ff3e0576ae1d8581 100644 (file)
@@ -673,7 +673,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) {
@@ -699,7 +699,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;
 }
@@ -711,7 +711,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);
 }
 
 /*
@@ -721,11 +721,13 @@ 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 = NULL;
+   va_list ap;
 
    if (bs) {
       msg = bs->msg;
@@ -736,7 +738,9 @@ void bmsg(UAContext *ua, const char *fmt, va_list arg_ptr)
 
 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;
@@ -745,13 +749,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_pool_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, ...)
 {
index b38b353405031d137aa36ddd6bf1b93c41fbc6c4..f8f88aea6b78cea65bb43154d16281e93ff0f3b3 100644 (file)
@@ -16,7 +16,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2005-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2005-2007 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.
@@ -45,6 +45,7 @@
 
 #include "bacula.h"
 #define FP_OUTPUT 1 /* Bacula uses floating point */
+
 /* Define the following if you want all the features of
  *  normal printf, but with all the security problems.
  *  For Bacula we turn this off, and it silently ignores
index ce7eaa588ac715025297812c4a20d19f0c2f5a62..57e5b5d6a3f0db52679e0beed34bf3f571783a52 100644 (file)
@@ -4,8 +4,8 @@
 
 #undef  VERSION
 #define VERSION "2.3.1"
-#define BDATE   "24 August 2007"
-#define LSMDATE "24Aug07"
+#define BDATE   "29 August 2007"
+#define LSMDATE "29Aug07"
 
 #define PROG_COPYRIGHT "Copyright (C) %d-2007 Free Software Foundation Europe e.V.\n"
 #define BYEAR "2007"       /* year for copyright messages in progs */