From: Kern Sibbald Date: Fri, 27 Feb 2004 13:01:23 +0000 (+0000) Subject: Job end push resource resturcturing X-Git-Tag: Release-1.34.0~85 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=e4d1ad2f5b7b2702a50c0e0c87158be63767ec0a;p=bacula%2Fbacula Job end push resource resturcturing git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1094 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/src/console/console_conf.c b/bacula/src/console/console_conf.c index 9def219279..b9d4c72026 100644 --- a/bacula/src/console/console_conf.c +++ b/bacula/src/console/console_conf.c @@ -65,7 +65,7 @@ int res_all_size = sizeof(res_all); */ /* Console "globals" */ -static struct res_items cons_items[] = { +static RES_ITEM cons_items[] = { {"name", store_name, ITEM(res_cons.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_cons.hdr.desc), 0, 0, 0}, {"rcfile", store_dir, ITEM(res_cons.rc_file), 0, 0, 0}, @@ -77,7 +77,7 @@ static struct res_items cons_items[] = { /* Director's that we can contact */ -static struct res_items dir_items[] = { +static RES_ITEM dir_items[] = { {"name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, {"dirport", store_int, ITEM(res_dir.DIRport), 0, ITEM_DEFAULT, 9101}, @@ -91,7 +91,7 @@ static struct res_items dir_items[] = { * This is the master resource definition. * It must have one item for each of the resources. */ -struct s_res resources[] = { +RES_TABLE resources[] = { {"console", cons_items, R_CONSOLE, NULL}, {"director", dir_items, R_DIRECTOR, NULL}, {NULL, NULL, 0, NULL} @@ -136,13 +136,10 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, char *fmt, ... * resource chain is traversed. Mainly we worry about freeing * allocated strings (names). */ -void free_resource(int type) +void free_resource(RES *sres, int type) { - URES *res; RES *nres; - int rindex = type - r_first; - - res = (URES *)resources[rindex].res_head; + URES *res = (URES *)sres; if (res == NULL) return; @@ -173,16 +170,16 @@ void free_resource(int type) } /* Common stuff again -- free the resource, recurse to next one */ free(res); - resources[rindex].res_head = nres; - if (nres) - free_resource(type); + if (nres) { + free_resource(nres, type); + } } /* Save the new resource by chaining it into the head list for * the resource. If this is pass 2, we update any resource * pointers (currently only in the Job resource). */ -void save_resource(int type, struct res_items *items, int pass) +void save_resource(int type, RES_ITEM *items, int pass) { URES *res; int rindex = type - r_first; diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index 271a841d6d..34aecc0e5a 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.c @@ -45,9 +45,9 @@ int do_backup(JCR *jcr); void backup_cleanup(void); void start_UA_server(char *addr, int port); void init_job_server(int max_workers); -void store_jobtype(LEX *lc, struct res_items *item, int index, int pass); -void store_level(LEX *lc, struct res_items *item, int index, int pass); -void store_replace(LEX *lc, struct res_items *item, int index, int pass); +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); static char *configfile = NULL; static char *runjob = NULL; @@ -60,7 +60,7 @@ int SDConnectTimeout; /* Globals Imported */ extern int r_first, r_last; /* first and last resources */ -extern struct res_items job_items[]; +extern RES_ITEM job_items[]; extern URES res_all; diff --git a/bacula/src/dird/dird_conf.c b/bacula/src/dird/dird_conf.c index d567a3bbf3..5b3084d8be 100644 --- a/bacula/src/dird/dird_conf.c +++ b/bacula/src/dird/dird_conf.c @@ -52,17 +52,17 @@ int r_first = R_FIRST; int r_last = R_LAST; /* Imported subroutines */ -extern void store_run(LEX *lc, struct res_items *item, int index, int pass); -extern void store_finc(LEX *lc, struct res_items *item, int index, int pass); -extern void store_inc(LEX *lc, struct res_items *item, int index, int pass); +extern void store_run(LEX *lc, RES_ITEM *item, int index, int pass); +extern void store_finc(LEX *lc, RES_ITEM *item, int index, int pass); +extern void store_inc(LEX *lc, RES_ITEM *item, int index, int pass); /* Forward referenced subroutines */ -void store_jobtype(LEX *lc, struct res_items *item, int index, int pass); -void store_level(LEX *lc, struct res_items *item, int index, int pass); -void store_replace(LEX *lc, struct res_items *item, int index, int pass); -void store_acl(LEX *lc, struct res_items *item, int index, int pass); +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); +void store_acl(LEX *lc, RES_ITEM *item, int index, int pass); /* We build the current resource here as we are @@ -83,7 +83,7 @@ int res_all_size = sizeof(res_all); * * name handler value code flags default_value */ -static struct res_items dir_items[] = { +static RES_ITEM dir_items[] = { {"name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, {"messages", store_res, ITEM(res_dir.messages), R_MSGS, 0, 0}, @@ -107,7 +107,7 @@ static struct res_items dir_items[] = { * * name handler value code flags default_value */ -static struct res_items con_items[] = { +static RES_ITEM con_items[] = { {"name", store_name, ITEM(res_con.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_con.hdr.desc), 0, 0, 0}, {"enablessl", store_yesno, ITEM(res_con.enable_ssl), 1, ITEM_DEFAULT, 0}, @@ -131,7 +131,7 @@ static struct res_items con_items[] = { * name handler value code flags default_value */ -static struct res_items cli_items[] = { +static RES_ITEM cli_items[] = { {"name", store_name, ITEM(res_client.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_client.hdr.desc), 0, 0, 0}, {"address", store_str, ITEM(res_client.address), 0, ITEM_REQUIRED, 0}, @@ -152,7 +152,7 @@ static struct res_items cli_items[] = { * * name handler value code flags default_value */ -static struct res_items store_items[] = { +static RES_ITEM store_items[] = { {"name", store_name, ITEM(res_store.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_store.hdr.desc), 0, 0, 0}, {"sdport", store_pint, ITEM(res_store.SDport), 0, ITEM_DEFAULT, 9103}, @@ -175,7 +175,7 @@ static struct res_items store_items[] = { * * name handler value code flags default_value */ -static struct res_items cat_items[] = { +static RES_ITEM cat_items[] = { {"name", store_name, ITEM(res_cat.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_cat.hdr.desc), 0, 0, 0}, {"address", store_str, ITEM(res_cat.db_address), 0, 0, 0}, @@ -195,7 +195,7 @@ static struct res_items cat_items[] = { * * name handler value code flags default_value */ -struct res_items job_items[] = { +RES_ITEM job_items[] = { {"name", store_name, ITEM(res_job.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_job.hdr.desc), 0, 0, 0}, {"type", store_jobtype, ITEM(res_job.JobType), 0, ITEM_REQUIRED, 0}, @@ -241,7 +241,7 @@ struct res_items job_items[] = { * * name handler value code flags default_value */ -static struct res_items fs_items[] = { +static RES_ITEM fs_items[] = { {"name", store_name, ITEM(res_fs.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_fs.hdr.desc), 0, 0, 0}, {"include", store_inc, NULL, 0, ITEM_NO_EQUALS, 0}, @@ -254,7 +254,7 @@ static struct res_items fs_items[] = { * * name handler value code flags default_value */ -static struct res_items sch_items[] = { +static RES_ITEM sch_items[] = { {"name", store_name, ITEM(res_sch.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_sch.hdr.desc), 0, 0, 0}, {"run", store_run, ITEM(res_sch.run), 0, 0, 0}, @@ -265,7 +265,7 @@ static struct res_items sch_items[] = { * * name handler value code flags default_value */ -static struct res_items pool_items[] = { +static RES_ITEM pool_items[] = { {"name", store_name, ITEM(res_pool.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_pool.hdr.desc), 0, 0, 0}, {"pooltype", store_strname, ITEM(res_pool.pool_type), 0, ITEM_REQUIRED, 0}, @@ -293,7 +293,7 @@ static struct res_items pool_items[] = { * Counter Resource * name handler value code flags default_value */ -static struct res_items counter_items[] = { +static RES_ITEM counter_items[] = { {"name", store_name, ITEM(res_counter.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_counter.hdr.desc), 0, 0, 0}, {"minimum", store_int, ITEM(res_counter.MinValue), 0, ITEM_DEFAULT, 0}, @@ -305,7 +305,7 @@ static struct res_items counter_items[] = { /* Message resource */ -extern struct res_items msgs_items[]; +extern RES_ITEM msgs_items[]; /* * This is the master resource definition. @@ -316,7 +316,7 @@ extern struct res_items msgs_items[]; * * name items rcode res_head */ -struct s_res resources[] = { +RES_TABLE resources[] = { {"director", dir_items, R_DIRECTOR, NULL}, {"client", cli_items, R_CLIENT, NULL}, {"job", job_items, R_JOB, NULL}, @@ -720,14 +720,11 @@ static void free_incexe(INCEXE *incexe) * resource chain is traversed. Mainly we worry about freeing * allocated strings (names). */ -void free_resource(int type) +void free_resource(RES *sres, int type) { int num; - URES *res; - RES *nres; - int rindex = type - r_first; - - res = (URES *)resources[rindex].res_head; + RES *nres; /* next resource if linked */ + URES *res = (URES *)sres; if (res == NULL) return; @@ -896,9 +893,8 @@ void free_resource(int type) if (res) { free(res); } - resources[rindex].res_head = nres; if (nres) { - free_resource(type); + free_resource(nres, type); } } @@ -908,7 +904,7 @@ void free_resource(int type) * pointers because they may not have been defined until * later in pass 1. */ -void save_resource(int type, struct res_items *items, int pass) +void save_resource(int type, RES_ITEM *items, int pass) { URES *res; int rindex = type - r_first; @@ -1097,7 +1093,7 @@ void save_resource(int type, struct res_items *items, int pass) * Store JobType (backup, verify, restore) * */ -void store_jobtype(LEX *lc, struct res_items *item, int index, int pass) +void store_jobtype(LEX *lc, RES_ITEM *item, int index, int pass) { int token, i; @@ -1121,7 +1117,7 @@ void store_jobtype(LEX *lc, struct res_items *item, int index, int pass) * Store Job Level (Full, Incremental, ...) * */ -void store_level(LEX *lc, struct res_items *item, int index, int pass) +void store_level(LEX *lc, RES_ITEM *item, int index, int pass) { int token, i; @@ -1141,7 +1137,7 @@ void store_level(LEX *lc, struct res_items *item, int index, int pass) set_bit(index, res_all.hdr.item_present); } -void store_replace(LEX *lc, struct res_items *item, int index, int pass) +void store_replace(LEX *lc, RES_ITEM *item, int index, int pass) { int token, i; token = lex_get_token(lc, T_NAME); @@ -1164,7 +1160,7 @@ void store_replace(LEX *lc, struct res_items *item, int index, int pass) * Store ACL (access control list) * */ -void store_acl(LEX *lc, struct res_items *item, int index, int pass) +void store_acl(LEX *lc, RES_ITEM *item, int index, int pass) { int token; @@ -1196,7 +1192,7 @@ void store_acl(LEX *lc, struct res_items *item, int index, int pass) * * Backup = Client= FileSet= Level= */ -static void store_backup(LEX *lc, struct res_items *item, int index, int pass) +static void store_backup(LEX *lc, RES_ITEM *item, int index, int pass) { int token, i; RES *res; @@ -1278,7 +1274,7 @@ static void store_backup(LEX *lc, struct res_items *item, int index, int pass) * Restore = JobId= Where= Replace= Bootstrap= * */ -static void store_restore(LEX *lc, struct res_items *item, int index, int pass) +static void store_restore(LEX *lc, RES_ITEM *item, int index, int pass) { int token, i; RES *res; diff --git a/bacula/src/dird/inc_conf.c b/bacula/src/dird/inc_conf.c index 9d09e1a535..5b1b5c66a5 100644 --- a/bacula/src/dird/inc_conf.c +++ b/bacula/src/dird/inc_conf.c @@ -31,13 +31,13 @@ /* Forward referenced subroutines */ -void store_inc(LEX *lc, struct res_items *item, int index, int pass); +void store_inc(LEX *lc, RES_ITEM *item, int index, int pass); -static void store_newinc(LEX *lc, struct res_items *item, int index, int pass); -static void store_match(LEX *lc, struct res_items *item, int index, int pass); -static void store_opts(LEX *lc, struct res_items *item, int index, int pass); -static void store_fname(LEX *lc, struct res_items *item, int index, int pass); -static void store_base(LEX *lc, struct res_items *item, int index, int pass); +static void store_newinc(LEX *lc, RES_ITEM *item, int index, int pass); +static void store_match(LEX *lc, RES_ITEM *item, int index, int pass); +static void store_opts(LEX *lc, RES_ITEM *item, int index, int pass); +static void store_fname(LEX *lc, RES_ITEM *item, int index, int pass); +static void store_base(LEX *lc, RES_ITEM *item, int index, int pass); static void setup_current_opts(void); @@ -56,7 +56,7 @@ static INCEXE res_incexe; * new Include/Exclude items * name handler value code flags default_value */ -static struct res_items newinc_items[] = { +static RES_ITEM newinc_items[] = { {"compression", store_opts, NULL, 0, 0, 0}, {"signature", store_opts, NULL, 0, 0, 0}, {"verify", store_opts, NULL, 0, 0, 0}, @@ -206,7 +206,7 @@ static void scan_include_options(LEX *lc, int keyword, char *opts, int optlen) } /* Store FileSet Include/Exclude info */ -void store_inc(LEX *lc, struct res_items *item, int index, int pass) +void store_inc(LEX *lc, RES_ITEM *item, int index, int pass) { int token, i; int options = lc->options; @@ -338,7 +338,7 @@ void store_inc(LEX *lc, struct res_items *item, int index, int pass) * resource. We treat the Finclude/Fexeclude like a sort of * mini-resource within the FileSet resource. */ -static void store_newinc(LEX *lc, struct res_items *item, int index, int pass) +static void store_newinc(LEX *lc, RES_ITEM *item, int index, int pass) { int token, i; INCEXE *incexe; @@ -405,7 +405,7 @@ static void store_newinc(LEX *lc, struct res_items *item, int index, int pass) /* Store Match info */ -static void store_match(LEX *lc, struct res_items *item, int index, int pass) +static void store_match(LEX *lc, RES_ITEM *item, int index, int pass) { int token; @@ -430,7 +430,7 @@ static void store_match(LEX *lc, struct res_items *item, int index, int pass) } /* Store Base info */ -static void store_base(LEX *lc, struct res_items *item, int index, int pass) +static void store_base(LEX *lc, RES_ITEM *item, int index, int pass) { int token; @@ -451,7 +451,7 @@ static void store_base(LEX *lc, struct res_items *item, int index, int pass) * always increase the name buffer by 10 items because we expect * to add more entries. */ -static void store_fname(LEX *lc, struct res_items *item, int index, int pass) +static void store_fname(LEX *lc, RES_ITEM *item, int index, int pass) { int token; INCEXE *incexe; @@ -486,7 +486,7 @@ static void store_fname(LEX *lc, struct res_items *item, int index, int pass) /* * New style options come here */ -static void store_opts(LEX *lc, struct res_items *item, int index, int pass) +static void store_opts(LEX *lc, RES_ITEM *item, int index, int pass) { int i; int keyword; diff --git a/bacula/src/dird/job.c b/bacula/src/dird/job.c index 5b9ffd5dfc..55788a11a6 100644 --- a/bacula/src/dird/job.c +++ b/bacula/src/dird/job.c @@ -72,7 +72,6 @@ void init_job_server(int max_workers) return; } - /* * Run a job -- typically called by the scheduler, but may also * be called by the UA (Console program). diff --git a/bacula/src/dird/run_conf.c b/bacula/src/dird/run_conf.c index e4a54ae411..5128af7e54 100644 --- a/bacula/src/dird/run_conf.c +++ b/bacula/src/dird/run_conf.c @@ -174,7 +174,7 @@ static struct s_kw RunFields[] = { * together. * */ -void store_run(LEX *lc, struct res_items *item, int index, int pass) +void store_run(LEX *lc, RES_ITEM *item, int index, int pass) { int i, j; bool found; diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index d8417e4370..f0f1eca586 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -36,7 +36,7 @@ /* Imported variables */ extern int r_first; extern int r_last; -extern struct s_res resources[]; +extern RES_TABLE resources[]; extern int console_msg_pending; extern FILE *con_fd; extern brwlock_t con_lock; diff --git a/bacula/src/filed/filed_conf.c b/bacula/src/filed/filed_conf.c index 4c37767bb2..bade134359 100644 --- a/bacula/src/filed/filed_conf.c +++ b/bacula/src/filed/filed_conf.c @@ -76,7 +76,7 @@ int res_all_size = sizeof(res_all); */ /* Client or File daemon "Global" resources */ -static struct res_items cli_items[] = { +static RES_ITEM cli_items[] = { {"name", store_name, ITEM(res_client.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_client.hdr.desc), 0, 0, 0}, {"fdport", store_pint, ITEM(res_client.FDport), 0, ITEM_DEFAULT, 9102}, @@ -94,7 +94,7 @@ static struct res_items cli_items[] = { }; /* Directors that can use our services */ -static struct res_items dir_items[] = { +static RES_ITEM dir_items[] = { {"name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, {"password", store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0}, @@ -104,13 +104,13 @@ static struct res_items dir_items[] = { }; /* Message resource */ -extern struct res_items msgs_items[]; +extern RES_ITEM msgs_items[]; /* * This is the master resource definition. * It must have one item for each of the resources. */ -struct s_res resources[] = { +RES_TABLE resources[] = { {"director", dir_items, R_DIRECTOR, NULL}, {"filedaemon", cli_items, R_CLIENT, NULL}, {"client", cli_items, R_CLIENT, NULL}, /* alias for filedaemon */ @@ -163,13 +163,10 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, char *fmt, ... * resource chain is traversed. Mainly we worry about freeing * allocated strings (names). */ -void free_resource(int type) +void free_resource(RES *sres, int type) { - URES *res; RES *nres; - int rindex = type - r_first; - - res = (URES *)resources[rindex].res_head; + URES *res = (URES *)sres; if (res == NULL) { return; @@ -222,9 +219,8 @@ void free_resource(int type) if (res) { free(res); } - resources[rindex].res_head = nres; if (nres) { - free_resource(type); + free_resource(nres, type); } } @@ -232,7 +228,7 @@ void free_resource(int type) * the resource. If this is pass 2, we update any resource * pointers (currently only in the Job resource). */ -void save_resource(int type, struct res_items *items, int pass) +void save_resource(int type, RES_ITEM *items, int pass) { URES *res; int rindex = type - r_first; diff --git a/bacula/src/gnome2-console/console_conf.c b/bacula/src/gnome2-console/console_conf.c index 6c89c3a73a..5e5ea86c3e 100644 --- a/bacula/src/gnome2-console/console_conf.c +++ b/bacula/src/gnome2-console/console_conf.c @@ -65,7 +65,7 @@ int res_all_size = sizeof(res_all); * resource with the routine to process the record * information. */ -static struct res_items dir_items[] = { +static RES_ITEM dir_items[] = { {"name", store_name, ITEM(dir_res.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(dir_res.hdr.desc), 0, 0, 0}, {"dirport", store_int, ITEM(dir_res.DIRport), 0, ITEM_DEFAULT, 9101}, @@ -75,7 +75,7 @@ static struct res_items dir_items[] = { {NULL, NULL, NULL, 0, 0, 0} }; -static struct res_items con_items[] = { +static RES_ITEM con_items[] = { {"name", store_name, ITEM(con_res.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(con_res.hdr.desc), 0, 0, 0}, {"password", store_password, ITEM(con_res.password), 0, ITEM_REQUIRED, 0}, @@ -83,7 +83,7 @@ static struct res_items con_items[] = { {NULL, NULL, NULL, 0, 0, 0} }; -static struct res_items con_font_items[] = { +static RES_ITEM con_font_items[] = { {"name", store_name, ITEM(con_font.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(con_font.hdr.desc), 0, 0, 0}, {"font", store_str, ITEM(con_font.fontface), 0, 0, 0}, @@ -96,7 +96,7 @@ static struct res_items con_font_items[] = { * This is the master resource definition. * It must have one item for each of the resources. */ -struct s_res resources[] = { +RES_TABLE resources[] = { {"director", dir_items, R_DIRECTOR, NULL}, {"console", con_items, R_CONSOLE, NULL}, {"consolefont", con_font_items, R_CONSOLE_FONT, NULL}, @@ -145,13 +145,10 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, char *fmt, ... * resource chain is traversed. Mainly we worry about freeing * allocated strings (names). */ -void free_resource(int type) +void free_resource(RES *sres, int type) { - URES *res; RES *nres; - int rindex = type - r_first; - - res = (URES *)resources[rindex].res_head; + URES *res = (URES *)sres; if (res == NULL) return; @@ -186,9 +183,8 @@ void free_resource(int type) } /* Common stuff again -- free the resource, recurse to next one */ free(res); - resources[rindex].res_head = nres; if (nres) { - free_resource(type); + free_resource(nres, type); } } @@ -196,7 +192,7 @@ void free_resource(int type) * the resource. If this is pass 2, we update any resource * pointers (currently only in the Job resource). */ -void save_resource(int type, struct res_items *items, int pass) +void save_resource(int type, RES_ITEM *items, int pass) { URES *res; int rindex = type - r_first; diff --git a/bacula/src/jcr.h b/bacula/src/jcr.h index 0b3e41e8d0..0a4ca14df3 100644 --- a/bacula/src/jcr.h +++ b/bacula/src/jcr.h @@ -102,6 +102,8 @@ struct JCR { BSOCK *file_bsock; /* File daemon connection socket */ JCR_free_HANDLER *daemon_free_jcr; /* Local free routine */ dlist *msg_queue; /* Queued messages */ + alist job_end_push; /* Job end pushed calls */ + int restart_count; /* SIGHUP restart count */ bool dequeuing; /* dequeuing messages */ POOLMEM *errmsg; /* edited error message */ char Job[MAX_NAME_LENGTH]; /* Unique name of this Job */ diff --git a/bacula/src/lib/jcr.c b/bacula/src/lib/jcr.c index 00cd0307d9..62d2f6c131 100755 --- a/bacula/src/lib/jcr.c +++ b/bacula/src/lib/jcr.c @@ -151,6 +151,24 @@ void unlock_last_jobs_list() unlock_jcr_chain(); } +/* + * Push a subroutine address into the job end callback stack + */ +void job_end_push(JCR *jcr, void job_end_cb(JCR *jcr)) +{ + jcr->job_end_push.prepend((void *)job_end_cb); +} + +/* Pop each job_end subroutine and call it */ +static void job_end_pop(JCR *jcr) +{ + void (*job_end_cb)(JCR *jcr); + for (int i=0; ijob_end_push.size(); i++) { + job_end_cb = (void (*)(JCR *))jcr->job_end_push.get(i); + job_end_cb(jcr); + } +} + /* * Create a Job Control Record and link it into JCR chain * Returns newly allocated JCR @@ -167,6 +185,7 @@ JCR *new_jcr(int size, JCR_free_HANDLER *daemon_free_jcr) jcr = (JCR *)malloc(size); memset(jcr, 0, size); jcr->msg_queue = new dlist(item, &item->link); + jcr->job_end_push.init(1, false); jcr->my_thread_id = pthread_self(); jcr->sched_time = time(NULL); jcr->daemon_free_jcr = daemon_free_jcr; /* plug daemon free routine */ @@ -332,6 +351,7 @@ void free_jcr(JCR *jcr) return; } remove_jcr(jcr); + job_end_pop(jcr); /* pop and call hooked routines */ Dmsg1(200, "End job=%d\n", jcr->JobId); if (jcr->daemon_free_jcr) { @@ -364,7 +384,6 @@ void free_locked_jcr(JCR *jcr) - /* * Given a JobId, find the JCR * Returns: jcr on success diff --git a/bacula/src/lib/parse_conf.c b/bacula/src/lib/parse_conf.c index 642fac588a..02d2a5e183 100755 --- a/bacula/src/lib/parse_conf.c +++ b/bacula/src/lib/parse_conf.c @@ -64,7 +64,7 @@ extern int debug_level; */ extern int r_first; extern int r_last; -extern struct s_res resources[]; +extern RES_TABLE resources[]; #ifdef HAVE_WIN32 // work around visual studio name manling preventing external linkage since res_all // is declared as a different type when instantiated. @@ -88,7 +88,7 @@ static void scan_types(LEX *lc, MSGS *msg, int dest, char *where, char *cmd); /* Message resource directives * name handler value code flags default_value */ -struct res_items msgs_items[] = { +RES_ITEM msgs_items[] = { {"name", store_name, ITEM(res_msgs.hdr.name), 0, 0, 0}, {"description", store_str, ITEM(res_msgs.hdr.desc), 0, 0, 0}, {"mailcommand", store_str, ITEM(res_msgs.mail_cmd), 0, 0, 0}, @@ -153,7 +153,7 @@ const char *res_to_str(int rcode) * Initialize the static structure to zeros, then * apply all the default values. */ -void init_resource(int type, struct res_items *items) +void init_resource(int type, RES_ITEM *items) { int i; int rindex = type - r_first; @@ -197,7 +197,7 @@ void init_resource(int type, struct res_items *items) /* Store Messages Destination information */ -void store_msgs(LEX *lc, struct res_items *item, int index, int pass) +void store_msgs(LEX *lc, RES_ITEM *item, int index, int pass) { int token; char *cmd; @@ -336,7 +336,7 @@ static void scan_types(LEX *lc, MSGS *msg, int dest_code, char *where, char *cmd * This routine is ONLY for resource names * Store a name at specified address. */ -void store_name(LEX *lc, struct res_items *item, int index, int pass) +void store_name(LEX *lc, RES_ITEM *item, int index, int pass) { POOLMEM *msg = get_pool_memory(PM_EMSG); lex_get_token(lc, T_NAME); @@ -359,7 +359,7 @@ void store_name(LEX *lc, struct res_items *item, int index, int pass) * Store a name string at specified address * A name string is limited to MAX_RES_NAME_LENGTH */ -void store_strname(LEX *lc, struct res_items *item, int index, int pass) +void store_strname(LEX *lc, RES_ITEM *item, int index, int pass) { lex_get_token(lc, T_NAME); /* Store the name */ @@ -371,7 +371,7 @@ void store_strname(LEX *lc, struct res_items *item, int index, int pass) } /* Store a string at specified address */ -void store_str(LEX *lc, struct res_items *item, int index, int pass) +void store_str(LEX *lc, RES_ITEM *item, int index, int pass) { lex_get_token(lc, T_STRING); if (pass == 1) { @@ -386,7 +386,7 @@ void store_str(LEX *lc, struct res_items *item, int index, int pass) * shell expansion except if the string begins with a vertical * bar (i.e. it will likely be passed to the shell later). */ -void store_dir(LEX *lc, struct res_items *item, int index, int pass) +void store_dir(LEX *lc, RES_ITEM *item, int index, int pass) { lex_get_token(lc, T_STRING); if (pass == 1) { @@ -401,7 +401,7 @@ void store_dir(LEX *lc, struct res_items *item, int index, int pass) /* Store a password specified address in MD5 coding */ -void store_password(LEX *lc, struct res_items *item, int index, int pass) +void store_password(LEX *lc, RES_ITEM *item, int index, int pass) { unsigned int i, j; struct MD5Context md5c; @@ -429,7 +429,7 @@ void store_password(LEX *lc, struct res_items *item, int index, int pass) * If we are in pass 2, do a lookup of the * resource. */ -void store_res(LEX *lc, struct res_items *item, int index, int pass) +void store_res(LEX *lc, RES_ITEM *item, int index, int pass) { RES *res; @@ -455,7 +455,7 @@ void store_res(LEX *lc, struct res_items *item, int index, int pass) * Note, here item points to the main resource (e.g. Job, not * the jobdefs, which we look up). */ -void store_defs(LEX *lc, struct res_items *item, int index, int pass) +void store_defs(LEX *lc, RES_ITEM *item, int index, int pass) { RES *res; @@ -485,7 +485,7 @@ void store_defs(LEX *lc, struct res_items *item, int index, int pass) /* Store an integer at specified address */ -void store_int(LEX *lc, struct res_items *item, int index, int pass) +void store_int(LEX *lc, RES_ITEM *item, int index, int pass) { lex_get_token(lc, T_INT32); *(int *)(item->value) = lc->int32_val; @@ -494,7 +494,7 @@ void store_int(LEX *lc, struct res_items *item, int index, int pass) } /* Store a positive integer at specified address */ -void store_pint(LEX *lc, struct res_items *item, int index, int pass) +void store_pint(LEX *lc, RES_ITEM *item, int index, int pass) { lex_get_token(lc, T_PINT32); *(int *)(item->value) = lc->pint32_val; @@ -504,7 +504,7 @@ void store_pint(LEX *lc, struct res_items *item, int index, int pass) /* Store an 64 bit integer at specified address */ -void store_int64(LEX *lc, struct res_items *item, int index, int pass) +void store_int64(LEX *lc, RES_ITEM *item, int index, int pass) { lex_get_token(lc, T_INT64); *(int64_t *)(item->value) = lc->int64_val; @@ -513,7 +513,7 @@ void store_int64(LEX *lc, struct res_items *item, int index, int pass) } /* Store a size in bytes */ -void store_size(LEX *lc, struct res_items *item, int index, int pass) +void store_size(LEX *lc, RES_ITEM *item, int index, int pass) { int token; uint64_t uvalue; @@ -541,7 +541,7 @@ void store_size(LEX *lc, struct res_items *item, int index, int pass) /* Store a time period in seconds */ -void store_time(LEX *lc, struct res_items *item, int index, int pass) +void store_time(LEX *lc, RES_ITEM *item, int index, int pass) { int token; utime_t utime; @@ -580,7 +580,7 @@ void store_time(LEX *lc, struct res_items *item, int index, int pass) /* Store a yes/no in a bit field */ -void store_yesno(LEX *lc, struct res_items *item, int index, int pass) +void store_yesno(LEX *lc, RES_ITEM *item, int index, int pass) { lex_get_token(lc, T_NAME); if (strcasecmp(lc->str, "yes") == 0) { @@ -689,7 +689,7 @@ parse_config(char *cf) int token, i, pass; int res_type = 0; enum parse_state state = p_none; - struct res_items *items = NULL; + RES_ITEM *items = NULL; int level = 0; /* Make two passes. The first builds the name symbol table, @@ -804,9 +804,10 @@ parse_config(char *cf) void free_config_resources() { - int i; - for (i=r_first; i<=r_last; i++) { - free_resource(i); - resources[i-r_first].res_head = NULL; + RES *res; + for (int i=r_first; i<=r_last; i++) { + res = resources[i-r_first].res_head; + free_resource(res, i); + res = NULL; } } diff --git a/bacula/src/lib/parse_conf.h b/bacula/src/lib/parse_conf.h index d216e49e2f..18761d2ee7 100644 --- a/bacula/src/lib/parse_conf.h +++ b/bacula/src/lib/parse_conf.h @@ -21,15 +21,15 @@ */ -struct res_items; /* Declare forward referenced structure */ -typedef void (MSG_RES_HANDLER)(LEX *lc, struct res_items *item, int index, int pass); +struct RES_ITEM; /* Declare forward referenced structure */ +typedef void (MSG_RES_HANDLER)(LEX *lc, RES_ITEM *item, int index, int pass); /* This is the structure that defines * the record types (items) permitted within each * resource. It is used to define the configuration * tables. */ -struct res_items { +struct RES_ITEM { const char *name; /* Resource name i.e. Director, ... */ MSG_RES_HANDLER *handler; /* Routine storing the resource item */ void **value; /* Where to store the item */ @@ -62,9 +62,9 @@ struct RES { * This is the structure that defines the * resources that are available to this daemon. */ -struct s_res { +struct RES_TABLE { const char *name; /* resource name */ - struct res_items *items; /* list of resource keywords */ + RES_ITEM *items; /* list of resource keywords */ int rcode; /* code if needed */ RES *res_head; /* where to store it */ }; @@ -106,9 +106,9 @@ RES *GetNextRes(int rcode, RES *res); void b_LockRes(const char *file, int line); void b_UnlockRes(const char *file, int line); void dump_resource(int type, RES *res, void sendmsg(void *sock, char *fmt, ...), void *sock); -void free_resource(int type); -void init_resource(int type, struct res_items *item); -void save_resource(int type, struct res_items *item, int pass); +void free_resource(RES *res, int type); +void init_resource(int type, RES_ITEM *item); +void save_resource(int type, RES_ITEM *item, int pass); const char *res_to_str(int rcode); /* Loop through each resource of type, returning in var */ @@ -121,17 +121,17 @@ const char *res_to_str(int rcode); #endif -void store_str(LEX *lc, struct res_items *item, int index, int pass); -void store_dir(LEX *lc, struct res_items *item, int index, int pass); -void store_password(LEX *lc, struct res_items *item, int index, int pass); -void store_name(LEX *lc, struct res_items *item, int index, int pass); -void store_strname(LEX *lc, struct res_items *item, int index, int pass); -void store_res(LEX *lc, struct res_items *item, int index, int pass); -void store_int(LEX *lc, struct res_items *item, int index, int pass); -void store_pint(LEX *lc, struct res_items *item, int index, int pass); -void store_msgs(LEX *lc, struct res_items *item, int index, int pass); -void store_int64(LEX *lc, struct res_items *item, int index, int pass); -void store_yesno(LEX *lc, struct res_items *item, int index, int pass); -void store_time(LEX *lc, struct res_items *item, int index, int pass); -void store_size(LEX *lc, struct res_items *item, int index, int pass); -void store_defs(LEX *lc, struct res_items *item, int index, int pass); +void store_str(LEX *lc, RES_ITEM *item, int index, int pass); +void store_dir(LEX *lc, RES_ITEM *item, int index, int pass); +void store_password(LEX *lc, RES_ITEM *item, int index, int pass); +void store_name(LEX *lc, RES_ITEM *item, int index, int pass); +void store_strname(LEX *lc, RES_ITEM *item, int index, int pass); +void store_res(LEX *lc, RES_ITEM *item, int index, int pass); +void store_int(LEX *lc, RES_ITEM *item, int index, int pass); +void store_pint(LEX *lc, RES_ITEM *item, int index, int pass); +void store_msgs(LEX *lc, RES_ITEM *item, int index, int pass); +void store_int64(LEX *lc, RES_ITEM *item, int index, int pass); +void store_yesno(LEX *lc, RES_ITEM *item, int index, int pass); +void store_time(LEX *lc, RES_ITEM *item, int index, int pass); +void store_size(LEX *lc, RES_ITEM *item, int index, int pass); +void store_defs(LEX *lc, RES_ITEM *item, int index, int pass); diff --git a/bacula/src/lib/protos.h b/bacula/src/lib/protos.h index 5351307c02..5f97e090d8 100644 --- a/bacula/src/lib/protos.h +++ b/bacula/src/lib/protos.h @@ -26,99 +26,99 @@ struct JCR; /* attr.c */ -ATTR *new_attr(); -void free_attr(ATTR *attr); -int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr); -void build_attr_output_fnames(JCR *jcr, ATTR *attr); -void print_ls_output(JCR *jcr, ATTR *attr); +ATTR *new_attr(); +void free_attr(ATTR *attr); +int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr); +void build_attr_output_fnames(JCR *jcr, ATTR *attr); +void print_ls_output(JCR *jcr, ATTR *attr); /* base64.c */ -void base64_init (void); -int to_base64 (intmax_t value, char *where); -int from_base64 (intmax_t *value, char *where); -int bin_to_base64 (char *buf, char *bin, int len); +void base64_init (void); +int to_base64 (intmax_t value, char *where); +int from_base64 (intmax_t *value, char *where); +int bin_to_base64 (char *buf, char *bin, int len); /* bsys.c */ -char *bstrncpy (char *dest, const char *src, int maxlen); -char *bstrncat (char *dest, const char *src, int maxlen); -void *b_malloc (const char *file, int line, size_t size); +char *bstrncpy (char *dest, const char *src, int maxlen); +char *bstrncat (char *dest, const char *src, int maxlen); +void *b_malloc (const 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, int32_t size, const char *format, ...); -int bvsnprintf (char *str, int32_t size, const char *format, va_list ap); -int pool_sprintf (char *pool_buf, const char *fmt, ...); -void create_pid_file (char *dir, const char *progname, int port); -int delete_pid_file (char *dir, const char *progname, int port); -void drop (char *uid, char *gid); -int bmicrosleep (time_t sec, long usec); -char *bfgets (char *s, int size, FILE *fd); -void make_unique_filename (POOLMEM **name, int Id, char *what); +void *brealloc (void *buf, size_t size); +void *bcalloc (size_t size1, size_t size2); +int bsnprintf (char *str, int32_t size, const char *format, ...); +int bvsnprintf (char *str, int32_t size, const char *format, va_list ap); +int pool_sprintf (char *pool_buf, const char *fmt, ...); +void create_pid_file (char *dir, const char *progname, int port); +int delete_pid_file (char *dir, const char *progname, int port); +void drop (char *uid, char *gid); +int bmicrosleep (time_t sec, long usec); +char *bfgets (char *s, int size, FILE *fd); +void make_unique_filename (POOLMEM **name, int Id, char *what); #ifndef HAVE_STRTOLL -long long int strtoll (const char *ptr, char **endptr, int base); +long long int strtoll (const char *ptr, char **endptr, int base); #endif void read_state_file(char *dir, const char *progname, int port); /* bnet.c */ -int32_t bnet_recv (BSOCK *bsock); -int bnet_send (BSOCK *bsock); -int bnet_fsend (BSOCK *bs, const char *fmt, ...); -int bnet_set_buffer_size (BSOCK *bs, uint32_t size, int rw); -int bnet_sig (BSOCK *bs, int sig); -int bnet_ssl_server (BSOCK *bsock, char *password, int ssl_need, int ssl_has); -int bnet_ssl_client (BSOCK *bsock, char *password, int ssl_need); -BSOCK * bnet_connect (JCR *jcr, int retry_interval, - int max_retry_time, const char *name, char *host, char *service, - int port, int verbose); -void bnet_close (BSOCK *bsock); -BSOCK * init_bsock (JCR *jcr, int sockfd, const char *who, char *ip, - int port, struct sockaddr_in *client_addr); -BSOCK * dup_bsock (BSOCK *bsock); -void term_bsock (BSOCK *bsock); -char * bnet_strerror (BSOCK *bsock); -char * bnet_sig_to_ascii (BSOCK *bsock); -int bnet_wait_data (BSOCK *bsock, int sec); -int bnet_wait_data_intr (BSOCK *bsock, int sec); -int bnet_despool_to_bsock (BSOCK *bsock); -int is_bnet_stop (BSOCK *bsock); -int is_bnet_error (BSOCK *bsock); -void bnet_suppress_error_messages(BSOCK *bsock, int flag); +int32_t bnet_recv (BSOCK *bsock); +int bnet_send (BSOCK *bsock); +int bnet_fsend (BSOCK *bs, const char *fmt, ...); +int bnet_set_buffer_size (BSOCK *bs, uint32_t size, int rw); +int bnet_sig (BSOCK *bs, int sig); +int bnet_ssl_server (BSOCK *bsock, char *password, int ssl_need, int ssl_has); +int bnet_ssl_client (BSOCK *bsock, char *password, int ssl_need); +BSOCK * bnet_connect (JCR *jcr, int retry_interval, + int max_retry_time, const char *name, char *host, char *service, + int port, int verbose); +void bnet_close (BSOCK *bsock); +BSOCK * init_bsock (JCR *jcr, int sockfd, const char *who, char *ip, + int port, struct sockaddr_in *client_addr); +BSOCK * dup_bsock (BSOCK *bsock); +void term_bsock (BSOCK *bsock); +char * bnet_strerror (BSOCK *bsock); +char * bnet_sig_to_ascii (BSOCK *bsock); +int bnet_wait_data (BSOCK *bsock, int sec); +int bnet_wait_data_intr (BSOCK *bsock, int sec); +int bnet_despool_to_bsock (BSOCK *bsock); +int is_bnet_stop (BSOCK *bsock); +int is_bnet_error (BSOCK *bsock); +void bnet_suppress_error_messages(BSOCK *bsock, int flag); /* bget_msg.c */ -int bget_msg(BSOCK *sock); +int bget_msg(BSOCK *sock); /* bpipe.c */ -BPIPE * open_bpipe(char *prog, int wait, const char *mode); -int close_wpipe(BPIPE *bpipe); -int close_bpipe(BPIPE *bpipe); +BPIPE * open_bpipe(char *prog, int wait, const char *mode); +int close_wpipe(BPIPE *bpipe); +int close_bpipe(BPIPE *bpipe); /* cram-md5.c */ int cram_md5_get_auth(BSOCK *bs, char *password, int ssl_need); int cram_md5_auth(BSOCK *bs, char *password, int ssl_need); void hmac_md5(uint8_t* text, int text_len, uint8_t* key, - int key_len, uint8_t *hmac); + int key_len, uint8_t *hmac); /* crc32.c */ uint32_t bcrc32(uint8_t *buf, int len); /* daemon.c */ -void daemon_start (); +void daemon_start (); /* edit.c */ -uint64_t str_to_uint64(char *str); -int64_t str_to_int64(char *str); -char * edit_uint64_with_commas (uint64_t val, char *buf); -char * add_commas (char *val, char *buf); -char * edit_uint64 (uint64_t val, char *buf); -int duration_to_utime (char *str, utime_t *value); -int size_to_uint64(char *str, int str_len, uint64_t *rtn_value); -char *edit_utime (utime_t val, char *buf); -int is_a_number (const char *num); -int is_an_integer (const char *n); -bool is_name_valid (char *name, POOLMEM **msg); +uint64_t str_to_uint64(char *str); +int64_t str_to_int64(char *str); +char * edit_uint64_with_commas (uint64_t val, char *buf); +char * add_commas (char *val, char *buf); +char * edit_uint64 (uint64_t val, char *buf); +int duration_to_utime (char *str, utime_t *value); +int size_to_uint64(char *str, int str_len, uint64_t *rtn_value); +char *edit_utime (utime_t val, char *buf); +int is_a_number (const char *num); +int is_an_integer (const char *n); +bool is_name_valid (char *name, POOLMEM **msg); /* jcr.c (most definitions are in src/jcr.h) */ void init_last_jobs_list(); @@ -128,40 +128,41 @@ void unlock_last_jobs_list(); void read_last_jobs_list(int fd, uint64_t addr); uint64_t write_last_jobs_list(int fd, uint64_t addr); void write_state_file(char *dir, const char *progname, int port); +void job_end_push(JCR *jcr, void job_end_cb(JCR *jcr)); /* lex.c */ -LEX * lex_close_file (LEX *lf); -LEX * lex_open_file (LEX *lf, char *fname, LEX_ERROR_HANDLER *scan_error); -int lex_get_char (LEX *lf); -void lex_unget_char (LEX *lf); -const char * lex_tok_to_str (int token); -int lex_get_token (LEX *lf, int expect); +LEX * lex_close_file (LEX *lf); +LEX * lex_open_file (LEX *lf, char *fname, LEX_ERROR_HANDLER *scan_error); +int lex_get_char (LEX *lf); +void lex_unget_char (LEX *lf); +const char * lex_tok_to_str (int token); +int lex_get_token (LEX *lf, int expect); /* message.c */ -void my_name_is (int argc, char *argv[], const char *name); -void init_msg (JCR *jcr, MSGS *msg); -void term_msg (void); -void close_msg (JCR *jcr); -void add_msg_dest (MSGS *msg, int dest, int type, char *where, char *dest_code); -void rem_msg_dest (MSGS *msg, int dest, int type, char *where); -void Jmsg (JCR *jcr, int type, int level, const char *fmt, ...); -void dispatch_message (JCR *jcr, int type, int level, char *buf); -void init_console_msg (char *wd); -void free_msgs_res (MSGS *msgs); -int open_spool_file (JCR *jcr, BSOCK *bs); -int close_spool_file (JCR *jcr, BSOCK *bs); -void dequeue_messages (JCR *jcr); +void my_name_is (int argc, char *argv[], const char *name); +void init_msg (JCR *jcr, MSGS *msg); +void term_msg (void); +void close_msg (JCR *jcr); +void add_msg_dest (MSGS *msg, int dest, int type, char *where, char *dest_code); +void rem_msg_dest (MSGS *msg, int dest, int type, char *where); +void Jmsg (JCR *jcr, int type, int level, const char *fmt, ...); +void dispatch_message (JCR *jcr, int type, int level, char *buf); +void init_console_msg (char *wd); +void free_msgs_res (MSGS *msgs); +int open_spool_file (JCR *jcr, BSOCK *bs); +int close_spool_file (JCR *jcr, BSOCK *bs); +void dequeue_messages (JCR *jcr); /* bnet_server.c */ -void bnet_thread_server(char *bind_addr, int port, int max_clients, workq_t *client_wq, - void *handle_client_request(void *bsock)); -void bnet_stop_thread_server(pthread_t tid); -void bnet_server (int port, void handle_client_request(BSOCK *bsock)); -int net_connect (int port); -BSOCK * bnet_bind (int port); -BSOCK * bnet_accept (BSOCK *bsock, char *who); +void bnet_thread_server(char *bind_addr, int port, int max_clients, workq_t *client_wq, + void *handle_client_request(void *bsock)); +void bnet_stop_thread_server(pthread_t tid); +void bnet_server (int port, void handle_client_request(BSOCK *bsock)); +int net_connect (int port); +BSOCK * bnet_bind (int port); +BSOCK * bnet_accept (BSOCK *bsock, char *who); /* idcache.c */ char *getuser(uid_t uid); @@ -171,37 +172,37 @@ void free_getgroup_cache(); /* signal.c */ -void init_signals (void terminate(int sig)); -void init_stack_dump (void); +void init_signals (void terminate(int sig)); +void init_stack_dump (void); /* scan.c */ -void strip_trailing_junk (char *str); -void strip_trailing_slashes (char *dir); -bool skip_spaces (char **msg); -bool skip_nonspaces (char **msg); -int fstrsch (char *a, char *b); -int parse_args(POOLMEM *cmd, POOLMEM **args, int *argc, - char **argk, char **argv, int max_args); -char *next_arg(char **s); +void strip_trailing_junk (char *str); +void strip_trailing_slashes (char *dir); +bool skip_spaces (char **msg); +bool skip_nonspaces (char **msg); +int fstrsch (char *a, char *b); +int parse_args(POOLMEM *cmd, POOLMEM **args, int *argc, + char **argk, char **argv, int max_args); +char *next_arg(char **s); /* util.c */ -int is_buf_zero (char *buf, int len); -void lcase (char *str); -void bash_spaces (char *str); -void unbash_spaces (char *str); -char * encode_time (time_t time, char *buf); -char * encode_mode (mode_t mode, char *buf); -int do_shell_expansion (char *name, int name_len); -void jobstatus_to_ascii (int JobStatus, char *msg, int maxlen); -int pm_strcat (POOLMEM **pm, const char *str); -int pm_strcpy (POOLMEM **pm, const char *str); -int run_program (char *prog, int wait, POOLMEM *results); -char * job_type_to_str (int type); -char * job_status_to_str (int stat); -char * job_level_to_str (int level); -void make_session_key (char *key, char *seed, int mode); -POOLMEM *edit_job_codes(JCR *jcr, char *omsg, char *imsg, const char *to); -void set_working_directory(char *wd); +int is_buf_zero (char *buf, int len); +void lcase (char *str); +void bash_spaces (char *str); +void unbash_spaces (char *str); +char * encode_time (time_t time, char *buf); +char * encode_mode (mode_t mode, char *buf); +int do_shell_expansion (char *name, int name_len); +void jobstatus_to_ascii (int JobStatus, char *msg, int maxlen); +int pm_strcat (POOLMEM **pm, const char *str); +int pm_strcpy (POOLMEM **pm, const char *str); +int run_program (char *prog, int wait, POOLMEM *results); +char * job_type_to_str (int type); +char * job_status_to_str (int stat); +char * job_level_to_str (int level); +void make_session_key (char *key, char *seed, int mode); +POOLMEM *edit_job_codes(JCR *jcr, char *omsg, char *imsg, const char *to); +void set_working_directory(char *wd); /* watchdog.c */ diff --git a/bacula/src/stored/stored_conf.c b/bacula/src/stored/stored_conf.c index 459a7d91d2..5916143e6d 100644 --- a/bacula/src/stored/stored_conf.c +++ b/bacula/src/stored/stored_conf.c @@ -50,7 +50,7 @@ int res_all_size = sizeof(res_all); */ /* Globals for the Storage daemon. */ -static struct res_items store_items[] = { +static RES_ITEM store_items[] = { {"name", store_name, ITEM(res_store.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, {"address", store_str, ITEM(res_store.address), 0, 0, 0}, /* deprecated */ @@ -69,7 +69,7 @@ static struct res_items store_items[] = { /* Directors that can speak to the Storage daemon */ -static struct res_items dir_items[] = { +static RES_ITEM dir_items[] = { {"name", store_name, ITEM(res_dir.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, {"password", store_password, ITEM(res_dir.password), 0, ITEM_REQUIRED, 0}, @@ -79,7 +79,7 @@ static struct res_items dir_items[] = { }; /* Device definition */ -static struct res_items dev_items[] = { +static RES_ITEM dev_items[] = { {"name", store_name, ITEM(res_dev.hdr.name), 0, ITEM_REQUIRED, 0}, {"description", store_str, ITEM(res_dir.hdr.desc), 0, 0, 0}, {"mediatype", store_strname,ITEM(res_dev.media_type), 0, ITEM_REQUIRED, 0}, @@ -121,11 +121,11 @@ static struct res_items dev_items[] = { /* Message resource */ -extern struct res_items msgs_items[]; +extern RES_ITEM msgs_items[]; /* This is the master resource definition */ -struct s_res resources[] = { +RES_TABLE resources[] = { {"director", dir_items, R_DIRECTOR, NULL}, {"storage", store_items, R_STORAGE, NULL}, {"device", dev_items, R_DEVICE, NULL}, @@ -234,18 +234,16 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, char *fmt, ... * resource chain is traversed. Mainly we worry about freeing * allocated strings (names). */ -void free_resource(int type) +void free_resource(RES *sres, int type) { - URES *nres; - URES *res; - int rindex = type - r_first; - res = (URES *)resources[rindex].res_head; + RES *nres; + URES *res = (URES *)sres; if (res == NULL) return; /* common stuff -- free the resource name */ - nres = (URES *)res->res_dir.hdr.next; + nres = (RES *)res->res_dir.hdr.next; if (res->res_dir.hdr.name) { free(res->res_dir.hdr.name); } @@ -312,9 +310,8 @@ void free_resource(int type) if (res) { free(res); } - resources[rindex].res_head = (RES *)nres; if (nres) { - free_resource(type); + free_resource(nres, type); } } @@ -322,7 +319,7 @@ void free_resource(int type) * the resource. If this is pass 2, we update any resource * pointers (currently only in the Job resource). */ -void save_resource(int type, struct res_items *items, int pass) +void save_resource(int type, RES_ITEM *items, int pass) { URES *res; int rindex = type - r_first; diff --git a/bacula/src/version.h b/bacula/src/version.h index 7f1599386e..9d91089a06 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -2,8 +2,8 @@ #undef VERSION #define VERSION "1.33.4" #define VSTRING "1" -#define BDATE "26 Feb 2004" -#define LSMDATE "26Feb04" +#define BDATE "27 Feb 2004" +#define LSMDATE "27Feb04" /* Debug flags */ #undef DEBUG