]> git.sur5r.net Git - bacula/bacula/commitdiff
More on barcodes
authorKern Sibbald <kern@sibbald.com>
Sun, 6 Apr 2003 10:28:20 +0000 (10:28 +0000)
committerKern Sibbald <kern@sibbald.com>
Sun, 6 Apr 2003 10:28:20 +0000 (10:28 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@423 91ce42f0-d328-0410-95d8-f526ca767f89

18 files changed:
bacula/src/dird/backup.c
bacula/src/dird/restore.c
bacula/src/dird/ua_cmds.c
bacula/src/dird/ua_label.c
bacula/src/dird/ua_status.c
bacula/src/dird/verify.c
bacula/src/filed/job.c
bacula/src/lib/jcr.c
bacula/src/lib/util.c
bacula/src/stored/autochanger.c
bacula/src/stored/bscan.c
bacula/src/stored/dircmd.c
bacula/src/stored/fd_cmds.c
bacula/src/stored/job.c
bacula/src/stored/label.c
bacula/src/stored/mount.c
bacula/src/stored/record.h
bacula/src/version.h

index 577c1298c0470233cff7f4d91a2cec293a56f969..a0e0d2e2f987601c84c7e8539029133f4906a741 100644 (file)
@@ -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);
index 5ec84e2c1ea58c455928e9b2bf8134e73f07a8a1..04bd2b59d218831ac036080427a88a4e120f8599 100644 (file)
@@ -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);
index ca6b080872eda923315e5cf8ad0a0ceb0a551633..3adb44f5993da9d5abc2bc8477e306a66a369c4f 100644 (file)
@@ -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)) {
index 3679a3018a69d17d42a48ff0b1657f39360477fa..8919cffd74c7c23eb5190aabdc03a9c400c482d7 100644 (file)
@@ -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;
index e64b325e49e038f54b4b46269fa5280e829b1729..e4ff79763a6abc38951dc486faae56cea57858ef 100644 (file)
@@ -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:
index 0fc3ddbf6dccec3378cb8bb21eda580caaff69fd..e6306a5ea987e8d5ad6854436d6f77303442c41f 100644 (file)
@@ -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 */
index 99947a7f0027a413de6bda138e6a01c2487c88b9..1d06cad6e2ea3960934de26a0d11cc942de7b032 100644 (file)
@@ -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;
       }
index 8bbab3d52d427f68f4b5c7842d1425d538a22dbf..ee0c5040505c13518bdea2f150cfd3a9b98176cb 100755 (executable)
@@ -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;
index 443498dfc6c4eb540e2026d5521145b0b7a8ef3d..a38eff903cacd5d380f0de46969ac94eb2d7dfa5 100644 (file)
@@ -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;
 }
-
index 1f5f271f3813115f16add28c52c5e3a0d12e1a46..f2f7a596cad5e371f8e77bf1c4a021892b3dc729 100644 (file)
@@ -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 */
index a1d04d4f6d5d0f65997e73cec47a4f60105cf742..eb1068d542cf70990b561f9d0e61efef2fd09e80 100644 (file)
@@ -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:
index 8793cac6eec7c1726062c8387494a17c2439f3b4..aa0f57f581b3f32c917cec093a8290f533bf003e 100644 (file)
@@ -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);
index 84c52b5e4ddbb04de4a46bffb0f86e464a8f0fd9..9987753720eef5babe33449bc702771dcc52936a 100644 (file)
@@ -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";
index 5b269e5273a8b3d01bfa26cde0882c55f79b406d..8eeecc94580fa997d3c78e5921e7542ca8d08511 100644 (file)
@@ -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, _("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);
index d1ee526a1b5350d479160c96b5be4bcf41bdeaf4..a99b9188e1083366b151cfd9222d485cf08feaa8 100644 (file)
@@ -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;
    }
index dc0f5179ad6880bfbfbc98511d064ae809c5cc05..a8b0e69828c0fcfb465bf2fa821e5648f22eac83 100644 (file)
@@ -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"
index 4824ecc34f1f28d36e47d04a854059bb96b28b34..327b2d525e6b06de46b773138416ef8bab8a92d5 100644 (file)
@@ -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 */
index 5e3db511453f6c0e90d760076bedd9e8bc29fd44..d464fbcbd2736f34532fbd1d063c878c060ba730 100644 (file)
@@ -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