set_jcr_job_status(jcr, jcr->FDJobStatus);
Dmsg1(100, "FDStatus=%c\n", (char)jcr->JobStatus);
}
- if (job_cancelled(jcr)) {
+ if (job_canceled(jcr)) {
break;
}
}
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);
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);
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 */
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)) {
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);
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, ':');
} 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);
}
#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;
case JS_ErrorTerminated:
msg = _("has erred");
break;
- case JS_Cancelled:
+ case JS_Canceled:
msg = _("has been canceled");
break;
case JS_WaitFD:
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:
* 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 */
/* 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";
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");
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);
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;
}
case JS_Error:
case JS_FatalError:
case JS_Differences:
- case JS_Cancelled:
+ case JS_Canceled:
break;
default:
jcr->JobStatus = JobStatus;
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");
case JS_FatalError:
str = _("Fatal Error");
break;
- case JS_Cancelled:
- str = _("Cancelled");
+ case JS_Canceled:
+ str = _("Canceled");
break;
case JS_Differences:
str = _("Differences");
}
return omsg;
}
-
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);
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);
}
/*
* 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)
{
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;
}
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 */
case JS_ErrorTerminated:
term_msg = _("*** Backup Error ***");
break;
- case JS_Cancelled:
+ case JS_Canceled:
term_msg = _("Backup Canceled");
break;
default:
/*
* 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) {
} 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 */
}
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 {
}
} 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);
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;
}
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;
}
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;
}
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"
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"
}
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"
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);
*/
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;
}
} 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);
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));
*/
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;
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);
};
/* 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";
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);
}
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);
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, _("store<dir: Bad Use Device command: %s\n"), dir->msg);
- 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);
* VOL_CREATE_ERROR
* VOL_VERSION_ERROR
* VOL_LABEL_ERROR
+ * VOL_NO_MEDIA
*/
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 */
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**");
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 */
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;
}
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;
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;
}
*/
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"
#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 */
/* */
#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