]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Fix sscanf problems reported by Peter Buschman that caused
authorKern Sibbald <kern@sibbald.com>
Thu, 7 Jun 2007 13:21:44 +0000 (13:21 +0000)
committerKern Sibbald <kern@sibbald.com>
Thu, 7 Jun 2007 13:21:44 +0000 (13:21 +0000)
     a bus error on Solaris.
kes  Rework (simplify) the select prompt in bat.
kes  Move get_jobid_from_tid() into lib and create a
     get_jcr_from_tid().
kes  Use get_jcr_from_tid() to conver all tls Emsg() to Jmsg().  This
     should definitely fix the problem of lost error messages in the
     encryption code.
kes  Remove over zellous addition of FSFE copyright in a few eggxxx files.
kes  Eliminate tcpd.h from the project. Enclose the #include from the
     library with extern C ...
kes  Add print of signal name when a signal is trapped.

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

19 files changed:
bacula/src/filed/job.c
bacula/src/lib/address_conf.h
bacula/src/lib/bnet_server.c
bacula/src/lib/crypto.c
bacula/src/lib/jcr.c
bacula/src/lib/openssl.c
bacula/src/lib/protos.h
bacula/src/lib/runscript.h
bacula/src/lib/signal.c
bacula/src/lib/tcpd.h [deleted file]
bacula/src/lib/tls.c
bacula/src/lib/util.c
bacula/src/lib/var.c
bacula/src/lib/workq.c
bacula/src/qt-console/console/console.cpp
bacula/src/qt-console/select/select.cpp
bacula/src/stored/device.c
bacula/src/stored/protos.h
bacula/technotes-2.1

index cfb569317fcf03ced4dbaaebf9982c5505b7523a..8fc6dbdc5de0f0cfc054459c0870c66793d00ec5 100644 (file)
@@ -120,7 +120,7 @@ static char verifycmd[]   = "verify level=%30s";
 static char estimatecmd[] = "estimate listing=%d";
 static char runbefore[]   = "RunBeforeJob %s";
 static char runafter[]    = "RunAfterJob %s";
-static char runscript[]   = "Run OnSuccess=%u OnFailure=%u AbortOnError=%u When=%u Command=%s";
+static char runscript[]   = "Run OnSuccess=%d OnFailure=%d AbortOnError=%d When=%d Command=%s";
 
 /* Responses sent to Director */
 static char errmsg[]      = "2999 Invalid command\n";
@@ -530,13 +530,15 @@ static int runscript_cmd(JCR *jcr)
 {
    BSOCK *dir = jcr->dir_bsock;
    POOLMEM *msg = get_memory(dir->msglen+1);
+   int on_success, on_failure, abort_on_error;
 
    RUNSCRIPT *cmd = new_runscript() ;
 
    Dmsg1(100, "runscript_cmd: '%s'\n", dir->msg);
-   if (sscanf(dir->msg, runscript, &cmd->on_success, 
-                                  &cmd->on_failure,
-                                  &cmd->abort_on_error,
+   /* Note, we cannot sscanf into bools */
+   if (sscanf(dir->msg, runscript, &on_success, 
+                                  &on_failure,
+                                  &abort_on_error,
                                   &cmd->when,
                                   msg) != 5) {
       pm_strcpy(jcr->errmsg, dir->msg);
@@ -546,6 +548,9 @@ static int runscript_cmd(JCR *jcr)
       free_memory(msg);
       return 0;
    }
+   cmd->on_success = on_success;
+   cmd->on_failure = on_failure;
+   cmd->abort_on_error = abort_on_error;
    unbash_spaces(msg);
 
    cmd->set_command(msg);
index 78d7992d2be8a1254b5780dfe0600845c3ed580c..de80c863d5b68bd8b0fda16544f0e5ec0898e006 100644 (file)
@@ -1,13 +1,7 @@
-/*
- *
- *   Written by Meno Abels, June MMIV
- *
- *   Version $Id$
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2004-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2004-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.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ *
+ *   Written by Meno Abels, June MMIV
+ *
+ *   Version $Id$
+ */
+
 
 class IPADDR : public SMARTALLOC {
  public:
index b30d17e14f525a74ef37112c5cd1e8aa28d6124f..00115e53633d0bb69aa2fe31e3649d66bff55374 100644 (file)
@@ -49,7 +49,9 @@
 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
 #ifdef HAVE_LIBWRAP
-#include "tcpd.h"
+extern "C" {
+#include <tcpd.h>
+}
 int allow_severity = LOG_NOTICE;
 int deny_severity = LOG_WARNING;
 #endif
index f6fa8847df625cff0052731c1d30aee17b53e546..e256aac4427dc57e49f46eb9ecb729e0ea02799c 100644 (file)
@@ -451,13 +451,15 @@ int crypto_keypair_load_cert(X509_KEYPAIR *keypair, const char *file)
 
    /* Extract the subjectKeyIdentifier extension field */
    if ((keypair->keyid = openssl_cert_keyid(cert)) == NULL) {
-      Emsg0(M_ERROR, 0, _("Provided certificate does not include the required subjectKeyIdentifier extension."));
+      Jmsg0(get_jcr_from_tid(), M_ERROR, 0,
+         _("Provided certificate does not include the required subjectKeyIdentifier extension."));
       goto err;
    }
 
    /* Validate the public key type (only RSA is supported) */
    if (EVP_PKEY_type(keypair->pubkey->type) != EVP_PKEY_RSA) {
-       Emsg1(M_ERROR, 0, _("Unsupported key type provided: %d\n"), EVP_PKEY_type(keypair->pubkey->type));
+       Jmsg1(get_jcr_from_tid(), M_ERROR, 0, 
+             _("Unsupported key type provided: %d\n"), EVP_PKEY_type(keypair->pubkey->type));
        goto err;
    }
 
@@ -1020,7 +1022,7 @@ CRYPTO_SESSION *crypto_session_new (crypto_cipher_t cipher, alist *pubkeys)
       ec = EVP_bf_cbc();
       break;
    default:
-      Emsg0(M_ERROR, 0, _("Unsupported cipher type specified\n"));
+      Jmsg0(get_jcr_from_tid(), M_ERROR, 0, _("Unsupported cipher type specified\n"));
       crypto_session_free(cs);
       return NULL;
    }
@@ -1263,7 +1265,8 @@ CIPHER_CONTEXT *crypto_cipher_new(CRYPTO_SESSION *cs, bool encrypt, uint32_t *bl
     * Acquire a cipher instance for the given ASN.1 cipher NID
     */
    if ((ec = EVP_get_cipherbyobj(cs->cryptoData->contentEncryptionAlgorithm)) == NULL) {
-      Emsg1(M_ERROR, 0, _("Unsupported contentEncryptionAlgorithm: %d\n"), OBJ_obj2nid(cs->cryptoData->contentEncryptionAlgorithm));
+      Jmsg1(get_jcr_from_tid(), M_ERROR, 0, 
+         _("Unsupported contentEncryptionAlgorithm: %d\n"), OBJ_obj2nid(cs->cryptoData->contentEncryptionAlgorithm));
       free(cipher_ctx);
       return NULL;
    }
@@ -1366,7 +1369,9 @@ int init_crypto (void)
    int stat;
 
    if ((stat = openssl_init_threads()) != 0) {
-      Emsg1(M_ABORT, 0, _("Unable to init OpenSSL threading: ERR=%s\n"), strerror(stat));
+      berrno be;
+      Jmsg1(get_jcr_from_tid(), M_ABORT, 0, 
+        _("Unable to init OpenSSL threading: ERR=%s\n"), be.bstrerror(stat));
    }
 
    /* Load libssl and libcrypto human-readable error strings */
@@ -1379,7 +1384,7 @@ int init_crypto (void)
    OpenSSL_add_all_algorithms();
 
    if (!openssl_seed_prng()) {
-      Emsg0(M_ERROR_TERM, 0, _("Failed to seed OpenSSL PRNG\n"));
+      Jmsg0(get_jcr_from_tid(), M_ERROR_TERM, 0, _("Failed to seed OpenSSL PRNG\n"));
    }
 
    crypto_initialized = true;
@@ -1405,7 +1410,7 @@ int cleanup_crypto (void)
    }
 
    if (!openssl_save_prng()) {
-      Emsg0(M_ERROR, 0, _("Failed to save OpenSSL PRNG\n"));
+      Jmsg0(get_jcr_from_tid(), M_ERROR, 0, _("Failed to save OpenSSL PRNG\n"));
    }
 
    openssl_cleanup_threads();
@@ -1486,7 +1491,7 @@ bool crypto_digest_update(DIGEST *digest, const uint8_t *data, uint32_t length)
       if ((ret = SHA1Update(&digest->sha1, (const u_int8_t *) data, length)) == shaSuccess) {
          return true;
       } else {
-         Emsg1(M_ERROR, 0, _("SHA1Update() returned an error: %d\n"), ret);
+         Jmsg1(get_jcr_from_tid(), M_ERROR, 0, _("SHA1Update() returned an error: %d\n"), ret);
          return false;
       }
       break;
index 40d641e1038f2c5cb1c846f75df237cc5d2049ac..1bad4fdb23ee50911f6316efc92072232d208d23 100644 (file)
@@ -451,6 +451,52 @@ void free_jcr(JCR *jcr)
    garbage_collect_memory_pool();
    Dmsg0(3400, "Exit free_jcr\n");
 }
+/*
+ * Find which JobId corresponds to the current thread
+ */
+uint32_t get_jobid_from_tid()                              
+{
+   return get_jobid_from_tid(pthread_self());
+}
+
+uint32_t get_jobid_from_tid(pthread_t tid)
+{
+   JCR *jcr;
+   uint32_t JobId = 0;
+   foreach_jcr(jcr) {
+      if (pthread_equal(jcr->my_thread_id, tid)) {
+         JobId = (uint32_t)jcr->JobId;
+         break;
+      }
+   }
+   endeach_jcr(jcr);
+   return JobId;
+}
+
+/*
+ * Find the jcr that corresponds to the current thread
+ */
+JCR *get_jcr_from_tid()                              
+{
+   return get_jcr_from_tid(pthread_self());
+}
+
+JCR *get_jcr_from_tid(pthread_t tid)
+{
+   JCR *jcr;
+   JCR *rtn_jcr = NULL;
+
+   foreach_jcr(jcr) {
+      if (pthread_equal(jcr->my_thread_id, tid)) {
+         rtn_jcr = jcr;
+         break;
+      }
+   }
+   endeach_jcr(jcr);
+   return rtn_jcr;
+}
+
 
 
 /*
index 96ffcb52bf111ff13db4905cbbaf1ba2fa512e42..09d274c74ad92f6a9b8e72b86db5d391fa9bc189 100644 (file)
@@ -66,7 +66,7 @@ struct CRYPTO_dynlock_value {
  */
 void openssl_post_errors(int code, const char *errstring)
 {
-   openssl_post_errors(NULL, code, errstring);
+   openssl_post_errors(get_jcr_from_tid(), code, errstring);
 }
 
 
@@ -95,6 +95,11 @@ void openssl_post_errors(JCR *jcr, int code, const char *errstring)
 static unsigned long get_openssl_thread_id(void)
 {
    /* Comparison without use of pthread_equal() is mandated by the OpenSSL API */
+   /*
+    * Note that this creates problems with the new Win32 pthreads
+    *   emulation code, which defines pthread_t as a structure. For
+    *   this reason, we continue to use a very old implementation.
+    */
    return ((unsigned long)pthread_self());
 }
 
@@ -110,7 +115,8 @@ static struct CRYPTO_dynlock_value *openssl_create_dynamic_mutex (const char *fi
 
    if ((stat = pthread_mutex_init(&dynlock->mutex, NULL)) != 0) {
       berrno be;
-      Emsg1(M_ABORT, 0, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(stat));
+      Jmsg1(get_jcr_from_tid(), M_ABORT, 0, _("Unable to init mutex: ERR=%s\n"), 
+            be.bstrerror(stat));
    }
 
    return dynlock;
@@ -131,7 +137,8 @@ static void openssl_destroy_dynamic_mutex(struct CRYPTO_dynlock_value *dynlock,
 
    if ((stat = pthread_mutex_destroy(&dynlock->mutex)) != 0) {
       berrno be;
-      Emsg1(M_ABORT, 0, _("Unable to destroy mutex: ERR=%s\n"), be.bstrerror(stat));
+      Jmsg1(get_jcr_from_tid(), M_ABORT, 0, _("Unable to destroy mutex: ERR=%s\n"), 
+            be.bstrerror(stat));
    }
 
    free(dynlock);
@@ -169,7 +176,8 @@ int openssl_init_threads (void)
    for (i = 0; i < numlocks; i++) {
       if ((stat = pthread_mutex_init(&mutexes[i], NULL)) != 0) {
          berrno be;
-         Emsg1(M_ERROR, 0, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(stat));
+         Jmsg1(get_jcr_from_tid(), M_ERROR, 0, _("Unable to init mutex: ERR=%s\n"), 
+               be.bstrerror(stat));
          return stat;
       }
    }
@@ -202,7 +210,8 @@ void openssl_cleanup_threads(void)
       if ((stat = pthread_mutex_destroy(&mutexes[i])) != 0) {
          berrno be;
          /* We don't halt execution, reporting the error should be sufficient */
-         Emsg1(M_ERROR, 0, _("Unable to destroy mutex: ERR=%s\n"), be.bstrerror(stat));
+         Jmsg1(get_jcr_from_tid(), M_ERROR, 0, _("Unable to destroy mutex: ERR=%s\n"), 
+               be.bstrerror(stat));
       }
    }
 
index 16b87f0e042867ae9107ae3fbe7641ad6ca07597..d7b5a18b117eba52c9eaa149c7201a55d05be16f 100644 (file)
@@ -198,6 +198,10 @@ void unlock_jobs();
 JCR *jcr_walk_start();
 JCR *jcr_walk_next(JCR *prev_jcr);
 void jcr_walk_end(JCR *jcr);
+uint32_t get_jobid_from_tid(pthread_t tid);
+uint32_t get_jobid_from_tid();             
+JCR *get_jcr_from_tid(pthread_t tid);
+JCR *get_jcr_from_tid();
 
 
 /* lex.c */
index 42b1c898d9e80d5ea3d1737aef88777b27289b77..451541c3aed9332c9ecbe323a291b13e70c43244 100644 (file)
@@ -1,12 +1,7 @@
-/*
- * Bacula RUNSCRIPT Structure definition for FileDaemon and Director
- * Eric Bollengier May 2006
- * Version $Id$
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2006-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2006-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.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
-
+/*
+ * Bacula RUNSCRIPT Structure definition for FileDaemon and Director
+ * Eric Bollengier May 2006
+ * Version $Id$
+ */
 
 #ifndef __RUNSCRIPT_H_
 #define __RUNSCRIPT_H_ 1
@@ -45,7 +45,7 @@
  * script->on_failure = true;
  * script->when = SCRIPT_After;
  * 
- * script->run("LabelBefore"); // the label must contain "Before" or "After" special keyword
+ * script->run("LabelBefore");  // the label must contain "Before" or "After" special keyword
  * free_runscript(script);
  */
 
@@ -66,11 +66,11 @@ class RUNSCRIPT {
 public:
    POOLMEM *command;            /* command string */
    POOLMEM *target;             /* host target */
+   int  when;                   /* SCRIPT_Before|Script_After BEFORE/AFTER JOB*/
    char level;                  /* Base|Full|Incr...|All (NYI) */
    bool on_success;             /* executre command on job success (After) */
    bool on_failure;             /* executre command on job failure (After) */
    bool abort_on_error;         /* abort job on error (Before) */
-   int  when;                   /* SCRIPT_Before|Script_After BEFORE/AFTER JOB*/
    /* TODO : drop this with bacula 1.42 */
    bool old_proto;              /* used by old 1.3X protocol */
 
index f395122b3102b9e8a611993eca521eb5e5e2fae8..3b34cd15256229fc8cdd7416c2c877a4d6b946dc 100644 (file)
@@ -91,7 +91,7 @@ extern "C" void signal_handler(int sig)
    if (sig == SIGTERM) {
 //    Emsg1(M_TERM, -1, "Shutting down Bacula service: %s ...\n", my_name);
    } else {
-      Emsg2(M_FATAL, -1, _("Bacula interrupted by signal %d: %s\n"), sig, sig_names[sig]);
+      Emsg2(M_FATAL, -1, _("Bacula interrupted by signal %d: %s\n"), sig, get_signal_name(sig));
    }
 
 #ifdef TRACEBACK
@@ -104,8 +104,8 @@ extern "C" void signal_handler(int sig)
       pid_t pid;
       int exelen = strlen(exepath);
 
-      fprintf(stderr, _("Kaboom! %s, %s got signal %d. Attempting traceback.\n"),
-              exename, my_name, sig);
+      fprintf(stderr, _("Kaboom! %s, %s got signal %d - %s. Attempting traceback.\n"),
+              exename, my_name, sig, get_signal_name(sig));
       fprintf(stderr, _("Kaboom! exepath=%s\n"), exepath);
 
       if (exelen + 12 > (int)sizeof(btpath)) {
@@ -149,7 +149,8 @@ extern "C" void signal_handler(int sig)
          argv[3] = (char *)NULL;
          fprintf(stderr, _("Calling: %s %s %s\n"), btpath, exepath, pid_buf);
          if (execv(btpath, argv) != 0) {
-            printf(_("execv: %s failed: ERR=%s\n"), btpath, strerror(errno));
+            berrno be;
+            printf(_("execv: %s failed: ERR=%s\n"), btpath, be.bstrerror());
          }
          exit(-1);
       default:                        /* parent */
diff --git a/bacula/src/lib/tcpd.h b/bacula/src/lib/tcpd.h
deleted file mode 100644 (file)
index b8a9ee6..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
- /*
-  * @(#) tcpd.h 1.5 96/03/19 16:22:24
-  *
-  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
-  */
-
-/*
- * This version of the file has been hacked over by
- *   Kern Sibbald to make it compatible with C++ for
- *   the few functions that Bacula uses.  19 April 2002
- *  It now compiles with C++ but remains untested.
- *  A correct fix would require significantly more work.
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Structure to describe one communications endpoint. */
-
-#define STRING_LENGTH   128             /* hosts, users, processes */
-
-struct host_info {
-    char    name[STRING_LENGTH];        /* access via eval_hostname(host) */
-    char    addr[STRING_LENGTH];        /* access via eval_hostaddr(host) */
-    struct sockaddr_in *sin;            /* socket address or 0 */
-    struct t_unitdata *unit;            /* TLI transport address or 0 */
-    struct request_info *request;       /* for shared information */
-};
-
-/* Structure to describe what we know about a service request. */
-
-struct request_info {
-    int     fd;                         /* socket handle */
-    char    user[STRING_LENGTH];        /* access via eval_user(request) */
-    char    daemon[STRING_LENGTH];      /* access via eval_daemon(request) */
-    char    pid[10];                    /* access via eval_pid(request) */
-    struct host_info client[1];         /* client endpoint info */
-    struct host_info server[1];         /* server endpoint info */
-    void  (*sink) ();                   /* datagram sink function or 0 */
-    void  (*hostname) ();               /* address to printable hostname */
-    void  (*hostaddr) ();               /* address to printable address */
-    void  (*cleanup) ();                /* cleanup function or 0 */
-    struct netconfig *config;           /* netdir handle */
-};
-
-/* Common string operations. Less clutter should be more readable. */
-
-#define STRN_CPY(d,s,l) { strncpy((d),(s),(l)); (d)[(l)-1] = 0; }
-
-#define STRN_EQ(x,y,l)  (strncasecmp((x),(y),(l)) == 0)
-#define STRN_NE(x,y,l)  (strncasecmp((x),(y),(l)) != 0)
-#define STR_EQ(x,y)     (strcasecmp((x),(y)) == 0)
-#define STR_NE(x,y)     (strcasecmp((x),(y)) != 0)
-
- /*
-  * Initially, all above strings have the empty value. Information that
-  * cannot be determined at runtime is set to "unknown", so that we can
-  * distinguish between `unavailable' and `not yet looked up'. A hostname
-  * that we do not believe in is set to "paranoid".
-  */
-
-#define STRING_UNKNOWN  "unknown"       /* lookup failed */
-#define STRING_PARANOID "paranoid"      /* hostname conflict */
-
-extern char unknown[];
-extern char paranoid[];
-
-#define HOSTNAME_KNOWN(s) (STR_NE((s),unknown) && STR_NE((s),paranoid))
-
-#define NOT_INADDR(s) (s[strspn(s,"01234567890./")] != 0)
-
-/* Global functions. */
-
-#if defined(TLI) || defined(PTX) || defined(TLI_SEQUENT)
-extern void fromhost();                 /* get/validate client host info */
-#else
-#define fromhost sock_host              /* no TLI support needed */
-#endif
-
-extern int hosts_access(struct request_info *); /* access control */
-extern void shell_cmd();                /* execute shell command */
-extern char *percent_x();               /* do %<char> expansion */
-extern void rfc931();                   /* client name from RFC 931 daemon */
-extern void clean_exit();               /* clean up and exit */
-extern void refuse();                   /* clean up and exit */
-extern char *xgets();                   /* fgets() on steroids */
-extern char *split_at();                /* strchr() and split */
-extern unsigned long dot_quad_addr();   /* restricted inet_addr() */
-
-/* Global variables. */
-
-extern int allow_severity;              /* for connection logging */
-extern int deny_severity;               /* for connection logging */
-extern char *hosts_allow_table;         /* for verification mode redirection */
-extern char *hosts_deny_table;          /* for verification mode redirection */
-extern int hosts_access_verbose;        /* for verbose matching mode */
-extern int rfc931_timeout;              /* user lookup timeout */
-extern int resident;                    /* > 0 if resident process */
-
- /*
-  * Routines for controlled initialization and update of request structure
-  * attributes. Each attribute has its own key.
-  */
-
-#ifdef __STDC__
-extern struct request_info *request_init(struct request_info *,...);
-extern struct request_info *request_set(struct request_info *,...);
-#else
-extern struct request_info *request_init();     /* initialize request */
-extern struct request_info *request_set();      /* update request structure */
-#endif
-
-#define RQ_FILE         1               /* file descriptor */
-#define RQ_DAEMON       2               /* server process (argv[0]) */
-#define RQ_USER         3               /* client user name */
-#define RQ_CLIENT_NAME  4               /* client host name */
-#define RQ_CLIENT_ADDR  5               /* client host address */
-#define RQ_CLIENT_SIN   6               /* client endpoint (internal) */
-#define RQ_SERVER_NAME  7               /* server host name */
-#define RQ_SERVER_ADDR  8               /* server host address */
-#define RQ_SERVER_SIN   9               /* server endpoint (internal) */
-
- /*
-  * Routines for delayed evaluation of request attributes. Each attribute
-  * type has its own access method. The trivial ones are implemented by
-  * macros. The other ones are wrappers around the transport-specific host
-  * name, address, and client user lookup methods. The request_info and
-  * host_info structures serve as caches for the lookup results.
-  */
-
-extern char *eval_user();               /* client user */
-extern char *eval_hostname();           /* printable hostname */
-extern char *eval_hostaddr();           /* printable host address */
-extern char *eval_hostinfo();           /* host name or address */
-extern char *eval_client(struct request_info *); /* whatever is available */
-extern char *eval_server();             /* whatever is available */
-#define eval_daemon(r)  ((r)->daemon)   /* daemon process name */
-#define eval_pid(r)     ((r)->pid)      /* process id */
-
-/* Socket-specific methods, including DNS hostname lookups. */
-
-extern void sock_host(struct request_info *);
-extern void sock_hostname();            /* translate address to hostname */
-extern void sock_hostaddr();            /* address to printable address */
-#define sock_methods(r) \
-       { (r)->hostname = sock_hostname; (r)->hostaddr = sock_hostaddr; }
-
-/* The System V Transport-Level Interface (TLI) interface. */
-
-#if defined(TLI) || defined(PTX) || defined(TLI_SEQUENT)
-extern void tli_host();                 /* look up endpoint addresses etc. */
-#endif
-
- /*
-  * Problem reporting interface. Additional file/line context is reported
-  * when available. The jump buffer (tcpd_buf) is not declared here, or
-  * everyone would have to include <setjmp.h>.
-  */
-
-#ifdef __STDC__
-extern void tcpd_warn(char *, ...);     /* report problem and proceed */
-extern void tcpd_jump(char *, ...);     /* report problem and jump */
-#else
-extern void tcpd_warn();
-extern void tcpd_jump();
-#endif
-
-struct tcpd_context {
-    char   *file;                       /* current file */
-    int     line;                       /* current line */
-};
-extern struct tcpd_context tcpd_context;
-
- /*
-  * While processing access control rules, error conditions are handled by
-  * jumping back into the hosts_access() routine. This is cleaner than
-  * checking the return value of each and every silly little function. The
-  * (-1) returns are here because zero is already taken by longjmp().
-  */
-
-#define AC_PERMIT       1               /* permit access */
-#define AC_DENY         (-1)            /* deny_access */
-#define AC_ERROR        AC_DENY         /* XXX */
-
- /*
-  * In verification mode an option function should just say what it would do,
-  * instead of really doing it. An option function that would not return
-  * should clear the dry_run flag to inform the caller of this unusual
-  * behavior.
-  */
-
-extern void process_options();          /* execute options */
-extern int dry_run;                     /* verification flag */
-
-/* Bug workarounds. */
-
-#ifdef INET_ADDR_BUG                    /* inet_addr() returns struct */
-#define inet_addr fix_inet_addr
-extern long fix_inet_addr();
-#endif
-
-#ifdef BROKEN_FGETS                     /* partial reads from sockets */
-#define fgets fix_fgets
-extern char *fix_fgets();
-#endif
-
-#ifdef RECVFROM_BUG                     /* no address family info */
-#define recvfrom fix_recvfrom
-extern int fix_recvfrom();
-#endif
-
-#ifdef GETPEERNAME_BUG                  /* claims success with UDP */
-#define getpeername fix_getpeername
-extern int fix_getpeername();
-#endif
-
-#ifdef SOLARIS_24_GETHOSTBYNAME_BUG     /* lists addresses as aliases */
-#define gethostbyname fix_gethostbyname
-extern struct hostent *fix_gethostbyname();
-#endif
-
-#ifdef USE_STRSEP                       /* libc calls strtok() */
-#define strtok  fix_strtok
-extern char *fix_strtok();
-#endif
-
-#ifdef LIBC_CALLS_STRTOK                /* libc calls strtok() */
-#define strtok  my_strtok
-extern char *my_strtok();
-#endif
-
-#ifdef __cplusplus
-}
-#endif
index d4919c83c137755cde128ff5c7c9e3d686a96556..b6d928e87342547afe6a17d6579b770373af4848 100644 (file)
@@ -90,7 +90,7 @@ static int openssl_verify_peer(int ok, X509_STORE_CTX *store)
       X509_NAME_oneline(X509_get_issuer_name(cert), issuer, 256);
       X509_NAME_oneline(X509_get_subject_name(cert), subject, 256);
 
-      Emsg5(M_ERROR, 0, _("Error with certificate at depth: %d, issuer = %s,"
+      Jmsg5(get_jcr_from_tid(), M_ERROR, 0, _("Error with certificate at depth: %d, issuer = %s,"
                           " subject = %s, ERR=%d:%s\n"), depth, issuer,
                           subject, err, X509_verify_cert_error_string(err));
 
@@ -153,7 +153,7 @@ TLS_CONTEXT *new_tls_context(const char *ca_certfile, const char *ca_certdir,
       }
    } else if (verify_peer) {
       /* At least one CA is required for peer verification */
-      Emsg0(M_ERROR, 0, _("Either a certificate file or a directory must be"
+      Jmsg0(get_jcr_from_tid(), M_ERROR, 0, _("Either a certificate file or a directory must be"
                          " specified as a verification store\n"));
       goto err;
    }
@@ -199,7 +199,8 @@ TLS_CONTEXT *new_tls_context(const char *ca_certfile, const char *ca_certdir,
    }
 
    if (SSL_CTX_set_cipher_list(ctx->openssl, TLS_DEFAULT_CIPHERS) != 1) {
-      Emsg0(M_ERROR, 0, _("Error setting cipher list, no valid ciphers available\n"));
+      Jmsg0(get_jcr_from_tid(), M_ERROR, 0,
+             _("Error setting cipher list, no valid ciphers available\n"));
       goto err;
    }
 
@@ -258,7 +259,7 @@ bool tls_postconnect_verify_cn(TLS_CONNECTION *tls, alist *verify_list)
 
    /* Check if peer provided a certificate */
    if (!(cert = SSL_get_peer_certificate(ssl))) {
-      Emsg0(M_ERROR, 0, _("Peer failed to present a TLS certificate\n"));
+      Jmsg0(get_jcr_from_tid(), M_ERROR, 0, _("Peer failed to present a TLS certificate\n"));
       return false;
    }
 
@@ -300,7 +301,8 @@ bool tls_postconnect_verify_host(TLS_CONNECTION *tls, const char *host)
 
    /* Check if peer provided a certificate */
    if (!(cert = SSL_get_peer_certificate(ssl))) {
-      Emsg1(M_ERROR, 0, _("Peer %s failed to present a TLS certificate\n"), host);
+      Jmsg1(get_jcr_from_tid(), M_ERROR, 0, 
+            _("Peer %s failed to present a TLS certificate\n"), host);
       return false;
    }
 
index 9cb5e07755540c0cb762e43eff19a001b0d1af41..e6ee972a374a8e13cda04240664330355fe2c1cd 100644 (file)
@@ -1,10 +1,3 @@
-/*
- *   util.c  miscellaneous utility subroutines for Bacula
- *
- *    Kern Sibbald, MM
- *
- *   Version $Id$
- */
 /*
    Bacula® - The Network Backup Solution
 
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ *   util.c  miscellaneous utility subroutines for Bacula
+ *
+ *    Kern Sibbald, MM
+ *
+ *   Version $Id$
+ */
 
 #include "bacula.h"
 #include "jcr.h"
index 27bf15d75d79552b90099646610af4406cc0f3be..26a9ff16884e31491ef56f63c727f6ddbb42b4a9 100644 (file)
@@ -1,26 +1,7 @@
-/*
-**  OSSP var - Variable Expansion
-**  Copyright (c) 2001-2002 Ralf S. Engelschall <rse@engelschall.com>
-**  Copyright (c) 2001-2002 The OSSP Project (http://www.ossp.org/)
-**  Copyright (c) 2001-2002 Cable & Wireless Deutschland (http://www.cw.com/de/)
-**
-**  This file is part of OSSP var, a variable expansion
-**  library which can be found at http://www.ossp.org/pkg/lib/var/.
-**
-**  Permission to use, copy, modify, and distribute this software for
-**  any purpose with or without fee is hereby granted, provided that
-**  the above copyright notice and this permission notice appear in all
-**  copies.
-**
-**  For disclaimer see below.
-*/
-/*
- *  Adapted by Kern Sibbald to Bacula June 2003
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2003-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2003-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.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+**  OSSP var - Variable Expansion
+**  Copyright (c) 2001-2002 Ralf S. Engelschall <rse@engelschall.com>
+**  Copyright (c) 2001-2002 The OSSP Project (http://www.ossp.org/)
+**  Copyright (c) 2001-2002 Cable & Wireless Deutschland (http://www.cw.com/de/)
+**
+**  This file is part of OSSP var, a variable expansion
+**  library which can be found at http://www.ossp.org/pkg/lib/var/.
+**
+**  Permission to use, copy, modify, and distribute this software for
+**  any purpose with or without fee is hereby granted, provided that
+**  the above copyright notice and this permission notice appear in all
+**  copies.
+**
+**  For disclaimer see below.
+*/
+/*
+ *  Adapted by Kern Sibbald to Bacula June 2003
+ */
 
 #include "bacula.h"
 #if defined(HAVE_PCREPOSIX)
index fbf880b2f152069e9711d86ccb63b004676552b6..2322d772e1e8c65f235281c080c3001641a37d01 100644 (file)
@@ -1,3 +1,30 @@
+/*
+   Bacula® - The Network Backup Solution
+
+   Copyright (C) 2001-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.
+   This program is Free Software; you can redistribute it and/or
+   modify it under the terms of version two of the GNU General Public
+   License as published by the Free Software Foundation plus additions
+   that are listed in the file LICENSE.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Bacula® is a registered trademark of John Walker.
+   The licensor of Bacula is the Free Software Foundation Europe
+   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+   Switzerland, email:ftf@fsfeurope.org.
+*/
 /*
  * Bacula work queue routines. Permits passing work to
  *  multiple threads.
  *  workq_destroy(workq_t *wq);
  *
  */
-/*
-   Bacula® - The Network Backup Solution
-
-   Copyright (C) 2001-2006 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.
-   This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
-   License as published by the Free Software Foundation plus additions
-   that are listed in the file LICENSE.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.
-
-   Bacula® is a registered trademark of John Walker.
-   The licensor of Bacula is the Free Software Foundation Europe
-   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
-   Switzerland, email:ftf@fsfeurope.org.
-*/
 
 #include "bacula.h"
 
index e09239ed63b051c3c7ae012da5d481240ecd038c..dbbc6f38df0c4ddcff3d978276a7680b22a2a67e 100644 (file)
@@ -548,7 +548,7 @@ int Console::write(const char *msg)
 void Console::beginNewCommand()
 {
    for (int i=0; i < 3; i++) {
-      write(".\n");
+      write(".");
       while (read() > 0) {
          if (mainWin->m_displayAll) display_text(msg());
       }
@@ -622,11 +622,13 @@ int Console::read()
          if (mainWin->m_commDebug) Pmsg0(000, "CMD OK\n");
          m_at_prompt = false;
          m_at_main_prompt = false;
+         mainWin->set_status(_("Command completed ..."));
          continue;
       case BNET_CMD_BEGIN:
          if (mainWin->m_commDebug) Pmsg0(000, "CMD BEGIN\n");
          m_at_prompt = false;
          m_at_main_prompt = false;
+         mainWin->set_status(_("Processing command ..."));
          continue;
       case BNET_MAIN_PROMPT:
          if (mainWin->m_commDebug) Pmsg0(000, "MAIN PROMPT\n");
@@ -752,7 +754,7 @@ bool Console::is_connectedGui()
       return true;
    } else {
       QString message("Director ");
-      message += " is curerntly disconnected\n  Please reconnect!!";
+      message += " is currently disconnected\n  Please reconnect!!";
       QMessageBox::warning(this, "Bat",
          tr(message.toUtf8().data()), QMessageBox::Ok );
       return false;
@@ -768,14 +770,14 @@ bool Console::preventInUseConnect()
    if (!is_connected()) {
       QString message("Director ");
       message += m_dir->name();
-      message += " is curerntly disconnected\n  Please reconnect!!";
+      message += " is currently disconnected\n  Please reconnect!!";
       QMessageBox::warning(this, "Bat",
          tr(message.toUtf8().data()), QMessageBox::Ok );
       return false;
    } else if (!m_at_main_prompt){
       QString message("Director ");
       message += m_dir->name();
-      message += " is curerntly busy\n  Please complete restore or other "
+      message += " is currently busy\n  Please complete restore or other "
                  " operation !!  This is a limitation that will be resolved before a beta"
                  " release.  This is currently an alpha release.";
       QMessageBox::warning(this, "Bat",
@@ -784,7 +786,7 @@ bool Console::preventInUseConnect()
    } else if (!m_at_prompt){
       QString message("Director ");
       message += m_dir->name();
-      message += " is curerntly not at a prompt\n  Please try again!!";
+      message += " is currently not at a prompt\n  Please try again!!";
       QMessageBox::warning(this, "Bat",
          tr(message.toUtf8().data()), QMessageBox::Ok );
       return false;
index 8772bbdb85dde8b0b14efa2c5f919a8aaef5a6d7..0dcca93d70f54c7112b8b4ca78ad233e5d155f31 100644 (file)
@@ -38,7 +38,7 @@
 #include "select.h"
 
 /*
- * Setup all the combo boxes and display the dialog
+ * Read the items for the selection
  */
 selectDialog::selectDialog(Console *console) 
 {
@@ -50,6 +50,7 @@ selectDialog::selectDialog(Console *console)
    m_console = console;
    setupUi(this);
    connect(listBox, SIGNAL(currentRowChanged(int)), this, SLOT(index_change(int)));
+   setAttribute(Qt::WA_DeleteOnClose);
    m_console->read();                 /* get title */
    labelWidget->setText(m_console->msg());
    while ((stat=m_console->read()) > 0) {
@@ -57,10 +58,7 @@ selectDialog::selectDialog(Console *console)
       item->setText(m_console->msg());
       listBox->insertItem(row++, item);
    }
-// Dmsg1(000, "Stat=%d\n", stat);
-   m_console->read();                 /* get prompt signal */
-   m_console->read();                 /* get prompt */
-// Dmsg1(000, "Prompt=%s", m_console->msg());
+   m_console->displayToPrompt();
    this->show();
 }
 
@@ -69,21 +67,23 @@ void selectDialog::accept()
    char cmd[100];
 
    this->hide();
-   
    bsnprintf(cmd, sizeof(cmd), "%d", m_index+1);
    m_console->write_dir(cmd);
    m_console->displayToPrompt();
-   delete this;
+   this->close();
    mainWin->resetFocus();
+   m_console->displayToPrompt();
+
 }
 
 
 void selectDialog::reject()
 {
-   mainWin->set_status(" Canceled");
    this->hide();
-   delete this;
+   mainWin->set_status(" Canceled");
+   this->close();
    mainWin->resetFocus();
+   m_console->beginNewCommand();
 }
 
 /*
@@ -93,6 +93,5 @@ void selectDialog::reject()
  */
 void selectDialog::index_change(int index)
 {
-// Dmsg1(000, "Index=%d\n", index);
    m_index = index;
 }
index 9a77cdf722c3cf3c8906298bc47f1f3949890a55..b8c77b142c0ece9f6335a161e6a41ab716c733d1 100644 (file)
@@ -323,22 +323,6 @@ bool open_device(DCR *dcr)
    return true;
 }
 
-/*
- * Find which JobId corresponds to the current thread
- */
-uint32_t get_jobid_from_tid(pthread_t tid)
-{
-   JCR *jcr;
-   uint32_t JobId = 0;
-   foreach_jcr(jcr) {
-      if (pthread_equal(jcr->my_thread_id, tid)) {
-         JobId = (uint32_t)jcr->JobId;
-         break;
-      }
-   }
-   endeach_jcr(jcr);
-   return JobId;
-}
 
 /*
  * Check if the device is blocked or not
@@ -356,14 +340,14 @@ bool is_device_unmounted(DEVICE *dev)
 void DEVICE::_dlock(const char *file, int line)
 {
    Dmsg4(sd_dbglvl, "dlock from %s:%d precnt=%d JobId=%u\n", file, line,
-         m_count, get_jobid_from_tid(pthread_self())); 
+         m_count, get_jobid_from_tid()); 
    /* Note, this *really* should be protected by a mutex, but
     *  since it is only debug code we don't worry too much.  
     */
    if (m_count > 0 && pthread_equal(m_pid, pthread_self())) {
       Dmsg5(sd_dbglvl, "Possible DEADLOCK!! lock held by JobId=%u from %s:%d m_count=%d JobId=%u\n", 
             get_jobid_from_tid(m_pid),
-            file, line, m_count, get_jobid_from_tid(pthread_self()));
+            file, line, m_count, get_jobid_from_tid());
    }
    P(m_mutex);
    m_pid = pthread_self();
@@ -374,7 +358,7 @@ void DEVICE::_dunlock(const char *file, int line)
 {
    m_count--; 
    Dmsg4(sd_dbglvl+1, "dunlock from %s:%d postcnt=%d JobId=%u\n", file, line,
-         m_count, get_jobid_from_tid(pthread_self())); 
+         m_count, get_jobid_from_tid()); 
    V(m_mutex);   
 }
 
@@ -402,7 +386,7 @@ void DEVICE::r_dlock()
    int stat;
 #ifdef SD_DEBUG_LOCK
    Dmsg4(sd_dbglvl+1, "r_dlock blked=%s from %s:%d JobId=%u\n", this->print_blocked(),
-         file, line, get_jobid_from_tid(pthread_self()));
+         file, line, get_jobid_from_tid());
 #else
    Dmsg1(sd_dbglvl, "reclock blked=%s\n", this->print_blocked());
 #endif
index dff2b02dcb06fec5d9fca263cb66b4fed25f861b..deb8d6c706b98cd120b89ab5c97677a14bb7c4db 100644 (file)
@@ -135,7 +135,6 @@ void     _give_back_device_lock(const char *file, int line, DEVICE *dev, bsteal_
 void     set_new_volume_parameters(DCR *dcr);
 void     set_new_file_parameters(DCR *dcr);
 bool     is_device_unmounted(DEVICE *dev);
-uint32_t get_jobid_from_tid(pthread_t tid);
 
 /* From dircmd.c */
 void     *handle_connection_request(void *arg);
index ca29a660650f689dcb522bc70770cfd207bb73c2..05a21b0dc76d707d56584daa63dc5edf1b433d70 100644 (file)
@@ -1,6 +1,21 @@
               Technical notes on version 2.1
 
 General:
+07Jun07
+kes  Fix sscanf problems reported by Peter Buschman that caused
+     a bus error on Solaris.
+kes  Rework (simplify) the select prompt in bat.
+kes  Move get_jobid_from_tid() into lib and create a 
+     get_jcr_from_tid().
+kes  Use get_jcr_from_tid() to conver all tls Emsg() to Jmsg().  This
+     should definitely fix the problem of lost error messages in the
+     encryption code.
+kes  Remove over zellous addition of FSFE copyright in a few eggxxx files.
+kes  Eliminate tcpd.h from the project. Enclose the #include from the
+     library with extern C ...
+kes  Add print of signal name when a signal is trapped.
+
+Release: 2.1.12 beta
 04Jun07
 kes  Fix a seg fault in the PostgreSQL driver dereferencing a NULL pointer.
 03Jun07