X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_restore.c;h=2615ad2d2e53f259bae76fe279c2aa6d0672c361;hb=f5727a2417ede1709c78329eceee239a88f6bf84;hp=25438c3e1a00db20ba3092512cd78e7a9199fde5;hpb=0da0e454b2bc05001b0f4c9d151a9e57c54ff243;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_restore.c b/bacula/src/dird/ua_restore.c index 25438c3e1a..2615ad2d2e 100644 --- a/bacula/src/dird/ua_restore.c +++ b/bacula/src/dird/ua_restore.c @@ -1,38 +1,33 @@ /* * * 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" @@ -41,22 +36,22 @@ 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 */ }; @@ -67,7 +62,7 @@ struct RESTORE_CTX { 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; @@ -75,13 +70,13 @@ struct RESTORE_CTX { 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; }; @@ -105,9 +100,9 @@ static void free_rx(RESTORE_CTX *rx); 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); @@ -119,7 +114,7 @@ static int count_handler(void *ctx, int num_fields, char **row); */ int restore_cmd(UAContext *ua, const char *cmd) { - RESTORE_CTX rx; /* restore context */ + RESTORE_CTX rx; /* restore context */ JOB *job; int i; @@ -143,10 +138,10 @@ int restore_cmd(UAContext *ua, const char *cmd) 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(); @@ -164,26 +159,26 @@ int restore_cmd(UAContext *ua, const char *cmd) * 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"); @@ -208,19 +203,22 @@ int restore_cmd(UAContext *ua, const char *cmd) } /* 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 */ } @@ -267,12 +265,12 @@ static int get_client_name(UAContext *ua, RESTORE_CTX *rx) /* 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)); } @@ -285,8 +283,8 @@ static int get_client_name(UAContext *ua, RESTORE_CTX *rx) * 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) { @@ -329,7 +327,8 @@ 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 }; @@ -337,86 +336,86 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) for (i=1; iargc; 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) { @@ -434,175 +433,175 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) 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; } } @@ -620,25 +619,25 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) 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; } @@ -654,10 +653,10 @@ static int get_date(UAContext *ua, char *date, int date_len) "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")); } @@ -679,30 +678,30 @@ static void insert_one_file_or_dir(UAContext *ua, RESTORE_CTX *rx, char *date, b 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; } @@ -714,7 +713,7 @@ static void insert_one_file_or_dir(UAContext *ua, RESTORE_CTX *rx, char *date, b * 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]; @@ -722,16 +721,16 @@ static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *f 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); @@ -753,7 +752,7 @@ static bool insert_file_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *f * 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]; @@ -763,13 +762,13 @@ static bool insert_dir_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *di 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); @@ -799,12 +798,12 @@ static void split_path_and_filename(RESTORE_CTX *rx, char *name) */ 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; } @@ -816,7 +815,7 @@ static void split_path_and_filename(RESTORE_CTX *rx, char *name) 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; @@ -866,20 +865,20 @@ static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx) 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 @@ -900,16 +899,16 @@ static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx) 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]; @@ -921,8 +920,8 @@ static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx) 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); } /* @@ -930,20 +929,20 @@ static bool build_directory_tree(UAContext *ua, RESTORE_CTX *rx) * 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; } @@ -990,11 +989,11 @@ static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *dat 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")); @@ -1002,8 +1001,8 @@ static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *dat 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)); @@ -1022,7 +1021,7 @@ static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *dat 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); } @@ -1031,7 +1030,7 @@ static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *dat /* 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; @@ -1056,7 +1055,7 @@ static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *dat /* 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)); } @@ -1072,7 +1071,7 @@ static bool select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *dat /* 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)); } @@ -1108,10 +1107,10 @@ static int get_next_jobid_from_list(char **p, uint32_t *JobId) 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; @@ -1119,7 +1118,7 @@ static int get_next_jobid_from_list(char **p, uint32_t *JobId) 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); @@ -1156,7 +1155,7 @@ static int jobid_handler(void *ctx, int num_fields, char **row) 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) { @@ -1205,16 +1204,16 @@ static int unique_name_list_handler(void *ctx, int num_fields, char **row) } 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; inum_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 */ @@ -1276,10 +1275,10 @@ static void get_storage_from_mediatype(UAContext *ua, NAME_LIST *name_list, REST 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(); @@ -1289,15 +1288,15 @@ static void get_storage_from_mediatype(UAContext *ua, NAME_LIST *name_list, REST 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; } @@ -1309,6 +1308,6 @@ static void get_storage_from_mediatype(UAContext *ua, NAME_LIST *name_list, REST 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]); } }