/*
- *
* Bacula Director -- restore.c -- responsible for restoring files
*
* Kern Sibbald, November MM
#include "dird.h"
/* Commands sent to File daemon */
-static char restorecmd[] = "restore replace=%c where=%s\n";
+static char restorecmd[] = "restore replace=%c prelinks=%d where=%s\n";
static char storaddr[] = "storage address=%s port=%d ssl=0\n";
static char sessioncmd[] = "session %s %ld %ld %ld %ld %ld %ld\n";
static char OKrestore[] = "2000 OK restore\n";
static char OKstore[] = "2000 OK storage\n";
static char OKsession[] = "2000 OK session\n";
-static char OKbootstrap[] = "2000 OK bootstrap\n";
/* Forward referenced functions */
static void restore_cleanup(JCR *jcr, int status);
-static int send_bootstrap_file(JCR *jcr);
/* External functions */
}
memset(&rjr, 0, sizeof(rjr));
- jcr->jr.Level = 'F'; /* Full restore */
+ jcr->jr.Level = L_FULL; /* Full restore */
jcr->jr.StartTime = jcr->start_time;
if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) {
Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
/*
* The following code is kept temporarily for compatibility.
* It is the predecessor to the Bootstrap file.
+ * DEPRECATED
*/
if (!jcr->RestoreBootstrap) {
/*
*
*/
Dmsg0(10, "Open connection with storage daemon\n");
- set_jcr_job_status(jcr, JS_Blocked);
+ set_jcr_job_status(jcr, JS_WaitSD);
/*
* Start conversation with Storage daemon
*/
/*
* Start conversation with File daemon
*/
+ set_jcr_job_status(jcr, JS_WaitFD);
if (!connect_to_file_daemon(jcr, 10, FDConnectTimeout, 1)) {
restore_cleanup(jcr, JS_ErrorTerminated);
return 0;
* then wait for File daemon to make connection
* with Storage daemon.
*/
- set_jcr_job_status(jcr, JS_Blocked);
if (jcr->store->SDDport == 0) {
jcr->store->SDDport = jcr->store->SDport;
}
restore_cleanup(jcr, JS_ErrorTerminated);
return 0;
}
- set_jcr_job_status(jcr, JS_Running);
/*
* Send the bootstrap file -- what Volumes/files to restore
}
}
+ if (!send_run_before_and_after_commands(jcr)) {
+ restore_cleanup(jcr, JS_ErrorTerminated);
+ return 0;
+ }
+
/* Send restore command */
char replace, *where;
} else {
replace = REPLACE_ALWAYS; /* always replace */
}
- if (jcr->RestoreWhere) {
- where = jcr->RestoreWhere; /* override */
+ if (jcr->where) {
+ where = jcr->where; /* override */
} else if (jcr->job->RestoreWhere) {
where = jcr->job->RestoreWhere; /* no override take from job */
} else {
where = ""; /* None */
}
+ jcr->prefix_links = jcr->job->PrefixLinks;
bash_spaces(where);
- bnet_fsend(fd, restorecmd, replace, where);
+ bnet_fsend(fd, restorecmd, replace, jcr->prefix_links, where);
unbash_spaces(where);
if (!response(jcr, fd, OKrestore, "Restore", DISPLAY_ERROR)) {
Dmsg0(20, "Leaving restore_cleanup\n");
}
-
-static int send_bootstrap_file(JCR *jcr)
-{
- FILE *bs;
- char buf[1000];
- BSOCK *fd = jcr->file_bsock;
- char *bootstrap = "bootstrap\n";
-
- Dmsg1(400, "send_bootstrap_file: %s\n", jcr->RestoreBootstrap);
- if (!jcr->RestoreBootstrap) {
- return 1;
- }
- bs = fopen(jcr->RestoreBootstrap, "r");
- if (!bs) {
- Jmsg(jcr, M_FATAL, 0, _("Could not open bootstrap file %s: ERR=%s\n"),
- jcr->RestoreBootstrap, strerror(errno));
- set_jcr_job_status(jcr, JS_ErrorTerminated);
- return 0;
- }
- strcpy(fd->msg, bootstrap);
- fd->msglen = strlen(fd->msg);
- bnet_send(fd);
- while (fgets(buf, sizeof(buf), bs)) {
- fd->msglen = Mmsg(&fd->msg, "%s", buf);
- bnet_send(fd);
- }
- bnet_sig(fd, BNET_EOD);
- fclose(bs);
- if (!response(jcr, fd, OKbootstrap, "Bootstrap", DISPLAY_ERROR)) {
- set_jcr_job_status(jcr, JS_ErrorTerminated);
- return 0;
- }
- return 1;
-}