From: Kern Sibbald Date: Thu, 9 May 2002 10:48:06 +0000 (+0000) Subject: Work on message resources X-Git-Tag: Release-1.20~13 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=9081f20ef8f97245ec769479dac904a6e16d0ef6;p=bacula%2Fbacula Work on message resources git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@16 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index bc1607d367..a9a49da782 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.c @@ -160,7 +160,7 @@ int main (int argc, char *argv[]) configfile = bstrdup(CONFIG_FILE); } - init_msg(NULL); /* initialize message handler */ + init_msg(NULL, NULL); /* initialize message handler */ parse_config(configfile); if (!check_resources()) { @@ -190,7 +190,7 @@ int main (int argc, char *argv[]) Dmsg0(200, "Start UA server\n"); start_UA_server(director->DIRport); - init_watchdog(); /* start network watchdog thread */ + start_watchdog(); /* start network watchdog thread */ init_job_server(director->MaxConcurrentJobs); @@ -215,7 +215,7 @@ static void terminate_dird(int sig) exit(1); } already_here = TRUE; - term_watchdog(); + stop_watchdog(); signal(SIGCHLD, SIG_IGN); /* don't worry about children now */ term_scheduler(); if (runjob) { diff --git a/bacula/src/dird/dird_conf.c b/bacula/src/dird/dird_conf.c index 0d7937c7e5..6218f539ab 100644 --- a/bacula/src/dird/dird_conf.c +++ b/bacula/src/dird/dird_conf.c @@ -584,7 +584,6 @@ void free_resource(int type) free(res->res_msgs.mail_cmd); if (res->res_msgs.operator_cmd) free(res->res_msgs.operator_cmd); - break; case R_GROUP: break; diff --git a/bacula/src/dird/job.c b/bacula/src/dird/job.c index 0d4cc77285..539b73cae0 100644 --- a/bacula/src/dird/job.c +++ b/bacula/src/dird/job.c @@ -259,6 +259,7 @@ void set_jcr_defaults(JCR *jcr, JOB *job) jcr->pool = job->pool; jcr->catalog = job->client->catalog; jcr->fileset = job->fs; + init_msg(jcr, job->messages); /* If no default level given, set one */ if (jcr->level == 0) { switch (jcr->JobType) { diff --git a/bacula/src/dird/ua_server.c b/bacula/src/dird/ua_server.c index b58405a0cc..8722a028d7 100644 --- a/bacula/src/dird/ua_server.c +++ b/bacula/src/dird/ua_server.c @@ -101,7 +101,6 @@ static void handle_UA_client_request(void *arg) ua.automount = TRUE; ua.verbose = TRUE; ua.jcr = new_jcr(sizeof(JCR), dird_free_jcr); - close_msg(ua.jcr); /* we don't handle messages */ ua.jcr->sd_auth_key = bstrdup("dummy"); /* dummy Storage daemon key */ ua.UA_sock = UA_sock; ua.cmd = (char *) get_pool_memory(PM_FNAME); diff --git a/bacula/src/filed/filed.c b/bacula/src/filed/filed.c index 7e7ee3be1d..5a40ade9fb 100644 --- a/bacula/src/filed/filed.c +++ b/bacula/src/filed/filed.c @@ -144,7 +144,7 @@ int main (int argc, char *argv[]) } - init_msg(NULL); + init_msg(NULL, NULL); parse_config(configfile); LockRes(); @@ -179,7 +179,7 @@ Without that I don't know who I am :-(\n"), configfile); me += 1000000; #endif - init_watchdog(); /* start watchdog thread */ + start_watchdog(); /* start watchdog thread */ /* Become server, and handle requests */ Dmsg1(10, "filed: listening on port %d\n", me->FDport); @@ -190,7 +190,7 @@ Without that I don't know who I am :-(\n"), configfile); void terminate_filed(int sig) { - term_watchdog(); + stop_watchdog(); if (configfile != NULL) { free(configfile); diff --git a/bacula/src/jcr.h b/bacula/src/jcr.h index 7557539c42..e25ed3ab86 100644 --- a/bacula/src/jcr.h +++ b/bacula/src/jcr.h @@ -98,6 +98,7 @@ struct s_jcr { char *VolumeName; /* Volume name desired -- pool_memory */ char *client_name; /* client name */ char *sd_auth_key; /* SD auth key */ + MSGS *msgs; /* Message resource */ DEST *dest_chain; /* Job message destination chain */ char send_msg[nbytes_for_bits(M_MAX+1)]; /* message bit mask */ diff --git a/bacula/src/lib/jcr.c b/bacula/src/lib/jcr.c index a29454d751..c17616793c 100755 --- a/bacula/src/lib/jcr.c +++ b/bacula/src/lib/jcr.c @@ -63,7 +63,6 @@ JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr) jcr->VolumeName[0] = 0; jcr->errmsg = (char *) get_pool_memory(PM_MESSAGE); jcr->errmsg[0] = 0; - init_msg(jcr); /* init job message chain */ jobs = jcr; V(mutex); return jcr; diff --git a/bacula/src/lib/message.c b/bacula/src/lib/message.c index 8b88e3006e..ec5cb38061 100755 --- a/bacula/src/lib/message.c +++ b/bacula/src/lib/message.c @@ -46,16 +46,7 @@ FILE *con_fd = NULL; /* Imported functions */ -/* This chain contains all the possible destinations */ -DEST *dest_chain = NULL; -/* - * send_msg has a bit set for each type that has a - * message destination. The info in send_msg[] is - * contained in the dest structures, - * but we keep it here for speed so that we don't have to - * search all the structures in all the cases. - */ -char send_msg[nbytes_for_bits(M_MAX+1)]; +static MSGS daemon_msg; /* global messages */ /* * Set daemon name. Also, find canonical execution @@ -131,19 +122,22 @@ void my_name_is(int argc, char *argv[], char *name) /* Initialize message handler */ void -init_msg(void *vjcr) +init_msg(void *vjcr, MSGS *msg) { DEST *d, *dnew, *temp_chain = NULL; JCR *jcr = (JCR *)vjcr; + if (!msg) { /* If nothing specified, use */ + msg = &daemon_msg; /* daemon global message resource */ + } if (!jcr) { - memset(send_msg, 0, sizeof(send_msg)); /* init daemon stuff */ + memset(msg, 0, sizeof(msg)); /* init daemon global message */ } else { /* init for job */ /* Walk down the global chain duplicating it * for the current Job. No need to duplicate * the attached strings. */ - for (d=dest_chain; d; d=d->next) { + for (d=daemon_msg.dest_chain; d; d=d->next) { dnew = (DEST *) malloc(sizeof(DEST)); memcpy(dnew, d, sizeof(DEST)); dnew->next = temp_chain; @@ -153,7 +147,7 @@ init_msg(void *vjcr) } jcr->dest_chain = temp_chain; - memcpy(jcr->send_msg, send_msg, sizeof(send_msg)); + memcpy(jcr->send_msg, daemon_msg.send_msg, sizeof(daemon_msg.send_msg)); } } @@ -197,23 +191,23 @@ void add_msg_dest(MSGS *msg, int dest_code, int msg_type, char *where, char *mai /* First search the existing chain and see if we * can simply add this msg_type to an existing entry. */ - for (d=dest_chain; d; d=d->next) { + for (d=daemon_msg.dest_chain; d; d=d->next) { if (dest_code == d->dest_code && ((where == NULL && d->where == NULL) || (strcmp(where, d->where) == 0))) { Dmsg4(200, "Add to existing d=%x msgtype=%d destcode=%d where=%s\n", d, msg_type, dest_code, where); set_bit(msg_type, d->msg_types); - set_bit(msg_type, send_msg); /* set msg_type bit in our local */ + set_bit(msg_type, daemon_msg.send_msg); /* set msg_type bit in our local */ return; } } /* Not found, create a new entry */ d = (DEST *) malloc(sizeof(DEST)); memset(d, 0, sizeof(DEST)); - d->next = dest_chain; + d->next = daemon_msg.dest_chain; d->dest_code = dest_code; set_bit(msg_type, d->msg_types); /* set type bit in structure */ - set_bit(msg_type, send_msg); /* set type bit in our local */ + set_bit(msg_type, daemon_msg.send_msg); /* set type bit in our local */ if (where) { d->where = bstrdup(where); } @@ -223,7 +217,7 @@ void add_msg_dest(MSGS *msg, int dest_code, int msg_type, char *where, char *mai Dmsg5(200, "add new d=%x msgtype=%d destcode=%d where=%s mailcmd=%s\n", d, msg_type, dest_code, where?where:"(null)", d->mail_cmd?d->mail_cmd:"(null)"); - dest_chain = d; + daemon_msg.dest_chain = d; } /* @@ -235,7 +229,7 @@ void rem_msg_dest(MSGS *msg, int dest_code, int msg_type, char *where) { DEST *d; - for (d=dest_chain; d; d=d->next) { + for (d=daemon_msg.dest_chain; d; d=d->next) { Dmsg2(200, "Remove_msg_dest d=%x where=%s\n", d, d->where); if (bit_is_set(msg_type, d->msg_types) && (dest_code == d->dest_code) && ((where == NULL && d->where == NULL) || @@ -552,7 +546,7 @@ void term_msg() { DEST *d, *n; - for (d=dest_chain; d; d=n) { + for (d=daemon_msg.dest_chain; d; d=n) { if (d->fd) { if (d->dest_code == MD_FILE || d->dest_code == MD_APPEND) { fclose(d->fd); /* close open file descriptor */ @@ -609,7 +603,7 @@ void dispatch_message(void *vjcr, int type, int level, char *buf) if (jcr) { d = jcr->dest_chain; /* use job message chain */ } else { - d = dest_chain; /* use global chain */ + d = daemon_msg.dest_chain; /* use global chain */ } for ( ; d; d=d->next) { if (bit_is_set(type, d->msg_types)) { @@ -662,7 +656,6 @@ void dispatch_message(void *vjcr, int type, int level, char *buf) char *name = (char *)get_pool_memory(PM_MESSAGE); make_unique_mail_filename(jcr, &name, d); d->fd = fopen(name, "w+"); - Dmsg2(100, "Open mail file %d: %s\n", d->fd, name); if (!d->fd) { Emsg2(M_ERROR, 0, "fopen %s failed: ERR=%s\n", name, strerror(errno)); free_pool_memory(name); @@ -786,7 +779,7 @@ e_msg(char *file, int line, int type, int level, char *fmt,...) * Check if we have a message destination defined. * We always report M_ABORT */ - if (type != M_ABORT && !bit_is_set(type, send_msg)) + if (type != M_ABORT && !bit_is_set(type, daemon_msg.send_msg)) return; /* no destination */ switch (type) { case M_ABORT: diff --git a/bacula/src/lib/protos.h b/bacula/src/lib/protos.h index 93737d5fa3..cc114032ec 100644 --- a/bacula/src/lib/protos.h +++ b/bacula/src/lib/protos.h @@ -22,132 +22,132 @@ */ /* base64.c */ -void base64_init __PROTO((void)); -int to_base64 __PROTO((intmax_t value, char *where)); -int from_base64 __PROTO((intmax_t *value, char *where)); -void encode_stat __PROTO((char *buf, struct stat *statp)); -void decode_stat __PROTO((char *buf, struct stat *statp)); -int bin_to_base64 __PROTO((char *buf, char *bin, int len)); +void base64_init __PROTO((void)); +int to_base64 __PROTO((intmax_t value, char *where)); +int from_base64 __PROTO((intmax_t *value, char *where)); +void encode_stat __PROTO((char *buf, struct stat *statp)); +void decode_stat __PROTO((char *buf, struct stat *statp)); +int bin_to_base64 __PROTO((char *buf, char *bin, int len)); /* bmisc.c */ -void *b_malloc (char *file, int line, size_t size); +void *b_malloc (char *file, int line, size_t size); #ifndef DEBUG -void *bmalloc (size_t size); +void *bmalloc (size_t size); #endif -void *brealloc (void *buf, size_t size); -void *bcalloc (size_t size1, size_t size2); -int bsnprintf (char *str, size_t size, const char *format, ...); -int bvsnprintf (char *str, size_t size, const char *format, va_list ap); -int pool_sprintf (char *pool_buf, char *fmt, ...); -int create_pid_file (char *dir, char *progname, int port, char *errmsg); -int delete_pid_file (char *dir, char *progname, int port); +void *brealloc (void *buf, size_t size); +void *bcalloc (size_t size1, size_t size2); +int bsnprintf (char *str, size_t size, const char *format, ...); +int bvsnprintf (char *str, size_t size, const char *format, va_list ap); +int pool_sprintf (char *pool_buf, char *fmt, ...); +int create_pid_file (char *dir, char *progname, int port, char *errmsg); +int delete_pid_file (char *dir, char *progname, int port); /* bnet.c */ -int32_t bnet_recv __PROTO((BSOCK *bsock)); -int bnet_send __PROTO((BSOCK *bsock)); -int bnet_fsend (BSOCK *bs, char *fmt, ...); -int bnet_set_buffer_size (BSOCK *bs, uint32_t size, int rw); -int bnet_sig (BSOCK *bs, int sig); -BSOCK * bnet_connect (void *jcr, int retry_interval, - int max_retry_time, char *name, char *host, char *service, - int port, int verbose); -int bnet_wait_data (BSOCK *bsock, int sec); -void bnet_close __PROTO((BSOCK *bsock)); -BSOCK * init_bsock __PROTO((int sockfd, char *who, char *ip, int port)); -BSOCK * dup_bsock __PROTO((BSOCK *bsock)); -void term_bsock __PROTO((BSOCK *bsock)); -char * bnet_strerror __PROTO((BSOCK *bsock)); -char * bnet_sig_to_ascii __PROTO((BSOCK *bsock)); -int bnet_wait_data __PROTO((BSOCK *bsock, int sec)); +int32_t bnet_recv __PROTO((BSOCK *bsock)); +int bnet_send __PROTO((BSOCK *bsock)); +int bnet_fsend (BSOCK *bs, char *fmt, ...); +int bnet_set_buffer_size (BSOCK *bs, uint32_t size, int rw); +int bnet_sig (BSOCK *bs, int sig); +BSOCK * bnet_connect (void *jcr, int retry_interval, + int max_retry_time, char *name, char *host, char *service, + int port, int verbose); +int bnet_wait_data (BSOCK *bsock, int sec); +void bnet_close __PROTO((BSOCK *bsock)); +BSOCK * init_bsock __PROTO((int sockfd, char *who, char *ip, int port)); +BSOCK * dup_bsock __PROTO((BSOCK *bsock)); +void term_bsock __PROTO((BSOCK *bsock)); +char * bnet_strerror __PROTO((BSOCK *bsock)); +char * bnet_sig_to_ascii __PROTO((BSOCK *bsock)); +int bnet_wait_data __PROTO((BSOCK *bsock, int sec)); /* cram-md5.c */ int cram_md5_get_auth(BSOCK *bs, char *password); int cram_md5_auth(BSOCK *bs, char *password); void hmac_md5(uint8_t* text, int text_len, uint8_t* key, - int key_len, uint8_t *hmac); + int key_len, uint8_t *hmac); /* create_file.c */ int create_file(void *jcr, char *fname, char *ofile, char *lname, - int type, struct stat *statp, int *ofd); + int type, struct stat *statp, int *ofd); int set_statp(void *jcr, char *fname, char *ofile, char *lname, int type, - struct stat *statp); + struct stat *statp); /* crc32.c */ uint32_t bcrc32(uint8_t *buf, int len); /* daemon.c */ -void daemon_start __PROTO(()); +void daemon_start __PROTO(()); /* lex.c */ -LEX * lex_close_file __PROTO((LEX *lf)); -LEX * lex_open_file __PROTO((LEX *lf, char *fname)); -int lex_get_char __PROTO((LEX *lf)); -void lex_unget_char __PROTO((LEX *lf)); -char * lex_tok_to_str __PROTO((int token)); -int lex_get_token __PROTO((LEX *lf)); +LEX * lex_close_file __PROTO((LEX *lf)); +LEX * lex_open_file __PROTO((LEX *lf, char *fname)); +int lex_get_char __PROTO((LEX *lf)); +void lex_unget_char __PROTO((LEX *lf)); +char * lex_tok_to_str __PROTO((int token)); +int lex_get_token __PROTO((LEX *lf)); /* makepath.c */ int make_path( - void *jcr, - const char *argpath, - int mode, - int parent_mode, - uid_t owner, - gid_t group, - int preserve_existing, - char *verbose_fmt_string); + void *jcr, + const char *argpath, + int mode, + int parent_mode, + uid_t owner, + gid_t group, + int preserve_existing, + char *verbose_fmt_string); /* message.c */ -void my_name_is __PROTO((int argc, char *argv[], char *name)); -void init_msg __PROTO((void *jcr)); -void term_msg __PROTO((void)); -void close_msg __PROTO((void *jcr)); -void add_msg_dest __PROTO((MSGS *msg, int dest, int type, char *where, char *dest_code)); -void rem_msg_dest __PROTO((MSGS *msg, int dest, int type, char *where)); -void Jmsg (void *jcr, int type, int level, char *fmt, ...); -void dispatch_message __PROTO((void *jcr, int type, int level, char *buf)); -void init_console_msg __PROTO((char *wd)); +void my_name_is __PROTO((int argc, char *argv[], char *name)); +void init_msg __PROTO((void *jcr, MSGS *msg)); +void term_msg __PROTO((void)); +void close_msg __PROTO((void *jcr)); +void add_msg_dest __PROTO((MSGS *msg, int dest, int type, char *where, char *dest_code)); +void rem_msg_dest __PROTO((MSGS *msg, int dest, int type, char *where)); +void Jmsg (void *jcr, int type, int level, char *fmt, ...); +void dispatch_message __PROTO((void *jcr, int type, int level, char *buf)); +void init_console_msg __PROTO((char *wd)); /* bnet_server.c */ -void bnet_thread_server(int port, int max_clients, workq_t *client_wq, - void handle_client_request(void *bsock)); -void bnet_server __PROTO((int port, void handle_client_request(BSOCK *bsock))); -int net_connect __PROTO((int port)); -BSOCK * bnet_bind __PROTO((int port)); -BSOCK * bnet_accept __PROTO((BSOCK *bsock, char *who)); +void bnet_thread_server(int port, int max_clients, workq_t *client_wq, + void handle_client_request(void *bsock)); +void bnet_server __PROTO((int port, void handle_client_request(BSOCK *bsock))); +int net_connect __PROTO((int port)); +BSOCK * bnet_bind __PROTO((int port)); +BSOCK * bnet_accept __PROTO((BSOCK *bsock, char *who)); /* signal.c */ -void init_signals __PROTO((void terminate(int sig))); -void init_stack_dump (void); +void init_signals __PROTO((void terminate(int sig))); +void init_stack_dump (void); /* util.c */ -void lcase __PROTO((char *str)); -void bash_spaces __PROTO((char *str)); -void unbash_spaces __PROTO((char *str)); -void strip_trailing_junk __PROTO((char *str)); -void strip_trailing_slashes __PROTO((char *dir)); -int skip_spaces __PROTO((char **msg)); -int skip_nonspaces __PROTO((char **msg)); -int fstrsch __PROTO((char *a, char *b)); -char * encode_time __PROTO((time_t time, char *buf)); -char * encode_mode __PROTO((mode_t mode, char *buf)); -char * edit_uint64_with_commas __PROTO((uint64_t val, char *buf)); -char * add_commas __PROTO((char *val, char *buf)); -char * edit_uint64 (uint64_t val, char *buf); -int do_shell_expansion (char *name); -int is_a_number (const char *num); -int string_to_btime(char *str, btime_t *value); -char *edit_btime(btime_t val, char *buf); +void lcase __PROTO((char *str)); +void bash_spaces __PROTO((char *str)); +void unbash_spaces __PROTO((char *str)); +void strip_trailing_junk __PROTO((char *str)); +void strip_trailing_slashes __PROTO((char *dir)); +int skip_spaces __PROTO((char **msg)); +int skip_nonspaces __PROTO((char **msg)); +int fstrsch __PROTO((char *a, char *b)); +char * encode_time __PROTO((time_t time, char *buf)); +char * encode_mode __PROTO((mode_t mode, char *buf)); +char * edit_uint64_with_commas __PROTO((uint64_t val, char *buf)); +char * add_commas __PROTO((char *val, char *buf)); +char * edit_uint64 (uint64_t val, char *buf); +int do_shell_expansion (char *name); +int is_a_number (const char *num); +int string_to_btime(char *str, btime_t *value); +char *edit_btime(btime_t val, char *buf); /* - *void print_ls_output __PROTO((char *fname, char *lname, int type, struct stat *statp)); + *void print_ls_output __PROTO((char *fname, char *lname, int type, struct stat *statp)); */ /* watchdog.c */ -int init_watchdog(void); -int term_watchdog(void); +int start_watchdog(void); +int stop_watchdog(void); diff --git a/bacula/src/lib/signal.c b/bacula/src/lib/signal.c index e4d41b632a..de9fdfe691 100644 --- a/bacula/src/lib/signal.c +++ b/bacula/src/lib/signal.c @@ -62,7 +62,7 @@ static void signal_handler(int sig) struct sigaction sigdefault; if (already_dead) { - abort(); + _exit(1); } already_dead = TRUE; if (sig == SIGTERM) { @@ -125,7 +125,6 @@ static void signal_handler(int sig) Dmsg0(500, "Doing sleep\n"); sleep(30); } - abort(); /* produce dump */ } #endif diff --git a/bacula/src/lib/watchdog.c b/bacula/src/lib/watchdog.c index 1bcccc4ef6..9cda310aa7 100755 --- a/bacula/src/lib/watchdog.c +++ b/bacula/src/lib/watchdog.c @@ -56,12 +56,12 @@ static void timeout_handler(int sig) /* - * Initialize watchdog thread + * Start watchdog thread * * Returns: 0 on success * errno on failure */ -int init_watchdog(void) +int start_watchdog(void) { int stat; pthread_t wdid; @@ -94,7 +94,7 @@ int init_watchdog(void) * Returns: 0 on success * errno on failure */ -int term_watchdog(void) +int stop_watchdog(void) { int stat; diff --git a/bacula/src/stored/stored.c b/bacula/src/stored/stored.c index eabbd18efd..cfe86abc75 100644 --- a/bacula/src/stored/stored.c +++ b/bacula/src/stored/stored.c @@ -162,7 +162,7 @@ int main (int argc, char *argv[]) configfile = bstrdup(CONFIG_FILE); } - init_msg(NULL); + init_msg(NULL, NULL); parse_config(configfile); check_config(); @@ -245,7 +245,7 @@ int main (int argc, char *argv[]) UnlockRes(); device = NULL; - init_watchdog(); /* start watchdog thread */ + start_watchdog(); /* start watchdog thread */ /* * Here we support either listening on one port or on two ports @@ -347,7 +347,7 @@ void terminate_stored(int sig) } in_here = TRUE; - term_watchdog(); + stop_watchdog(); Dmsg0(200, "In terminate_stored()\n"); diff --git a/bacula/src/version.h b/bacula/src/version.h index 625956f409..01f063f51c 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -1,8 +1,8 @@ /* */ #define VERSION "1.19" #define VSTRING "1" -#define DATE "08 May 2002" -#define LSMDATE "08May02" +#define DATE "09 May 2002" +#define LSMDATE "09May02" /* Debug flags */ #define DEBUG 1