/*
*
* Bacula Director -- User Agent Database restore Command
- * Creates a bootstrap file for restoring files and
- * starts the restore job.
+ * Creates a bootstrap file for restoring files and
+ * starts the restore job.
*
- * Tree handling routines split into ua_tree.c July MMIII.
- * BSR (bootstrap record) handling routines split into
- * bsr.c July MMIII
+ * Tree handling routines split into ua_tree.c July MMIII.
+ * BSR (bootstrap record) handling routines split into
+ * bsr.c July MMIII
*
* Kern Sibbald, July MMII
*
* Version $Id$
*/
-
/*
Copyright (C) 2002-2005 Kern Sibbald
This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of
- the License, or (at your option) any later version.
+ modify it under the terms of the GNU General Public License
+ version 2 as ammended with additional clauses defined in the
+ file LICENSE in the main source directory.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public
- License along with this program; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
- MA 02111-1307, USA.
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ the file LICENSE for additional details.
*/
+
#include "bacula.h"
#include "dird.h"
extern void print_bsr(UAContext *ua, RBSR *bsr);
/* Imported variables */
-extern char *uar_list_jobs, *uar_file, *uar_sel_files;
-extern char *uar_del_temp, *uar_del_temp1, *uar_create_temp;
-extern char *uar_create_temp1, *uar_last_full, *uar_full;
-extern char *uar_inc, *uar_list_temp, *uar_sel_jobid_temp;
+extern char *uar_list_jobs, *uar_file, *uar_sel_files;
+extern char *uar_del_temp, *uar_del_temp1, *uar_create_temp;
+extern char *uar_create_temp1, *uar_last_full, *uar_full;
+extern char *uar_inc, *uar_list_temp, *uar_sel_jobid_temp;
extern char *uar_sel_all_temp1, *uar_sel_fileset, *uar_mediatype;
-extern char *uar_jobid_fileindex, *uar_dif, *uar_sel_all_temp;
-extern char *uar_count_files, *uar_jobids_fileindex;
+extern char *uar_jobid_fileindex, *uar_dif, *uar_sel_all_temp;
+extern char *uar_count_files, *uar_jobids_fileindex;
extern char *uar_jobid_fileindex_from_dir;
struct NAME_LIST {
- char **name; /* list of names */
- int num_ids; /* ids stored */
- int max_ids; /* size of array */
- int num_del; /* number deleted */
- int tot_ids; /* total to process */
+ char **name; /* list of names */
+ int num_ids; /* ids stored */
+ int max_ids; /* size of array */
+ int num_del; /* number deleted */
+ int tot_ids; /* total to process */
};
uint32_t JobId;
char ClientName[MAX_NAME_LENGTH];
char last_jobid[20];
- POOLMEM *JobIds; /* User entered string of JobIds */
+ POOLMEM *JobIds; /* User entered string of JobIds */
STORE *store;
JOB *restore_job;
POOL *pool;
uint32_t selected_files;
char *where;
RBSR *bsr;
- POOLMEM *fname; /* filename only */
- POOLMEM *path; /* path only */
+ POOLMEM *fname; /* filename only */
+ POOLMEM *path; /* path only */
POOLMEM *query;
- int fnl; /* filename length */
- int pnl; /* path length */
+ int fnl; /* filename length */
+ int pnl; /* path length */
bool found;
- bool all; /* mark all as default */
+ bool all; /* mark all as default */
NAME_LIST name_list;
};
static void split_path_and_filename(RESTORE_CTX *rx, char *fname);
static int jobid_fileindex_handler(void *ctx, int num_fields, char **row);
static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *file,
- char *date);
+ char *date);
static bool insert_dir_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *dir,
- char *date);
+ char *date);
static void insert_one_file_or_dir(UAContext *ua, RESTORE_CTX *rx, char *date, bool dir);
static int get_client_name(UAContext *ua, RESTORE_CTX *rx);
static int get_date(UAContext *ua, char *date, int date_len);
*/
int restore_cmd(UAContext *ua, const char *cmd)
{
- RESTORE_CTX rx; /* restore context */
+ RESTORE_CTX rx; /* restore context */
JOB *job;
int i;
LockRes();
foreach_res(job, R_JOB) {
if (job->JobType == JT_RESTORE) {
- if (!rx.restore_job) {
- rx.restore_job = job;
- }
- rx.restore_jobs++;
+ if (!rx.restore_job) {
+ rx.restore_job = job;
+ }
+ rx.restore_jobs++;
}
}
UnlockRes();
* add_findex()
*/
switch (user_select_jobids_or_files(ua, &rx)) {
- case 0: /* error */
+ case 0: /* error */
goto bail_out;
- case 1: /* selected by jobid */
+ case 1: /* selected by jobid */
if (!build_directory_tree(ua, &rx)) {
bsendmsg(ua, _("Restore not done.\n"));
- goto bail_out;
+ goto bail_out;
}
break;
- case 2: /* selected by filename, no tree needed */
+ case 2: /* selected by filename, no tree needed */
break;
}
if (rx.bsr->JobId) {
- if (!complete_bsr(ua, rx.bsr)) { /* find Vol, SessId, SessTime from JobIds */
+ if (!complete_bsr(ua, rx.bsr)) { /* find Vol, SessId, SessTime from JobIds */
bsendmsg(ua, _("Unable to construct a valid BSR. Cannot continue.\n"));
- goto bail_out;
+ goto bail_out;
}
if (!(rx.selected_files = write_bsr_file(ua, rx.bsr))) {
bsendmsg(ua, _("No files selected to be restored.\n"));
- goto bail_out;
+ goto bail_out;
}
bsendmsg(ua, _("\n%u file%s selected to be restored.\n\n"), rx.selected_files,
rx.selected_files==1?"":"s");
}
/* Build run command */
+ POOLMEM *fname = get_pool_memory(PM_MESSAGE);
+ make_unique_restore_filename(ua, &fname);
if (rx.where) {
Mmsg(ua->cmd,
- "run job=\"%s\" client=\"%s\" storage=\"%s\" bootstrap=\"%s/restore.bsr\""
+ "run job=\"%s\" client=\"%s\" storage=\"%s\" bootstrap=\"%s\""
" where=\"%s\" files=%d catalog=\"%s\"",
job->hdr.name, rx.ClientName, rx.store?rx.store->hdr.name:"",
- working_directory, rx.where, rx.selected_files, ua->catalog->hdr.name);
+ fname, rx.where, rx.selected_files, ua->catalog->hdr.name);
} else {
Mmsg(ua->cmd,
- "run job=\"%s\" client=\"%s\" storage=\"%s\" bootstrap=\"%s/restore.bsr\""
+ "run job=\"%s\" client=\"%s\" storage=\"%s\" bootstrap=\"%s\""
" files=%d catalog=\"%s\"",
job->hdr.name, rx.ClientName, rx.store?rx.store->hdr.name:"",
- working_directory, rx.selected_files, ua->catalog->hdr.name);
+ fname, rx.selected_files, ua->catalog->hdr.name);
}
+ free_pool_memory(fname);
if (find_arg(ua, _("yes")) > 0) {
pm_strcat(ua->cmd, " yes"); /* pass it on to the run command */
}
/* try command line argument */
int i = find_arg_with_value(ua, _("client"));
if (i >= 0) {
- bstrncpy(rx->ClientName, ua->argv[i], sizeof(rx->ClientName));
- return 1;
+ bstrncpy(rx->ClientName, ua->argv[i], sizeof(rx->ClientName));
+ return 1;
}
memset(&cr, 0, sizeof(cr));
if (!get_client_dbr(ua, &cr)) {
- return 0;
+ return 0;
}
bstrncpy(rx->ClientName, cr.Name, sizeof(rx->ClientName));
}
* select which files are to be restored.
*
* Returns: 2 if filename list made
- * 1 if jobid list made
- * 0 on error
+ * 1 if jobid list made
+ * 0 on error
*/
static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
{
"fileset", /* 10 */
"where", /* 11 */
"yes", /* 12 */
- "done", /* 13 */
+ "bootstrap", /* 13 */
+ "done", /* 14 */
NULL
};
for (i=1; i<ua->argc; i++) { /* loop through arguments */
bool found_kw = false;
- for (j=0; kw[j]; j++) { /* loop through keywords */
- if (strcasecmp(kw[j], ua->argk[i]) == 0) {
- found_kw = true;
- break;
- }
+ for (j=0; kw[j]; j++) { /* loop through keywords */
+ if (strcasecmp(kw[j], ua->argk[i]) == 0) {
+ found_kw = true;
+ break;
+ }
}
if (!found_kw) {
bsendmsg(ua, _("Unknown keyword: %s\n"), ua->argk[i]);
- return 0;
+ return 0;
}
/* Found keyword in kw[] list, process it */
switch (j) {
- case 0: /* jobid */
- if (*rx->JobIds != 0) {
+ case 0: /* jobid */
+ if (*rx->JobIds != 0) {
pm_strcat(rx->JobIds, ",");
- }
- pm_strcat(rx->JobIds, ua->argv[i]);
- done = true;
- break;
- case 1: /* current */
- bstrutime(date, sizeof(date), time(NULL));
- have_date = true;
- break;
- case 2: /* before */
- if (str_to_utime(ua->argv[i]) == 0) {
+ }
+ pm_strcat(rx->JobIds, ua->argv[i]);
+ done = true;
+ break;
+ case 1: /* current */
+ bstrutime(date, sizeof(date), time(NULL));
+ have_date = true;
+ break;
+ case 2: /* before */
+ if (str_to_utime(ua->argv[i]) == 0) {
bsendmsg(ua, _("Improper date format: %s\n"), ua->argv[i]);
- return 0;
- }
- bstrncpy(date, ua->argv[i], sizeof(date));
- have_date = true;
- break;
- case 3: /* file */
- case 4: /* dir */
- if (!have_date) {
- bstrutime(date, sizeof(date), time(NULL));
- }
- if (!get_client_name(ua, rx)) {
- return 0;
- }
- pm_strcpy(ua->cmd, ua->argv[i]);
- insert_one_file_or_dir(ua, rx, date, j==4);
- if (rx->name_list.num_ids) {
- /* Check MediaType and select storage that corresponds */
- get_storage_from_mediatype(ua, &rx->name_list, rx);
- done = true;
- }
- break;
- case 5: /* select */
- if (!have_date) {
- bstrutime(date, sizeof(date), time(NULL));
- }
- if (!select_backups_before_date(ua, rx, date)) {
- return 0;
- }
- done = true;
- break;
- case 6: /* pool specified */
- rx->pool = (POOL *)GetResWithName(R_POOL, ua->argv[i]);
- if (!rx->pool) {
+ return 0;
+ }
+ bstrncpy(date, ua->argv[i], sizeof(date));
+ have_date = true;
+ break;
+ case 3: /* file */
+ case 4: /* dir */
+ if (!have_date) {
+ bstrutime(date, sizeof(date), time(NULL));
+ }
+ if (!get_client_name(ua, rx)) {
+ return 0;
+ }
+ pm_strcpy(ua->cmd, ua->argv[i]);
+ insert_one_file_or_dir(ua, rx, date, j==4);
+ if (rx->name_list.num_ids) {
+ /* Check MediaType and select storage that corresponds */
+ get_storage_from_mediatype(ua, &rx->name_list, rx);
+ done = true;
+ }
+ break;
+ case 5: /* select */
+ if (!have_date) {
+ bstrutime(date, sizeof(date), time(NULL));
+ }
+ if (!select_backups_before_date(ua, rx, date)) {
+ return 0;
+ }
+ done = true;
+ break;
+ case 6: /* pool specified */
+ rx->pool = (POOL *)GetResWithName(R_POOL, ua->argv[i]);
+ if (!rx->pool) {
bsendmsg(ua, _("Error: Pool resource \"%s\" does not exist.\n"), ua->argv[i]);
- return 0;
- }
- if (!acl_access_ok(ua, Pool_ACL, ua->argv[i])) {
- rx->pool = NULL;
+ return 0;
+ }
+ if (!acl_access_ok(ua, Pool_ACL, ua->argv[i])) {
+ rx->pool = NULL;
bsendmsg(ua, _("Error: Pool resource \"%s\" access not allowed.\n"), ua->argv[i]);
- return 0;
- }
- break;
- case 7: /* all specified */
- rx->all = true;
- break;
+ return 0;
+ }
+ break;
+ case 7: /* all specified */
+ rx->all = true;
+ break;
/*
* All keywords 7 or greater are ignored or handled by a select prompt
*/
default:
- break;
+ break;
}
}
if (rx->name_list.num_ids) {
- return 2; /* filename list made */
+ return 2; /* filename list made */
}
if (!done) {
start_prompt(ua, _("To select the JobIds, you have the following choices:\n"));
for (int i=0; list[i]; i++) {
- add_prompt(ua, list[i]);
+ add_prompt(ua, list[i]);
}
done = true;
switch (do_prompt(ua, "", _("Select item: "), NULL, 0)) {
- case -1: /* error */
- return 0;
- case 0: /* list last 20 Jobs run */
- gui_save = ua->jcr->gui;
- ua->jcr->gui = true;
- db_list_sql_query(ua->jcr, ua->db, uar_list_jobs, prtit, ua, 1, HORZ_LIST);
- ua->jcr->gui = gui_save;
- done = false;
- break;
- case 1: /* list where a file is saved */
- if (!get_client_name(ua, rx)) {
- return 0;
- }
+ case -1: /* error */
+ return 0;
+ case 0: /* list last 20 Jobs run */
+ gui_save = ua->jcr->gui;
+ ua->jcr->gui = true;
+ db_list_sql_query(ua->jcr, ua->db, uar_list_jobs, prtit, ua, 1, HORZ_LIST);
+ ua->jcr->gui = gui_save;
+ done = false;
+ break;
+ case 1: /* list where a file is saved */
+ if (!get_client_name(ua, rx)) {
+ return 0;
+ }
if (!get_cmd(ua, _("Enter Filename (no path):"))) {
- return 0;
- }
- len = strlen(ua->cmd);
- fname = (char *)malloc(len * 2 + 1);
- db_escape_string(fname, ua->cmd, len);
- Mmsg(rx->query, uar_file, rx->ClientName, fname);
- free(fname);
- gui_save = ua->jcr->gui;
- ua->jcr->gui = true;
- db_list_sql_query(ua->jcr, ua->db, rx->query, prtit, ua, 1, HORZ_LIST);
- ua->jcr->gui = gui_save;
- done = false;
- break;
- case 2: /* enter a list of JobIds */
+ return 0;
+ }
+ len = strlen(ua->cmd);
+ fname = (char *)malloc(len * 2 + 1);
+ db_escape_string(fname, ua->cmd, len);
+ Mmsg(rx->query, uar_file, rx->ClientName, fname);
+ free(fname);
+ gui_save = ua->jcr->gui;
+ ua->jcr->gui = true;
+ db_list_sql_query(ua->jcr, ua->db, rx->query, prtit, ua, 1, HORZ_LIST);
+ ua->jcr->gui = gui_save;
+ done = false;
+ break;
+ case 2: /* enter a list of JobIds */
if (!get_cmd(ua, _("Enter JobId(s), comma separated, to restore: "))) {
- return 0;
- }
- pm_strcpy(rx->JobIds, ua->cmd);
- break;
- case 3: /* Enter an SQL list command */
+ return 0;
+ }
+ pm_strcpy(rx->JobIds, ua->cmd);
+ break;
+ case 3: /* Enter an SQL list command */
if (!get_cmd(ua, _("Enter SQL list command: "))) {
- return 0;
- }
- gui_save = ua->jcr->gui;
- ua->jcr->gui = true;
- db_list_sql_query(ua->jcr, ua->db, ua->cmd, prtit, ua, 1, HORZ_LIST);
- ua->jcr->gui = gui_save;
- done = false;
- break;
- case 4: /* Select the most recent backups */
- bstrutime(date, sizeof(date), time(NULL));
- if (!select_backups_before_date(ua, rx, date)) {
- return 0;
- }
- break;
- case 5: /* select backup at specified time */
- if (!get_date(ua, date, sizeof(date))) {
- return 0;
- }
- if (!select_backups_before_date(ua, rx, date)) {
- return 0;
- }
- break;
- case 6: /* Enter files */
- bstrutime(date, sizeof(date), time(NULL));
- if (!get_client_name(ua, rx)) {
- return 0;
- }
+ return 0;
+ }
+ gui_save = ua->jcr->gui;
+ ua->jcr->gui = true;
+ db_list_sql_query(ua->jcr, ua->db, ua->cmd, prtit, ua, 1, HORZ_LIST);
+ ua->jcr->gui = gui_save;
+ done = false;
+ break;
+ case 4: /* Select the most recent backups */
+ bstrutime(date, sizeof(date), time(NULL));
+ if (!select_backups_before_date(ua, rx, date)) {
+ return 0;
+ }
+ break;
+ case 5: /* select backup at specified time */
+ if (!get_date(ua, date, sizeof(date))) {
+ return 0;
+ }
+ if (!select_backups_before_date(ua, rx, date)) {
+ return 0;
+ }
+ break;
+ case 6: /* Enter files */
+ bstrutime(date, sizeof(date), time(NULL));
+ if (!get_client_name(ua, rx)) {
+ return 0;
+ }
bsendmsg(ua, _("Enter file names with paths, or < to enter a filename\n"
"containg a list of file names with paths, and terminate\n"
"them with a blank line.\n"));
- for ( ;; ) {
+ for ( ;; ) {
if (!get_cmd(ua, _("Enter full filename: "))) {
- return 0;
- }
- len = strlen(ua->cmd);
- if (len == 0) {
- break;
- }
- insert_one_file_or_dir(ua, rx, date, false);
- }
- /* Check MediaType and select storage that corresponds */
- if (rx->name_list.num_ids) {
- get_storage_from_mediatype(ua, &rx->name_list, rx);
- }
- return 2;
- case 7: /* enter files backed up before specified time */
- if (!get_date(ua, date, sizeof(date))) {
- return 0;
- }
- if (!get_client_name(ua, rx)) {
- return 0;
- }
+ return 0;
+ }
+ len = strlen(ua->cmd);
+ if (len == 0) {
+ break;
+ }
+ insert_one_file_or_dir(ua, rx, date, false);
+ }
+ /* Check MediaType and select storage that corresponds */
+ if (rx->name_list.num_ids) {
+ get_storage_from_mediatype(ua, &rx->name_list, rx);
+ }
+ return 2;
+ case 7: /* enter files backed up before specified time */
+ if (!get_date(ua, date, sizeof(date))) {
+ return 0;
+ }
+ if (!get_client_name(ua, rx)) {
+ return 0;
+ }
bsendmsg(ua, _("Enter file names with paths, or < to enter a filename\n"
"containg a list of file names with paths, and terminate\n"
"them with a blank line.\n"));
- for ( ;; ) {
+ for ( ;; ) {
if (!get_cmd(ua, _("Enter full filename: "))) {
- return 0;
- }
- len = strlen(ua->cmd);
- if (len == 0) {
- break;
- }
- insert_one_file_or_dir(ua, rx, date, false);
- }
- /* Check MediaType and select storage that corresponds */
- if (rx->name_list.num_ids) {
- get_storage_from_mediatype(ua, &rx->name_list, rx);
- }
- return 2;
-
- case 8: /* Find JobIds for current backup */
- bstrutime(date, sizeof(date), time(NULL));
- if (!select_backups_before_date(ua, rx, date)) {
- return 0;
- }
- done = false;
- break;
-
- case 9: /* Find JobIds for give date */
- if (!get_date(ua, date, sizeof(date))) {
- return 0;
- }
- if (!select_backups_before_date(ua, rx, date)) {
- return 0;
- }
- done = false;
- break;
-
- case 10: /* Enter directories */
- if (*rx->JobIds != 0) {
+ return 0;
+ }
+ len = strlen(ua->cmd);
+ if (len == 0) {
+ break;
+ }
+ insert_one_file_or_dir(ua, rx, date, false);
+ }
+ /* Check MediaType and select storage that corresponds */
+ if (rx->name_list.num_ids) {
+ get_storage_from_mediatype(ua, &rx->name_list, rx);
+ }
+ return 2;
+
+ case 8: /* Find JobIds for current backup */
+ bstrutime(date, sizeof(date), time(NULL));
+ if (!select_backups_before_date(ua, rx, date)) {
+ return 0;
+ }
+ done = false;
+ break;
+
+ case 9: /* Find JobIds for give date */
+ if (!get_date(ua, date, sizeof(date))) {
+ return 0;
+ }
+ if (!select_backups_before_date(ua, rx, date)) {
+ return 0;
+ }
+ done = false;
+ break;
+
+ case 10: /* Enter directories */
+ if (*rx->JobIds != 0) {
bsendmsg(ua, _("You have already seleted the following JobIds: %s\n"),
- rx->JobIds);
+ rx->JobIds);
} else if (get_cmd(ua, _("Enter JobId(s), comma separated, to restore: "))) {
- if (*rx->JobIds != 0 && *ua->cmd) {
+ if (*rx->JobIds != 0 && *ua->cmd) {
pm_strcat(rx->JobIds, ",");
- }
- pm_strcat(rx->JobIds, ua->cmd);
- }
+ }
+ pm_strcat(rx->JobIds, ua->cmd);
+ }
if (*rx->JobIds == 0 || *rx->JobIds == '.') {
- return 0; /* nothing entered, return */
- }
- bstrutime(date, sizeof(date), time(NULL));
- if (!get_client_name(ua, rx)) {
- return 0;
- }
+ return 0; /* nothing entered, return */
+ }
+ bstrutime(date, sizeof(date), time(NULL));
+ if (!get_client_name(ua, rx)) {
+ return 0;
+ }
bsendmsg(ua, _("Enter directory names with a trailing /, or < to enter a filename\n"
"containg a list of directories and terminate\n"
"them with a blank line.\n"));
- for ( ;; ) {
+ for ( ;; ) {
if (!get_cmd(ua, _("Enter directory name: "))) {
- return 0;
- }
- len = strlen(ua->cmd);
- if (len == 0) {
- break;
- }
+ return 0;
+ }
+ len = strlen(ua->cmd);
+ if (len == 0) {
+ break;
+ }
if (ua->cmd[len-1] != '/') {
strcat(ua->cmd, "/");
- }
- insert_one_file_or_dir(ua, rx, date, true);
- }
- /* Check MediaType and select storage that corresponds */
- if (rx->name_list.num_ids) {
- get_storage_from_mediatype(ua, &rx->name_list, rx);
- }
- return 2;
-
- case 11: /* Cancel or quit */
- return 0;
+ }
+ insert_one_file_or_dir(ua, rx, date, true);
+ }
+ /* Check MediaType and select storage that corresponds */
+ if (rx->name_list.num_ids) {
+ get_storage_from_mediatype(ua, &rx->name_list, rx);
+ }
+ return 2;
+
+ case 11: /* Cancel or quit */
+ return 0;
}
}
int stat = get_next_jobid_from_list(&p, &JobId);
if (stat < 0) {
bsendmsg(ua, _("Invalid JobId in list.\n"));
- return 0;
+ return 0;
}
if (stat == 0) {
- break;
+ break;
}
if (jr.JobId == JobId) {
- continue; /* duplicate of last JobId */
+ continue; /* duplicate of last JobId */
}
jr.JobId = JobId;
if (!db_get_job_record(ua->jcr, ua->db, &jr)) {
- char ed1[50];
+ char ed1[50];
bsendmsg(ua, _("Unable to get Job record for JobId=%s: ERR=%s\n"),
- edit_int64(JobId, ed1), db_strerror(ua->db));
- return 0;
+ edit_int64(JobId, ed1), db_strerror(ua->db));
+ return 0;
}
if (!acl_access_ok(ua, Job_ACL, jr.Name)) {
bsendmsg(ua, _("No authorization. Job \"%s\" not selected.\n"),
- jr.Name);
- continue;
+ jr.Name);
+ continue;
}
rx->TotalFiles += jr.JobFiles;
}
"BEFORE the date you specify below.\n\n"));
for ( ;; ) {
if (!get_cmd(ua, _("Enter date as YYYY-MM-DD HH:MM:SS :"))) {
- return 0;
+ return 0;
}
if (str_to_utime(ua->cmd) != 0) {
- break;
+ break;
}
bsendmsg(ua, _("Improper date format.\n"));
}
case '<':
p++;
if ((ffd = fopen(p, "r")) == NULL) {
- berrno be;
+ berrno be;
bsendmsg(ua, _("Cannot open file %s: ERR=%s\n"),
- p, be.strerror());
- break;
+ p, be.strerror());
+ break;
}
while (fgets(file, sizeof(file), ffd)) {
- line++;
- if (dir) {
- if (!insert_dir_into_findex_list(ua, rx, file, date)) {
+ line++;
+ if (dir) {
+ if (!insert_dir_into_findex_list(ua, rx, file, date)) {
bsendmsg(ua, _("Error occurred on line %d of %s\n"), line, p);
- }
- } else {
- if (!insert_file_into_findex_list(ua, rx, file, date)) {
+ }
+ } else {
+ if (!insert_file_into_findex_list(ua, rx, file, date)) {
bsendmsg(ua, _("Error occurred on line %d of %s\n"), line, p);
- }
- }
+ }
+ }
}
fclose(ffd);
break;
default:
if (dir) {
- insert_dir_into_findex_list(ua, rx, ua->cmd, date);
+ insert_dir_into_findex_list(ua, rx, ua->cmd, date);
} else {
- insert_file_into_findex_list(ua, rx, ua->cmd, date);
+ insert_file_into_findex_list(ua, rx, ua->cmd, date);
}
break;
}
* and FileIndex, then insert them into the findex list.
*/
static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *file,
- char *date)
+ char *date)
{
char ed1[50];
split_path_and_filename(rx, file);
if (*rx->JobIds == 0) {
Mmsg(rx->query, uar_jobid_fileindex, date, rx->path, rx->fname,
- rx->ClientName);
+ rx->ClientName);
} else {
Mmsg(rx->query, uar_jobids_fileindex, rx->JobIds, date,
- rx->path, rx->fname, rx->ClientName);
+ rx->path, rx->fname, rx->ClientName);
}
rx->found = false;
/* Find and insert jobid and File Index */
if (!db_sql_query(ua->db, rx->query, jobid_fileindex_handler, (void *)rx)) {
bsendmsg(ua, _("Query failed: %s. ERR=%s\n"),
- rx->query, db_strerror(ua->db));
+ rx->query, db_strerror(ua->db));
}
if (!rx->found) {
bsendmsg(ua, _("No database record found for: %s\n"), file);
* to get the JobId and FileIndexes of all files in that directory.
*/
static bool insert_dir_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *dir,
- char *date)
+ char *date)
{
char ed1[50];
return false;
} else {
Mmsg(rx->query, uar_jobid_fileindex_from_dir, rx->JobIds,
- dir, rx->ClientName);
+ dir, rx->ClientName);
}
rx->found = false;
/* Find and insert jobid and File Index */
if (!db_sql_query(ua->db, rx->query, jobid_fileindex_handler, (void *)rx)) {
bsendmsg(ua, _("Query failed: %s. ERR=%s\n"),
- rx->query, db_strerror(ua->db));
+ rx->query, db_strerror(ua->db));
}
if (!rx->found) {
bsendmsg(ua, _("No database record found for: %s\n"), dir);
*/
for (p=f=name; *p; p++) {
if (*p == '/') {
- f = p; /* set pos of last slash */
+ f = p; /* set pos of last slash */
}
}
if (*f == '/') { /* did we find a slash? */
- f++; /* yes, point to filename */
- } else { /* no, whole thing must be path name */
+ f++; /* yes, point to filename */
+ } else { /* no, whole thing must be path name */
f = p;
}
rx->fnl = p - f;
if (rx->fnl > 0) {
rx->fname = check_pool_memory_size(rx->fname, rx->fnl+1);
- memcpy(rx->fname, f, rx->fnl); /* copy filename */
+ memcpy(rx->fname, f, rx->fnl); /* copy filename */
rx->fname[rx->fnl] = 0;
} else {
rx->fname[0] = 0;
bsendmsg(ua, "%s\n", db_strerror(ua->db));
}
if (rx->found) {
- /* Add about 25% more than this job for over estimate */
- tree.FileEstimate = rx->JobId + (rx->JobId >> 2);
- tree.DeltaCount = rx->JobId/50; /* print 50 ticks */
+ /* Add about 25% more than this job for over estimate */
+ tree.FileEstimate = rx->JobId + (rx->JobId >> 2);
+ tree.DeltaCount = rx->JobId/50; /* print 50 ticks */
}
}
for (p=rx->JobIds; get_next_jobid_from_list(&p, &JobId) > 0; ) {
char ed1[50];
if (JobId == last_JobId) {
- continue; /* eliminate duplicate JobIds */
+ continue; /* eliminate duplicate JobIds */
}
last_JobId = JobId;
bsendmsg(ua, _("\nBuilding directory tree for JobId %s ... "),
- edit_int64(JobId, ed1));
+ edit_int64(JobId, ed1));
items++;
/*
* Find files for this JobId and insert them in the tree
bsendmsg(ua, "\nThere were no files inserted into the tree, so file selection\n"
"is not possible.Most likely your retention policy pruned the files\n");
if (!get_yesno(ua, _("\nDo you want to restore all the files? (yes|no): "))) {
- OK = false;
+ OK = false;
} else {
- last_JobId = 0;
- for (p=rx->JobIds; get_next_jobid_from_list(&p, &JobId) > 0; ) {
- if (JobId == last_JobId) {
- continue; /* eliminate duplicate JobIds */
- }
- add_findex_all(rx->bsr, JobId);
- }
- OK = true;
+ last_JobId = 0;
+ for (p=rx->JobIds; get_next_jobid_from_list(&p, &JobId) > 0; ) {
+ if (JobId == last_JobId) {
+ continue; /* eliminate duplicate JobIds */
+ }
+ add_findex_all(rx->bsr, JobId);
+ }
+ OK = true;
}
} else {
char ec1[50];
get_storage_from_mediatype(ua, &rx->name_list, rx);
if (find_arg(ua, _("done")) < 0) {
- /* Let the user interact in selecting which files to restore */
- OK = user_select_files_from_tree(&tree);
+ /* Let the user interact in selecting which files to restore */
+ OK = user_select_files_from_tree(&tree);
}
/*
* extracted making a bootstrap file.
*/
if (OK) {
- for (TREE_NODE *node=first_tree_node(tree.root); node; node=next_tree_node(node)) {
+ for (TREE_NODE *node=first_tree_node(tree.root); node; node=next_tree_node(node)) {
Dmsg2(400, "FI=%d node=0x%x\n", node->FileIndex, node);
- if (node->extract || node->extract_dir) {
+ if (node->extract || node->extract_dir) {
Dmsg2(400, "type=%d FI=%d\n", node->type, node->FileIndex);
- add_findex(rx->bsr, node->JobId, node->FileIndex);
- if (node->extract && node->type != TN_NEWDIR) {
- rx->selected_files++; /* count only saved files */
- }
- }
- }
+ add_findex(rx->bsr, node->JobId, node->FileIndex);
+ if (node->extract && node->type != TN_NEWDIR) {
+ rx->selected_files++; /* count only saved files */
+ }
+ }
+ }
}
}
- free_tree(tree.root); /* free the directory tree */
+ free_tree(tree.root); /* free the directory tree */
return OK;
}
bstrncpy(fsr.FileSet, ua->argv[i], sizeof(fsr.FileSet));
if (!db_get_fileset_record(ua->jcr, ua->db, &fsr)) {
bsendmsg(ua, _("Error getting FileSet \"%s\": ERR=%s\n"), fsr.FileSet,
- db_strerror(ua->db));
- i = -1;
+ db_strerror(ua->db));
+ i = -1;
}
}
- if (i < 0) { /* fileset not found */
+ if (i < 0) { /* fileset not found */
edit_int64(cr.ClientId, ed1);
Mmsg(rx->query, uar_sel_fileset, ed1, ed1);
start_prompt(ua, _("The defined FileSet resources are:\n"));
bsendmsg(ua, "%s\n", db_strerror(ua->db));
}
if (do_prompt(ua, _("FileSet"), _("Select FileSet resource"),
- fileset_name, sizeof(fileset_name)) < 0) {
- goto bail_out;
+ fileset_name, sizeof(fileset_name)) < 0) {
+ goto bail_out;
}
bstrncpy(fsr.FileSet, fileset_name, sizeof(fsr.FileSet));
bstrncpy(pr.Name, rx->pool->hdr.name, sizeof(pr.Name));
if (db_get_pool_record(ua->jcr, ua->db, &pr)) {
bsnprintf(pool_select, sizeof(pool_select), "AND Media.PoolId=%s ",
- edit_int64(pr.PoolId, ed1));
+ edit_int64(pr.PoolId, ed1));
} else {
bsendmsg(ua, _("Pool \"%s\" not found, using any pool.\n"), pr.Name);
}
/* Find JobId of last Full backup for this client, fileset */
edit_int64(cr.ClientId, ed1);
Mmsg(rx->query, uar_last_full, ed1, ed1, date, fsr.FileSet,
- pool_select);
+ pool_select);
if (!db_sql_query(ua->db, rx->query, NULL, NULL)) {
bsendmsg(ua, "%s\n", db_strerror(ua->db));
goto bail_out;
/* Now find most recent Differental Job after Full save, if any */
Mmsg(rx->query, uar_dif, edit_uint64(rx->JobTDate, ed1), date,
- edit_int64(cr.ClientId, ed2), fsr.FileSet, pool_select);
+ edit_int64(cr.ClientId, ed2), fsr.FileSet, pool_select);
if (!db_sql_query(ua->db, rx->query, NULL, NULL)) {
bsendmsg(ua, "%s\n", db_strerror(ua->db));
}
/* Now find all Incremental Jobs after Full/dif save */
Mmsg(rx->query, uar_inc, edit_uint64(rx->JobTDate, ed1), date,
- edit_int64(cr.ClientId, ed2), fsr.FileSet, pool_select);
+ edit_int64(cr.ClientId, ed2), fsr.FileSet, pool_select);
if (!db_sql_query(ua->db, rx->query, NULL, NULL)) {
bsendmsg(ua, "%s\n", db_strerror(ua->db));
}
jobid[0] = 0;
for (int i=0; i<(int)sizeof(jobid); i++) {
if (*q == 0) {
- break;
+ break;
} else if (*q == ',') {
- q++;
- break;
+ q++;
+ break;
}
jobid[i] = *q++;
jobid[i+1] = 0;
if (jobid[0] == 0) {
return 0;
} else if (!is_a_number(jobid)) {
- return -1; /* error */
+ return -1; /* error */
}
*p = q;
*JobId = str_to_int64(jobid);
RESTORE_CTX *rx = (RESTORE_CTX *)ctx;
if (strcmp(rx->last_jobid, row[0]) == 0) {
- return 0; /* duplicate id */
+ return 0; /* duplicate id */
}
bstrncpy(rx->last_jobid, row[0], sizeof(rx->last_jobid));
if (rx->JobIds[0] != 0) {
}
if (name->num_ids == name->max_ids) {
if (name->max_ids == 0) {
- name->max_ids = 1000;
- name->name = (char **)bmalloc(sizeof(char *) * name->max_ids);
+ name->max_ids = 1000;
+ name->name = (char **)bmalloc(sizeof(char *) * name->max_ids);
} else {
- name->max_ids = (name->max_ids * 3) / 2;
- name->name = (char **)brealloc(name->name, sizeof(char *) * name->max_ids);
+ name->max_ids = (name->max_ids * 3) / 2;
+ name->name = (char **)brealloc(name->name, sizeof(char *) * name->max_ids);
}
}
for (int i=0; i<name->num_ids; i++) {
if (strcmp(name->name[i], row[0]) == 0) {
- return 0; /* already in list, return */
+ return 0; /* already in list, return */
}
}
/* Add new name to list */
LockRes();
foreach_res(store, R_STORAGE) {
if (strcmp(name_list->name[0], store->media_type) == 0) {
- if (acl_access_ok(ua, Storage_ACL, store->hdr.name)) {
- rx->store = store;
- }
- break;
+ if (acl_access_ok(ua, Storage_ACL, store->hdr.name)) {
+ rx->store = store;
+ }
+ break;
}
}
UnlockRes();
store = NULL;
int i = find_arg_with_value(ua, "storage");
if (i > 0) {
- store = (STORE *)GetResWithName(R_STORAGE, ua->argv[i]);
- if (store && !acl_access_ok(ua, Storage_ACL, store->hdr.name)) {
- store = NULL;
- }
+ store = (STORE *)GetResWithName(R_STORAGE, ua->argv[i]);
+ if (store && !acl_access_ok(ua, Storage_ACL, store->hdr.name)) {
+ store = NULL;
+ }
}
if (store && (store != rx->store)) {
bsendmsg(ua, _("Warning default storage overridden by %s on command line.\n"),
- store->hdr.name);
- rx->store = store;
+ store->hdr.name);
+ rx->store = store;
}
return;
}
bsendmsg(ua, _("\nWarning. Unable to find Storage resource for\n"
"MediaType \"%s\", needed by the Jobs you selected.\n"
"You will be allowed to select a Storage device later.\n"),
- name_list->name[0]);
+ name_list->name[0]);
}
}