From: Kern Sibbald Date: Sun, 6 Apr 2003 10:28:20 +0000 (+0000) Subject: More on barcodes X-Git-Tag: Release-1.30~44 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=e1187372073c4190d58582372c26400b69af3b6f;p=bacula%2Fbacula More on barcodes git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@423 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/src/dird/backup.c b/bacula/src/dird/backup.c index 577c1298c0..a0e0d2e2f9 100644 --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@ -279,7 +279,7 @@ static int wait_for_job_termination(JCR *jcr) set_jcr_job_status(jcr, jcr->FDJobStatus); Dmsg1(100, "FDStatus=%c\n", (char)jcr->JobStatus); } - if (job_cancelled(jcr)) { + if (job_canceled(jcr)) { break; } } @@ -399,7 +399,7 @@ static void backup_cleanup(JCR *jcr, int TermCode, char *since) pthread_cancel(jcr->SD_msg_chan); } break; - case JS_Cancelled: + case JS_Canceled: term_msg = _("Backup Canceled"); if (jcr->store_bsock) { bnet_sig(jcr->store_bsock, BNET_TERMINATE); diff --git a/bacula/src/dird/restore.c b/bacula/src/dird/restore.c index 5ec84e2c1e..04bd2b59d2 100644 --- a/bacula/src/dird/restore.c +++ b/bacula/src/dird/restore.c @@ -305,7 +305,7 @@ static void restore_cleanup(JCR *jcr, int TermCode) pthread_cancel(jcr->SD_msg_chan); } break; - case JS_Cancelled: + case JS_Canceled: term_msg = _("Restore Canceled"); if (jcr->store_bsock) { bnet_sig(jcr->store_bsock, BNET_TERMINATE); diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index ca6b080872..3adb44f599 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -422,8 +422,8 @@ static int cancelcmd(UAContext *ua, char *cmd) switch (jcr->JobStatus) { case JS_Created: - set_jcr_job_status(jcr, JS_Cancelled); - bsendmsg(ua, _("JobId %d, Job %s marked to be cancelled.\n"), + set_jcr_job_status(jcr, JS_Canceled); + bsendmsg(ua, _("JobId %d, Job %s marked to be canceled.\n"), jcr->JobId, jcr->Job); #ifndef USE_SEMAPHORE workq_remove(&job_wq, jcr->work_item); /* attempt to remove it from queue */ @@ -432,7 +432,7 @@ static int cancelcmd(UAContext *ua, char *cmd) return 1; default: - set_jcr_job_status(jcr, JS_Cancelled); + set_jcr_job_status(jcr, JS_Canceled); /* Cancel File daemon */ ua->jcr->client = jcr->client; if (!connect_to_file_daemon(ua->jcr, 10, FDConnectTimeout, 1)) { diff --git a/bacula/src/dird/ua_label.c b/bacula/src/dird/ua_label.c index 3679a3018a..8919cffd74 100644 --- a/bacula/src/dird/ua_label.c +++ b/bacula/src/dird/ua_label.c @@ -224,10 +224,17 @@ checkName: static void label_from_barcodes(UAContext *ua) { STORE *store = ua->jcr->store; - BSOCK *sd = ua->jcr->store_bsock; + BSOCK *sd; POOL_DBR pr; char dev_name[MAX_NAME_LENGTH]; // MEDIA_DBR mr, omr; + typedef struct s_vol_list { + struct s_vol_list *next; + char *VolName; + int Slot; + } vol_list_t; + vol_list_t *vol_list = NULL; + vol_list_t *vl; bsendmsg(ua, _("Connecting to Storage daemon %s at %s:%d ...\n"), store->hdr.name, store->address, store->SDport); @@ -235,17 +242,19 @@ static void label_from_barcodes(UAContext *ua) bsendmsg(ua, _("Failed to connect to Storage daemon.\n")); return; } + sd = ua->jcr->store_bsock; - strcpy(dev_name, store->dev_name); + bstrncpy(dev_name, store->dev_name, sizeof(dev_name)); bash_spaces(dev_name); bnet_fsend(sd, _("autochanger list %s \n"), dev_name); while (bget_msg(sd, 0) >= 0) { char *p; - int slot; strip_trailing_junk(sd->msg); - if (strncmp(sd->msg, "3902 Issuing", 12) == 0 || - strncmp(sd->msg, "3903 Issuing", 12) == 0) { - bsendmsg(ua, "%s\n", sd->msg); + /* Check for returned SD messages */ + if (sd->msg[0] == '3' && sd->msg[1] == '9' && + B_ISDIGIT(sd->msg[2]) && B_ISDIGIT(sd->msg[3]) && + sd->msg[4] == ' ') { + bsendmsg(ua, "%s\n", sd->msg); /* pass them on to user */ continue; } p = strchr(sd->msg, ':'); @@ -257,10 +266,30 @@ static void label_from_barcodes(UAContext *ua) } else { continue; } - slot = atoi(sd->msg); - bsendmsg(ua, "Got slot=%d label: %s\n", slot, p); + vl = (vol_list_t *)malloc(sizeof(vol_list_t)); + vl->Slot = atoi(sd->msg); + vl->VolName = bstrdup(p); + vl->next = vol_list; + vol_list = vl; + } + + if (!vol_list) { + bsendmsg(ua, _("No Volumes found to label, or no barcodes.\n")); + goto bail_out; + } + bsendmsg(ua, _("The following Volumes will be labeled:\n" + "Slot Volume\n" + "==============\n")); + for (vl=vol_list; vl; vl=vl->next) { + bsendmsg(ua, "%4d %s\n", vl->Slot, vl->VolName); + } + if (!get_cmd(ua, _("Do you want to continue? (y/n): ")) || + (ua->cmd[0] != 'y' && ua->cmd[0] != 'Y')) { + goto bail_out; } + + #ifdef xxxx memset(&mr, 0, sizeof(mr)); strcpy(mr.VolumeName, ua->cmd); @@ -271,6 +300,16 @@ static void label_from_barcodes(UAContext *ua) } #endif +bail_out: + /* Free list */ + for (vl=vol_list; vl; ) { + vol_list_t *ovl; + free(vl->VolName); + ovl = vl; + vl = vl->next; + free(ovl); + } + bnet_sig(sd, BNET_TERMINATE); bnet_close(sd); ua->jcr->store_bsock = NULL; diff --git a/bacula/src/dird/ua_status.c b/bacula/src/dird/ua_status.c index e64b325e49..e4ff79763a 100644 --- a/bacula/src/dird/ua_status.c +++ b/bacula/src/dird/ua_status.c @@ -238,7 +238,7 @@ static void do_director_status(UAContext *ua, char *cmd) case JS_ErrorTerminated: msg = _("has erred"); break; - case JS_Cancelled: + case JS_Canceled: msg = _("has been canceled"); break; case JS_WaitFD: diff --git a/bacula/src/dird/verify.c b/bacula/src/dird/verify.c index 0fc3ddbf6d..e6306a5ea9 100644 --- a/bacula/src/dird/verify.c +++ b/bacula/src/dird/verify.c @@ -322,7 +322,7 @@ static void verify_cleanup(JCR *jcr, int TermCode) term_msg = _("*** Verify Error ***"); msg_type = M_ERROR; /* Generate error message */ break; - case JS_Cancelled: + case JS_Canceled: term_msg = _("Verify Canceled"); break; case JS_Differences: @@ -396,7 +396,7 @@ int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId) * Attributes * Link name ??? */ - while ((n=bget_msg(fd, 0)) >= 0 && !job_cancelled(jcr)) { + while ((n=bget_msg(fd, 0)) >= 0 && !job_canceled(jcr)) { int stream; char *attr, *p, *fn; char Opts_SIG[MAXSTRING]; /* Verify Opts or MD5/SHA1 signature */ diff --git a/bacula/src/filed/job.c b/bacula/src/filed/job.c index 99947a7f00..1d06cad6e2 100644 --- a/bacula/src/filed/job.c +++ b/bacula/src/filed/job.c @@ -89,10 +89,10 @@ static struct s_cmds cmds[] = { /* Commands received from director that need scanning */ static char jobcmd[] = "JobId=%d Job=%127s SDid=%d SDtime=%d Authorization=%100s"; static char storaddr[] = "storage address=%s port=%d\n"; -static char sessioncmd[] = "session %s %ld %ld %ld %ld %ld %ld\n"; +static char sessioncmd[] = "session %127s %ld %ld %ld %ld %ld %ld\n"; static char restorecmd[] = "restore replace=%c where=%s\n"; static char restorecmd1[] = "restore replace=%c where=\n"; -static char verifycmd[] = "verify level=%20s\n"; +static char verifycmd[] = "verify level=%30s\n"; /* Responses sent to Director */ static char errmsg[] = "2999 Invalid command\n"; @@ -232,9 +232,9 @@ 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 { - set_jcr_job_status(cjcr, JS_Cancelled); + set_jcr_job_status(cjcr, JS_Canceled); free_jcr(cjcr); - bnet_fsend(dir, "2001 Job %s marked to be cancelled.\n", Job); + bnet_fsend(dir, "2001 Job %s marked to be canceled.\n", Job); } } else { bnet_fsend(dir, "2902 Error scanning cancel command.\n"); @@ -391,11 +391,11 @@ static int bootstrap_cmd(JCR *jcr) static int level_cmd(JCR *jcr) { BSOCK *dir = jcr->dir_bsock; - char *level; + POOLMEM *level; struct tm tm; time_t mtime; - level = (char *) get_memory(dir->msglen); + level = get_memory(dir->msglen+1); Dmsg1(110, "level_cmd: %s", dir->msg); if (sscanf(dir->msg, "level = %s ", level) != 1) { Jmsg1(jcr, M_FATAL, 0, _("Bad level command: %s\n"), dir->msg); @@ -416,7 +416,7 @@ static int level_cmd(JCR *jcr) if (sscanf(dir->msg, "level = since %d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) { - Jmsg1(jcr, M_FATAL, 0, "Bad scan of date/time: %s\n", dir->msg); + Jmsg1(jcr, M_FATAL, 0, _("Bad scan of date/time: %s\n"), dir->msg); free_memory(level); return 0; } diff --git a/bacula/src/lib/jcr.c b/bacula/src/lib/jcr.c index 8bbab3d52d..ee0c504050 100755 --- a/bacula/src/lib/jcr.c +++ b/bacula/src/lib/jcr.c @@ -311,7 +311,7 @@ void set_jcr_job_status(JCR *jcr, int JobStatus) case JS_Error: case JS_FatalError: case JS_Differences: - case JS_Cancelled: + case JS_Canceled: break; default: jcr->JobStatus = JobStatus; diff --git a/bacula/src/lib/util.c b/bacula/src/lib/util.c index 443498dfc6..a38eff903c 100644 --- a/bacula/src/lib/util.c +++ b/bacula/src/lib/util.c @@ -242,8 +242,8 @@ void jobstatus_to_ascii(int JobStatus, char *msg, int maxlen) case JS_Error: termstat = _("Non-fatal error"); break; - case JS_Cancelled: - termstat = _("Cancelled"); + case JS_Canceled: + termstat = _("Canceled"); break; case JS_Differences: termstat = _("Verify differences"); @@ -275,8 +275,8 @@ char *job_status_to_str(int stat) case JS_FatalError: str = _("Fatal Error"); break; - case JS_Cancelled: - str = _("Cancelled"); + case JS_Canceled: + str = _("Canceled"); break; case JS_Differences: str = _("Differences"); @@ -644,4 +644,3 @@ POOLMEM *edit_job_codes(void *mjcr, char *omsg, char *imsg, char *to) } return omsg; } - diff --git a/bacula/src/stored/autochanger.c b/bacula/src/stored/autochanger.c index 1f5f271f38..f2f7a596ca 100644 --- a/bacula/src/stored/autochanger.c +++ b/bacula/src/stored/autochanger.c @@ -81,6 +81,13 @@ int autoload_device(JCR *jcr, DEVICE *dev, int writing, BSOCK *dir) if (status == 0) { loaded = atoi(results); } else { + if (dir) { + bnet_fsend(dir, _("3991 Bad autochanger \"loaded\" status = %d.\n"), + status); + } else { + Jmsg(jcr, M_INFO, 0, _("Bad autochanger \"load slot\" status = %d.\n"), + status); + } loaded = -1; /* force unload */ } Dmsg1(100, "loaded=%s\n", results); @@ -119,10 +126,19 @@ int autoload_device(JCR *jcr, DEVICE *dev, int writing, BSOCK *dir) jcr->device->changer_command, "load"); status = run_program(changer, timeout, NULL); if (status == 0) { - Jmsg(jcr, M_INFO, 0, _("Autochanger \"load slot\" status is OK.\n")); + if (dir) { + bnet_fsend(dir, _("3904 Autochanger \"load slot\" status is OK.\n")); + } else { + Jmsg(jcr, M_INFO, 0, _("Autochanger \"load slot\" status is OK.\n")); + } } else { - Jmsg(jcr, M_INFO, 0, _("Bad autochanger \"load slot\" status = %d.\n"), - status); + if (dir) { + bnet_fsend(dir, _("3992 Bad autochanger \"load slot\" status = %d.\n"), + status); + } else { + Jmsg(jcr, M_INFO, 0, _("Bad autochanger \"load slot\" status = %d.\n"), + status); + } } Dmsg2(100, "load slot %d status=%d\n", slot, status); } @@ -139,6 +155,7 @@ int autoload_device(JCR *jcr, DEVICE *dev, int writing, BSOCK *dir) /* * List the Volumes that are in the autoloader possibly * with their barcodes. + * We assume that it is always the Console that is calling us. */ int autochanger_list(JCR *jcr, DEVICE *dev, BSOCK *dir) { @@ -149,7 +166,7 @@ int autochanger_list(JCR *jcr, DEVICE *dev, BSOCK *dir) if (!dev_cap(dev, CAP_AUTOCHANGER) || !jcr->device->changer_name || !jcr->device->changer_command) { - bnet_fsend(dir, _("Not a changer device.\n")); + bnet_fsend(dir, _("3993 Not a changer device.\n")); return 0; } @@ -170,7 +187,7 @@ int autochanger_list(JCR *jcr, DEVICE *dev, BSOCK *dir) bnet_fsend(dir, _("3903 Issuing autochanger \"list\" command.\n")); bpipe = open_bpipe(changer, timeout, "r"); if (!bpipe) { - bnet_fsend(dir, _("Open bpipe failed.\n")); + bnet_fsend(dir, _("3994 Open bpipe failed.\n")); goto bail_out; } /* Get output from changer */ diff --git a/bacula/src/stored/bscan.c b/bacula/src/stored/bscan.c index a1d04d4f6d..eb1068d542 100644 --- a/bacula/src/stored/bscan.c +++ b/bacula/src/stored/bscan.c @@ -971,7 +971,7 @@ static int update_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *elabel, case JS_ErrorTerminated: term_msg = _("*** Backup Error ***"); break; - case JS_Cancelled: + case JS_Canceled: term_msg = _("Backup Canceled"); break; default: diff --git a/bacula/src/stored/dircmd.c b/bacula/src/stored/dircmd.c index 8793cac6ee..aa0f57f581 100644 --- a/bacula/src/stored/dircmd.c +++ b/bacula/src/stored/dircmd.c @@ -128,7 +128,7 @@ void *connection_request(void *arg) /* * See if this is a File daemon connection */ - if (bs->msglen < 25 || bs->msglen > (int)sizeof(name)) { + if (bs->msglen < 25 || bs->msglen > (int)sizeof(name)+25) { Emsg1(M_ERROR, 0, _("Invalid Dir connection. Len=%d\n"), bs->msglen); } if (sscanf(bs->msg, "Hello Start Job %127s calling\n", name) == 1) { @@ -216,7 +216,7 @@ static int cancel_cmd(JCR *cjcr) } else { P(jcr->mutex); oldStatus = jcr->JobStatus; - set_jcr_job_status(jcr, JS_Cancelled); + set_jcr_job_status(jcr, JS_Canceled); if (!jcr->authenticated && oldStatus == JS_WaitFD) { pthread_cond_signal(&jcr->job_start_wait); /* wake waiting thread */ } @@ -231,7 +231,7 @@ static int cancel_cmd(JCR *cjcr) jcr->device->dev->dev_blocked == BST_UNMOUNTED_WAITING_FOR_SYSOP)) { pthread_cond_signal(&jcr->device->dev->wait_next_vol); } - bnet_fsend(dir, _("3000 Job %s marked to be cancelled.\n"), jcr->Job); + bnet_fsend(dir, _("3000 Job %s marked to be canceled.\n"), jcr->Job); free_jcr(jcr); } } else { @@ -334,8 +334,8 @@ static int do_label(JCR *jcr, int relabel) } } else { /* NB dir->msg gets clobbered in bnet_fsend, so save command */ - strcpy(dname, dir->msg); - bnet_fsend(dir, _("3903 Error scanning label command: %s\n"), dname); + pm_strcpy(&jcr->errmsg, dir->msg); + bnet_fsend(dir, _("3903 Error scanning label command: %s\n"), jcr->errmsg); } free_memory(dname); free_memory(oldname); @@ -373,7 +373,7 @@ static void label_volume_if_ok(JCR *jcr, DEVICE *dev, char *oldname, if (dev->dev_errno == EAGAIN || dev->dev_errno == EBUSY) { sleep(30); } - bnet_fsend(dir, _("3903 Unable to open device %s. ERR=%s\n"), + bnet_fsend(dir, _("3910 Unable to open device %s. ERR=%s\n"), dev_name(dev), strerror_dev(dev)); goto bail_out; } @@ -387,7 +387,7 @@ static void label_volume_if_ok(JCR *jcr, DEVICE *dev, char *oldname, case VOL_OK: if (!relabel) { bnet_fsend(dir, _( - "3901 Cannot label Volume because it is already labeled: %s\n"), + "3911 Cannot label Volume because it is already labeled: %s\n"), dev->VolHdr.VolName); break; } @@ -400,15 +400,18 @@ static void label_volume_if_ok(JCR *jcr, DEVICE *dev, char *oldname, case VOL_IO_ERROR: case VOL_NO_LABEL: if (!write_volume_label_to_dev(jcr, jcr->device, newname, poolname)) { - bnet_fsend(dir, _("3903 Failed to label Volume: ERR=%s\n"), strerror_dev(dev)); + bnet_fsend(dir, _("3912 Failed to label Volume: ERR=%s\n"), strerror_dev(dev)); break; } strcpy(jcr->VolumeName, newname); bnet_fsend(dir, _("3000 OK label. Volume=%s Device=%s\n"), newname, dev->dev_name); break; + case VOL_NO_MEDIA: + bnet_fsend(dir, _("3912 Failed to label Volume: ERR=%s\n"), strerror_dev(dev)); + break; default: - bnet_fsend(dir, _("3902 Cannot label Volume. \ + bnet_fsend(dir, _("3913 Cannot label Volume. \ Unknown status %d from read_volume_label()\n"), jcr->label_status); break; } @@ -514,7 +517,7 @@ static int mount_cmd(JCR *jcr) pthread_cond_signal(&dev->wait_next_vol); } if (dev->state & ST_LABEL) { - bnet_fsend(dir, _("3001 Device %s is mounted with Volume %s\n"), + bnet_fsend(dir, _("3001 Device %s is mounted with Volume \"%s\"\n"), dev->dev_name, dev->VolHdr.VolName); } else { bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n" @@ -535,7 +538,7 @@ static int mount_cmd(JCR *jcr) case BST_NOT_BLOCKED: if (dev->state & ST_OPENED) { if (dev->state & ST_LABEL) { - bnet_fsend(dir, _("3001 Device %s is mounted with Volume %s\n"), + bnet_fsend(dir, _("3001 Device %s is mounted with Volume \"%s\"\n"), dev->dev_name, dev->VolHdr.VolName); } else { bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n" @@ -554,7 +557,7 @@ static int mount_cmd(JCR *jcr) } read_label(jcr, dev); if (dev->state & ST_LABEL) { - bnet_fsend(dir, _("3001 Device %s is mounted with Volume %s\n"), + bnet_fsend(dir, _("3001 Device %s is mounted with Volume \"%s\"\n"), dev->dev_name, dev->VolHdr.VolName); } else { bnet_fsend(dir, _("3905 Device %s open but no Bacula volume is mounted.\n" @@ -573,8 +576,8 @@ static int mount_cmd(JCR *jcr) bnet_fsend(dir, _("3999 Device %s not found\n"), dev_name); } } else { - pm_strcpy(&dev_name, dir->msg); - bnet_fsend(dir, _("3906 Error scanning mount command: %s\n"), dev_name); + pm_strcpy(&jcr->errmsg, dir->msg); + bnet_fsend(dir, _("3906 Error scanning mount command: %s\n"), jcr->errmsg); } free_memory(dev_name); bnet_sig(dir, BNET_EOD); @@ -586,13 +589,13 @@ static int mount_cmd(JCR *jcr) */ static int unmount_cmd(JCR *jcr) { - char *dname; + POOLMEM *dname; BSOCK *dir = jcr->dir_bsock; DEVRES *device; DEVICE *dev; int found = 0; - dname = (char *) get_memory(dir->msglen+1); + dname = get_memory(dir->msglen+1); if (sscanf(dir->msg, "unmount %s", dname) == 1) { unbash_spaces(dname); device = NULL; @@ -658,8 +661,8 @@ static int unmount_cmd(JCR *jcr) } } else { /* NB dir->msg gets clobbered in bnet_fsend, so save command */ - strcpy(dname, dir->msg); - bnet_fsend(dir, _("3907 Error scanning unmount command: %s\n"), dname); + pm_strcpy(&jcr->errmsg, dir->msg); + bnet_fsend(dir, _("3907 Error scanning unmount command: %s\n"), jcr->errmsg); } free_memory(dname); bnet_sig(dir, BNET_EOD); @@ -700,7 +703,7 @@ static int status_cmd(JCR *jcr) for (dev=device->dev; dev; dev=dev->next) { if (dev->state & ST_OPENED) { if (dev->state & ST_LABEL) { - bnet_fsend(user, _("Device %s is mounted with Volume %s\n"), + bnet_fsend(user, _("Device %s is mounted with Volume \"%s\"\n"), dev_name(dev), dev->VolHdr.VolName); } else { bnet_fsend(user, _("Device %s open but no Bacula volume is mounted.\n"), dev_name(dev)); @@ -811,13 +814,13 @@ static void send_blocked_status(JCR *jcr, DEVICE *dev) */ static int autochanger_cmd(JCR *jcr) { - char *devname; + POOLMEM *devname; BSOCK *dir = jcr->dir_bsock; DEVRES *device; DEVICE *dev; int found = 0; - devname = (char *)get_memory(dir->msglen); + devname = get_memory(dir->msglen+1); if (sscanf(dir->msg, "autochanger list %s ", devname) == 1) { unbash_spaces(devname); device = NULL; @@ -864,8 +867,9 @@ static int autochanger_cmd(JCR *jcr) bnet_fsend(dir, _("3999 Device %s not found\n"), devname); } } else { - strcpy(devname, dir->msg); - bnet_fsend(dir, _("3907 Error scanning autocharger list command: %s\n"), devname); + pm_strcpy(&jcr->errmsg, dir->msg); + bnet_fsend(dir, _("3907 Error scanning autocharger list command: %s\n"), + jcr->errmsg); } free_memory(devname); bnet_sig(dir, BNET_EOD); diff --git a/bacula/src/stored/fd_cmds.c b/bacula/src/stored/fd_cmds.c index 84c52b5e4d..9987753720 100644 --- a/bacula/src/stored/fd_cmds.c +++ b/bacula/src/stored/fd_cmds.c @@ -77,7 +77,7 @@ static struct s_cmds fd_cmds[] = { }; /* Commands from the File daemon that require additional scanning */ -static char read_open[] = "read open session = %s %ld %ld %ld %ld %ld %ld\n"; +static char read_open[] = "read open session = %127s %ld %ld %ld %ld %ld %ld\n"; /* Responses sent to the File daemon */ static char NO_open[] = "3901 Error session already open\n"; diff --git a/bacula/src/stored/job.c b/bacula/src/stored/job.c index 5b269e5273..8eeecc9458 100644 --- a/bacula/src/stored/job.c +++ b/bacula/src/stored/job.c @@ -84,8 +84,9 @@ int job_cmd(JCR *jcr) if (sscanf(dir->msg, jobcmd, &JobId, job, job_name, client_name, &JobType, &level, fileset_name, &no_attributes, &spool_attributes, fileset_md5) != 10) { - bnet_fsend(dir, BAD_job, dir->msg); - Emsg1(M_FATAL, 0, _("Bad Job Command from Director: %s\n"), dir->msg); + pm_strcpy(&jcr->errmsg, dir->msg); + bnet_fsend(dir, BAD_job, jcr->errmsg); + Emsg1(M_FATAL, 0, _("Bad Job Command from Director: %s\n"), jcr->errmsg); free_memory(job); free_memory(job_name); free_memory(client_name); @@ -194,8 +195,9 @@ void connection_from_filed(void *arg) } Dmsg1(100, "got: %s\n", fd->msg); - if (sscanf(fd->msg, "Hello Start Job %127s\n", job_name) != 1) { - Emsg1(M_FATAL, 0, _("Authentication failure: %s\n"), fd->msg); + if (fd->msglen < 17 || fd->msglen > 17+127 || + sscanf(fd->msg, "Hello Start Job %127s\n", job_name) != 1) { + Emsg1(M_FATAL, 0, _("Bad Hello from FD: %s\n"), fd->msg); return; } handle_filed_connection(fd, job_name); @@ -299,19 +301,21 @@ static int use_device_cmd(JCR *jcr) UnlockRes(); if (verbose) { unbash_spaces(dir->msg); - Jmsg(jcr, M_INFO, 0, _("Failed command: %s\n"), dir->msg); + pm_strcpy(&jcr->errmsg, dir->msg); + Jmsg(jcr, M_INFO, 0, _("Failed command: %s\n"), jcr->errmsg); } Jmsg(jcr, M_FATAL, 0, _("\n" " Device \"%s\" requested by Dir not found in SD Device resources.\n"), dev_name); bnet_fsend(dir, NO_device, dev_name); } else { + unbash_spaces(dir->msg); + pm_strcpy(&jcr->errmsg, dir->msg); if (verbose) { - unbash_spaces(dir->msg); - Jmsg(jcr, M_INFO, 0, _("Failed command: %s\n"), dir->msg); + Jmsg(jcr, M_INFO, 0, _("Failed command: %s\n"), jcr->errmsg); } - Jmsg(jcr, M_FATAL, 0, _("storemsg); - bnet_fsend(dir, BAD_use, dir->msg); + Jmsg(jcr, M_FATAL, 0, _("Bad Use Device command: %s\n"), jcr->errmsg); + bnet_fsend(dir, BAD_use, jcr->errmsg); } free_memory(dev_name); diff --git a/bacula/src/stored/label.c b/bacula/src/stored/label.c index d1ee526a1b..a99b9188e1 100644 --- a/bacula/src/stored/label.c +++ b/bacula/src/stored/label.c @@ -54,6 +54,7 @@ extern int debug_level; * VOL_CREATE_ERROR * VOL_VERSION_ERROR * VOL_LABEL_ERROR + * VOL_NO_MEDIA */ int read_dev_volume_label(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) { @@ -61,8 +62,8 @@ int read_dev_volume_label(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) DEV_RECORD *record; int ok = 0; - Dmsg2(30, "Enter read_volume_label device=%s vol=%s\n", - dev_name(dev), VolName); + Dmsg3(100, "Enter read_volume_label device=%s vol=%s dev_Vol=%s\n", + dev_name(dev), VolName, dev->VolHdr.VolName); if (dev->state & ST_LABEL) { /* did we already read label? */ /* Compare Volume Names allow special wild card */ @@ -88,7 +89,7 @@ int read_dev_volume_label(JCR *jcr, DEVICE *dev, DEV_BLOCK *block) if (!rewind_dev(dev)) { Mmsg(&jcr->errmsg, _("Couldn't rewind device %s ERR=%s\n"), dev_name(dev), strerror_dev(dev)); - return jcr->label_status = VOL_IO_ERROR; + return jcr->label_status = VOL_NO_MEDIA; } strcpy(dev->VolHdr.Id, "**error**"); @@ -337,9 +338,9 @@ void create_volume_label(DEVICE *dev, char *VolName) strcpy(dev->VolHdr.Id, BaculaId); dev->VolHdr.VerNum = BaculaTapeVersion; dev->VolHdr.LabelType = PRE_LABEL; /* Mark tape as unused */ - strcpy(dev->VolHdr.VolName, VolName); + bstrncpy(dev->VolHdr.VolName, VolName, sizeof(dev->VolHdr.VolName)); strcpy(dev->VolHdr.PoolName, "Default"); - strcpy(dev->VolHdr.MediaType, device->media_type); + bstrncpy(dev->VolHdr.MediaType, device->media_type, sizeof(dev->VolHdr.MediaType)); strcpy(dev->VolHdr.PoolType, "Backup"); /* Put label time/date in header */ @@ -387,11 +388,12 @@ int write_volume_label_to_dev(JCR *jcr, DEVRES *device, char *VolName, char *Poo Dmsg0(99, "write_volume_label()\n"); create_volume_label(dev, VolName); - strcpy(dev->VolHdr.MediaType, device->media_type); + bstrncpy(dev->VolHdr.MediaType, device->media_type, sizeof(dev->VolHdr.MediaType)); bstrncpy(dev->VolHdr.VolName, VolName, sizeof(dev->VolHdr.VolName)); bstrncpy(dev->VolHdr.PoolName, PoolName, sizeof(dev->VolHdr.PoolName)); if (!rewind_dev(dev)) { + memset(&dev->VolHdr, 0, sizeof(dev->VolHdr)); Dmsg2(30, "Bad status on %s from rewind. ERR=%s\n", dev_name(dev), strerror_dev(dev)); return 0; } @@ -404,6 +406,7 @@ int write_volume_label_to_dev(JCR *jcr, DEVRES *device, char *VolName, char *Poo if (!write_record_to_block(block, &rec)) { Dmsg2(30, "Bad Label write on %s. ERR=%s\n", dev_name(dev), strerror_dev(dev)); + memset(&dev->VolHdr, 0, sizeof(dev->VolHdr)); free_block(block); free_pool_memory(rec.data); return 0; @@ -414,6 +417,7 @@ int write_volume_label_to_dev(JCR *jcr, DEVRES *device, char *VolName, char *Poo Dmsg0(99, "Call write_block_to_device()\n"); if (!write_block_to_dev(jcr, dev, block)) { + memset(&dev->VolHdr, 0, sizeof(dev->VolHdr)); Dmsg2(30, "Bad Label write on %s. ERR=%s\n", dev_name(dev), strerror_dev(dev)); stat = 9; } diff --git a/bacula/src/stored/mount.c b/bacula/src/stored/mount.c index dc0f5179ad..a8b0e69828 100644 --- a/bacula/src/stored/mount.c +++ b/bacula/src/stored/mount.c @@ -185,7 +185,7 @@ read_volume: */ memcpy(&dev->VolCatInfo, &jcr->VolCatInfo, sizeof(jcr->VolCatInfo)); /* Check if this is a valid Volume in the pool */ - strcpy(jcr->VolumeName, dev->VolHdr.VolName); + bstrncpy(jcr->VolumeName, dev->VolHdr.VolName, sizeof(jcr->VolumeName)); if (!dir_get_volume_info(jcr, 1)) { Mmsg(&jcr->errmsg, _("Wanted Volume \"%s\".\n" " Actual Volume \"%s\" not acceptable because:\n" diff --git a/bacula/src/stored/record.h b/bacula/src/stored/record.h index 4824ecc34f..327b2d525e 100644 --- a/bacula/src/stored/record.h +++ b/bacula/src/stored/record.h @@ -38,6 +38,7 @@ #define VOL_CREATE_ERROR 5 /* Error creating label */ #define VOL_VERSION_ERROR 6 /* Bacula version error */ #define VOL_LABEL_ERROR 7 /* Bad label type */ +#define VOL_NO_MEDIA 8 /* Hard error -- no media present */ /* See block.h for RECHDR_LENGTH */ diff --git a/bacula/src/version.h b/bacula/src/version.h index 5e3db51145..d464fbcbd2 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -1,8 +1,8 @@ /* */ #define VERSION "1.30" #define VSTRING "1" -#define BDATE "05 April 2003" -#define LSMDATE "05Apr03" +#define BDATE "06 April 2003" +#define LSMDATE "06Apr03" /* Debug flags */ #define DEBUG 1