]> git.sur5r.net Git - bacula/bacula/commitdiff
Job end push resource resturcturing
authorKern Sibbald <kern@sibbald.com>
Fri, 27 Feb 2004 13:01:23 +0000 (13:01 +0000)
committerKern Sibbald <kern@sibbald.com>
Fri, 27 Feb 2004 13:01:23 +0000 (13:01 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1094 91ce42f0-d328-0410-95d8-f526ca767f89

16 files changed:
bacula/src/console/console_conf.c
bacula/src/dird/dird.c
bacula/src/dird/dird_conf.c
bacula/src/dird/inc_conf.c
bacula/src/dird/job.c
bacula/src/dird/run_conf.c
bacula/src/dird/ua_output.c
bacula/src/filed/filed_conf.c
bacula/src/gnome2-console/console_conf.c
bacula/src/jcr.h
bacula/src/lib/jcr.c
bacula/src/lib/parse_conf.c
bacula/src/lib/parse_conf.h
bacula/src/lib/protos.h
bacula/src/stored/stored_conf.c
bacula/src/version.h

index 9def2192791c5ce1d6656bc313f687a254e033c0..b9d4c72026e525ca3a013949bd6b2e68911873da 100644 (file)
@@ -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;
index 271a841d6dfbabff4f827fa5af4de99224ddf2e7..34aecc0e5a1ca5fc19569eb211b74b9a688a73ee 100644 (file)
@@ -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;
 
 
index d567a3bbf3f1fa4f4f06bd49a0dfa7edc3193e7b..5b3084d8bed0f59b2190a55a4dbff5c50d8c722c 100644 (file)
@@ -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=<client-name> FileSet=<FileSet-name> Level=<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=<job-id> Where=<root-directory> Replace=<options> Bootstrap=<file>
  *
  */
-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;
index 9d09e1a535b3a096051d32e5eb3ce56270cf0cbb..5b1b5c66a542323c9c4e3e6dd7164e345da1cc60 100644 (file)
 
 /* 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;
index 5b9ffd5dfce4913a32516652aa68657c5f7cba42..55788a11a67a4f1cce356d369e129dfd4ed621ed 100644 (file)
@@ -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).
index e4a54ae41109f4ccd3a852d1881b6e84136c38b6..5128af7e5458adeec9f5aa5c08a087e3eba0e890 100644 (file)
@@ -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;
index d8417e4370eda1af87795f94aea10681cc0bb1ec..f0f1eca58654a7dc63ebd9235dd577b2541781a5 100644 (file)
@@ -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;
index 4c37767bb2c55a054d5a8dd405eb90e01e4c4ed4..bade134359fccad47e3d6233b37293ff77b7af2c 100644 (file)
@@ -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;
index 6c89c3a73a19a4150a565b717c4ef3846a745f30..5e5ea86c3e08c00f014b0ab7aba4d4bc7d503609 100644 (file)
@@ -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;
index 0b3e41e8d0f6a8d505d18aecd24471898cfcb845..0a4ca14df33defb4a43e575ac3312e493aa97673 100644 (file)
@@ -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 */
index 00cd0307d9fe4964b581099d183dd5d3a201f619..62d2f6c131fdd099c0bd117a910f68ab64d4e2d9 100755 (executable)
@@ -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; i<jcr->job_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
index 642fac588afba687dddbd2bd7e7fcdff09a6f7a2..02d2a5e18307fb31a5aeeca6a05365b4150042c4 100755 (executable)
@@ -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;
    }
 }
index d216e49e2f6d7e9de82a214bf67d6e5732ec5fb1..18761d2ee7250034f1a79dc177fade85303de7bc 100644 (file)
 
  */
 
-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);
index 5351307c025d2374bf3fc4003d9cc1293d0ebb26..5f97e090d86bd4368951d23cdca05c3dd56ff008 100644 (file)
 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 */
index 459a7d91d229137c91a7542dfc3a9a44bf344fb9..5916143e6d67fd0853c32ab7938f5dc7ac41c3aa 100644 (file)
@@ -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;
index 7f1599386e886160deb0c326777492f8e8fbae68..9d91089a061360cb787dc0d12858addde7a0161f 100644 (file)
@@ -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