+ return true;
+
+bail_out:
+ set_jcr_job_status(jcr, JS_ErrorTerminated);
+ return false;
+
+}
+
+
+/*
+ * Send include list to File daemon
+ */
+bool send_include_list(JCR *jcr)
+{
+ BSOCK *fd = jcr->file_bsock;
+ if (jcr->fileset->new_include) {
+ bnet_fsend(fd, filesetcmd, jcr->fileset->enable_vss ? " vss=1" : "");
+ return send_fileset(jcr);
+ }
+ return true;
+}
+
+
+/*
+ * Send exclude list to File daemon
+ * Under the new scheme, the Exclude list
+ * is part of the FileSet sent with the
+ * "include_list" above.
+ */
+bool send_exclude_list(JCR *jcr)
+{
+ return true;
+}
+
+
+/*
+ * Send bootstrap file if any to the socket given (FD or SD).
+ * This is used for restore, verify VolumeToCatalog, and
+ * for migration.
+ */
+bool send_bootstrap_file(JCR *jcr, BSOCK *sock)
+{
+ FILE *bs;
+ char buf[1000];
+ const char *bootstrap = "bootstrap\n";
+
+ Dmsg1(400, "send_bootstrap_file: %s\n", jcr->RestoreBootstrap);
+ if (!jcr->RestoreBootstrap) {
+ return true;
+ }
+ bs = fopen(jcr->RestoreBootstrap, "rb");
+ if (!bs) {
+ berrno be;
+ Jmsg(jcr, M_FATAL, 0, _("Could not open bootstrap file %s: ERR=%s\n"),
+ jcr->RestoreBootstrap, be.strerror());
+ set_jcr_job_status(jcr, JS_ErrorTerminated);
+ return false;
+ }
+ bnet_fsend(sock, bootstrap);
+ while (fgets(buf, sizeof(buf), bs)) {
+ bnet_fsend(sock, "%s", buf);
+ }
+ bnet_sig(sock, BNET_EOD);
+ fclose(bs);
+ if (jcr->unlink_bsr) {
+ unlink(jcr->RestoreBootstrap);
+ jcr->unlink_bsr = false;
+ }
+ return true;
+}
+
+/* TODO: drop this with runscript.old_proto in bacula 1.42 */
+static char runbefore[] = "RunBeforeJob %s\n";
+static char runafter[] = "RunAfterJob %s\n";
+static char OKRunBefore[] = "2000 OK RunBefore\n";
+static char OKRunAfter[] = "2000 OK RunAfter\n";
+
+int send_runscript_with_old_proto(JCR *jcr, int when, POOLMEM *msg)
+{
+ int ret;
+ Dmsg1(120, "bdird: sending old runcommand to fd '%s'\n",msg);
+ if (when & SCRIPT_Before) {
+ bnet_fsend(jcr->file_bsock, runbefore, msg);
+ ret = response(jcr, jcr->file_bsock, OKRunBefore, "ClientRunBeforeJob", DISPLAY_ERROR);
+ } else {
+ bnet_fsend(jcr->file_bsock, runafter, msg);
+ ret = response(jcr, jcr->file_bsock, OKRunAfter, "ClientRunAfterJob", DISPLAY_ERROR);
+ }
+ return ret;
+} /* END OF TODO */
+
+/*
+ * Send RunScripts to File daemon
+ * 1) We send all runscript to FD, they can be executed Before, After, or twice
+ * 2) Then, we send a "RunBeforeNow" command to the FD to tell him to do the
+ * first run_script() call. (ie ClientRunBeforeJob)
+ */
+int send_runscripts_commands(JCR *jcr)
+{
+ POOLMEM *msg = get_pool_memory(PM_FNAME);
+ BSOCK *fd = jcr->file_bsock;
+ RUNSCRIPT *cmd;
+ bool launch_before_cmd = false;
+ POOLMEM *ehost = get_pool_memory(PM_FNAME);
+ int result;
+
+ Dmsg0(120, "bdird: sending runscripts to fd\n");
+
+ foreach_alist(cmd, jcr->job->RunScripts) {
+
+ if (cmd->can_run_at_level(jcr->JobLevel) && cmd->target) {
+
+ ehost = edit_job_codes(jcr, ehost, cmd->target, "");
+ Dmsg2(200, "bdird: runscript %s -> %s\n", cmd->target, ehost);
+
+ if (strcmp(ehost, jcr->client->hdr.name) == 0) {
+ pm_strcpy(msg, cmd->command);
+ bash_spaces(msg);
+
+ Dmsg1(120, "bdird: sending runscripts to fd '%s'\n", cmd->command);
+
+ /* TODO: remove this with bacula 1.42 */
+ if (cmd->old_proto) {
+ result = send_runscript_with_old_proto(jcr, cmd->when, msg);
+
+ } else {
+ bnet_fsend(fd, runscript, cmd->on_success,
+ cmd->on_failure,
+ cmd->abort_on_error,
+ cmd->when,
+ msg);
+
+ result = response(jcr, fd, OKRunScript, "RunScript", DISPLAY_ERROR);
+ launch_before_cmd=true;
+ }
+
+ if (!result) {
+ set_jcr_job_status(jcr, JS_ErrorTerminated);
+ free_pool_memory(msg);
+ free_pool_memory(ehost);
+ return 0;
+ }
+ }
+ /* TODO : we have to play with other client */
+ /*
+ else {
+ send command to an other client
+ }
+ */
+ }
+ }
+
+ /* We tell to the FD that i can execute commands (ie ClientRunBeforeJob) */
+ if (launch_before_cmd) {
+ bnet_fsend(fd, runbeforenow);
+ if (!response(jcr, fd, OKRunBeforeNow, "RunBeforeNow", DISPLAY_ERROR)) {
+ set_jcr_job_status(jcr, JS_ErrorTerminated);
+ free_pool_memory(msg);
+ free_pool_memory(ehost);
+ return 0;
+ }
+ }
+ free_pool_memory(msg);
+ free_pool_memory(ehost);