From de8d15daf2f9df91d19ab0eb0a0fcd54be89e48f Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Wed, 31 Aug 2005 15:29:40 +0000 Subject: [PATCH] - 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. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@2371 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/kernstodo | 3 + bacula/kes-1.37 | 6 + bacula/src/baconfig.h | 4 + bacula/src/dird/ua_label.c | 456 ++++++++++++++++++------------------ bacula/src/stored/dircmd.c | 1 + bacula/src/stored/reserve.c | 19 +- bacula/src/version.h | 4 +- 7 files changed, 261 insertions(+), 232 deletions(-) diff --git a/bacula/kernstodo b/bacula/kernstodo index c6b8f41148..6e98a95a62 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -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. diff --git a/bacula/kes-1.37 b/bacula/kes-1.37 index 32a41224e3..872460643a 100644 --- a/bacula/kes-1.37 +++ b/bacula/kes-1.37 @@ -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 diff --git a/bacula/src/baconfig.h b/bacula/src/baconfig.h index 04dc8c6617..53a6ac1508 100644 --- a/bacula/src/baconfig.h +++ b/bacula/src/baconfig.h @@ -57,6 +57,10 @@ /* Allow printing of NULL pointers */ #define NPRT(x) (x)?(x):_("*None*") + +#ifdef WIN32 +#undef ENABLE_NLS +#endif #ifdef ENABLE_NLS #include diff --git a/bacula/src/dird/ua_label.c b/bacula/src/dird/ua_label.c index 01b094c4da..60040cdee8 100644 --- a/bacula/src/dird/ua_label.c +++ b/bacula/src/dird/ua_label.c @@ -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; } diff --git a/bacula/src/stored/dircmd.c b/bacula/src/stored/dircmd.c index 7f40b79971..398607c3a7 100644 --- a/bacula/src/stored/dircmd.c +++ b/bacula/src/stored/dircmd.c @@ -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")); diff --git a/bacula/src/stored/reserve.c b/bacula/src/stored/reserve.c index 93a0b12f8f..4543c3a655 100644 --- a/bacula/src/stored/reserve.c +++ b/bacula/src/stored/reserve.c @@ -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); diff --git a/bacula/src/version.h b/bacula/src/version.h index 0401067b55..b778264870 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -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 -- 2.39.5