]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/label.c
- DVD writing/reading seems to be mostly working.
[bacula/bacula] / bacula / src / stored / label.c
index c296e39ff77d6ffca48c642072c23129e41e69ea..2e11958ae3f5d6b4e180b337d733c73a4a9a6f5a 100644 (file)
@@ -66,16 +66,16 @@ int read_dev_volume_label(DCR *dcr)
    bool want_ansi_label;
 
    Dmsg3(100, "Enter read_volume_label device=%s vol=%s dev_Vol=%s\n",
-      dev->name(), VolName, dev->VolHdr.VolName);
+      dev->name(), VolName, dev->VolHdr.VolumeName);
 
    if (!dev->is_open()) {
       Emsg0(M_ABORT, 0, _("BAD call to read_dev_volume_label\n"));
    }
    if (dev->is_labeled()) {              /* did we already read label? */
       /* Compare Volume Names allow special wild card */
-      if (VolName && *VolName && *VolName != '*' && strcmp(dev->VolHdr.VolName, VolName) != 0) {
+      if (VolName && *VolName && *VolName != '*' && strcmp(dev->VolHdr.VolumeName, VolName) != 0) {
          Mmsg(jcr->errmsg, _("Wrong Volume mounted on device %s: Wanted %s have %s\n"),
-            dev->print_name(), VolName, dev->VolHdr.VolName);
+            dev->print_name(), VolName, dev->VolHdr.VolumeName);
          /*
           * Cancel Job if too many label errors
           *  => we are in a loop
@@ -89,7 +89,9 @@ int read_dev_volume_label(DCR *dcr)
       return VOL_OK;       /* label already read */
    }
 
-   dev->state &= ~(ST_LABEL|ST_APPEND|ST_READ);  /* set no label, no append */
+   dev->clear_labeled();
+   dev->clear_append();
+   dev->clear_read();
    dev->label_type = B_BACULA_LABEL;
 
    if (!rewind_dev(dev)) {
@@ -114,7 +116,7 @@ int read_dev_volume_label(DCR *dcr)
       }
       if (stat == VOL_NAME_ERROR || stat == VOL_LABEL_ERROR) {
          Mmsg(jcr->errmsg, _("Wrong Volume mounted on device %s: Wanted %s have %s\n"),
-              dev->print_name(), VolName, dev->VolHdr.VolName);
+              dev->print_name(), VolName, dev->VolHdr.VolumeName);
          if (!dev->poll && jcr->label_errors++ > 100) {
             Jmsg(jcr, M_FATAL, 0, "Too many tries: %s", jcr->errmsg);
          }
@@ -197,13 +199,13 @@ int read_dev_volume_label(DCR *dcr)
    }
 
    dev->set_labeled();               /* set has Bacula label */
-   new_volume(dev->VolHdr.VolName, dev);
+   new_volume(dev->VolHdr.VolumeName, dev);
 
    /* Compare Volume Names */
-   Dmsg2(30, "Compare Vol names: VolName=%s hdr=%s\n", VolName?VolName:"*", dev->VolHdr.VolName);
-   if (VolName && *VolName && *VolName != '*' && strcmp(dev->VolHdr.VolName, VolName) != 0) {
+   Dmsg2(30, "Compare Vol names: VolName=%s hdr=%s\n", VolName?VolName:"*", dev->VolHdr.VolumeName);
+   if (VolName && *VolName && *VolName != '*' && strcmp(dev->VolHdr.VolumeName, VolName) != 0) {
       Mmsg(jcr->errmsg, _("Wrong Volume mounted on device %s: Wanted %s have %s\n"),
-           dev->print_name(), VolName, dev->VolHdr.VolName);
+           dev->print_name(), VolName, dev->VolHdr.VolumeName);
       Dmsg1(30, "%s", jcr->errmsg);
       /*
        * Cancel Job if too many label errors
@@ -214,7 +216,7 @@ int read_dev_volume_label(DCR *dcr)
       }
       return VOL_NAME_ERROR;
    }
-   Dmsg1(30, "Copy vol_name=%s\n", dev->VolHdr.VolName);
+   Dmsg1(30, "Copy vol_name=%s\n", dev->VolHdr.VolumeName);
 
    if (debug_level >= 10) {
       dump_volume_label(dev);
@@ -230,84 +232,94 @@ int read_dev_volume_label(DCR *dcr)
  *  Writing : returns the label of the current file (on the harddisk).
  *  Reading : returns an error
  */
-int read_dev_volume_label_guess(DCR *dcr, bool write) 
+int read_dvd_volume_label(DCR *dcr, bool write) 
 {
    int vol_label_status;
    DEVICE *dev = dcr->dev;
    JCR *jcr = dcr->jcr;
-   Dmsg3(100, "Enter read_dev_volume_label_guess device=%s vol=%s dev_Vol=%s\n",
-         dev->print_name(), dcr->VolumeName, dev->VolHdr.VolName);
+   Dmsg3(100, "Enter: dvd_volume_label device=%s vol=%s dev_Vol=%s\n",
+         dev->print_name(), dcr->VolumeName, dev->VolHdr.VolumeName);
    
-   if (!dev->is_dvd()) {
-      Dmsg0(100, "Leave read_dev_volume_label_guess !CAP_REQMOUNT\n");
-      return read_dev_volume_label(dcr);
+   if (!dev->is_dvd()) {  
+      Jmsg1(jcr, M_ABORT, 0, _("Device %s is not a DVD.\n"), dev->print_name());
+      return -1;    /* for compiler, won't get here */
    }
    
    if (!write && (dcr->VolCatInfo.VolCatParts == 0)) {
-      Dmsg0(100, "Leave read_dev_volume_label_guess !writing, and VolCatParts == 0\n");
+      Dmsg0(100, "Leave read_dvd_volume_label !writing, and VolCatParts == 0\n");
       return read_dev_volume_label(dcr);
    }
    
-   /* For mounted devices, tries to guess the volume name, and read the label if possible.
-   */
-   if (open_guess_name_dev(dev) < 0) {     
+   /*
+    * For mounted devices, try to guess the Volume name
+    * and read the label if possible.
+    */
+   if (!can_open_mounted_dev(dev)) {     
       if (!write || dcr->VolCatInfo.VolCatParts > 0) {
          Mmsg2(jcr->errmsg, _("Requested Volume \"%s\" on %s is not a Bacula labeled Volume."),
                dev->print_name(), dcr->VolumeName);
-         Dmsg0(100, "Leave read_dev_volume_label_guess VOL_NO_LABEL (!open_guess_name_dev)\n");
+         Dmsg0(100, "Leave read_dvd_volume_label VOL_NO_LABEL (!open_mounted_dev)\n");
          return VOL_NO_LABEL;
       }
       
-      if (write && dev->free_space_errno < 0) {
-         Dmsg0(100, "Leave read_dev_volume_label_guess !free_space VOL_NO_MEDIA\n");
+      /* At this point, we are writing */
+      if (dev->free_space_errno < 0) {
+         Dmsg0(100, "Exit: read_dvd_volume_label !free_space VOL_NO_MEDIA\n");
          Mmsg2(jcr->errmsg, _("free_space error on %s. The current medium is probably not writable: ERR=%s.\n"),
                dev->print_name(), dev->errmsg);
          return VOL_NO_MEDIA;
       }
       
-      /* If we can't guess the name, and we are writing, just reopen the right file with open_first_part. */
-      if (open_first_part(dev) < 0) {
+      /* 
+       * If we can't guess the name, and we are writing, 
+       * just reopen the right file with open_first_part.
+       */
+      if (open_first_part(dev, OPEN_READ_WRITE) < 0) {
          berrno be;
          Mmsg2(jcr->errmsg, _("open_first_part error on %s: ERR=%s.\n"),
                dev->print_name(), be.strerror());
-         Dmsg0(100, "Leave read_dev_volume_label_guess VOL_IO_ERROR (!open_guess_name_dev && !open_first_part)\n");
+         Dmsg0(100, "Leave read_dvd_volume_label VOL_IO_ERROR (!open_mounted_dev && !open_first_part)\n");
          return VOL_IO_ERROR;
       }
       
-      Dmsg0(100, "Leave read_dev_volume_label_guess !open_guess_name_dev\n");
+      Dmsg0(100, "Leave read_dvd_volume_label !open_mounted_dev\n");
       return read_dev_volume_label(dcr);
+
    } else {
+      /* 
+       * If we get here, we can open the mounted device
+       */
       if (write && dcr->dev->free_space_errno < 0) {
-         Dmsg0(100, "Leave read_dev_volume_label_guess !free_space VOL_NO_MEDIA\n");
+         Dmsg0(100, "Leave read_dvd_volume_label !free_space VOL_NO_MEDIA\n");
          Mmsg2(jcr->errmsg, _("free_space error on %s. The current medium is probably not writable: ERR=%s.\n"),
                dev->print_name(), dev->errmsg);
          return VOL_NO_MEDIA;
       }
       
-      vol_label_status = read_dev_volume_label(dcr);
-
       if (!write || dcr->VolCatInfo.VolCatParts > 0) {
-         Dmsg0(100, "Leave read_dev_volume_label_guess (open_guess_name_dev && (!write || dcr->VolCatInfo.VolCatParts > 0))\n");
-         return vol_label_status;
+         Dmsg0(100, "Exit: read_dvd_volume_label (open_mounted_dev && (!write || dcr->VolCatInfo.VolCatParts > 0))\n");
+         return read_dev_volume_label(dcr);
       }
       
-      if (open_first_part(dcr->dev) < 0) {
+      /* At this point, we are writing */
+      if (open_first_part(dcr->dev, OPEN_READ_WRITE) < 0) {
          berrno be;
          Mmsg2(jcr->errmsg, _("open_first_part error on %s: ERR=%s.\n"),
                dev->print_name(), be.strerror());
-         Dmsg0(100, "Leave read_dev_volume_label_guess VOL_IO_ERROR (open_guess_name_dev && !open_first_part)\n");
+         Dmsg0(100, "Leave read_dvd_volume_label VOL_IO_ERROR (open_mounted_dev && !open_first_part)\n");
          return VOL_IO_ERROR;
       }
+      vol_label_status = read_dev_volume_label(dcr);
       
-      /* When writing, if the guessed volume name is no the right volume name, 
+      /* When writing, if the guessed volume name is not the right volume name, 
        * report the error, otherwise, just continue with the right file.
        */
       if (vol_label_status != VOL_NAME_ERROR) {
-         Dmsg0(100, "Leave read_dev_volume_label_guess (open_guess_name_dev && !VOL_NAME_ERROR)\n");
+         Dmsg0(100, "Leave read_dvd_volume_label (open_mounted_dev && !VOL_NAME_ERROR)\n");
          dev->clear_labeled();   
          return read_dev_volume_label(dcr);
       } else {
-         Dmsg0(100, "Leave read_dev_volume_label_guess (open_guess_name_dev && VOL_NAME_ERROR)\n");
+         Dmsg0(100, "Leave read_dvd_volume_label (open_mounted_dev && VOL_NAME_ERROR)\n");
          return vol_label_status;
       }
    }
@@ -413,7 +425,7 @@ bool write_new_volume_label_to_dev(DCR *dcr, const char *VolName, const char *Po
 
    if (weof_dev(dev, 1) == 0) {
       dev->set_labeled();
-      write_ansi_ibm_labels(dcr, ANSI_EOF_LABEL, dev->VolHdr.VolName);
+      write_ansi_ibm_labels(dcr, ANSI_EOF_LABEL, dev->VolHdr.VolumeName);
    }
 
    if (debug_level >= 20)  {
@@ -475,7 +487,7 @@ bool rewrite_volume_label(DCR *dcr, bool recycle)
             rewind_dev(dev);
             return false;
          }
-      } else if (!write_ansi_ibm_labels (dcr, ANSI_VOL_LABEL, dev->VolHdr.VolName)) {
+      } else if (!write_ansi_ibm_labels(dcr, ANSI_VOL_LABEL, dev->VolHdr.VolumeName)) {
          return false;
       }
 
@@ -563,8 +575,8 @@ static void create_volume_label_record(DCR *dcr, DEV_RECORD *rec)
    ser_float64(dev->VolHdr.write_date);   /* 0 if VerNum >= 11 */
    ser_float64(dev->VolHdr.write_time);   /* 0  if VerNum >= 11 */
 
-   ser_string(dev->VolHdr.VolName);
-   ser_string(dev->VolHdr.PrevVolName);
+   ser_string(dev->VolHdr.VolumeName);
+   ser_string(dev->VolHdr.PrevVolumeName);
    ser_string(dev->VolHdr.PoolName);
    ser_string(dev->VolHdr.PoolType);
    ser_string(dev->VolHdr.MediaType);
@@ -601,7 +613,7 @@ void create_volume_label(DEVICE *dev, const char *VolName, const char *PoolName)
    bstrncpy(dev->VolHdr.Id, BaculaId, sizeof(dev->VolHdr.Id));
    dev->VolHdr.VerNum = BaculaTapeVersion;
    dev->VolHdr.LabelType = PRE_LABEL;  /* Mark tape as unused */
-   bstrncpy(dev->VolHdr.VolName, VolName, sizeof(dev->VolHdr.VolName));
+   bstrncpy(dev->VolHdr.VolumeName, VolName, sizeof(dev->VolHdr.VolumeName));
    bstrncpy(dev->VolHdr.PoolName, PoolName, sizeof(dev->VolHdr.PoolName));
    bstrncpy(dev->VolHdr.MediaType, device->media_type, sizeof(dev->VolHdr.MediaType));
 
@@ -797,8 +809,8 @@ bool unser_volume_label(DEVICE *dev, DEV_RECORD *rec)
    unser_float64(dev->VolHdr.write_date);    /* Unused with VerNum >= 11 */
    unser_float64(dev->VolHdr.write_time);    /* Unused with VerNum >= 11 */
 
-   unser_string(dev->VolHdr.VolName);
-   unser_string(dev->VolHdr.PrevVolName);
+   unser_string(dev->VolHdr.VolumeName);
+   unser_string(dev->VolHdr.PrevVolumeName);
    unser_string(dev->VolHdr.PoolName);
    unser_string(dev->VolHdr.PoolType);
    unser_string(dev->VolHdr.MediaType);
@@ -913,7 +925,7 @@ void dump_volume_label(DEVICE *dev)
 "HostName          : %s\n"
 "",
              dev->VolHdr.Id, dev->VolHdr.VerNum,
-             dev->VolHdr.VolName, dev->VolHdr.PrevVolName,
+             dev->VolHdr.VolumeName, dev->VolHdr.PrevVolumeName,
              File, LabelType, dev->VolHdr.LabelSize,
              dev->VolHdr.PoolName, dev->VolHdr.MediaType,
              dev->VolHdr.PoolType, dev->VolHdr.HostName);