From: Kern Sibbald Date: Thu, 12 Aug 2004 18:58:13 +0000 (+0000) Subject: Misc -- see techlog X-Git-Tag: Release-1.35.1~21 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=4c9d5e05d85b2567788335730f326f9081df87cd;p=bacula%2Fbacula Misc -- see techlog git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1516 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/kernstodo b/bacula/kernstodo index e16b57ea2c..05d28bce80 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -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 diff --git a/bacula/src/dird/authenticate.c b/bacula/src/dird/authenticate.c index 00c793f3d3..ab680fdcd3 100644 --- a/bacula/src/dird/authenticate.c +++ b/bacula/src/dird/authenticate.c @@ -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) && diff --git a/bacula/src/dird/backup.c b/bacula/src/dird/backup.c index a10f733180..623755c7fd 100644 --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@ -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), diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index bf4df1326b..857701844a 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.c @@ -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); } diff --git a/bacula/src/dird/dird_conf.c b/bacula/src/dird/dird_conf.c index 4e5e06e5ba..cf45f51fbc 100644 --- a/bacula/src/dird/dird_conf.c +++ b/bacula/src/dird/dird_conf.c @@ -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)); diff --git a/bacula/src/dird/job.c b/bacula/src/dird/job.c index e387dd9255..659c3618b9 100644 --- a/bacula/src/dird/job.c +++ b/bacula/src/dird/job.c @@ -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). diff --git a/bacula/src/dird/jobq.c b/bacula/src/dird/jobq.c index 785e3fd863..f62d949907 100755 --- a/bacula/src/dird/jobq.c +++ b/bacula/src/dird/jobq.c @@ -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, diff --git a/bacula/src/dird/scheduler.c b/bacula/src/dird/scheduler.c index be4ac81572..9beb9863db 100644 --- a/bacula/src/dird/scheduler.c +++ b/bacula/src/dird/scheduler.c @@ -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 */ } diff --git a/bacula/src/lib/address_conf.c b/bacula/src/lib/address_conf.c index 82a2e6efd5..443d37ed2b 100644 --- a/bacula/src/lib/address_conf.c +++ b/bacula/src/lib/address_conf.c @@ -28,6 +28,10 @@ #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; } - - diff --git a/bacula/src/lib/address_conf.h b/bacula/src/lib/address_conf.h index 6f6c554a2f..1e86c745a4 100644 --- a/bacula/src/lib/address_conf.h +++ b/bacula/src/lib/address_conf.h @@ -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); diff --git a/bacula/src/lib/alist.h b/bacula/src/lib/alist.h index cf8fbf5bc5..c65a17fbb7 100644 --- a/bacula/src/lib/alist.h +++ b/bacula/src/lib/alist.h @@ -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); } + diff --git a/bacula/src/lib/bnet.c b/bacula/src/lib/bnet.c index ca87ab7bb4..fd35187248 100644 --- a/bacula/src/lib/bnet.c +++ b/bacula/src/lib/bnet.c @@ -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; diff --git a/bacula/src/lib/bnet_server.c b/bacula/src/lib/bnet_server.c index aafd216ea7..773b202610 100644 --- a/bacula/src/lib/bnet_server.c +++ b/bacula/src/lib/bnet_server.c @@ -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); } } } diff --git a/bacula/src/lib/dlist.c b/bacula/src/lib/dlist.c index 74f9fe7131..6a6d6a4bbe 100644 --- a/bacula/src/lib/dlist.c +++ b/bacula/src/lib/dlist.c @@ -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"); diff --git a/bacula/src/lib/dlist.h b/bacula/src/lib/dlist.h index da077a047e..90200f5413 100644 --- a/bacula/src/lib/dlist.h +++ b/bacula/src/lib/dlist.h @@ -28,6 +28,10 @@ * */ +#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)) /* @@ -45,22 +49,22 @@ 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; } diff --git a/bacula/src/lib/jcr.c b/bacula/src/lib/jcr.c index 6fb681a661..d7fdc9d494 100755 --- a/bacula/src/lib/jcr.c +++ b/bacula/src/lib/jcr.c @@ -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 */ diff --git a/bacula/src/lib/lib.h b/bacula/src/lib/lib.h index d67e30642c..95d92d2f09 100644 --- a/bacula/src/lib/lib.h +++ b/bacula/src/lib/lib.h @@ -28,11 +28,11 @@ */ +#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" diff --git a/bacula/src/lib/smartall.h b/bacula/src/lib/smartall.h index b879905411..a319ec5260 100644 --- a/bacula/src/lib/smartall.h +++ b/bacula/src/lib/smartall.h @@ -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 diff --git a/bacula/src/lib/watchdog.c b/bacula/src/lib/watchdog.c index 405f1dcd11..629a890dff 100755 --- a/bacula/src/lib/watchdog.c +++ b/bacula/src/lib/watchdog.c @@ -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; diff --git a/bacula/src/version.h b/bacula/src/version.h index 79c25e7148..a97a4096cc 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -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 diff --git a/bacula/src/win32/compat/compat.cpp b/bacula/src/win32/compat/compat.cpp index d57575bdf9..7d114289c1 100644 --- a/bacula/src/win32/compat/compat.cpp +++ b/bacula/src/win32/compat/compat.cpp @@ -615,7 +615,6 @@ copyin(struct dirent &dp, const char *fname) int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result) { - _dir *dp = (_dir *)dirp; if (dp->valid) { entry->d_off = dp->offset; @@ -633,28 +632,40 @@ readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result) return 0; } +/* + * Dotted IP address to network address + * + * Returns 1 if OK + * 0 on error + */ int inet_aton(const char *a, struct in_addr *inp) { + const char *cp = a; + uint32_t acc = 0, tmp = 0; + int dotc = 0; - const char *cp = a; - uint32_t acc = 0, tmp = 0; - int dotc = 0; - if (!isdigit(*a)) return 0; - while (*cp) { - if (isdigit(*cp)) - tmp = (tmp * 10) + (*cp -'0'); - else if (*cp == '.') { - if (tmp > 255) return 0; - acc = (acc << 8) + tmp; - dotc++; - } - else return 0; - } - - if (dotc != 3) return 0; - inp->s_addr = acc; - return 1; + if (!isdigit(*cp)) { /* first char must be digit */ + return 0; /* error */ + } + do { + if (isdigit(*cp)) { + tmp = (tmp * 10) + (*cp -'0'); + } else if (*cp == '.' || *cp == 0) { + if (tmp > 255) { + return 0; /* error */ + } + acc = (acc << 8) + tmp; + dotc++; + } else { + return 0; /* error */ + } + } while (*cp++ != 0); + if (dotc != 4) { /* want 3 .'s plus EOS */ + return 0; /* error */ + } + inp->s_addr = htonl(acc); /* store addr in network format */ + return 1; } int