From: Kern Sibbald Date: Tue, 21 Jun 2005 07:30:22 +0000 (+0000) Subject: - Add debug error printout when open() fails. X-Git-Tag: Release-1.38.0~350 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=81cf978dfe560008e7f8c35e53ea9ba577d36ea0;p=bacula%2Fbacula - Add debug error printout when open() fails. - If open() of DVD fails in mount.c, return false. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@2154 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/kes-1.37 b/bacula/kes-1.37 index 8a027ad2df..c0793b1a33 100644 --- a/bacula/kes-1.37 +++ b/bacula/kes-1.37 @@ -3,6 +3,11 @@ General: +Changes to 1.37.26: +21Jun05: +- Add debug error printout when open() fails. +- If open() of DVD fails in mount.c, return false. + Changes to 1.37.25 released on 20 Jun 05: 20Jun05: - Remove (cd gnome-console; make clean) from src/Makefile.in diff --git a/bacula/src/filed/job.c b/bacula/src/filed/job.c index f17f9a2385..f6c79945f9 100644 --- a/bacula/src/filed/job.c +++ b/bacula/src/filed/job.c @@ -29,9 +29,9 @@ #endif extern char my_name[]; -extern CLIENT *me; /* our client resource */ +extern CLIENT *me; /* our client resource */ -int enable_vss = 0; /* set to use vss */ +int enable_vss = 0; /* set to use vss */ /* Imported functions */ extern int status_cmd(JCR *jcr); @@ -90,7 +90,7 @@ static struct s_cmds cmds[] = { {"bootstrap", bootstrap_cmd, 0}, {"RunBeforeJob", runbefore_cmd, 0}, {"RunAfterJob", runafter_cmd, 0}, - {NULL, NULL} /* list terminator */ + {NULL, NULL} /* list terminator */ }; /* Commands received from director that need scanning */ @@ -183,37 +183,37 @@ void *handle_client_request(void *dirp) /* Read command */ if (bnet_recv(dir) < 0) { - break; /* connection terminated */ + break; /* connection terminated */ } dir->msg[dir->msglen] = 0; Dmsg1(100, "msg); found = false; for (i=0; cmds[i].cmd; i++) { - if (strncmp(cmds[i].cmd, dir->msg, strlen(cmds[i].cmd)) == 0) { - found = true; /* indicate command found */ - if (!jcr->authenticated && cmds[i].func != hello_cmd) { - bnet_fsend(dir, no_auth); - bnet_sig(dir, BNET_EOD); - break; - } - if ((jcr->authenticated) && (!cmds[i].monitoraccess) && (jcr->director->monitor)) { + if (strncmp(cmds[i].cmd, dir->msg, strlen(cmds[i].cmd)) == 0) { + found = true; /* indicate command found */ + if (!jcr->authenticated && cmds[i].func != hello_cmd) { + bnet_fsend(dir, no_auth); + bnet_sig(dir, BNET_EOD); + break; + } + if ((jcr->authenticated) && (!cmds[i].monitoraccess) && (jcr->director->monitor)) { Dmsg1(100, "Command %s illegal.\n", cmds[i].cmd); - bnet_fsend(dir, illegal_cmd); - bnet_sig(dir, BNET_EOD); - break; - } + bnet_fsend(dir, illegal_cmd); + bnet_sig(dir, BNET_EOD); + break; + } Dmsg1(100, "Executing %s command.\n", cmds[i].cmd); - if (!cmds[i].func(jcr)) { /* do command */ - quit = true; /* error or fully terminated, get out */ + if (!cmds[i].func(jcr)) { /* do command */ + quit = true; /* error or fully terminated, get out */ Dmsg1(20, "Quit command loop. Canceled=%d\n", job_canceled(jcr)); - } - break; - } + } + break; + } } - if (!found) { /* command not found */ - bnet_fsend(dir, errmsg); - quit = true; - break; + if (!found) { /* command not found */ + bnet_fsend(dir, errmsg); + quit = true; + break; } } @@ -227,7 +227,7 @@ void *handle_client_request(void *dirp) } generate_daemon_event(jcr, "JobEnd"); - dequeue_messages(jcr); /* send any queued messages */ + dequeue_messages(jcr); /* send any queued messages */ /* Inform Director that we are done */ bnet_sig(dir, BNET_TERMINATE); @@ -239,48 +239,48 @@ void *handle_client_request(void *dirp) int i, j, k; /* Delete FileSet Include lists */ for (i=0; iinclude_list.size(); i++) { - findINCEXE *incexe = (findINCEXE *)fileset->include_list.get(i); - for (j=0; jopts_list.size(); j++) { - findFOPTS *fo = (findFOPTS *)incexe->opts_list.get(j); - for (k=0; kregex.size(); k++) { - regfree((regex_t *)fo->regex.get(k)); - } - fo->regex.destroy(); - fo->regexdir.destroy(); - fo->regexfile.destroy(); - fo->wild.destroy(); - fo->wilddir.destroy(); - fo->wildfile.destroy(); - fo->base.destroy(); - fo->fstype.destroy(); - if (fo->reader) { - free(fo->reader); - } - if (fo->writer) { - free(fo->writer); - } - } - incexe->opts_list.destroy(); - incexe->name_list.destroy(); + findINCEXE *incexe = (findINCEXE *)fileset->include_list.get(i); + for (j=0; jopts_list.size(); j++) { + findFOPTS *fo = (findFOPTS *)incexe->opts_list.get(j); + for (k=0; kregex.size(); k++) { + regfree((regex_t *)fo->regex.get(k)); + } + fo->regex.destroy(); + fo->regexdir.destroy(); + fo->regexfile.destroy(); + fo->wild.destroy(); + fo->wilddir.destroy(); + fo->wildfile.destroy(); + fo->base.destroy(); + fo->fstype.destroy(); + if (fo->reader) { + free(fo->reader); + } + if (fo->writer) { + free(fo->writer); + } + } + incexe->opts_list.destroy(); + incexe->name_list.destroy(); } fileset->include_list.destroy(); /* Delete FileSet Exclude lists */ for (i=0; iexclude_list.size(); i++) { - findINCEXE *incexe = (findINCEXE *)fileset->exclude_list.get(i); - for (j=0; jopts_list.size(); j++) { - findFOPTS *fo = (findFOPTS *)incexe->opts_list.get(j); - fo->regex.destroy(); - fo->regexdir.destroy(); - fo->regexfile.destroy(); - fo->wild.destroy(); - fo->wilddir.destroy(); - fo->wildfile.destroy(); - fo->base.destroy(); - fo->fstype.destroy(); - } - incexe->opts_list.destroy(); - incexe->name_list.destroy(); + findINCEXE *incexe = (findINCEXE *)fileset->exclude_list.get(i); + for (j=0; jopts_list.size(); j++) { + findFOPTS *fo = (findFOPTS *)incexe->opts_list.get(j); + fo->regex.destroy(); + fo->regexdir.destroy(); + fo->regexfile.destroy(); + fo->wild.destroy(); + fo->wilddir.destroy(); + fo->wildfile.destroy(); + fo->base.destroy(); + fo->fstype.destroy(); + } + incexe->opts_list.destroy(); + incexe->name_list.destroy(); } fileset->exclude_list.destroy(); free(fileset); @@ -290,7 +290,7 @@ void *handle_client_request(void *dirp) term_find_files((FF_PKT *)jcr->ff); jcr->ff = NULL; Dmsg0(100, "Done with term_find_files\n"); - free_jcr(jcr); /* destroy JCR record */ + free_jcr(jcr); /* destroy JCR record */ Dmsg0(100, "Done with free_jcr\n"); return NULL; } @@ -323,20 +323,20 @@ static int cancel_cmd(JCR *jcr) if (!(cjcr=get_jcr_by_full_name(Job))) { bnet_fsend(dir, "2901 Job %s not found.\n", Job); } else { - if (cjcr->store_bsock) { - P(cjcr->mutex); - cjcr->store_bsock->timed_out = 1; - cjcr->store_bsock->terminated = 1; + if (cjcr->store_bsock) { + P(cjcr->mutex); + cjcr->store_bsock->timed_out = 1; + cjcr->store_bsock->terminated = 1; /* * #if !defined(HAVE_CYGWIN) && !defined(HAVE_WIN32) */ #if !defined(HAVE_CYGWIN) - pthread_kill(cjcr->my_thread_id, TIMEOUT_SIGNAL); + pthread_kill(cjcr->my_thread_id, TIMEOUT_SIGNAL); #endif - V(cjcr->mutex); - } - set_jcr_job_status(cjcr, JS_Canceled); - free_jcr(cjcr); + V(cjcr->mutex); + } + set_jcr_job_status(cjcr, JS_Canceled); + free_jcr(cjcr); bnet_fsend(dir, _("2001 Job %s marked to be canceled.\n"), Job); } } else { @@ -396,8 +396,8 @@ static int job_cmd(JCR *jcr) sd_auth_key = get_memory(dir->msglen); if (sscanf(dir->msg, jobcmd, &jcr->JobId, jcr->Job, - &jcr->VolSessionId, &jcr->VolSessionTime, - sd_auth_key) != 5) { + &jcr->VolSessionId, &jcr->VolSessionTime, + sd_auth_key) != 5) { pm_strcpy(jcr->errmsg, dir->msg); Jmsg(jcr, M_FATAL, 0, _("Bad Job Command: %s"), jcr->errmsg); bnet_fsend(dir, BADjob); @@ -474,13 +474,13 @@ static bool run_cmd(JCR *jcr, char *cmd, const char *name) if (bpipe == NULL) { berrno be; Jmsg(jcr, M_FATAL, 0, _("%s could not execute. ERR=%s\n"), name, - be.strerror()); + be.strerror()); return false; } while (fgets(line, sizeof(line), bpipe->rfd)) { int len = strlen(line); if (len > 0 && line[len-1] == '\n') { - line[len-1] = 0; + line[len-1] = 0; } Jmsg(jcr, M_INFO, 0, _("%s: %s\n"), name, line); } @@ -488,7 +488,7 @@ static bool run_cmd(JCR *jcr, char *cmd, const char *name) if (status != 0) { berrno be; Jmsg(jcr, M_FATAL, 0, _("%s returned non-zero status=%d. ERR=%s\n"), name, - status, be.strerror(status)); + status, be.strerror(status)); return false; } return true; @@ -557,39 +557,39 @@ static void add_file_to_fileset(JCR *jcr, const char *fname, findFILESET *filese ch = (uint8_t)*p; switch (ch) { case '|': - p++; /* skip over | */ + p++; /* skip over | */ fn = get_pool_memory(PM_FNAME); fn = edit_job_codes(jcr, fn, p, ""); bpipe = open_bpipe(fn, 0, "r"); free_pool_memory(fn); if (!bpipe) { Jmsg(jcr, M_FATAL, 0, _("Cannot run program: %s. ERR=%s\n"), - p, strerror(errno)); - return; + p, strerror(errno)); + return; } while (fgets(buf, sizeof(buf), bpipe->rfd)) { - strip_trailing_junk(buf); - fileset->incexe->name_list.append(bstrdup(buf)); + strip_trailing_junk(buf); + fileset->incexe->name_list.append(bstrdup(buf)); } if ((stat=close_bpipe(bpipe)) != 0) { Jmsg(jcr, M_FATAL, 0, _("Error running program: %s. RtnStat=%d ERR=%s\n"), - p, stat, strerror(errno)); - return; + p, stat, strerror(errno)); + return; } break; case '<': Dmsg0(100, "Doing < include on client.\n"); - p++; /* skip over < */ + p++; /* skip over < */ if ((ffd = fopen(p, "r")) == NULL) { - berrno be; + berrno be; Jmsg(jcr, M_FATAL, 0, _("Cannot open FileSet input file: %s. ERR=%s\n"), - p, be.strerror()); - return; + p, be.strerror()); + return; } while (fgets(buf, sizeof(buf), ffd)) { - strip_trailing_junk(buf); + strip_trailing_junk(buf); Dmsg1(100, "%s\n", buf); - fileset->incexe->name_list.append(bstrdup(buf)); + fileset->incexe->name_list.append(bstrdup(buf)); } fclose(ffd); break; @@ -668,27 +668,27 @@ static void add_fileset(JCR *jcr, const char *item) char prbuf[500]; preg = (regex_t *)malloc(sizeof(regex_t)); if (current_opts->flags & FO_IGNORECASE) { - rc = regcomp(preg, item, REG_EXTENDED|REG_ICASE); + rc = regcomp(preg, item, REG_EXTENDED|REG_ICASE); } else { - rc = regcomp(preg, item, REG_EXTENDED); + rc = regcomp(preg, item, REG_EXTENDED); } if (rc != 0) { - regerror(rc, preg, prbuf, sizeof(prbuf)); - regfree(preg); - free(preg); + regerror(rc, preg, prbuf, sizeof(prbuf)); + regfree(preg); + free(preg); Jmsg(jcr, M_FATAL, 0, "REGEX %s compile error. ERR=%s\n", item, prbuf); - state = state_error; - break; + state = state_error; + break; } state = state_options; if (subcode == ' ') { - current_opts->regex.append(preg); + current_opts->regex.append(preg); } else if (subcode == 'D') { - current_opts->regexdir.append(preg); + current_opts->regexdir.append(preg); } else if (subcode == 'F') { - current_opts->regexfile.append(preg); + current_opts->regexfile.append(preg); } else { - state = state_error; + state = state_error; } break; case 'B': @@ -705,13 +705,13 @@ static void add_fileset(JCR *jcr, const char *item) current_opts = start_options(ff); state = state_options; if (subcode == ' ') { - current_opts->wild.append(bstrdup(item)); + current_opts->wild.append(bstrdup(item)); } else if (subcode == 'D') { - current_opts->wilddir.append(bstrdup(item)); + current_opts->wilddir.append(bstrdup(item)); } else if (subcode == 'F') { - current_opts->wildfile.append(bstrdup(item)); + current_opts->wildfile.append(bstrdup(item)); } else { - state = state_error; + state = state_error; } break; case 'O': @@ -747,37 +747,37 @@ static bool term_fileset(JCR *jcr) findINCEXE *incexe = (findINCEXE *)fileset->include_list.get(i); Dmsg0(400, "I\n"); for (j=0; jopts_list.size(); j++) { - findFOPTS *fo = (findFOPTS *)incexe->opts_list.get(j); - for (k=0; kregex.size(); k++) { + findFOPTS *fo = (findFOPTS *)incexe->opts_list.get(j); + for (k=0; kregex.size(); k++) { Dmsg1(400, "R %s\n", (char *)fo->regex.get(k)); - } - for (k=0; kregexdir.size(); k++) { + } + for (k=0; kregexdir.size(); k++) { Dmsg1(400, "RD %s\n", (char *)fo->regexdir.get(k)); - } - for (k=0; kregexfile.size(); k++) { + } + for (k=0; kregexfile.size(); k++) { Dmsg1(400, "RF %s\n", (char *)fo->regexfile.get(k)); - } - for (k=0; kwild.size(); k++) { + } + for (k=0; kwild.size(); k++) { Dmsg1(400, "W %s\n", (char *)fo->wild.get(k)); - } - for (k=0; kwilddir.size(); k++) { + } + for (k=0; kwilddir.size(); k++) { Dmsg1(400, "WD %s\n", (char *)fo->wilddir.get(k)); - } - for (k=0; kwildfile.size(); k++) { + } + for (k=0; kwildfile.size(); k++) { Dmsg1(400, "WF %s\n", (char *)fo->wildfile.get(k)); - } - for (k=0; kbase.size(); k++) { + } + for (k=0; kbase.size(); k++) { Dmsg1(400, "B %s\n", (char *)fo->base.get(k)); - } - for (k=0; kfstype.size(); k++) { + } + for (k=0; kfstype.size(); k++) { Dmsg1(400, "X %s\n", (char *)fo->fstype.get(k)); - } - if (fo->reader) { + } + if (fo->reader) { Dmsg1(400, "D %s\n", fo->reader); - } - if (fo->writer) { + } + if (fo->writer) { Dmsg1(400, "T %s\n", fo->writer); - } + } } for (j=0; jname_list.size(); j++) { Dmsg1(400, "F %s\n", (char *)incexe->name_list.get(j)); @@ -787,31 +787,31 @@ static bool term_fileset(JCR *jcr) findINCEXE *incexe = (findINCEXE *)fileset->exclude_list.get(i); Dmsg0(400, "E\n"); for (j=0; jopts_list.size(); j++) { - findFOPTS *fo = (findFOPTS *)incexe->opts_list.get(j); - for (k=0; kregex.size(); k++) { + findFOPTS *fo = (findFOPTS *)incexe->opts_list.get(j); + for (k=0; kregex.size(); k++) { Dmsg1(400, "R %s\n", (char *)fo->regex.get(k)); - } - for (k=0; kregexdir.size(); k++) { + } + for (k=0; kregexdir.size(); k++) { Dmsg1(400, "RD %s\n", (char *)fo->regexdir.get(k)); - } - for (k=0; kregexfile.size(); k++) { + } + for (k=0; kregexfile.size(); k++) { Dmsg1(400, "RF %s\n", (char *)fo->regexfile.get(k)); - } - for (k=0; kwild.size(); k++) { + } + for (k=0; kwild.size(); k++) { Dmsg1(400, "W %s\n", (char *)fo->wild.get(k)); - } - for (k=0; kwilddir.size(); k++) { + } + for (k=0; kwilddir.size(); k++) { Dmsg1(400, "WD %s\n", (char *)fo->wilddir.get(k)); - } - for (k=0; kwildfile.size(); k++) { + } + for (k=0; kwildfile.size(); k++) { Dmsg1(400, "WF %s\n", (char *)fo->wildfile.get(k)); - } - for (k=0; kbase.size(); k++) { + } + for (k=0; kbase.size(); k++) { Dmsg1(400, "B %s\n", (char *)fo->base.get(k)); - } - for (k=0; kfstype.size(); k++) { + } + for (k=0; kfstype.size(); k++) { Dmsg1(400, "X %s\n", (char *)fo->fstype.get(k)); - } + } } for (j=0; jname_list.size(); j++) { Dmsg1(400, "F %s\n", (char *)incexe->name_list.get(j)); @@ -835,72 +835,72 @@ static void set_options(findFOPTS *fo, const char *opts) switch (*p) { case 'a': /* alway replace */ case '0': /* no option */ - break; + break; case 'e': - fo->flags |= FO_EXCLUDE; - break; + fo->flags |= FO_EXCLUDE; + break; case 'f': - fo->flags |= FO_MULTIFS; - break; + fo->flags |= FO_MULTIFS; + break; case 'h': /* no recursion */ - fo->flags |= FO_NO_RECURSION; - break; + fo->flags |= FO_NO_RECURSION; + break; case 'H': /* no hard link handling */ - fo->flags |= FO_NO_HARDLINK; - break; + fo->flags |= FO_NO_HARDLINK; + break; case 'i': - fo->flags |= FO_IGNORECASE; - break; + fo->flags |= FO_IGNORECASE; + break; case 'M': /* MD5 */ - fo->flags |= FO_MD5; - break; + fo->flags |= FO_MD5; + break; case 'n': - fo->flags |= FO_NOREPLACE; - break; + fo->flags |= FO_NOREPLACE; + break; case 'p': /* use portable data format */ - fo->flags |= FO_PORTABLE; - break; + fo->flags |= FO_PORTABLE; + break; case 'R': /* Resource forks and Finder Info */ - fo->flags |= FO_HFSPLUS; + fo->flags |= FO_HFSPLUS; case 'r': /* read fifo */ - fo->flags |= FO_READFIFO; - break; + fo->flags |= FO_READFIFO; + break; case 'S': - fo->flags |= FO_SHA1; - break; + fo->flags |= FO_SHA1; + break; case 's': - fo->flags |= FO_SPARSE; - break; + fo->flags |= FO_SPARSE; + break; case 'm': - fo->flags |= FO_MTIMEONLY; - break; + fo->flags |= FO_MTIMEONLY; + break; case 'k': - fo->flags |= FO_KEEPATIME; - break; + fo->flags |= FO_KEEPATIME; + break; case 'A': - fo->flags |= FO_ACL; - break; + fo->flags |= FO_ACL; + break; case 'V': /* verify options */ - /* Copy Verify Options */ + /* Copy Verify Options */ for (j=0; *p && *p != ':'; p++) { - fo->VerifyOpts[j] = *p; - if (j < (int)sizeof(fo->VerifyOpts) - 1) { - j++; - } - } - fo->VerifyOpts[j] = 0; - break; + fo->VerifyOpts[j] = *p; + if (j < (int)sizeof(fo->VerifyOpts) - 1) { + j++; + } + } + fo->VerifyOpts[j] = 0; + break; case 'w': - fo->flags |= FO_IF_NEWER; - break; + fo->flags |= FO_IF_NEWER; + break; case 'Z': /* gzip compression */ - fo->flags |= FO_GZIP; + fo->flags |= FO_GZIP; fo->GZIP_level = *++p - '0'; Dmsg1(200, "Compression level=%d\n", fo->GZIP_level); - break; + break; default: Emsg1(M_ERROR, 0, "Unknown include/exclude option: %c\n", *p); - break; + break; } } } @@ -958,10 +958,10 @@ static int bootstrap_cmd(JCR *jcr) * read our error message. */ while (bnet_recv(dir) >= 0) - { } + { } Jmsg(jcr, M_FATAL, 0, _("Could not create bootstrap file %s: ERR=%s\n"), - jcr->RestoreBootstrap, be.strerror()); + jcr->RestoreBootstrap, be.strerror()); free_pool_memory(jcr->RestoreBootstrap); jcr->RestoreBootstrap = NULL; set_jcr_job_status(jcr, JS_ErrorTerminated); @@ -1009,54 +1009,54 @@ static int level_cmd(JCR *jcr) return 1; /* * We get his UTC since time, then sync the clocks and correct it - * to agree with our clock. + * to agree with our clock. */ } else if (strcmp(level, "since_utime") == 0) { buf = get_memory(dir->msglen+1); utime_t since_time, adj; btime_t his_time, bt_start, rt=0, bt_adj=0; if (jcr->JobLevel == L_NONE) { - jcr->JobLevel = L_SINCE; /* if no other job level set, do it now */ + jcr->JobLevel = L_SINCE; /* if no other job level set, do it now */ } if (sscanf(dir->msg, "level = since_utime %s mtime_only=%d", - buf, &mtime_only) != 2) { - goto bail_out; + buf, &mtime_only) != 2) { + goto bail_out; } - since_time = str_to_uint64(buf); /* this is the since time */ + since_time = str_to_uint64(buf); /* this is the since time */ char ed1[50], ed2[50]; /* * Sync clocks by polling him for the time. We take * 10 samples of his time throwing out the first two. */ for (int i=0; i<10; i++) { - bt_start = get_current_btime(); - bnet_sig(dir, BNET_BTIME); /* poll for time */ - if (bnet_recv(dir) <= 0) { /* get response */ - goto bail_out; - } + bt_start = get_current_btime(); + bnet_sig(dir, BNET_BTIME); /* poll for time */ + if (bnet_recv(dir) <= 0) { /* get response */ + goto bail_out; + } if (sscanf(dir->msg, "btime %s", buf) != 1) { - goto bail_out; - } - if (i < 2) { /* toss first two results */ - continue; - } - his_time = str_to_uint64(buf); - rt = get_current_btime() - bt_start; /* compute round trip time */ - bt_adj -= his_time - bt_start - rt/2; + goto bail_out; + } + if (i < 2) { /* toss first two results */ + continue; + } + his_time = str_to_uint64(buf); + rt = get_current_btime() - bt_start; /* compute round trip time */ + bt_adj -= his_time - bt_start - rt/2; Dmsg2(200, "rt=%s adj=%s\n", edit_uint64(rt, ed1), edit_uint64(bt_adj, ed2)); } - bt_adj = bt_adj / 8; /* compute average time */ + bt_adj = bt_adj / 8; /* compute average time */ Dmsg2(100, "rt=%s adj=%s\n", edit_uint64(rt, ed1), edit_uint64(bt_adj, ed2)); adj = btime_to_utime(bt_adj); - since_time += adj; /* adjust for clock difference */ + since_time += adj; /* adjust for clock difference */ if (adj != 0) { Jmsg(jcr, M_INFO, 0, _("DIR and FD clocks differ by %d seconds, FD automatically adjusting.\n"), adj); } bnet_sig(dir, BNET_EOD); Dmsg2(100, "adj = %d since_time=%d\n", (int)adj, (int)since_time); - jcr->incremental = 1; /* set incremental or decremental backup */ + jcr->incremental = 1; /* set incremental or decremental backup */ jcr->mtime = (time_t)since_time; /* set since time */ } else { Jmsg1(jcr, M_FATAL, 0, "Unknown backup level: %s\n", level); @@ -1088,9 +1088,9 @@ static int session_cmd(JCR *jcr) Dmsg1(100, "SessionCmd: %s", dir->msg); if (sscanf(dir->msg, sessioncmd, jcr->VolumeName, - &jcr->VolSessionId, &jcr->VolSessionTime, - &jcr->StartFile, &jcr->EndFile, - &jcr->StartBlock, &jcr->EndBlock) != 7) { + &jcr->VolSessionId, &jcr->VolSessionTime, + &jcr->StartFile, &jcr->EndFile, + &jcr->StartBlock, &jcr->EndBlock) != 7) { pm_strcpy(jcr->errmsg, dir->msg); Jmsg(jcr, M_FATAL, 0, "Bad session command: %s", jcr->errmsg); return 0; @@ -1105,10 +1105,10 @@ static int session_cmd(JCR *jcr) */ static int storage_cmd(JCR *jcr) { - int stored_port; /* storage daemon port */ - int enable_ssl; /* enable ssl to sd */ + int stored_port; /* storage daemon port */ + int enable_ssl; /* enable ssl to sd */ BSOCK *dir = jcr->dir_bsock; - BSOCK *sd; /* storage daemon bsock */ + BSOCK *sd; /* storage daemon bsock */ Dmsg1(100, "StorageCmd: %s", dir->msg); if (sscanf(dir->msg, storaddr, &jcr->stored_addr, &stored_port, &enable_ssl) != 3) { @@ -1120,12 +1120,12 @@ static int storage_cmd(JCR *jcr) /* Open command communications with Storage daemon */ /* Try to connect for 1 hour at 10 second intervals */ sd = bnet_connect(jcr, 10, (int)me->SDConnectTimeout, _("Storage daemon"), - jcr->stored_addr, NULL, stored_port, 1); + jcr->stored_addr, NULL, stored_port, 1); if (sd == NULL) { Jmsg(jcr, M_FATAL, 0, _("Failed to connect to Storage daemon: %s:%d\n"), - jcr->stored_addr, stored_port); + jcr->stored_addr, stored_port); Dmsg2(100, "Failed to connect to Storage daemon: %s:%d\n", - jcr->stored_addr, stored_port); + jcr->stored_addr, stored_port); return 0; } Dmsg0(110, "Connection OK to SD.\n"); @@ -1179,7 +1179,7 @@ static int backup_cmd(JCR *jcr) Dmsg1(110, "msg); if (sscanf(sd->msg, OK_open, &jcr->Ticket) != 1) { Jmsg(jcr, M_FATAL, 0, _("Bad response to append open: %s\n"), sd->msg); - goto cleanup; + goto cleanup; } Dmsg1(110, "Got Ticket=%d\n", jcr->Ticket); } else { @@ -1207,30 +1207,31 @@ static int backup_cmd(JCR *jcr) /* START VSS ON WIN 32 */ if (g_pVSSClient && enable_vss == 1) { if (g_pVSSClient->InitializeForBackup()) { - /* tell vss which drives to snapshot */ - char szWinDriveLetters[27]; - if (get_win32_driveletters((FF_PKT *)jcr->ff, szWinDriveLetters)) { + /* tell vss which drives to snapshot */ + char szWinDriveLetters[27]; + if (get_win32_driveletters((FF_PKT *)jcr->ff, szWinDriveLetters)) { Jmsg(jcr, M_INFO, 0, _("Generate VSS snapshots. Driver=\"%s\", Drive(s)=\"%s\"\n"), g_pVSSClient->GetDriverName(), szWinDriveLetters); - if (!g_pVSSClient->CreateSnapshots(szWinDriveLetters)) { + if (!g_pVSSClient->CreateSnapshots(szWinDriveLetters)) { Jmsg(jcr, M_WARNING, 0, _("Generate VSS snapshots failed\n")); - } - else { - /* tell user if snapshot creation of a specific drive failed */ - for (size_t i=0; iGetWriterCount(); i++) { - int msg_type = M_INFO; - if (g_pVSSClient->GetWriterState(i) < 0) - msg_type = M_WARNING; + } + /* inform user about writer states */ + for (i=0; iGetWriterCount(); i++) { + int msg_type = M_INFO; + if (g_pVSSClient->GetWriterState(i) < 0) + msg_type = M_WARNING; Jmsg(jcr, msg_type, 0, _("VSS Writer: %s\n"), g_pVSSClient->GetWriterInfo(i)); - } - } - } + } + } + } } else { Jmsg(jcr, M_WARNING, 0, _("VSS was not initialized properly. VSS support is disabled.")); } @@ -1244,20 +1245,20 @@ static int backup_cmd(JCR *jcr) if (!blast_data_to_storage_daemon(jcr, NULL)) { set_jcr_job_status(jcr, JS_ErrorTerminated); bnet_suppress_error_messages(sd, 1); - bget_msg(sd); /* Read final response from append_data */ + bget_msg(sd); /* Read final response from append_data */ Dmsg0(110, "Error in blast_data.\n"); } else { set_jcr_job_status(jcr, JS_Terminated); if (jcr->JobStatus != JS_Terminated) { - bnet_suppress_error_messages(sd, 1); - goto cleanup; /* bail out now */ + bnet_suppress_error_messages(sd, 1); + goto cleanup; /* bail out now */ } /* * Expect to get response to append_data from Storage daemon */ if (!response(jcr, sd, OK_append, "Append Data")) { - set_jcr_job_status(jcr, JS_ErrorTerminated); - goto cleanup; + set_jcr_job_status(jcr, JS_ErrorTerminated); + goto cleanup; } /* @@ -1266,8 +1267,8 @@ static int backup_cmd(JCR *jcr) bnet_fsend(sd, append_end, jcr->Ticket); /* Get end OK */ if (!response(jcr, sd, OK_end, "Append End")) { - set_jcr_job_status(jcr, JS_ErrorTerminated); - goto cleanup; + set_jcr_job_status(jcr, JS_ErrorTerminated); + goto cleanup; } /* @@ -1275,18 +1276,18 @@ static int backup_cmd(JCR *jcr) */ bnet_fsend(sd, append_close, jcr->Ticket); while (bget_msg(sd) >= 0) { /* stop on signal or error */ - if (sscanf(sd->msg, OK_close, &SDJobStatus) == 1) { - ok = 1; + if (sscanf(sd->msg, OK_close, &SDJobStatus) == 1) { + ok = 1; Dmsg2(200, "SDJobStatus = %d %c\n", SDJobStatus, (char)SDJobStatus); - } + } } if (!ok) { Jmsg(jcr, M_FATAL, 0, _("Append Close with SD failed.\n")); - goto cleanup; + goto cleanup; } if (SDJobStatus != JS_Terminated) { Jmsg(jcr, M_FATAL, 0, _("Bad status %d returned from Storage Daemon.\n"), - SDJobStatus); + SDJobStatus); } } @@ -1303,7 +1304,7 @@ cleanup: edit_uint64(jcr->JobBytes, ed2), jcr->Errors); Dmsg1(110, "End FD msg: %s\n", dir->msg); - return 0; /* return and stop command loop */ + return 0; /* return and stop command loop */ } /* @@ -1350,7 +1351,7 @@ static int verify_cmd(JCR *jcr) break; case L_VERIFY_VOLUME_TO_CATALOG: if (!open_sd_read_session(jcr)) { - return 0; + return 0; } start_dir_heartbeat(jcr); do_verify_volume(jcr); @@ -1362,7 +1363,7 @@ static int verify_cmd(JCR *jcr) Dmsg1(130, "bfiled>stored: %s", sd->msg); /* ****FIXME**** check response */ - bget_msg(sd); /* get OK */ + bget_msg(sd); /* get OK */ /* Inform Storage daemon that we are done */ bnet_sig(sd, BNET_TERMINATE); @@ -1385,7 +1386,7 @@ static int verify_cmd(JCR *jcr) /* Inform Director that we are done */ bnet_sig(dir, BNET_TERMINATE); - return 0; /* return and terminate command loop */ + return 0; /* return and terminate command loop */ } /* @@ -1411,9 +1412,9 @@ static int restore_cmd(JCR *jcr) if (sscanf(dir->msg, restorecmd, &replace, &prefix_links, where) != 3) { if (sscanf(dir->msg, restorecmd1, &replace, &prefix_links) != 2) { - pm_strcpy(jcr->errmsg, dir->msg); + pm_strcpy(jcr->errmsg, dir->msg); Jmsg(jcr, M_FATAL, 0, _("Bad replace command. CMD=%s\n"), jcr->errmsg); - return 0; + return 0; } *where = 0; } @@ -1462,7 +1463,7 @@ static int restore_cmd(JCR *jcr) bnet_fsend(sd, read_close, jcr->Ticket); Dmsg1(130, "bfiled>stored: %s", sd->msg); - bget_msg(sd); /* get OK */ + bget_msg(sd); /* get OK */ /* Inform Storage daemon that we are done */ bnet_sig(sd, BNET_TERMINATE); @@ -1481,7 +1482,7 @@ bail_out: bnet_sig(dir, BNET_TERMINATE); Dmsg0(130, "Done in job.c\n"); - return 0; /* return and terminate command loop */ + return 0; /* return and terminate command loop */ } static int open_sd_read_session(JCR *jcr) @@ -1510,7 +1511,7 @@ static int open_sd_read_session(JCR *jcr) Dmsg1(110, "bfiledmsg); if (sscanf(sd->msg, OK_open, &jcr->Ticket) != 1) { Jmsg(jcr, M_FATAL, 0, _("Bad response to SD read open: %s\n"), sd->msg); - return 0; + return 0; } Dmsg1(110, "bfiled: got Ticket=%d\n", jcr->Ticket); } else { @@ -1567,7 +1568,7 @@ static void filed_free_jcr(JCR *jcr) * sent. Check that the response is OK. * * Returns: 0 on failure - * 1 on success + * 1 on success */ int response(JCR *jcr, BSOCK *sd, char *resp, const char *cmd) { @@ -1577,18 +1578,18 @@ int response(JCR *jcr, BSOCK *sd, char *resp, const char *cmd) if (bget_msg(sd) > 0) { Dmsg0(110, sd->msg); if (strcmp(sd->msg, resp) == 0) { - return 1; + return 1; } } if (job_canceled(jcr)) { - return 0; /* if canceled avoid useless error messages */ + return 0; /* if canceled avoid useless error messages */ } if (is_bnet_error(sd)) { Jmsg2(jcr, M_FATAL, 0, _("Comm error with SD. bad response to %s. ERR=%s\n"), - cmd, bnet_strerror(sd)); + cmd, bnet_strerror(sd)); } else { Jmsg3(jcr, M_FATAL, 0, _("Bad response to %s command. Wanted %s, got %s\n"), - cmd, resp, sd->msg); + cmd, resp, sd->msg); } return 0; } @@ -1609,7 +1610,7 @@ static int send_bootstrap_file(JCR *jcr) if (!bs) { berrno be; Jmsg(jcr, M_FATAL, 0, _("Could not open bootstrap file %s: ERR=%s\n"), - jcr->RestoreBootstrap, be.strerror()); + jcr->RestoreBootstrap, be.strerror()); set_jcr_job_status(jcr, JS_ErrorTerminated); goto bail_out; } diff --git a/bacula/src/stored/dev.c b/bacula/src/stored/dev.c index b9bc31921a..7f7f59124a 100644 --- a/bacula/src/stored/dev.c +++ b/bacula/src/stored/dev.c @@ -444,12 +444,13 @@ static void open_file_device(DEVICE *dev, int mode) Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n")); } /* If creating file, give 0640 permissions */ - Dmsg2(29, "open(%s, 0x%x, 0640)\n", archive_name.c_str(), dev->mode); + Dmsg3(29, "mode=%d open(%s, 0x%x, 0640)\n", mode, archive_name.c_str(), dev->mode); if ((dev->fd = open(archive_name.c_str(), dev->mode, 0640)) < 0) { berrno be; dev->dev_errno = errno; Mmsg2(dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(), be.strerror()); + Dmsg1(29, "open failed: %s", dev->errmsg); Emsg0(M_FATAL, 0, dev->errmsg); } else { dev->dev_errno = 0; @@ -462,6 +463,7 @@ static void open_file_device(DEVICE *dev, int mode) Mmsg2(dev->errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(), be.strerror()); Emsg0(M_FATAL, 0, dev->errmsg); + Dmsg1(29, "open failed: %s", dev->errmsg); } else { dev->part_size = filestat.st_size; } @@ -469,7 +471,7 @@ static void open_file_device(DEVICE *dev, int mode) Dmsg5(29, "open dev: %s fd=%d opened, part=%d/%d, part_size=%u\n", dev->is_dvd()?"DVD":"disk", dev->fd, dev->part, dev->num_parts, dev->part_size); - if (dev->is_dvd() && (mode != OPEN_READ_ONLY) && + if (dev->is_open() && dev->is_dvd() && (mode != OPEN_READ_ONLY) && (dev->free_space_errno == 0 || dev->num_parts == dev->part)) { update_free_space_dev(dev); } diff --git a/bacula/src/stored/mount.c b/bacula/src/stored/mount.c index bcfb36da6f..45fd9e071a 100644 --- a/bacula/src/stored/mount.c +++ b/bacula/src/stored/mount.c @@ -258,8 +258,12 @@ read_volume: /* * At this point, we assume we have a blank tape mounted. */ - case VOL_NO_LABEL: case VOL_IO_ERROR: + if (dev->is_dvd()) { + return false; /* we could not write on DVD */ + } + /* Fall through wanted */ + case VOL_NO_LABEL: /* * If permitted, we label the device, make sure we can do * it by checking that the VolCatBytes is zero => not labeled, diff --git a/bacula/src/version.h b/bacula/src/version.h index 893aa54c3d..d6a04265c5 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -1,8 +1,8 @@ /* */ #undef VERSION -#define VERSION "1.37.25" -#define BDATE "20 June 2005" -#define LSMDATE "20Jun05" +#define VERSION "1.37.26" +#define BDATE "21 June 2005" +#define LSMDATE "21Jun05" /* Debug flags */ #undef DEBUG diff --git a/bacula/src/win32/README.win32 b/bacula/src/win32/README.win32 index d12e12a3f6..314d984855 100644 --- a/bacula/src/win32/README.win32 +++ b/bacula/src/win32/README.win32 @@ -57,19 +57,25 @@ To build it: cd src/win32 make -Instructions if you want to build bacula-fd with VSS (Volume Shadow Copy Service) support: -- VSS support is right now (June 2005) available for MS-Windows XP (beta) +Instructions if you want to build bacula-fd with VSS +(Volume Shadow Copy Service) support: + +- VSS support is right now (June 2005) available for MS-Windows XP + (beta) - VSS support is right now (June 2005) available for MS-Windows 2003 (beta) - you need to get the VSS SDK: http://www.microsoft.com/downloads/details.aspx?FamilyID=0B4F56E4-0CCC-4626-826A-ED2C4C95C871&displaylang=en -- copy the 'inc' and 'lib' directories from this SDK to 'bacula/src/win32/compat/vss' -- you should then have 'bacula/src/win32/compat/vss/inc' and 'bacula/src/win32/compat/vss/lib' +- copy the 'inc' and 'lib' directories from this SDK to + 'bacula/src/win32/compat/vss' +- you should then have 'bacula/src/win32/compat/vss/inc' and + 'bacula/src/win32/compat/vss/lib' both with 'Win2003' and 'WinXP' subdirectories - add 'WIN32_VSS' as preprocessor directive -- you should get a bacula-fd that runs on all platforms but has VSS support for WinXP and 2003 enabled +- you should get a bacula-fd that runs on all platforms and has + VSS support for WinXP and 2003 enabled -That should be all there is too it. The winbacula-1.xx.y.exe should be -in the current directory. +That should be all there is too it. The winbacula-1.xx.y.exe +should be in the current directory. See License.txt for the License.