- return 1;
-}
-
-static int date_item(JCR *jcr, int code,
- const char **val_ptr, int *val_len, int *val_size)
-{
- struct tm tm;
- time_t now = time(NULL);
- localtime_r(&now, &tm);
- int val = 0;
- char buf[10];
-
- switch (code) {
- case 1: /* year */
- val = tm.tm_year + 1900;
- break;
- case 2: /* month */
- val = tm.tm_mon + 1;
- break;
- case 3: /* day */
- val = tm.tm_mday;
- break;
- case 4: /* hour */
- val = tm.tm_hour;
- break;
- case 5: /* minute */
- val = tm.tm_min;
- break;
- case 6: /* second */
- val = tm.tm_sec;
- break;
- case 7: /* Week day */
- val = tm.tm_wday;
- break;
- }
- bsnprintf(buf, sizeof(buf), "%d", val);
- *val_ptr = bstrdup(buf);
- *val_len = strlen(buf);
- *val_size = *val_len;
- return 1;
-}
-
-static int job_item(JCR *jcr, int code,
- const char **val_ptr, int *val_len, int *val_size)
-{
- char *str = " ";
- char buf[20];
-
- switch (code) {
- case 1: /* Job */
- str = jcr->Job;
- break;
- case 2: /* Director's name */
- str = my_name;
- break;
- case 3: /* level */
- str = job_level_to_str(jcr->JobLevel);
- break;
- case 4: /* type */
- str = job_type_to_str(jcr->JobType);
- break;
- case 5: /* JobId */
- bsnprintf(buf, sizeof(buf), "%d", jcr->JobId);
- str = buf;
- break;
- case 6: /* Client */
- str = jcr->client_name;
- if (!str) {
- str = " ";
- }
- break;
- case 7: /* NumVols */
- bsnprintf(buf, sizeof(buf), "%d", jcr->NumVols);
- str = buf;
- break;
- case 8: /* Pool */
- str = jcr->client->hdr.name;
- break;
- }
- *val_ptr = bstrdup(str);
- *val_len = strlen(str);
- *val_size = *val_len;
- return 1;
-}
-
-
-struct s_built_in_vars {char *var_name; int code; int (*func)(JCR *jcr, int code,
- const char **val_ptr, int *val_len, int *val_size);};
-
-static struct s_built_in_vars built_in_vars[] = {
- { N_("Year"), 1, date_item},
- { N_("Month"), 2, date_item},
- { N_("Day"), 3, date_item},
- { N_("Hour"), 4, date_item},
- { N_("Minute"), 5, date_item},
- { N_("Second"), 6, date_item},
- { N_("WeekDay"), 7, date_item},
-
- { N_("Job"), 1, job_item},
- { N_("Dir"), 2, job_item},
- { N_("Level"), 3, job_item},
- { N_("Type"), 4, job_item},
- { N_("JobId"), 5, job_item},
- { N_("Client"), 6, job_item},
- { N_("NumVols"), 7, job_item},
- { N_("Pool"), 8, job_item},
-
- { NULL, 0, NULL}
-};
-
-
-static var_rc_t lookup_built_in_var(var_t *ctx, void *my_ctx,
- const char *var_ptr, int var_len, int var_index,
- const char **val_ptr, int *val_len, int *val_size)
-{
- JCR *jcr = (JCR *)my_ctx;
- int stat;
-
- for (int i=0; _(built_in_vars[i].var_name); i++) {
- if (strncmp(_(built_in_vars[i].var_name), var_ptr, var_len) == 0) {
- stat = (*built_in_vars[i].func)(jcr, built_in_vars[i].code,
- val_ptr, val_len, val_size);
- if (stat) {
- return VAR_OK;
- }
- break;
- }
- }
- return VAR_ERR_UNDEFINED_VARIABLE;
-}
-
-
-/*
- * Search counter variables
- */
-static var_rc_t lookup_counter_var(var_t *ctx, void *my_ctx,
- const char *var_ptr, int var_len, int var_inc, int var_index,
- const char **val_ptr, int *val_len, int *val_size)
-{
- char buf[MAXSTRING];
- var_rc_t stat = VAR_ERR_UNDEFINED_VARIABLE;
-
- if (var_len > (int)sizeof(buf) - 1) {
- return VAR_ERR_OUT_OF_MEMORY;
- }
- memcpy(buf, var_ptr, var_len);
- buf[var_len] = 0;
- LockRes();
- for (COUNTER *counter=NULL; (counter = (COUNTER *)GetNextRes(R_COUNTER, (RES *)counter)); ) {
- if (strcmp(counter->hdr.name, buf) == 0) {
- bsnprintf(buf, sizeof(buf), "%d", counter->CurrentValue);
- *val_ptr = bstrdup(buf);
- *val_len = strlen(buf);
- *val_size = *val_len;
- if (var_inc) {
- COUNTER_DBR cr;
- JCR *jcr = (JCR *)my_ctx;
- memset(&cr, 0, sizeof(cr));
- bstrncpy(cr.Counter, counter->hdr.name, sizeof(cr.Counter));
- cr.MinValue = counter->MinValue;
- cr.MaxValue = counter->MaxValue;
- cr.CurrentValue = ++counter->CurrentValue;
- bstrncpy(cr.WrapCounter, counter->WrapCounter->hdr.name, sizeof(cr.WrapCounter));
- if (!db_update_counter_record(jcr, jcr->db, &cr)) {
- Jmsg(jcr, M_ERROR, 0, _("Count not update counter %s: ERR=%s\n"),
- counter->hdr.name, db_strerror(jcr->db));
- }
- }
- stat = VAR_OK;
- break;
- }
- }
- UnlockRes();
- return stat;
-}
-
-
-/*
- * Called here to look up a variable
- */
-static var_rc_t lookup_var(var_t *ctx, void *my_ctx,
- const char *var_ptr, int var_len, int var_inc, int var_index,
- const char **val_ptr, int *val_len, int *val_size)
-{
- char buf[MAXSTRING], *val, *p, *v;
- var_rc_t stat;
- int count;
-
- if ((stat = lookup_built_in_var(ctx, my_ctx, var_ptr, var_len, var_index,
- val_ptr, val_len, val_size)) == VAR_OK) {
- return VAR_OK;
- }
-
- if ((stat = lookup_counter_var(ctx, my_ctx, var_ptr, var_len, var_inc, var_index,
- val_ptr, val_len, val_size)) == VAR_OK) {
- return VAR_OK;
- }
-
- /* Look in environment */
- if (var_len > (int)sizeof(buf) - 1) {
- return VAR_ERR_OUT_OF_MEMORY;
- }
- memcpy(buf, var_ptr, var_len + 1);
- buf[var_len] = 0;
-// Dmsg1(000, "Var=%s\n", buf);
-
- if ((val = getenv(buf)) == NULL) {
- return VAR_ERR_UNDEFINED_VARIABLE;
- }
- if (var_index == 0) {
- *val_ptr = val;
- *val_len = strlen(val);
- *val_size = 0;
- return VAR_OK;
- }
- /* He wants to index the "array" */
- count = 0;
- /* Find the size of the "array"
- * each element is separated by a |
- */
- for (p = val; *p; p++) {
- if (*p == '|') {
- count++;
- }
- }
- count++;
-// Dmsg3(000, "For %s, reqest index=%d have=%d\n",
-// buf, var_index, count);
- if (var_index < 0 || var_index > count) {
- return VAR_ERR_SUBMATCH_OUT_OF_RANGE;
- }
- /* Now find the particular item (var_index) he wants */
- count = 1;
- for (p=val; *p; ) {
- if (*p == '|') {
- if (count < var_index) {
- val = ++p;
- count++;
- continue;
- }
- break;
- }
- p++;
- }
- if (p-val > (int)sizeof(buf) - 1) {
- return VAR_ERR_OUT_OF_MEMORY;
- }
-// Dmsg2(000, "val=%s len=%d\n", val, p-val);
- /* Make a copy of item, and pass it back */
- v = (char *)malloc(p-val+1);
- memcpy(v, val, p-val);
- v[p-val] = 0;
- *val_ptr = v;
- *val_len = p-val;
- *val_size = p-val;
-// Dmsg1(000, "v=%s\n", v);
- return VAR_OK;
-}
-
-/*
- * Called here to do a special operation on a variable
- * op_ptr points to the special operation code (not EOS terminated)
- * arg_ptr points to argument to special op code
- * val_ptr points to the value string
- * out_ptr points to string to be returned
- */
-static var_rc_t operate_var(var_t *var, void *my_ctx,
- const char *op_ptr, int op_len,
- const char *arg_ptr, int arg_len,
- const char *val_ptr, int val_len,
- char **out_ptr, int *out_len, int *out_size)
-{
- var_rc_t stat = VAR_ERR_UNDEFINED_OPERATION;
- Dmsg0(000, "Enter operate_var\n");
- if (!val_ptr) {
- *out_size = 0;
- return stat;
- }
- if (op_len == 3 && strncmp(op_ptr, "inc", 3) == 0) {
- char buf[MAXSTRING];
- if (val_len > (int)sizeof(buf) - 1) {
- return VAR_ERR_OUT_OF_MEMORY;
- }
- memcpy(buf, arg_ptr, arg_len);
- buf[arg_len] = 0;
- Dmsg1(000, "Arg=%s\n", buf);
- memcpy(buf, val_ptr, val_len);
- buf[val_len] = 0;
- Dmsg1(000, "Val=%s\n", buf);
- LockRes();
- for (COUNTER *counter=NULL; (counter = (COUNTER *)GetNextRes(R_COUNTER, (RES *)counter)); ) {
- if (strcmp(counter->hdr.name, buf) == 0) {
- Dmsg2(000, "counter=%s val=%s\n", counter->hdr.name, buf);
- break;
- }
- }
- UnlockRes();
- return stat;
- }
- *out_size = 0;
- return stat;