*/
/* 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},
/* 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},
* 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}
* 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;
}
/* 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;
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;
/* 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;
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
*
* 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},
*
* 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},
* 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},
*
* 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},
*
* 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},
*
* 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},
*
* 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},
*
* 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},
*
* 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},
* 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},
/* Message resource */
-extern struct res_items msgs_items[];
+extern RES_ITEM msgs_items[];
/*
* This is the master resource definition.
*
* 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},
* 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;
if (res) {
free(res);
}
- resources[rindex].res_head = nres;
if (nres) {
- free_resource(type);
+ free_resource(nres, 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;
* 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;
* 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;
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);
* 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;
*
* 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;
* 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;
/* 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);
* 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},
}
/* 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;
* 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;
/* 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;
}
/* 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;
* 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;
/*
* 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;
return;
}
-
/*
* Run a job -- typically called by the scheduler, but may also
* be called by the UA (Console program).
* 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;
/* 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;
*/
/* 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},
};
/* 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},
};
/* 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 */
* 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;
if (res) {
free(res);
}
- resources[rindex].res_head = nres;
if (nres) {
- free_resource(type);
+ free_resource(nres, 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;
* 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},
{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},
{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},
* 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},
* 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;
}
/* 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);
}
}
* 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;
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 */
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
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 */
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) {
-
/*
* Given a JobId, find the JCR
* Returns: jcr on success
*/
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.
/* 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},
* 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;
/* 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;
* 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);
* 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 */
}
/* 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) {
* 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) {
/* 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;
* 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;
* 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;
/* 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;
}
/* 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;
/* 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;
}
/* 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;
/* 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;
/* 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) {
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,
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;
}
}
*/
-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 */
* 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 */
};
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 */
#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);
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();
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);
/* 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 */
*/
/* 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 */
/* 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},
};
/* 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},
/* 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},
* 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);
}
if (res) {
free(res);
}
- resources[rindex].res_head = (RES *)nres;
if (nres) {
- free_resource(type);
+ free_resource(nres, 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;
#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