]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/message.c
const char * additions
[bacula/bacula] / bacula / src / lib / message.c
index 0b308fa4e06863c35e23fa634deb1b73b13187f5..03aab84941932d760f53197a8f39df546aedec2a 100755 (executable)
@@ -89,7 +89,7 @@ static MSGS *daemon_msgs;            /* global messages */
  *  argv is NULL to avoid doing the path code twice.
  */
 #define BTRACE_EXTRA 20
-void my_name_is(int argc, char *argv[], char *name)
+void my_name_is(int argc, char *argv[], const char *name)
 {
    char *l, *p, *q;
    char cpath[400], npath[400];
@@ -730,7 +730,7 @@ void dispatch_message(JCR *jcr, int type, int level, char *msg)
  *  are not printed.
  */
 void 
-d_msg(char *file, int line, int level, char *fmt,...)
+d_msg(const char *file, int line, int level, const char *fmt,...)
 {
     char      buf[5000];
     int       len;
@@ -790,7 +790,7 @@ d_msg(char *file, int line, int level, char *fmt,...)
  *  are not printed.
  */
 void 
-p_msg(char *file, int line, int level, char *fmt,...)
+p_msg(const char *file, int line, int level, const char *fmt,...)
 {
     char      buf[5000];
     int       len;
@@ -823,7 +823,7 @@ p_msg(char *file, int line, int level, char *fmt,...)
  *  are not printed.
  */
 void 
-t_msg(char *file, int line, int level, char *fmt,...)
+t_msg(const char *file, int line, int level, const char *fmt,...)
 {
     char      buf[5000];
     int       len;
@@ -868,7 +868,7 @@ t_msg(char *file, int line, int level, char *fmt,...)
  *
  */
 void 
-e_msg(char *file, int line, int type, int level, char *fmt,...)
+e_msg(const char *file, int line, int type, int level, const char *fmt,...)
 {
     char     buf[5000];
     va_list   arg_ptr;
@@ -935,7 +935,7 @@ e_msg(char *file, int line, int type, int level, char *fmt,...)
  *
  */
 void 
-Jmsg(JCR *jcr, int type, int level, char *fmt,...)
+Jmsg(JCR *jcr, int type, int level, const char *fmt,...)
 {
     char     rbuf[5000];
     va_list   arg_ptr;
@@ -1026,10 +1026,38 @@ Jmsg(JCR *jcr, int type, int level, char *fmt,...)
     }
 }
 
+/*
+ * If we come here, prefix the message with the file:line-number,
+ *  then pass it on to the normal Jmsg routine.
+ */
+void j_msg(const char *file, int line, JCR *jcr, int type, int level, const char *fmt,...)
+{
+   va_list   arg_ptr;
+   int i, len, maxlen;
+   POOLMEM *pool_buf;
+
+   pool_buf = get_pool_memory(PM_EMSG);
+   i = Mmsg(&pool_buf, "%s:%d ", file, line);
+
+again:
+   maxlen = sizeof_pool_memory(pool_buf) - i - 1; 
+   va_start(arg_ptr, fmt);
+   len = bvsnprintf(pool_buf+i, maxlen, fmt, arg_ptr);
+   va_end(arg_ptr);
+   if (len < 0 || len >= maxlen) {
+      pool_buf = realloc_pool_memory(pool_buf, maxlen + i + maxlen/2);
+      goto again;
+   }
+
+   Jmsg(jcr, type, level, "%s", pool_buf);
+   free_memory(pool_buf);
+}
+
+
 /*
  * Edit a message into a Pool memory buffer, with file:lineno
  */
-int m_msg(char *file, int line, POOLMEM **pool_buf, char *fmt, ...)
+int m_msg(const char *file, int line, POOLMEM **pool_buf, const char *fmt, ...)
 {
    va_list   arg_ptr;
    int i, len, maxlen;
@@ -1052,7 +1080,7 @@ again:
  * Edit a message into a Pool Memory buffer NO file:lineno
  *  Returns: string length of what was edited.
  */
-int Mmsg(POOLMEM **pool_buf, char *fmt, ...)
+int Mmsg(POOLMEM **pool_buf, const char *fmt, ...)
 {
    va_list   arg_ptr;
    int len, maxlen;
@@ -1069,12 +1097,66 @@ again:
    return len;
 }
 
+static pthread_mutex_t msg_queue_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/*
+ * We queue messages rather than print them directly. This
+ *  is generally used in low level routines (msg handler, bnet)
+ *  to prevent recursion.
+ */
+void Qmsg(JCR *jcr, int type, int level, const char *fmt,...)
+{
+   va_list   arg_ptr;
+   int len, maxlen;
+   POOLMEM *pool_buf;
+   MQUEUE_ITEM *item;
+
+   if (jcr->dequeuing) {             /* do not allow recursion */
+      return;
+   }
+   pool_buf = get_pool_memory(PM_EMSG);
+
+again:
+   maxlen = sizeof_pool_memory(pool_buf) - 1; 
+   va_start(arg_ptr, fmt);
+   len = bvsnprintf(pool_buf, maxlen, fmt, arg_ptr);
+   va_end(arg_ptr);
+   if (len < 0 || len >= maxlen) {
+      pool_buf = realloc_pool_memory(pool_buf, maxlen + maxlen/2);
+      goto again;
+   }
+   P(msg_queue_mutex);
+   item = (MQUEUE_ITEM *)malloc(sizeof(MQUEUE_ITEM) + strlen(pool_buf) + 1);
+   item->type = type;
+   item->level = level;
+   strcpy(item->msg, pool_buf);  
+   jcr->msg_queue->append(item);
+   V(msg_queue_mutex);
+   free_memory(pool_buf);
+}
+
+/*
+ * Dequeue messages 
+ */
+void dequeue_messages(JCR *jcr)
+{
+   MQUEUE_ITEM *item;
+   P(msg_queue_mutex);
+   jcr->dequeuing = true;
+   foreach_dlist(item, jcr->msg_queue) {
+      Jmsg(jcr, item->type, item->level, "%s", item->msg);
+   }
+   jcr->msg_queue->destroy();
+   jcr->dequeuing = false;
+   V(msg_queue_mutex);
+}
+
 
 /*
  * If we come here, prefix the message with the file:line-number,
- *  then pass it on to the normal Jmsg routine.
+ *  then pass it on to the normal Qmsg routine.
  */
-void j_msg(char *file, int line, JCR *jcr, int type, int level, char *fmt,...)
+void q_msg(const char *file, int line, JCR *jcr, int type, int level, const char *fmt,...)
 {
    va_list   arg_ptr;
    int i, len, maxlen;
@@ -1093,6 +1175,6 @@ again:
       goto again;
    }
 
-   Jmsg(jcr, type, level, "%s", pool_buf);
+   Qmsg(jcr, type, level, "%s", pool_buf);
    free_memory(pool_buf);
 }