]> git.sur5r.net Git - bacula/bacula/commitdiff
- Final tweaks to build Win32.
authorKern Sibbald <kern@sibbald.com>
Wed, 31 Aug 2005 15:29:40 +0000 (15:29 +0000)
committerKern Sibbald <kern@sibbald.com>
Wed, 31 Aug 2005 15:29:40 +0000 (15:29 +0000)
- Enable debug code in ua_label.c
- Remove devices from the Volume list even if no
  Volume is in drive.  Hopefully this fixes Arno's problem
  of multiple volumes listed in the same drive.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@2371 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/kernstodo
bacula/kes-1.37
bacula/src/baconfig.h
bacula/src/dird/ua_label.c
bacula/src/stored/dircmd.c
bacula/src/stored/reserve.c
bacula/src/version.h

index c6b8f41148bfca52c7244a082c968f973a46622d..6e98a95a62716cf43ee316ad2d20549647b083a0 100644 (file)
@@ -10,6 +10,8 @@ Version 1.37                Kern (see below)
 Final items for 1.37 before release:
 1. Fix bugs
 - Look at fixing restore status stats in SD.
+- Check "update slots=7 scan storage=DLT drive=0" with    
+  non-bacula tape in the drive.
 
 -  --without-openssl breaks at least on Solaris.
 -  Figure out how to package gui, and rescue programs.
@@ -21,6 +23,7 @@ Final items for 1.37 before release:
 - Add scratch pool event.
 - Implement NeedVolume event
 - Add Win32 FileSet definition somewhere
+      
 
 Document:
 - datadir for po files.
index 32a41224e34a3c6b6aace011bd5894703b815250..872460643a16bd6851a6a6fc37809906d6e16ae6 100644 (file)
@@ -4,6 +4,12 @@
 General:
 
 Changes to 1.37.37:
+30Aug05
+- Final tweaks to build Win32.
+- Enable debug code in ua_label.c
+- Remove devices from the Volume list even if no
+  Volume is in drive.  Hopefully this fixes Arno's problem
+  of multiple volumes listed in the same drive.
 28Aug05
 - Apply Landon's patch for TLS default values.
 - Correct LOCALEDIR problem in build of Win32
index 04dc8c6617aeeee2575bb238800111c7a90758f9..53a6ac150838ce1e94c21e01b9c1d74364599fb2 100644 (file)
 
 /* Allow printing of NULL pointers */
 #define NPRT(x) (x)?(x):_("*None*")
+#ifdef WIN32
+#undef ENABLE_NLS
+#endif
 
 #ifdef ENABLE_NLS
    #include <libintl.h>
index 01b094c4da6c6540ece8e5d405b704b8dcf10134..60040cdee8d46435c7b97aa7350e13d6421e595b 100644 (file)
@@ -36,7 +36,7 @@ typedef struct s_vol_list {
 static int do_label(UAContext *ua, const char *cmd, int relabel);
 static void label_from_barcodes(UAContext *ua, int drive);
 static bool send_label_request(UAContext *ua, MEDIA_DBR *mr, MEDIA_DBR *omr,
-              POOL_DBR *pr, int relabel, bool media_record_exits, int drive);
+               POOL_DBR *pr, int relabel, bool media_record_exits, int drive);
 static vol_list_t *get_vol_list_from_SD(UAContext *ua, bool scan);
 static void free_vol_list(vol_list_t *vol_list);
 static bool is_cleaning_tape(UAContext *ua, MEDIA_DBR *mr, POOL_DBR *pr);
@@ -77,68 +77,66 @@ static bool get_user_slot_list(UAContext *ua, char *slot_list, int num_slots)
 
       strip_trailing_junk(ua->argv[i]);
       for (p=ua->argv[i]; p && *p; p=e) {
-        /* Check for list */
+         /* Check for list */
          e = strchr(p, ',');
-        if (e) {
-           *e++ = 0;
-        }
-        /* Check for range */
+         if (e) {
+            *e++ = 0;
+         }
+         /* Check for range */
          h = strchr(p, '-');             /* range? */
-        if (h == p) {
+         if (h == p) {
             msg = _("Negative numbers not permitted\n");
-           goto bail_out;
-        }
-        if (h) {
-           *h++ = 0;
-           if (!is_an_integer(h)) {
+            goto bail_out;
+         }
+         if (h) {
+            *h++ = 0;
+            if (!is_an_integer(h)) {
                msg = _("Range end is not integer.\n");
-              goto bail_out;
-           }
-           skip_spaces(&p);
-           if (!is_an_integer(p)) {
+               goto bail_out;
+            }
+            skip_spaces(&p);
+            if (!is_an_integer(p)) {
                msg = _("Range start is not an integer.\n");
-              goto bail_out;
-           }
-           beg = atoi(p);
-           end = atoi(h);
-           if (end < beg) {
+               goto bail_out;
+            }
+            beg = atoi(p);
+            end = atoi(h);
+            if (end < beg) {
                msg = _("Range end not bigger than start.\n");
-              goto bail_out;
-           }
-        } else {
-           skip_spaces(&p);
-           if (!is_an_integer(p)) {
+               goto bail_out;
+            }
+         } else {
+            skip_spaces(&p);
+            if (!is_an_integer(p)) {
                msg = _("Input value is not an integer.\n");
-              goto bail_out;
-           }
-           beg = end = atoi(p);
-        }
-        if (beg <= 0 || end <= 0) {
+               goto bail_out;
+            }
+            beg = end = atoi(p);
+         }
+         if (beg <= 0 || end <= 0) {
             msg = _("Values must be be greater than zero.\n");
-           goto bail_out;
-        }
-        if (end >= num_slots) {
+            goto bail_out;
+         }
+         if (end >= num_slots) {
             msg = _("Slot too large.\n");
-           goto bail_out;
-        }
-        for (i=beg; i<=end; i++) {
-           slot_list[i] = 1;         /* Turn on specified range */
-        }
+            goto bail_out;
+         }
+         for (i=beg; i<=end; i++) {
+            slot_list[i] = 1;         /* Turn on specified range */
+         }
       }
    } else {
       /* Turn everything on */
       for (i=0; i <= num_slots; i++) {
-        slot_list[i] = 1;
+         slot_list[i] = 1;
       }
    }
-#ifdef xxx_debug
-   printf("Slots turned on:\n");
+   Dmsg0(100, "Slots turned on:\n");
    for (i=1; i <= num_slots; i++) {
       if (slot_list[i]) {
-         printf("%d\n", i);
+         Dmsg1(100, "%d\n", i);
       }
    }
-#endif
    return true;
 
 bail_out:
@@ -193,61 +191,61 @@ int update_slots(UAContext *ua)
    for (vl=vol_list; vl; vl=vl->next) {
       if (vl->Slot > max_slots) {
          bsendmsg(ua, _("Slot %d larger than max %d ignored.\n"),
-           vl->Slot, max_slots);
-        continue;
+            vl->Slot, max_slots);
+         continue;
       }
       /* Check if user wants us to look at this slot */
       if (!slot_list[vl->Slot]) {
          Dmsg1(100, "Skipping slot=%d\n", vl->Slot);
-        continue;
+         continue;
       }
       /* If scanning, we read the label rather than the barcode */
       if (scan) {
-        if (vl->VolName) {
-           free(vl->VolName);
-           vl->VolName = NULL;
-        }
-        vl->VolName = get_volume_name_from_SD(ua, vl->Slot, drive);
+         if (vl->VolName) {
+            free(vl->VolName);
+            vl->VolName = NULL;
+         }
+         vl->VolName = get_volume_name_from_SD(ua, vl->Slot, drive);
          Dmsg2(100, "Got Vol=%s from SD for Slot=%d\n", vl->VolName, vl->Slot);
       }
-      slot_list[vl->Slot] = 0;       /* clear Slot */
+      slot_list[vl->Slot] = 0;        /* clear Slot */
       if (!vl->VolName) {
          Dmsg1(100, "No VolName for Slot=%d setting InChanger to zero.\n", vl->Slot);
-        memset(&mr, 0, sizeof(mr));
-        mr.Slot = vl->Slot;
-        mr.InChanger = 1;
-        mr.StorageId = store->StorageId;
-        /* Set InChanger to zero for this Slot */
-        db_lock(ua->db);
-        db_make_inchanger_unique(ua->jcr, ua->db, &mr);
-        db_unlock(ua->db);
+         memset(&mr, 0, sizeof(mr));
+         mr.Slot = vl->Slot;
+         mr.InChanger = 1;
+         mr.StorageId = store->StorageId;
+         /* Set InChanger to zero for this Slot */
+         db_lock(ua->db);
+         db_make_inchanger_unique(ua->jcr, ua->db, &mr);
+         db_unlock(ua->db);
          bsendmsg(ua, _("No VolName for Slot=%d set InChanger to zero.\n"), vl->Slot);
-        continue;
+         continue;
       }
       memset(&mr, 0, sizeof(mr));
       bstrncpy(mr.VolumeName, vl->VolName, sizeof(mr.VolumeName));
       db_lock(ua->db);
       if (db_get_media_record(ua->jcr, ua->db, &mr)) {
-        if (mr.Slot != vl->Slot || !mr.InChanger || mr.StorageId != store->StorageId) {
-           mr.Slot = vl->Slot;
-           mr.InChanger = 1;
-           mr.StorageId = store->StorageId;
-           if (!db_update_media_record(ua->jcr, ua->db, &mr)) {
+         if (mr.Slot != vl->Slot || !mr.InChanger || mr.StorageId != store->StorageId) {
+            mr.Slot = vl->Slot;
+            mr.InChanger = 1;
+            mr.StorageId = store->StorageId;
+            if (!db_update_media_record(ua->jcr, ua->db, &mr)) {
                bsendmsg(ua, "%s", db_strerror(ua->db));
-           } else {
-              bsendmsg(ua, _(
+            } else {
+               bsendmsg(ua, _(
                  "Catalog record for Volume \"%s\" updated to reference slot %d.\n"),
-                mr.VolumeName, mr.Slot);
-           }
-        } else {
+                 mr.VolumeName, mr.Slot);
+            }
+         } else {
             bsendmsg(ua, _("Catalog record for Volume \"%s\" is up to date.\n"),
-              mr.VolumeName);
-        }
-        db_unlock(ua->db);
-        continue;
+               mr.VolumeName);
+         }
+         db_unlock(ua->db);
+         continue;
       } else {
          bsendmsg(ua, _("Record for Volume \"%s\" not found in catalog.\n"),
-            mr.VolumeName);
+             mr.VolumeName);
       }
       db_unlock(ua->db);
    }
@@ -257,9 +255,9 @@ int update_slots(UAContext *ua)
    db_lock(ua->db);
    for (int i=1; i <= max_slots; i++) {
       if (slot_list[i]) {
-        mr.Slot = i;
-        /* Set InChanger to zero for this Slot */
-        db_make_inchanger_unique(ua->jcr, ua->db, &mr);
+         mr.Slot = i;
+         /* Set InChanger to zero for this Slot */
+         db_make_inchanger_unique(ua->jcr, ua->db, &mr);
       }
    }
    db_unlock(ua->db);
@@ -316,24 +314,24 @@ static int do_label(UAContext *ua, const char *cmd, int relabel)
       /* Check for oldvolume=name */
       i = find_arg_with_value(ua, "oldvolume");
       if (i >= 0) {
-        memset(&omr, 0, sizeof(omr));
-        bstrncpy(omr.VolumeName, ua->argv[i], sizeof(omr.VolumeName));
-        if (db_get_media_record(ua->jcr, ua->db, &omr)) {
-           goto checkVol;
-        }
+         memset(&omr, 0, sizeof(omr));
+         bstrncpy(omr.VolumeName, ua->argv[i], sizeof(omr.VolumeName));
+         if (db_get_media_record(ua->jcr, ua->db, &omr)) {
+            goto checkVol;
+         }
          bsendmsg(ua, "%s", db_strerror(ua->db));
       }
       /* No keyword or Vol not found, ask user to select */
       if (!select_media_dbr(ua, &omr)) {
-        return 1;
+         return 1;
       }
 
       /* Require Volume to be Purged or Recycled */
 checkVol:
       if (strcmp(omr.VolStatus, "Purged") != 0 && strcmp(omr.VolStatus, "Recycle") != 0) {
          bsendmsg(ua, _("Volume \"%s\" has VolStatus %s. It must be Purged or Recycled before relabeling.\n"),
-           omr.VolumeName, omr.VolStatus);
-        return 1;
+            omr.VolumeName, omr.VolStatus);
+         return 1;
       }
    }
 
@@ -348,38 +346,38 @@ checkVol:
    for ( ;; ) {
       media_record_exists = false;
       if (!get_cmd(ua, _("Enter new Volume name: "))) {
-        return 1;
+         return 1;
       }
 checkName:
       if (!is_volume_name_legal(ua, ua->cmd)) {
-        continue;
+         continue;
       }
 
       memset(&mr, 0, sizeof(mr));
       bstrncpy(mr.VolumeName, ua->cmd, sizeof(mr.VolumeName));
       /* If VolBytes are zero the Volume is not labeled */
       if (db_get_media_record(ua->jcr, ua->db, &mr)) {
-        if (mr.VolBytes != 0) {
+         if (mr.VolBytes != 0) {
              bsendmsg(ua, _("Media record for new Volume \"%s\" already exists.\n"),
-               mr.VolumeName);
-            continue;
-         }
-         media_record_exists = true;
+                mr.VolumeName);
+             continue;
+          }
+          media_record_exists = true;
       }
-      break;                         /* Got it */
+      break;                          /* Got it */
    }
 
    /* If autochanger, request slot */
    i = find_arg_with_value(ua, "slot");
    if (i >= 0) {
       mr.Slot = atoi(ua->argv[i]);
-      mr.InChanger = 1;              /* assumed if we are labeling it */
+      mr.InChanger = 1;               /* assumed if we are labeling it */
    } else if (store->autochanger) {
       if (!get_pint(ua, _("Enter slot (0 or Enter for none): "))) {
-        return 1;
+         return 1;
       }
       mr.Slot = ua->pint32_val;
-      mr.InChanger = 1;              /* assumed if we are labeling it */
+      mr.InChanger = 1;               /* assumed if we are labeling it */
    }
    mr.StorageId = store->StorageId;
 
@@ -389,7 +387,7 @@ checkName:
    if (pr.PoolId == 0) {
       memset(&pr, 0, sizeof(pr));
       if (!select_pool_dbr(ua, &pr)) {
-        return 1;
+         return 1;
       }
    }
 
@@ -398,41 +396,41 @@ checkName:
    if (ok) {
       sd = ua->jcr->store_bsock;
       if (relabel) {
-        /* Delete the old media record */
-        if (!db_delete_media_record(ua->jcr, ua->db, &omr)) {
+         /* Delete the old media record */
+         if (!db_delete_media_record(ua->jcr, ua->db, &omr)) {
             bsendmsg(ua, _("Delete of Volume \"%s\" failed. ERR=%s"),
-              omr.VolumeName, db_strerror(ua->db));
-        } else {
+               omr.VolumeName, db_strerror(ua->db));
+         } else {
             bsendmsg(ua, _("Old volume \"%s\" deleted from catalog.\n"),
-              omr.VolumeName);
-           /* Update the number of Volumes in the pool */
-           pr.NumVols--;
-           if (!db_update_pool_record(ua->jcr, ua->db, &pr)) {
+               omr.VolumeName);
+            /* Update the number of Volumes in the pool */
+            pr.NumVols--;
+            if (!db_update_pool_record(ua->jcr, ua->db, &pr)) {
                bsendmsg(ua, "%s", db_strerror(ua->db));
-           }
-        }
+            }
+         }
       }
       if (ua->automount) {
-        bstrncpy(dev_name, store->dev_name(), sizeof(dev_name));
+         bstrncpy(dev_name, store->dev_name(), sizeof(dev_name));
          bsendmsg(ua, _("Requesting to mount %s ...\n"), dev_name);
-        bash_spaces(dev_name);
+         bash_spaces(dev_name);
          bnet_fsend(sd, "mount %s drive=%d", dev_name, drive);
-        unbash_spaces(dev_name);
-        while (bnet_recv(sd) >= 0) {
+         unbash_spaces(dev_name);
+         while (bnet_recv(sd) >= 0) {
             bsendmsg(ua, "%s", sd->msg);
-           /* Here we can get
-            *  3001 OK mount. Device=xxx      or
-            *  3001 Mounted Volume vvvv
+            /* Here we can get
+             *  3001 OK mount. Device=xxx      or
+             *  3001 Mounted Volume vvvv
              *  3002 Device "DVD-Writer" (/dev/hdc) is mounted.
-            *  3906 is cannot mount non-tape
-            * So for those, no need to print a reminder
-            */
+             *  3906 is cannot mount non-tape
+             * So for those, no need to print a reminder
+             */
             if (strncmp(sd->msg, "3001 ", 5) == 0 ||
                 strncmp(sd->msg, "3002 ", 5) == 0 ||
                 strncmp(sd->msg, "3906 ", 5) == 0) {
-              print_reminder = false;
-           }
-        }
+               print_reminder = false;
+            }
+         }
       }
    }
    if (print_reminder) {
@@ -481,7 +479,7 @@ static void label_from_barcodes(UAContext *ua, int drive)
                   "==============\n"));
    for (vl=vol_list; vl; vl=vl->next) {
       if (!vl->VolName || !slot_list[vl->Slot]) {
-        continue;
+         continue;
       }
       bsendmsg(ua, "%4d  %s\n", vl->Slot, vl->VolName);
    }
@@ -499,24 +497,24 @@ static void label_from_barcodes(UAContext *ua, int drive)
    /* Fire off the label requests */
    for (vl=vol_list; vl; vl=vl->next) {
       if (!vl->VolName || !slot_list[vl->Slot]) {
-        continue;
+         continue;
       }
       memset(&mr, 0, sizeof(mr));
       bstrncpy(mr.VolumeName, vl->VolName, sizeof(mr.VolumeName));
       media_record_exists = false;
       if (db_get_media_record(ua->jcr, ua->db, &mr)) {
-         if (mr.VolBytes != 0) {
+          if (mr.VolBytes != 0) {
              bsendmsg(ua, _("Media record for Slot %d Volume \"%s\" already exists.\n"),
-               vl->Slot, mr.VolumeName);
-            mr.Slot = vl->Slot;
-            mr.InChanger = 1;
-            mr.StorageId = store->StorageId;
-            if (!db_update_media_record(ua->jcr, ua->db, &mr)) {
+                vl->Slot, mr.VolumeName);
+             mr.Slot = vl->Slot;
+             mr.InChanger = 1;
+             mr.StorageId = store->StorageId;
+             if (!db_update_media_record(ua->jcr, ua->db, &mr)) {
                 bsendmsg(ua, _("Error setting InChanger: ERR=%s"), db_strerror(ua->db));
-            }
-            continue;
-         }
-         media_record_exists = true;
+             }
+             continue;
+          }
+          media_record_exists = true;
       }
       mr.InChanger = 1;
       mr.StorageId = store->StorageId;
@@ -525,29 +523,29 @@ static void label_from_barcodes(UAContext *ua, int drive)
        *  send_label_request() below
        */
       if (is_cleaning_tape(ua, &mr, &pr)) {
-        if (media_record_exists) {      /* we update it */
-           mr.VolBytes = 1;
+         if (media_record_exists) {      /* we update it */
+            mr.VolBytes = 1;
             bstrncpy(mr.VolStatus, "Cleaning", sizeof(mr.VolStatus));
-           mr.MediaType[0] = 0;
-           if (!db_update_media_record(ua->jcr, ua->db, &mr)) {
+            mr.MediaType[0] = 0;
+            if (!db_update_media_record(ua->jcr, ua->db, &mr)) {
                 bsendmsg(ua, "%s", db_strerror(ua->db));
-           }
-        } else {                        /* create the media record */
-           set_pool_dbr_defaults_in_media_dbr(&mr, &pr);
+            }
+         } else {                        /* create the media record */
+            set_pool_dbr_defaults_in_media_dbr(&mr, &pr);
             bstrncpy(mr.VolStatus, "Cleaning", sizeof(mr.VolStatus));
-           mr.MediaType[0] = 0;
-           if (db_create_media_record(ua->jcr, ua->db, &mr)) {
+            mr.MediaType[0] = 0;
+            if (db_create_media_record(ua->jcr, ua->db, &mr)) {
                bsendmsg(ua, _("Catalog record for cleaning tape \"%s\" successfully created.\n"),
-                 mr.VolumeName);
-              pr.NumVols++;          /* this is a bit suspect */
-              if (!db_update_pool_record(ua->jcr, ua->db, &pr)) {
+                  mr.VolumeName);
+               pr.NumVols++;          /* this is a bit suspect */
+               if (!db_update_pool_record(ua->jcr, ua->db, &pr)) {
                   bsendmsg(ua, "%s", db_strerror(ua->db));
-              }
-           } else {
+               }
+            } else {
                bsendmsg(ua, _("Catalog error on cleaning tape: %s"), db_strerror(ua->db));
-           }
-        }
-        continue;                    /* done, go handle next volume */
+            }
+         }
+         continue;                    /* done, go handle next volume */
       }
       bstrncpy(mr.MediaType, store->media_type, sizeof(mr.MediaType));
 
@@ -577,7 +575,7 @@ bool is_volume_name_legal(UAContext *ua, const char *name)
    /* Restrict the characters permitted in the Volume name */
    for (p=name; *p; p++) {
       if (B_ISALPHA(*p) || B_ISDIGIT(*p) || strchr(accept, (int)(*p))) {
-        continue;
+         continue;
       }
       if (ua) {
          bsendmsg(ua, _("Illegal character \"%c\" in a volume name.\n"), *p);
@@ -604,8 +602,8 @@ bool is_volume_name_legal(UAContext *ua, const char *name)
  * NOTE! This routine opens the SD socket but leaves it open
  */
 static bool send_label_request(UAContext *ua, MEDIA_DBR *mr, MEDIA_DBR *omr,
-                              POOL_DBR *pr, int relabel, bool media_record_exists,
-                              int drive)
+                               POOL_DBR *pr, int relabel, bool media_record_exists,
+                               int drive)
 {
    BSOCK *sd;
    char dev_name[MAX_NAME_LENGTH];
@@ -623,25 +621,25 @@ static bool send_label_request(UAContext *ua, MEDIA_DBR *mr, MEDIA_DBR *omr,
       bash_spaces(omr->VolumeName);
       bnet_fsend(sd, "relabel %s OldName=%s NewName=%s PoolName=%s "
                      "MediaType=%s Slot=%d drive=%d",
-                dev_name, omr->VolumeName, mr->VolumeName, pr->Name, 
-                mr->MediaType, mr->Slot, drive);
+                 dev_name, omr->VolumeName, mr->VolumeName, pr->Name, 
+                 mr->MediaType, mr->Slot, drive);
       bsendmsg(ua, _("Sending relabel command from \"%s\" to \"%s\" ...\n"),
-        omr->VolumeName, mr->VolumeName);
+         omr->VolumeName, mr->VolumeName);
    } else {
       bnet_fsend(sd, "label %s VolumeName=%s PoolName=%s MediaType=%s "
                      "Slot=%d drive=%d",
-                dev_name, mr->VolumeName, pr->Name, mr->MediaType, 
-                mr->Slot, drive);
+                 dev_name, mr->VolumeName, pr->Name, mr->MediaType, 
+                 mr->Slot, drive);
       bsendmsg(ua, _("Sending label command for Volume \"%s\" Slot %d ...\n"),
-        mr->VolumeName, mr->Slot);
+         mr->VolumeName, mr->Slot);
       Dmsg6(100, "label %s VolumeName=%s PoolName=%s MediaType=%s Slot=%d drive=%d\n",
-        dev_name, mr->VolumeName, pr->Name, mr->MediaType, mr->Slot, drive);
+         dev_name, mr->VolumeName, pr->Name, mr->MediaType, mr->Slot, drive);
    }
 
    while (bnet_recv(sd) >= 0) {
       bsendmsg(ua, "%s", sd->msg);
       if (strncmp(sd->msg, "3000 OK label.", 14) == 0) {
-        ok = true;
+         ok = true;
       }
    }
    unbash_spaces(mr->VolumeName);
@@ -651,28 +649,28 @@ static bool send_label_request(UAContext *ua, MEDIA_DBR *mr, MEDIA_DBR *omr,
    mr->set_label_date = true;
    if (ok) {
       if (media_record_exists) {      /* we update it */
-        mr->VolBytes = 1;
-        mr->InChanger = 1;
-        if (!db_update_media_record(ua->jcr, ua->db, mr)) {
+         mr->VolBytes = 1;
+         mr->InChanger = 1;
+         if (!db_update_media_record(ua->jcr, ua->db, mr)) {
              bsendmsg(ua, "%s", db_strerror(ua->db));
-            ok = false;
-        }
-      } else {                       /* create the media record */
-        set_pool_dbr_defaults_in_media_dbr(mr, pr);
-        mr->VolBytes = 1;               /* flag indicating Volume labeled */
-        mr->InChanger = 1;
-        if (db_create_media_record(ua->jcr, ua->db, mr)) {
+             ok = false;
+         }
+      } else {                        /* create the media record */
+         set_pool_dbr_defaults_in_media_dbr(mr, pr);
+         mr->VolBytes = 1;               /* flag indicating Volume labeled */
+         mr->InChanger = 1;
+         if (db_create_media_record(ua->jcr, ua->db, mr)) {
             bsendmsg(ua, _("Catalog record for Volume \"%s\", Slot %d  successfully created.\n"),
-           mr->VolumeName, mr->Slot);
-           /* Update number of volumes in pool */
-           pr->NumVols++;
-           if (!db_update_pool_record(ua->jcr, ua->db, pr)) {
+            mr->VolumeName, mr->Slot);
+            /* Update number of volumes in pool */
+            pr->NumVols++;
+            if (!db_update_pool_record(ua->jcr, ua->db, pr)) {
                bsendmsg(ua, "%s", db_strerror(ua->db));
-           }
-        } else {
+            }
+         } else {
             bsendmsg(ua, "%s", db_strerror(ua->db));
-           ok = false;
-        }
+            ok = false;
+         }
       }
    } else {
       bsendmsg(ua, _("Label command failed for Volume %s.\n"), mr->VolumeName);
@@ -686,10 +684,10 @@ static BSOCK *open_sd_bsock(UAContext *ua)
 
    if (!ua->jcr->store_bsock) {
       bsendmsg(ua, _("Connecting to Storage daemon %s at %s:%d ...\n"),
-        store->hdr.name, store->address, store->SDport);
+         store->hdr.name, store->address, store->SDport);
       if (!connect_to_storage_daemon(ua->jcr, 10, SDConnectTimeout, 1)) {
          bsendmsg(ua, _("Failed to connect to Storage daemon.\n"));
-        return NULL;
+         return NULL;
       }
    }
    return ua->jcr->store_bsock;
@@ -727,12 +725,12 @@ static char *get_volume_name_from_SD(UAContext *ua, int Slot, int drive)
       bsendmsg(ua, "%s", sd->msg);
       Dmsg1(100, "Got: %s", sd->msg);
       if (strncmp(sd->msg, "3001 Volume=", 12) == 0) {
-        VolName = (char *)malloc(sd->msglen);
+         VolName = (char *)malloc(sd->msglen);
          if (sscanf(sd->msg, "3001 Volume=%s Slot=%d", VolName, &rtn_slot) == 2) {
-           break;
-        }
-        free(VolName);
-        VolName = NULL;
+            break;
+         }
+         free(VolName);
+         VolName = NULL;
       }
    }
    close_sd_bsock(ua);
@@ -771,42 +769,42 @@ static vol_list_t *get_vol_list_from_SD(UAContext *ua, bool scan)
 
       /* Check for returned SD messages */
       if (sd->msg[0] == '3'     && B_ISDIGIT(sd->msg[1]) &&
-         B_ISDIGIT(sd->msg[2]) && B_ISDIGIT(sd->msg[3]) &&
+          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;
+         continue;
       }
 
-      /* Validate Slot: if scanning, otherwise Slot:Barcode */
+      /* Validate Slot: if scanning, otherwise  Slot:Barcode */
       p = strchr(sd->msg, ':');
       if (scan && p) {
-        /* Scanning -- require only valid slot */
-        Slot = atoi(sd->msg);
-        if (Slot <= 0) {
-           p--;
+         /* Scanning -- require only valid slot */
+         Slot = atoi(sd->msg);
+         if (Slot <= 0) {
+            p--;
             *p = ':';
             bsendmsg(ua, _("Invalid Slot number: %s\n"), sd->msg);
-           continue;
-        }
+            continue;
+         }
       } else {
-        /* Not scanning */
-        if (p && strlen(p) > 1) {
-           *p++ = 0;
-           if (!is_an_integer(sd->msg) || (Slot=atoi(sd->msg)) <= 0) {
-              p--;
+         /* Not scanning */
+         if (p && strlen(p) > 1) {
+            *p++ = 0;
+            if (!is_an_integer(sd->msg) || (Slot=atoi(sd->msg)) <= 0) {
+               p--;
                *p = ':';
                bsendmsg(ua, _("Invalid Slot number: %s\n"), sd->msg);
-              continue;
-           }
-        } else {
-           continue;
-        }
-        if (!is_volume_name_legal(ua, p)) {
-           p--;
+               continue;
+            }
+         } else {
+            continue;
+         }
+         if (!is_volume_name_legal(ua, p)) {
+            p--;
             *p = ':';
             bsendmsg(ua, _("Invalid Volume name: %s\n"), sd->msg);
-           continue;
-        }
+            continue;
+         }
       }
 
       /* Add Slot and VolumeName to list */
@@ -814,25 +812,25 @@ static vol_list_t *get_vol_list_from_SD(UAContext *ua, bool scan)
       vl->Slot = Slot;
       if (p) {
          if (*p == ':') {
-           p++;                      /* skip separator */
-        }
-        vl->VolName = bstrdup(p);
+            p++;                      /* skip separator */
+         }
+         vl->VolName = bstrdup(p);
       } else {
-        vl->VolName = NULL;
+         vl->VolName = NULL;
       }
       Dmsg2(100, "Add slot=%d Vol=%s to SD list.\n", vl->Slot, NPRT(vl->VolName));
       if (!vol_list) {
-        vl->next = vol_list;
-        vol_list = vl;
+         vl->next = vol_list;
+         vol_list = vl;
       } else {
-        /* Add new entry to end of list */
-        for (vol_list_t *tvl=vol_list; tvl; tvl=tvl->next) {
-           if (!tvl->next) {
-              tvl->next = vl;
-              vl->next = NULL;
-              break;
-           }
-        }
+         /* Add new entry to end of list */
+         for (vol_list_t *tvl=vol_list; tvl; tvl=tvl->next) {
+            if (!tvl->next) {
+               tvl->next = vl;
+               vl->next = NULL;
+               break;
+            }
+         }
       }
    }
    close_sd_bsock(ua);
@@ -847,7 +845,7 @@ static void free_vol_list(vol_list_t *vol_list)
    for (vl=vol_list; vl; ) {
       vol_list_t *ovl;
       if (vl->VolName) {
-        free(vl->VolName);
+         free(vl->VolName);
       }
       ovl = vl;
       vl = vl->next;
@@ -877,7 +875,7 @@ static int get_num_slots_from_SD(UAContext *ua)
 
    while (bnet_recv(sd) >= 0) {
       if (sscanf(sd->msg, "slots=%d\n", &slots) == 1) {
-        break;
+         break;
       } else {
          bsendmsg(ua, "%s", sd->msg);
       }
@@ -909,7 +907,7 @@ static bool is_cleaning_tape(UAContext *ua, MEDIA_DBR *mr, POOL_DBR *pr)
       ua->jcr->pool->cleaning_prefix, mr->VolumeName,
       strlen(ua->jcr->pool->cleaning_prefix),
       strncmp(mr->VolumeName, ua->jcr->pool->cleaning_prefix,
-                 strlen(ua->jcr->pool->cleaning_prefix)));
+                  strlen(ua->jcr->pool->cleaning_prefix)));
    return strncmp(mr->VolumeName, ua->jcr->pool->cleaning_prefix,
-                 strlen(ua->jcr->pool->cleaning_prefix)) == 0;
+                  strlen(ua->jcr->pool->cleaning_prefix)) == 0;
 }
index 7f40b79971b31651921bb6478d37d0fccf0e9a7d..398607c3a7fe1f1d50d8a9431f5fa1b646fd2b0c 100644 (file)
@@ -406,6 +406,7 @@ static void label_volume_if_ok(JCR *jcr, DEVICE *dev, char *oldname,
              dev->VolHdr.VolumeName);
          break;
       }
+
       /* Relabel request. If oldname matches, continue */
       if (strcmp(oldname, dev->VolHdr.VolumeName) != 0) {
          bnet_fsend(dir, _("3921 Wrong volume mounted.\n"));
index 93a0b12f8f52b36e6076433da304ef80e3e149fe..4543c3a65597b179a7dda50acd9629f8835f5983 100644 (file)
@@ -163,7 +163,24 @@ bool free_volume(DEVICE *dev)
    VOLRES vol, *fvol;
 
    if (dev->VolHdr.VolumeName[0] == 0) {
-      return false;
+      /*
+       * Our device has no VolumeName listed, but
+       *  search the list for any Volume attached to
+       *  this device and remove it.
+       */
+      P(vol_list_lock);
+      foreach_dlist(fvol, vol_list) {
+         if (fvol && fvol->dev == dev) {
+            vol_list->remove(fvol);
+            if (fvol->vol_name) {
+               free(fvol->vol_name);
+            }
+            free(fvol);
+            break;
+         }
+      }
+      V(vol_list_lock);
+      return fvol != NULL;
    }
    Dmsg1(400, "free_volume %s\n", dev->VolHdr.VolumeName);
    vol.vol_name = bstrdup(dev->VolHdr.VolumeName);
index 0401067b558c18ec37d2b1e43c3befdb736bf4b3..b7782648707874f0065604b437b072e12691cc79 100644 (file)
@@ -4,8 +4,8 @@
 
 #undef  VERSION
 #define VERSION "1.37.37"
-#define BDATE   "28 August 2005"
-#define LSMDATE "28Aug05"
+#define BDATE   "30 August 2005"
+#define LSMDATE "30Aug05"
 
 /* Debug flags */
 #undef  DEBUG