*
*/
/*
- Copyright (C) 2000-2005 Kern Sibbald
+ Copyright (C) 2000-2006 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 amended 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.
*/
static bool read_open_session(JCR *jcr);
static bool read_data_cmd(JCR *jcr);
static bool read_close_session(JCR *jcr);
+static bool bootstrap_cmd(JCR *jcr);
/* Exported function */
-bool bootstrap_cmd(JCR *jcr);
+bool get_bootstrap_file(JCR *jcr, BSOCK *bs);
struct s_cmds {
const char *cmd;
/* Information sent to the Director */
static char Job_start[] = "3010 Job %s start\n";
-static char Job_end[] =
+char Job_end[] =
"3099 Job %s end JobStatus=%d JobFiles=%d JobBytes=%s\n";
/*
for (i=0; fd_cmds[i].cmd; i++) {
if (strncmp(fd_cmds[i].cmd, fd->msg, strlen(fd_cmds[i].cmd)) == 0) {
found = true; /* indicate command found */
- if (!fd_cmds[i].func(jcr)) { /* do command */
+ if (!fd_cmds[i].func(jcr) || job_canceled(jcr)) { /* do command */
set_jcr_job_status(jcr, JS_ErrorTerminated);
quit = true;
}
return true;
}
-bool bootstrap_cmd(JCR *jcr)
+static bool bootstrap_cmd(JCR *jcr)
+{
+ return get_bootstrap_file(jcr, jcr->file_bsock);
+}
+
+static pthread_mutex_t bsr_mutex = PTHREAD_MUTEX_INITIALIZER;
+static uint32_t bsr_uniq = 0;
+
+bool get_bootstrap_file(JCR *jcr, BSOCK *sock)
{
- BSOCK *fd = jcr->file_bsock;
POOLMEM *fname = get_pool_memory(PM_FNAME);
FILE *bs;
bool ok = false;
unlink(jcr->RestoreBootstrap);
free_pool_memory(jcr->RestoreBootstrap);
}
- Mmsg(fname, "%s/%s.%s.bootstrap", me->working_directory, me->hdr.name,
- jcr->Job);
+ P(bsr_mutex);
+ bsr_uniq++;
+ Mmsg(fname, "%s/%s.%s.%d.bootstrap", me->working_directory, me->hdr.name,
+ jcr->Job, bsr_uniq);
+ V(bsr_mutex);
Dmsg1(400, "bootstrap=%s\n", fname);
jcr->RestoreBootstrap = fname;
- bs = fopen(fname, "a+"); /* create file */
+ bs = fopen(fname, "a+b"); /* create file */
if (!bs) {
Jmsg(jcr, M_FATAL, 0, _("Could not create bootstrap file %s: ERR=%s\n"),
jcr->RestoreBootstrap, strerror(errno));
goto bail_out;
}
- while (bnet_recv(fd) >= 0) {
- Dmsg1(400, "stored<filed: bootstrap file %s", fd->msg);
- fputs(fd->msg, bs);
+ while (bnet_recv(sock) >= 0) {
+ Dmsg1(400, "stored<filed: bootstrap file %s", sock->msg);
+ fputs(sock->msg, bs);
}
fclose(bs);
jcr->bsr = parse_bsr(jcr, jcr->RestoreBootstrap);
free_pool_memory(jcr->RestoreBootstrap);
jcr->RestoreBootstrap = NULL;
if (!ok) {
- bnet_fsend(fd, ERROR_bootstrap);
+ bnet_fsend(sock, ERROR_bootstrap);
return false;
}
- return bnet_fsend(fd, OK_bootstrap);
+ return bnet_fsend(sock, OK_bootstrap);
}