]> git.sur5r.net Git - bacula/bacula/commitdiff
Misc -- see techlog
authorKern Sibbald <kern@sibbald.com>
Thu, 12 Aug 2004 18:58:13 +0000 (18:58 +0000)
committerKern Sibbald <kern@sibbald.com>
Thu, 12 Aug 2004 18:58:13 +0000 (18:58 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1516 91ce42f0-d328-0410-95d8-f526ca767f89

20 files changed:
bacula/kernstodo
bacula/src/dird/authenticate.c
bacula/src/dird/backup.c
bacula/src/dird/dird.c
bacula/src/dird/dird_conf.c
bacula/src/dird/job.c
bacula/src/dird/jobq.c
bacula/src/dird/scheduler.c
bacula/src/lib/address_conf.c
bacula/src/lib/address_conf.h
bacula/src/lib/alist.h
bacula/src/lib/bnet.c
bacula/src/lib/bnet_server.c
bacula/src/lib/dlist.c
bacula/src/lib/dlist.h
bacula/src/lib/jcr.c
bacula/src/lib/lib.h
bacula/src/lib/smartall.h
bacula/src/lib/watchdog.c
bacula/src/version.h

index e16b57ea2cb49726bf03512b3fc3cf762a708bac..05d28bce80c196bc5a0676415bc955dfcc35466d 100644 (file)
@@ -11,6 +11,14 @@ Version 1.35                Kern (see below)
 ========================================================
 
 1.35 Items to do for release:
+- Find memory leaks in address_conf.c
+- Network order of port and ip addresses.
+- SetIP in dird/fd_cmds.c is broken.
+- don't use inet_addr() it is deprecated.
+- Fix code in filed.c for init_bsock();
+- Fix code in console.c for init_bsock();
+
+
 - Knoppix CDROM
 - Make Verify jobs require exclusive use of Volume as Restore 
   jobs do.
@@ -20,6 +28,7 @@ Version 1.35                Kern (see below)
 - Fix restore ++++ that get intermingled with "Building directory tree"
 - Solve the termcap.h problem on Solaris configure.
 
+
 - Test Win32 errno handling.
 - Add bscan to four-concurrent-jobs regression.
 - Doc new IPv6 syntax
index 00c793f3d3e4346a26ccaa264c8826a19e320127..ab680fdcd305239070cec4aa1a96487ef2c0591f 100644 (file)
@@ -147,6 +147,8 @@ int authenticate_user_agent(UAContext *uac)
    bool ok;    
    BSOCK *ua = uac->UA_sock;
 
+//  Emsg4(M_INFO, 0, _("UA Hello from %s:%s:%d is invalid. Len=%d\n"), ua->who,
+//         ua->host, ua->port, ua->msglen);
    if (ua->msglen < 16 || ua->msglen >= MAX_NAME_LENGTH + 15) {
       Emsg4(M_ERROR, 0, _("UA Hello from %s:%s:%d is invalid. Len=%d\n"), ua->who,
            ua->host, ua->port, ua->msglen);
@@ -159,7 +161,6 @@ int authenticate_user_agent(UAContext *uac)
            ua->host, ua->port, ua->msg);
       return 0;
    }
-// Dmsg2(000, "Console=%s addr=%s\n", name, inet_ntoa(ua->client_addr.sin_addr));
    name[sizeof(name)-1] = 0;            /* terminate name */
    if (strcmp(name, "*UserAgent*") == 0) {  /* default console */
       ok = cram_md5_auth(ua, director->password, ssl_need) &&
index a10f73318059b429bd8954e61382ead615815098..623755c7fdb8025e32312675053b4882a8742f54 100644 (file)
@@ -80,7 +80,7 @@ int do_backup(JCR *jcr)
 
    get_level_since_time(jcr, since, sizeof(since));
 
-   jcr->fname = (char *) get_pool_memory(PM_FNAME);
+   jcr->fname = (char *)get_pool_memory(PM_FNAME);
 
    /* 
     * Get the Pool record -- first apply any level defined pools  
@@ -445,6 +445,7 @@ Job:                    %s\n\
 Backup Level:           %s%s\n\
 Client:                 %s\n\
 FileSet:                \"%s\" %s\n\
+Pool:                   \"%s\"\n\
 Start time:             %s\n\
 End time:               %s\n\
 FD Files Written:       %s\n\
@@ -468,6 +469,7 @@ Termination:            %s\n\n"),
        level_to_str(jcr->JobLevel), since,
        jcr->client->hdr.name,
        jcr->fileset->hdr.name, fsr->cCreateTime,
+       jcr->pool->hdr.name,
        sdt,
        edt,
        edit_uint64_with_commas(jcr->jr.JobFiles, ec1),
index bf4df1326b45c9ea05b1d0750bda6b7adcc1d883..857701844a3461c555c0480e2f81f2de15a848f5 100644 (file)
@@ -46,6 +46,7 @@ int do_backup(JCR *jcr);
 void backup_cleanup(void);
 void start_UA_server(dlist *addrs);
 void init_job_server(int max_workers);
+void term_job_server();
 void store_jobtype(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_level(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_replace(LEX *lc, RES_ITEM *item, int index, int pass);
@@ -260,6 +261,7 @@ static void terminate_dird(int sig)
    delete_pid_file(director->pid_directory, "bacula-dir", get_first_port(director->DIRaddrs));
 // signal(SIGCHLD, SIG_IGN);          /* don't worry about children now */
    term_scheduler();
+   term_job_server();
    if (runjob) {
       free(runjob);
    }
index 4e5e06e5baa994101c440b999b6c8341f016d0c7..cf45f51fbc2761ae98e69ae9b4ad40f36d576c48 100644 (file)
@@ -1207,7 +1207,7 @@ void store_acl(LEX *lc, RES_ITEM *item, int index, int pass)
       token = lex_get_token(lc, T_NAME);
       if (pass == 1) {
         if (((alist **)item->value)[item->code] == NULL) {   
-           ((alist **)item->value)[item->code] = new alist(10, owned_by_alist);
+           ((alist **)item->value)[item->code] = new alist(10, owned_by_alist); 
 //          Dmsg1(900, "Defined new ACL alist at %d\n", item->code);
         }
         ((alist **)item->value)[item->code]->append(bstrdup(lc->str));
index e387dd9255193a5622c35c6b9c1e1b9dae96508b..659c3618b981f86c8eb3a9a1d6835875acdc2e8a 100644 (file)
@@ -72,6 +72,16 @@ void init_job_server(int max_workers)
    register_watchdog(wd);
 }
 
+void term_job_server()
+{
+   int stat;
+   if ((stat=jobq_destroy(&job_queue)) != 0) {
+      berrno be;
+      be.set_errno(stat);
+      Emsg1(M_INFO, 0, _("Could not term job queue: ERR=%s\n"), be.strerror());
+   }
+}
+
 /*
  * Run a job -- typically called by the scheduler, but may also
  *             be called by the UA (Console program).
index 785e3fd8632e5450f90bbe2588f0e8f95f39081b..f62d949907deed13399a3bd88837c73573d19e25 100755 (executable)
@@ -84,9 +84,9 @@ int jobq_init(jobq_t *jq, int threads, void *(*engine)(void *arg))
    jq->engine = engine;              /* routine to run */
    jq->valid = JOBQ_VALID; 
    /* Initialize the job queues */
-   jq->waiting_jobs = new dlist(item, &item->link);
-   jq->running_jobs = new dlist(item, &item->link);
-   jq->ready_jobs = new dlist(item, &item->link);
+   jq->waiting_jobs = New(dlist(item, &item->link));
+   jq->running_jobs = New(dlist(item, &item->link));
+   jq->ready_jobs = New(dlist(item, &item->link));
    return 0;
 }
 
@@ -420,6 +420,8 @@ void *jobq_server(void *arg)
         }
         jq->running_jobs->append(je);
          Dmsg1(300, "Took jobid=%d from ready and appended to run\n", jcr->JobId);
+
+        /* Release job queue lock */
         if ((stat = pthread_mutex_unlock(&jq->mutex)) != 0) {
             Jmsg1(NULL, M_ERROR, 0, "pthread_mutex_unlock: ERR=%s\n", strerror(stat));
            jq->num_workers--;
@@ -431,6 +433,8 @@ void *jobq_server(void *arg)
         jq->engine(je->jcr);
 
          Dmsg1(300, "Back from user engine jobid=%d.\n", jcr->JobId);
+
+        /* Reacquire job queue lock */
         if ((stat = pthread_mutex_lock(&jq->mutex)) != 0) {
             Jmsg1(NULL, M_ERROR, 0, "pthread_mutex_lock: ERR=%s\n", strerror(stat));
            jq->num_workers--;
@@ -453,6 +457,9 @@ void *jobq_server(void *arg)
            jcr->job->NumConcurrentJobs--;
         }
 
+        /*
+         * Reschedule the job if necessary and requested
+         */
         if (jcr->job->RescheduleOnError && 
             jcr->JobStatus != JS_Terminated &&
             jcr->JobStatus != JS_Canceled && 
@@ -508,8 +515,10 @@ void *jobq_server(void *arg)
            jcr->db = NULL;
         }
          Dmsg1(300, "====== Termination job=%d\n", jcr->JobId);
+        V(jq->mutex);                /* release internal lock */
         free_jcr(jcr);
         free(je);                    /* release job entry */
+        P(jq->mutex);                /* reacquire job queue lock */
       }
       /*
        * If any job in the wait queue can be run,
index be4ac815724272b111c782ee8f5f49a9c4bb7297..9beb9863dba00e77956a596de2afe2eec70f48c9 100644 (file)
@@ -78,7 +78,7 @@ JCR *wait_for_next_job(char *one_shot_job_to_run)
    if (first) {
       first = false;
       /* Create scheduled jobs list */
-      jobs_to_run = new dlist(next_job, &next_job->link);
+      jobs_to_run = New(dlist(next_job, &next_job->link));
       if (one_shot_job_to_run) {           /* one shot */
         job = (JOB *)GetResWithName(R_JOB, one_shot_job_to_run);
         if (!job) {
@@ -142,20 +142,11 @@ JCR *wait_for_next_job(char *one_shot_job_to_run)
    ASSERT(job);
    set_jcr_defaults(jcr, job);
    if (run->level) {
-      jcr->JobLevel = run->level;       /* override run level */
+      jcr->JobLevel = run->level;     /* override run level */
    }
    if (run->pool) {
       jcr->pool = run->pool;         /* override pool */
    }
-   if (run->full_pool) {
-      jcr->pool = run->full_pool;     /* override full pool */
-   }
-   if (run->inc_pool) {
-      jcr->pool = run->inc_pool;      /* override inc pool */
-   }
-   if (run->dif_pool) {
-      jcr->pool = run->dif_pool;      /* override dif pool */
-   }
    if (run->storage) {
       jcr->store = run->storage;      /* override storage */
    }
index 82a2e6efd5327abd3261c6762a44e7307938eb6f..443d37ed2bd05fe543f8451237a82d4ab5aac580 100644 (file)
 
 #include "bacula.h"
 
+static int add_address(dlist **out, IPADDR::i_type type, unsigned short defaultport, int family,
+               const char *hostname_str, const char *port_str, char **errstr);
+
+
 IPADDR::IPADDR(const IPADDR &src) : type(src.type)
 {
   memcpy(&buf, &src.buf, sizeof(buf));
@@ -106,7 +110,7 @@ void IPADDR::set_port(unsigned short port)
 int IPADDR::get_family() const
 {
     return saddr->sa_family;
-}       
+}      
 
 struct sockaddr *IPADDR::get_sockaddr()
 {
@@ -168,8 +172,8 @@ const char *IPADDR::get_address(char *outputbuf, int outlen)
    outputbuf[0] = '\0';
 #if defined(HAVE_INET_NTOP) && defined(HAVE_IPV6)
    inet_ntop(saddr->sa_family, saddr->sa_family == AF_INET ?
-              (void*)&(saddr4->sin_addr) : (void*)&(saddr6->sin6_addr),
-              outputbuf, outlen);
+             (void*)&(saddr4->sin_addr) : (void*)&(saddr6->sin6_addr),
+             outputbuf, outlen);
 #else
    bstrncpy(outputbuf, inet_ntoa(saddr4->sin_addr), outlen);
 #endif
@@ -179,9 +183,9 @@ const char *IPADDR::get_address(char *outputbuf, int outlen)
 const char *IPADDR::build_address_str(char *buf, int blen) 
 {
    char tmp[1024];
-   snprintf(buf, blen, "host[%s:%s:%hu] ",
+   bsnprintf(buf, blen, "host[%s:%s:%hu] ",
             get_family() == AF_INET ? "ipv4" : "ipv6",
-            get_address(tmp, sizeof(tmp) - 1), ntohs(get_port()));
+           get_address(tmp, sizeof(tmp) - 1), ntohs(get_port()));
    return buf;
 }
 
@@ -195,9 +199,9 @@ const char *build_addresses_str(dlist *addrs, char *buf, int blen)
    IPADDR *p;
    foreach_dlist(p, addrs) {
       char tmp[1024];
-      int len = snprintf(work, blen, "%s", p->build_address_str(tmp, sizeof(tmp)));
+      int len = bsnprintf(work, blen, "%s", p->build_address_str(tmp, sizeof(tmp)));
       if (len < 0)
-         break;
+        break;
       work += len;
       blen -= len;
    }
@@ -211,7 +215,7 @@ const char *get_first_address(dlist * addrs, char *outputbuf, int outlen)
 
 int get_first_port(dlist * addrs)
 {
-   return ((IPADDR *)(addrs->first()))->get_port();
+   return ntohs(((IPADDR *)(addrs->first()))->get_port());                               
 }
 
 static int skip_to_next_not_eol(LEX * lc)
@@ -225,7 +229,7 @@ static int skip_to_next_not_eol(LEX * lc)
 }
 
 
-void init_default_addresses(dlist ** out, int port)
+void init_default_addresses(dlist **out, int port)
 {
    char *errstr;
    unsigned short sport = port;
@@ -235,8 +239,8 @@ void init_default_addresses(dlist ** out, int port)
    }
 }
 
-int add_address(dlist ** out, IPADDR::i_type type, unsigned short defaultport, int family,
-                const char *hostname_str, const char *port_str, char **errstr)
+static int add_address(dlist **out, IPADDR::i_type type, unsigned short defaultport, int family,
+               const char *hostname_str, const char *port_str, char **errstr)
 {
    IPADDR *iaddr;
    IPADDR *jaddr;
@@ -244,29 +248,29 @@ int add_address(dlist ** out, IPADDR::i_type type, unsigned short defaultport, i
    unsigned short port;
    IPADDR::i_type intype = type;
 
-   dlist *addrs = (dlist *) (*(out));
+   dlist *addrs = (dlist *)(*(out));
    if (!addrs) {
       IPADDR *tmp = 0;
-      addrs = *out = new dlist(tmp, &tmp->link);
+      addrs = *out = New(dlist(tmp, &tmp->link));
    }
 
    type = (type == IPADDR::R_SINGLE_PORT
-           || type == IPADDR::R_SINGLE_ADDR) ? IPADDR::R_SINGLE : type;
+          || type == IPADDR::R_SINGLE_ADDR) ? IPADDR::R_SINGLE : type;
    if (type != IPADDR::R_DEFAULT) {
       IPADDR *def = 0;
       foreach_dlist(iaddr, addrs) {
-         if (iaddr->get_type() == IPADDR::R_DEFAULT) {
-            def = iaddr;
-         } else if (iaddr->get_type() != type) {
-            *errstr = (char *)malloc(1024);
-            bsnprintf(*errstr, 1023,
+        if (iaddr->get_type() == IPADDR::R_DEFAULT) {
+           def = iaddr;
+        } else if (iaddr->get_type() != type) {
+           *errstr = (char *)malloc(1024);
+           bsnprintf(*errstr, 1023,
                       "the old style addresses could mixed with new style");
-            return 0;
-         }
+           return 0;
+        }
       }
       if (def) {
-         addrs->remove(def);
-         delete def;
+        addrs->remove(def);
+        delete def;
       }
    }
 
@@ -276,16 +280,16 @@ int add_address(dlist ** out, IPADDR::i_type type, unsigned short defaultport, i
    } else {
       int pnum = atol(port_str);
       if (0 < pnum && pnum < 0xffff) {
-         port = htons(pnum);
+        port = htons(pnum);
       } else {
          struct servent *s = getservbyname(port_str, "tcp");
-         if (s) {
-            port = s->s_port;
-         } else {
-            *errstr = (char *)malloc(1024);
+        if (s) {
+           port = s->s_port;
+        } else {
+           *errstr = (char *)malloc(1024);
             bsnprintf(*errstr, 1023, "can't resolve service(%s)", port_str);
-            return 0;
-         }
+           return 0;
+        }
       }
    }
 
@@ -294,45 +298,45 @@ int add_address(dlist ** out, IPADDR::i_type type, unsigned short defaultport, i
    if (!hostaddrs) {
       *errstr = (char *)malloc(1024);
       bsnprintf(*errstr, 1023, "can't resolve hostname(%s) %s", hostname_str,
-                myerrstr);
+               myerrstr);
       return 0;
    }
 
    if (intype == IPADDR::R_SINGLE_PORT || intype == IPADDR::R_SINGLE_ADDR) {
       IPADDR *addr;
       if (addrs->size()) {
-         addr = (IPADDR *) addrs->first();
+        addr = (IPADDR *)addrs->first();
       } else {
-         addr = new IPADDR(family);
-         addr->set_type(type);
-         addr->set_port(defaultport);
-         addr->set_addr_any();
-         addrs->append(addr);
+        addr = new IPADDR(family); 
+        addr->set_type(type);
+        addr->set_port(defaultport);
+        addr->set_addr_any();
+        addrs->append(addr);
       }
       if (intype == IPADDR::R_SINGLE_PORT) {
-         addr->set_port(port);
+        addr->set_port(port);
       }
       if (intype == IPADDR::R_SINGLE_ADDR) {
-         addr->copy_addr((IPADDR *) (hostaddrs->first()));
+        addr->copy_addr((IPADDR *) (hostaddrs->first()));
       }
    } else {
       foreach_dlist(iaddr, hostaddrs) {
-         IPADDR *clone;
-         /* for duplicates */
-         foreach_dlist(jaddr, addrs) {
-            if (iaddr->get_sockaddr_len() == jaddr->get_sockaddr_len() &&
-            !memcmp(iaddr->get_sockaddr(), jaddr->get_sockaddr(), 
-                    iaddr->get_sockaddr_len()))
-                {
-               goto skip;          /* no price */
-            }
-         }
-         clone = new IPADDR(*iaddr);
-         clone->set_type(type);
-         clone->set_port(port);
-         addrs->append(clone);
+        IPADDR *clone;
+        /* for duplicates */
+        foreach_dlist(jaddr, addrs) {
+           if (iaddr->get_sockaddr_len() == jaddr->get_sockaddr_len() &&
+           !memcmp(iaddr->get_sockaddr(), jaddr->get_sockaddr(), 
+                   iaddr->get_sockaddr_len()))
+               {
+              goto skip;          /* no price */
+           }
+        }
+        clone = new IPADDR(*iaddr); 
+        clone->set_type(type);
+        clone->set_port(port);
+        addrs->append(clone);
        skip:
-         continue;
+        continue;
       }
    }
    free_addresses(hostaddrs);
@@ -350,35 +354,35 @@ void store_addresses(LEX * lc, RES_ITEM * item, int index, int pass)
 
    /*
     *   =  { [[ip|ipv4|ipv6] = { [[addr|port] = [^ ]+[\n;]+] }]+ }
-    *   or my tests
-    *   positiv
-    *   = { ip = { addr = 1.2.3.4; port = 1205; } ipv4 = { addr = 1.2.3.4; port = http; } }
-    *   = { ip = { 
-    *         addr = 1.2.3.4; port = 1205; } 
-    *     ipv4 = { 
-    *         addr = 1.2.3.4; port = http; } 
-    *     ipv6 = { 
-    *       addr = 1.2.3.4; 
-    *       port = 1205;
-    *     
-    *     ip = {
-    *       addr = 1.2.3.4
-    *       port = 1205
-    *     
-    *     ip = {
-    *       addr = 1.2.3.4
-    *     
-    *     ip = {
-    *       addr = 2001:220:222::2
-    *     
-    *     ip = {
-    *       addr = bluedot.thun.net
-    (     
-    *   }
-    *   negativ
-    *   = { ip = { } }
-    *   = { ipv4 { addr = doof.nowaytoheavenxyz.uhu; } }
-    *   = { ipv4 { port = 4711 } }
+    *  or my tests
+    *  positiv
+    *  = { ip = { addr = 1.2.3.4; port = 1205; } ipv4 = { addr = 1.2.3.4; port = http; } }
+    *  = { ip = { 
+    *        addr = 1.2.3.4; port = 1205; } 
+    *    ipv4 = { 
+    *        addr = 1.2.3.4; port = http; } 
+    *    ipv6 = { 
+    *      addr = 1.2.3.4; 
+    *      port = 1205;
+    *    } 
+    *    ip = {
+    *      addr = 1.2.3.4
+    *      port = 1205
+    *    } 
+    *    ip = {
+    *      addr = 1.2.3.4
+    *    } 
+    *    ip = {
+    *      addr = 2001:220:222::2
+    *    } 
+    *    ip = {
+    *      addr = bluedot.thun.net
+    (    } 
+    *  }
+    *  negativ
+    *  = { ip = { } }
+    *  = { ipv4 { addr = doof.nowaytoheavenxyz.uhu; } }
+    *  = { ipv4 { port = 4711 } }
     */
 
    token = skip_to_next_not_eol(lc);
@@ -395,11 +399,11 @@ void store_addresses(LEX * lc, RES_ITEM * item, int index, int pass)
          scan_err1(lc, _("Expected a string, got: %s"), lc->str);
       }
       if (!strcmp("ip", lc->str) || !strcmp("ipv4", lc->str)) {
-         family = AF_INET;
+        family = AF_INET;
       }
 #ifdef HAVE_IPV6
       else if (!strcmp("ipv6", lc->str)) {
-         family = AF_INET6;
+        family = AF_INET6;
       }
 #endif
       else {
@@ -417,62 +421,61 @@ void store_addresses(LEX * lc, RES_ITEM * item, int index, int pass)
       exist = EMPTYLINE;
       port_str[0] = hostname_str[0] = '\0';
       do {
-         if (token != T_IDENTIFIER) {
+        if (token != T_IDENTIFIER) {
             scan_err1(lc, _("Expected a identifier [addr|port], got: %s"), lc->str);
-         }
+        }
          if (!strcmp("port", lc->str)) {
-            next_line = PORTLINE;
-            if (exist & PORTLINE) {
+           next_line = PORTLINE;
+           if (exist & PORTLINE) {
                scan_err0(lc, _("Only one port per address block"));
-            }
-            exist |= PORTLINE;
+           }
+           exist |= PORTLINE;
          } else if (!strcmp("addr", lc->str)) {
-            next_line = ADDRLINE;
-            if (exist & ADDRLINE) {
+           next_line = ADDRLINE;
+           if (exist & ADDRLINE) {
                scan_err0(lc, _("Only one addr per address block"));
-            }
-            exist |= ADDRLINE;
-         } else {
+           }
+           exist |= ADDRLINE;
+        } else {
             scan_err1(lc, _("Expected a identifier [addr|port], got: %s"), lc->str);
-         }
-         token = lex_get_token(lc, T_ALL);
-         if (token != T_EQUALS) {
+        }
+        token = lex_get_token(lc, T_ALL);
+        if (token != T_EQUALS) {
             scan_err1(lc, _("Expected a equal =, got: %s"), lc->str);
-         }
-         token = lex_get_token(lc, T_ALL);
-         switch (next_line) {
-         case PORTLINE:
-            if (!
-                (token == T_UNQUOTED_STRING || token == T_NUMBER
-                 || token == T_IDENTIFIER)) {
+        }
+        token = lex_get_token(lc, T_ALL);
+        switch (next_line) {
+        case PORTLINE:
+           if (!
+               (token == T_UNQUOTED_STRING || token == T_NUMBER
+                || token == T_IDENTIFIER)) {
                scan_err1(lc, _("Expected a number or a string, got: %s"), lc->str);
-            }
-            bstrncpy(port_str, lc->str, sizeof(port_str));
-            break;
-         case ADDRLINE:
-            if (!(token == T_UNQUOTED_STRING || token == T_IDENTIFIER)) {
+           }
+           bstrncpy(port_str, lc->str, sizeof(port_str));
+           break;
+        case ADDRLINE:
+           if (!(token == T_UNQUOTED_STRING || token == T_IDENTIFIER)) {
                scan_err1(lc, _("Expected a ipnumber or a hostname, got: %s"),
-                         lc->str);
-            }
-            bstrncpy(hostname_str, lc->str, sizeof(hostname_str));
-            break;
-         case EMPTYLINE:
+                        lc->str);
+           }
+           bstrncpy(hostname_str, lc->str, sizeof(hostname_str));
+           break;
+        case EMPTYLINE:
             scan_err0(lc, _("Statemachine missmatch"));
-            break;
-         }
-         token = skip_to_next_not_eol(lc);
+           break;
+        }
+        token = skip_to_next_not_eol(lc);
       } while (token == T_IDENTIFIER);
       if (token != T_EOB) {
          scan_err1(lc, _("Expected a end of block }, got: %s"), lc->str);
       }
 
       char *errstr;
-      if (!add_address
-          ((dlist **) (item->value), IPADDR::R_MULTIPLE, htons(item->default_value),
-           family, hostname_str, port_str, &errstr)) {
+      if (!add_address((dlist **)(item->value), IPADDR::R_MULTIPLE, 
+          htons(item->default_value), family, hostname_str, port_str, &errstr)) {
          scan_err3(lc, _("Can't add hostname(%s) and port(%s) to addrlist (%s)"),
-                   hostname_str, port_str, errstr);
-         free(errstr);
+                  hostname_str, port_str, errstr);
+        free(errstr);
       }
       token = skip_to_next_not_eol(lc);
    } while ((token == T_IDENTIFIER || token == T_UNQUOTED_STRING));
@@ -489,7 +492,7 @@ void store_addresses_address(LEX * lc, RES_ITEM * item, int index, int pass)
    }
    char *errstr;
    if (!add_address((dlist **) (item->value), IPADDR::R_SINGLE_ADDR,
-                    htons(item->default_value), AF_INET, lc->str, 0, &errstr)) {
+                   htons(item->default_value), AF_INET, lc->str, 0, &errstr)) {
       scan_err2(lc, _("can't add port (%s) to (%s)"), lc->str, errstr);
       free(errstr);
    }
@@ -502,8 +505,8 @@ void store_addresses_port(LEX * lc, RES_ITEM * item, int index, int pass)
       scan_err1(lc, _("Expected a port nummer or string, got: %s"), lc->str);
    }
    char *errstr;
-   if (!add_address((dlist **) (item->value), IPADDR::R_SINGLE_PORT,
-                    htons(item->default_value), AF_INET, 0, lc->str, &errstr)) {
+   if (!add_address((dlist **)(item->value), IPADDR::R_SINGLE_PORT,
+                   htons(item->default_value), AF_INET, 0, lc->str, &errstr)) {
       scan_err2(lc, _("can't add port (%s) to (%s)"), lc->str, errstr);
       free(errstr);
    }
@@ -518,5 +521,3 @@ void free_addresses(dlist * addrs)
    }
    delete addrs;
 }
-
-
index 6f6c554a2f5f5b42d03c69cae149b7597f01bf99..1e86c745a454c5ca7c62858afda125cf7e09730e 100644 (file)
@@ -74,10 +74,6 @@ extern void store_addresses(LEX * lc, RES_ITEM * item, int index, int pass);
 extern void free_addresses(dlist * addrs);
 extern void store_addresses_address(LEX * lc, RES_ITEM * item, int index, int pass);
 extern void store_addresses_port(LEX * lc, RES_ITEM * item, int index, int pass);
-extern int add_address(dlist ** out, IPADDR::i_type type, unsigned short defaultport,
-                       int family, const char *hostname_str,
-                       const char *port_str, char **errstr);
-
 extern void init_default_addresses(dlist ** addr, int port);
 
 extern const char *get_first_address(dlist * addrs, char *outputbuf, int outlen);
index cf8fbf5bc552bcfbf1cbcebd9fc84ed7dcb1ed18..c65a17fbb79f04740067195f8806f9de71d1269c 100644 (file)
@@ -65,13 +65,13 @@ public:
    void prepend(void *item);
    void *remove(int index);
    void *get(int index);
-   bool empty();
+   bool empty() const;
    void *prev();
    void *next();
    void *first();
    void *last();
    void * operator [](int index) const;
-   int size();
+   int size() const;
    void destroy();
    void grow(int num);
    void * operator new(size_t);
@@ -85,7 +85,7 @@ inline void * alist::operator [](int index) const {
    return items[index];
 }
 
-inline bool alist::empty()
+inline bool alist::empty() const
 {
    return num_items == 0;
 }
@@ -111,7 +111,7 @@ inline alist::alist(int num, bool own) {
 
 
 /* Current size of list */
-inline int alist::size()
+inline int alist::size() const 
 {
    return num_items;
 }
@@ -132,3 +132,4 @@ inline void alist::operator delete(void  *item)
    ((alist *)item)->destroy();
    free(item);
 }
+
index ca87ab7bb432f5ee4a6ca92142dc21b0670fc63f..fd3518724878600fd73a0d418065b9cf6554f624 100644 (file)
@@ -912,8 +912,9 @@ const char *bnet_sig_to_ascii(BSOCK * bs)
  *  This probably should be done in net_open
  */
 BSOCK *init_bsock(JCR * jcr, int sockfd, const char *who, const char *host, int port,
-                 struct sockaddr * client_addr)
+                 struct sockaddr *client_addr)
 {
+   Dmsg3(100, "who=%s host=%s port=%d\n", who, host, port);
    BSOCK *bsock = (BSOCK *)malloc(sizeof(BSOCK));
    memset(bsock, 0, sizeof(BSOCK));
    bsock->fd = sockfd;
index aafd216ea7d017e5fd3a0c5ec93ce740303143ff..773b2026105e384a4d24e1cd861bad87a1e5a212 100644 (file)
@@ -212,16 +212,15 @@ bnet_thread_server(dlist *addrs, int max_clients, workq_t *client_wq,
 
            /* see who client is. i.e. who connected to us. */
            P(mutex);
-#ifndef HAVE_INET_NTOP
-           bstrncpy(buf, inet_ntoa(((sockaddr_in *) & cli_addr)->sin_addr), sizeof(buf));      /* NOT thread safe, use mutex */
-#else
+#ifdef HAVE_INET_NTOP
            inet_ntop(clilen == sizeof(sockaddr_in) ? AF_INET : AF_INET6, &clilen,
-                     buf, clilen);
+                     buf, sizeof(buf));
+#else
+           bstrncpy(buf, inet_ntoa(((sockaddr_in *)&cli_addr)->sin_addr), sizeof(buf));      /* NOT thread safe, use mutex */
 #endif
-           /* possible release of the mutex */
-
-           BSOCK *bs =
-               init_bsock(NULL, newsockfd, "client", buf, fd_ptr->port, &cli_addr);
+           V(mutex);
+           BSOCK *bs; 
+            bs = init_bsock(NULL, newsockfd, "client", buf, fd_ptr->port, &cli_addr);
            if (bs == NULL) {
                Jmsg0(NULL, M_ABORT, 0, _("Could not create client BSOCK.\n"));
            }
@@ -229,13 +228,10 @@ bnet_thread_server(dlist *addrs, int max_clients, workq_t *client_wq,
            /* Queue client to be served */
            if ((stat = workq_add(client_wq, (void *)bs, NULL, 0)) != 0) {
               berrno be;
-              V(mutex);
               be.set_errno(stat);
-              Jmsg1(NULL, M_ABORT, 0,
-                     _("Could not add job to client queue: ERR=%s\n"),
+               Jmsg1(NULL, M_ABORT, 0, _("Could not add job to client queue: ERR=%s\n"),
                     be.strerror());
            }
-           V(mutex);
         }
       }
    }
index 74f9fe7131985989eb734c517f82dde7b5932800..6a6d6a4bbe7c93a9e49035bd7dfa69dabdb90349 100644 (file)
@@ -34,6 +34,7 @@
 /* ===================================================================
  *    dlist
  */
+
 /*
  * Append an item to the list
  */
@@ -243,7 +244,7 @@ void dlist::remove(void *item)
    }
 }
 
-void * dlist::next(void *item)
+void * dlist::next(const void *item) const
 {
    if (item == NULL) {
       return head;
@@ -251,7 +252,7 @@ void * dlist::next(void *item)
    return ((dlink *)(((char *)item)+loffset))->next;
 }
 
-void * dlist::prev(void *item)
+void * dlist::prev(const void *item) const
 {
    if (item == NULL) {
       return tail;
@@ -332,7 +333,7 @@ int main()
    jcr_chain->destroy();
    free(jcr_chain);
 
-   jcr_chain = new dlist(jcr, &jcr->link);
+   jcr_chain = New(dlist(jcr, &jcr->link));
    printf("append 20 items 0-19\n");
    for (int i=0; i<20; i++) {
       sprintf(buf, "This is dlist item %d", i);
@@ -363,7 +364,7 @@ int main()
 
 
    /* Now do a binary insert for the list */
-   jcr_chain = new dlist(jcr, &jcr->link);
+   jcr_chain = New(dlist(jcr, &jcr->link));
 #define CNT 26
    printf("append %d items\n", CNT*CNT*CNT);
    strcpy(buf, "ZZZ");
index da077a047e751e99ad28a0c80c55260bdbeb6af3..90200f541342865f46ef609f01c10b76bb506859 100644 (file)
  *
  */
 
+#define M_ABORT 1
+#undef  New
+#define New(type) new type
+
 /* In case you want to specifically specify the offset to the link */
 #define OFFSET(item, link) ((char *)(link) - (char *)(item))
 /* 
         for((var)=NULL; (((void *)(var))=(list)->next(var)); )
 #endif
 
+
 struct dlink {
    void *next;
    void *prev;
 };
 
-
 class dlist {
    void *head;
    void *tail;
    int16_t loffset;
    uint32_t num_items;
 public:
-   dlist(void *item, void *link);
+   dlist(void *item, dlink *link);
    dlist(void);
    ~dlist() { destroy(); }
-   void init(void *item, void *link);
+   void init(void *item, dlink *link);
    void prepend(void *item);
    void append(void *item);
    void insert_before(void *item, void *where);
@@ -68,24 +72,27 @@ public:
    void *unique_binary_insert(void *item, int compare(void *item1, void *item2));
    void binary_insert(void *item, int compare(void *item1, void *item2));
    void remove(void *item);
-   bool empty();
-   int  size();
-   void *next(void *item);
-   void *prev(void *item);
+   bool empty() const;
+   int  size() const;
+   void *next(const void *item) const;
+   void *prev(const void *item) const;
    void destroy();
-   void *first();
-   void *last();
+   void *first() const;
+   void *last() const;
    void * operator new(size_t);
    void operator delete(void *);
 };
 
+dlist *new_dlist();
+dlist *new_dlist(void *item, dlink *link);
+
+
 /*                            
  * This allows us to do explicit initialization,
  *   allowing us to mix C++ classes inside malloc'ed
  *   C structures. Define before called in constructor.
  */
-#define M_ABORT 1
-inline void dlist::init(void *item, void *link) 
+inline void dlist::init(void *item, dlink *link) 
 {
    head = tail = NULL;
    loffset = (char *)link - (char *)item;
@@ -103,23 +110,22 @@ inline void dlist::init(void *item, void *link)
  *   then there is no need to specify the link address 
  *   since the offset is zero.
  */
-inline dlist::dlist(void *item, void *link)
+inline dlist::dlist(void *item, dlink *link)
 {
-   this->init(item, link);
+   init(item, link);
 }
 
 /* Constructor with link at head of item */
-inline dlist::dlist(void)
+inline dlist::dlist(void) : head(0), tail(0), loffset(0), num_items(0)
 {
-   memset(this, 0, sizeof(dlist));
 }
 
-inline bool dlist::empty()
+inline bool dlist::empty() const
 {
    return head == NULL;
 }
 
-inline int dlist::size()
+inline int dlist::size() const
 {
    return num_items;
 }
@@ -137,12 +143,12 @@ inline void dlist::operator delete(void  *item)
 }
  
 
-inline void * dlist::first()
+inline void * dlist::first() const
 {
    return head;
 }
 
-inline void * dlist::last()
+inline void * dlist::last() const
 {
    return tail;
 }
index 6fb681a661cd198c53ac71b5481f5708715b451b..d7fdc9d49446973e91d2ceb46211dcd2351b0b6f 100755 (executable)
@@ -51,7 +51,7 @@ void init_last_jobs_list()
    int errstat;
    struct s_last_job *job_entry = NULL;
    if (!last_jobs) {
-      last_jobs = new dlist(job_entry, &job_entry->link);
+      last_jobs = New(dlist(job_entry, &job_entry->link));
       if ((errstat=rwl_init(&lock)) != 0) {
          Emsg1(M_ABORT, 0, _("Unable to initialize jcr_chain lock. ERR=%s\n"), 
               strerror(errstat));
@@ -191,7 +191,7 @@ JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr)
    Dmsg0(400, "Enter new_jcr\n");
    jcr = (JCR *)malloc(size);
    memset(jcr, 0, size);
-   jcr->msg_queue = new dlist(item, &item->link);
+   jcr->msg_queue = New(dlist(item, &item->link));
    jcr->job_end_push.init(1, false);
    jcr->sched_time = time(NULL);
    jcr->daemon_free_jcr = daemon_free_jcr;    /* plug daemon free routine */
index d67e30642c10f811b3118c40cb2eebbe246d296d..95d92d2f092212e201c9919bea07083d5dd95e20 100644 (file)
 
  */
 
+#include "smartall.h"
 #include "alist.h"
 #include "dlist.h"
 #include "bits.h"
 #include "btime.h"
-#include "smartall.h"
 #include "mem_pool.h"
 #include "message.h"
 #include "lex.h"
index b879905411844e68d73a64e149763188dd3805c2..a319ec526046f3815fbe466405ec7054ce187b41 100644 (file)
@@ -7,7 +7,7 @@
 */
 
 /*
-   Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+   Copyright (C) 2000-2004 Kern Sibbald and John Walker
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -33,6 +33,7 @@ extern uint32_t sm_buffers;
 
 #ifdef SMARTALLOC
 
+
 extern void *sm_malloc(const char *fname, int lineno, unsigned int nbytes),
             *sm_calloc(const char *fname, int lineno,
                 unsigned int nelem, unsigned int elsize),
@@ -85,3 +86,66 @@ extern void *b_malloc();
 
 
 #endif
+
+#ifdef SMARTALLOC
+
+#define New(type) new(__FILE__, __LINE__ type
+
+#undef SMARTALLOC 
+#define SMARTALLOC SMARTALLOC
+
+class SMARTALLOC
+{
+private:
+public:
+
+void *operator new(size_t s, const char *fname, int line)
+{
+  void *p = sm_malloc(fname, line, s > sizeof(int) ? s : sizeof(int));
+  return p;
+}
+void *operator new[](size_t s, const char *fname, int line)
+{
+   void *p = sm_malloc(fname, line, s > sizeof(int) ? s : sizeof(int));
+   return p;
+}
+void  operator delete(void *ptr)
+{
+   free(ptr);
+}
+void  operator delete[](void *ptr, size_t i)
+{
+   free(ptr);
+}
+
+private:
+void *operator new(size_t s) throw() { return 0; }
+void *operator new[](size_t s) throw() { return 0; }
+};
+
+#else
+
+#define New(type) new type
+
+class SMARTALLOC
+{
+   public:
+      void *operator new(size_t s)
+      {
+          return malloc(s);
+      }
+      void *operator new[](size_t s)
+      {
+          return malloc(s);
+      }
+      void  operator delete(void *ptr)
+      {
+          free(ptr);
+      }
+      void  operator delete[](void *ptr, size_t i)
+      {
+          free(ptr);
+      }
+};
+#endif
index 405f1dcd1162defb5fbdd452362dfd9024f7fb54..629a890dff575b8911a9e2086e17d3c5c050c54d 100755 (executable)
@@ -72,8 +72,8 @@ int start_watchdog(void)
       Emsg1(M_ABORT, 0, _("Unable to initialize watchdog lock. ERR=%s\n"), 
            strerror(errstat));
    }
-   wd_queue = new dlist(dummy, &dummy->link);
-   wd_inactive = new dlist(dummy, &dummy->link);
+   wd_queue = New(dlist(dummy, &dummy->link));
+   wd_inactive = New(dlist(dummy, &dummy->link));
 
    if ((stat = pthread_create(&wd_tid, NULL, watchdog_thread, NULL)) != 0) {
       return stat;
index 79c25e7148d9d349e39449bb1ed3b216e568cd4d..a97a4096ccd4975f805e14462f66dcab3b492555 100644 (file)
@@ -1,8 +1,8 @@
 /* */
 #undef  VERSION
 #define VERSION "1.35.1"
-#define BDATE   "06 August 2004"
-#define LSMDATE "06Aug04"
+#define BDATE   "12 August 2004"
+#define LSMDATE "12Aug04"
 
 /* Debug flags */
 #undef  DEBUG