many others, a complete list can be found in the file AUTHORS.
This program is Free Software; you can redistribute it and/or
modify it under the terms of version two of the GNU General Public
- License as published by the Free Software Foundation plus additions
- that are listed in the file LICENSE.
+ License as published by the Free Software Foundation and included
+ in the file LICENSE.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
*/
int run_cmd(UAContext *ua, const char *cmd)
{
- JCR *jcr;
+ JCR *jcr = NULL;
run_ctx rc;
int i, opt;
return 0;
}
+ if (find_arg(ua, NT_("fdcalled")) > 0) {
+ jcr->file_bsock = dup_bsock(ua->UA_sock);
+ ua->quit = true;
+ }
+
+try_again:
/*
* Create JCR to run job. NOTE!!! after this point, free_jcr()
* before returning.
*/
- jcr = new_jcr(sizeof(JCR), dird_free_jcr);
- set_jcr_defaults(jcr, rc.job);
- jcr->unlink_bsr = ua->jcr->unlink_bsr; /* copy unlink flag from caller */
- ua->jcr->unlink_bsr = false;
+ if (!jcr) {
+ jcr = new_jcr(sizeof(JCR), dird_free_jcr);
+ set_jcr_defaults(jcr, rc.job);
+ jcr->unlink_bsr = ua->jcr->unlink_bsr; /* copy unlink flag from caller */
+ ua->jcr->unlink_bsr = false;
+ }
jcr->verify_job = rc.verify_job;
jcr->previous_job = rc.previous_job;
pm_strcpy(jcr->client_name, rc.client->name());
jcr->fileset = rc.fileset;
jcr->ExpectedFiles = rc.files;
- if (rc.catalog != NULL) {
+ if (rc.catalog) {
jcr->catalog = rc.catalog;
}
if (rc.where) {
free(jcr->where);
}
jcr->where = bstrdup(rc.where);
+ rc.where = NULL;
}
if (rc.regexwhere) {
free(jcr->RegexWhere);
}
jcr->RegexWhere = bstrdup(rc.regexwhere);
+ rc.regexwhere = NULL;
}
if (rc.when) {
ua->send_msg(_("Invalid time, using current time.\n"));
jcr->sched_time = time(NULL);
}
+ rc.when = NULL;
}
if (rc.bootstrap) {
free(jcr->RestoreBootstrap);
}
jcr->RestoreBootstrap = bstrdup(rc.bootstrap);
+ rc.bootstrap = NULL;
}
if (rc.replace) {
} else {
jcr->replace = REPLACE_ALWAYS;
}
+ rc.replace = NULL;
if (rc.Priority) {
jcr->JobPriority = rc.Priority;
+ rc.Priority = 0;
}
if (rc.since) {
jcr->stime = get_pool_memory(PM_MESSAGE);
}
pm_strcpy(jcr->stime, rc.since);
+ rc.since = NULL;
}
- jcr->cloned = rc.cloned;
-
- if (find_arg(ua, NT_("fdcalled")) > 0) {
- jcr->file_bsock = dup_bsock(ua->UA_sock);
- ua->quit = true;
+ if (rc.cloned) {
+ jcr->cloned = rc.cloned;
+ rc.cloned = false;
}
-try_again:
+
/* If pool changed, update migration write storage */
if (jcr->JobType == JT_MIGRATE) {
if (!set_migration_wstorage(jcr, rc.pool)) {
ua->send_msg(_("Level %s not valid.\n"), rc.level_name);
goto bail_out;
}
+ rc.level_name = NULL;
}
if (rc.jid) {
/* Note, this is also MigrateJobId */
jcr->RestoreJobId = str_to_int64(rc.jid);
+ rc.jid = 0;
}
/* Run without prompting? */
goto bail_out;
}
- if (ua->cmd[0] == '.' && strncasecmp(ua->cmd, ".mod ", 5) == 0) {
+ if (strncasecmp(ua->cmd, ".mod ", 5) == 0 ||
+ (strncasecmp(ua->cmd, "mod ", 4) == 0 && strlen(ua->cmd) > 6)) {
Dmsg1(000, "got: %s\n", ua->cmd);
parse_ua_args(ua);
rc.mod = true;
#define YES_POS 14
+ rc.catalog_name = NULL;
+ rc.job_name = NULL;
+ rc.pool_name = NULL;
+ rc.store_name = NULL;
+ rc.client_name = NULL;
+ rc.restore_client_name = NULL;
+ rc.fileset_name = NULL;
+ rc.verify_job_name = NULL;
+ rc.previous_job_name = NULL;
+
+
for (i=1; i<ua->argc; i++) {
Dmsg2(800, "Doing arg %d = %s\n", i, ua->argk[i]);
kw_ok = false;
/* Note, yes and run have no value, so do not fail */
if (!ua->argv[i] && j != YES_POS /*yes*/) {
ua->send_msg(_("Value missing for keyword %s\n"), ua->argk[i]);
- return 1;
+ return true;
}
Dmsg1(800, "Got keyword=%s\n", NPRT(kw[j]));
switch (j) {
case 0: /* job */
- if (rc.job_name && !rc.mod) {
+ if (rc.job_name) {
ua->send_msg(_("Job name specified twice.\n"));
return false;
}
break;
case 2: /* client */
case 3: /* fd */
- if (rc.client_name && !rc.mod) {
+ if (rc.client_name) {
ua->send_msg(_("Client specified twice.\n"));
return false;
}
kw_ok = true;
break;
case 4: /* fileset */
- if (rc.fileset_name && !rc.mod) {
+ if (rc.fileset_name) {
ua->send_msg(_("FileSet specified twice.\n"));
return false;
}
kw_ok = true;
break;
case 5: /* level */
- if (rc.level_name && !rc.mod) {
+ if (rc.level_name) {
ua->send_msg(_("Level specified twice.\n"));
return false;
}
break;
case 6: /* storage */
case 7: /* sd */
- if (rc.store_name && !rc.mod) {
+ if (rc.store_name) {
ua->send_msg(_("Storage specified twice.\n"));
return false;
}
kw_ok = true;
break;
case 15: /* Verify Job */
- if (rc.verify_job_name && !rc.mod) {
+ if (rc.verify_job_name) {
ua->send_msg(_("Verify Job specified twice.\n"));
return false;
}
kw_ok = true;
break;
case 21: /* Migration Job */
- if (rc.previous_job_name && !rc.mod) {
+ if (rc.previous_job_name) {
ua->send_msg(_("Migration Job specified twice.\n"));
return false;
}
kw_ok = true;
break;
case 22: /* pool */
- if (rc.pool_name && !rc.mod) {
+ if (rc.pool_name) {
ua->send_msg(_("Pool specified twice.\n"));
return false;
}
kw_ok = true;
break;
case 23: /* backupclient */
- if (rc.client_name && !rc.mod) {
+ if (rc.client_name) {
ua->send_msg(_("Client specified twice.\n"));
return 0;
}
Dmsg0(800, "Done scan.\n");
- if (rc.catalog_name != NULL) {
+ if (rc.catalog_name) {
rc.catalog = GetCatalogResWithName(rc.catalog_name);
if (rc.catalog == NULL) {
ua->error_msg(_("Catalog \"%s\" not found\n"), rc.catalog_name);
} else {
Dmsg1(800, "Found job=%s\n", rc.job_name);
}
- } else {
+ } else if (!rc.job) {
ua->send_msg(_("A job name must be specified.\n"));
rc.job = select_job_resource(ua);
}
}
rc.pool = select_pool_resource(ua);
}
- } else {
+ } else if (!rc.pool) {
rc.pool = rc.job->pool; /* use default */
}
if (!rc.pool) {
rc.store->store = select_storage_resource(ua);
pm_strcpy(rc.store->store_source, _("user selection"));
}
- } else {
+ } else if (!rc.store->store) {
get_job_storage(rc.store, rc.job, NULL); /* use default */
}
if (!rc.store->store) {
ua->error_msg(_("No storage specified.\n"));
- return true;
+ return false;
} else if (!acl_access_ok(ua, Storage_ACL, rc.store->store->name())) {
ua->error_msg(_("No authorization. Storage \"%s\".\n"),
rc.store->store->name());
}
rc.client = select_client_resource(ua);
}
- } else {
+ } else if (!rc.client) {
rc.client = rc.job->client; /* use default */
}
if (!rc.client) {
}
rc.client = select_client_resource(ua);
}
- } else {
+ } else if (!rc.client) {
rc.client = rc.job->client; /* use default */
}
if (!rc.client) {
ua->send_msg(_("FileSet \"%s\" not found.\n"), rc.fileset_name);
rc.fileset = select_fileset_resource(ua);
}
- } else {
+ } else if (!rc.fileset) {
rc.fileset = rc.job->fileset; /* use default */
}
if (!rc.fileset) {
ua->send_msg(_("Verify Job \"%s\" not found.\n"), rc.verify_job_name);
rc.verify_job = select_job_resource(ua);
}
- } else {
+ } else if (!rc.verify_job) {
rc.verify_job = rc.job->verify_job;
}