Refresh elements data.

If absolute_addressing == 1 refresh elements data when status command is executed.
    This is needed to update tape library information in the calling application.
This commit is contained in:
Alexander Moibenko
2019-01-23 15:15:30 -06:00
parent b338d5f9a0
commit 6ca40adeba
4 changed files with 44 additions and 35 deletions

Binary file not shown.

View File

@@ -31,7 +31,7 @@
Near complete re-write Feb 2000 Eric Lee Green <eric@badtux.org> to add support for Near complete re-write Feb 2000 Eric Lee Green <eric@badtux.org> to add support for
multi-drive tape changers, extract out library stuff into mtxl.c, multi-drive tape changers, extract out library stuff into mtxl.c,
and otherwise bring things up to date for dealing with LARGE tape jukeboxes and otherwise bring things up to date for dealing with LARGE tape jukeboxes
and other such enterprise-class storage subsystems. and other such enterprise-class storage subsystems.
*/ */
char *argv0; char *argv0;
@@ -39,7 +39,7 @@ char *argv0;
#include "mtx.h" /* various defines for bit order etc. */ #include "mtx.h" /* various defines for bit order etc. */
#include "mtxl.h" #include "mtxl.h"
/* A table for printing out the peripheral device type as ASCII. */ /* A table for printing out the peripheral device type as ASCII. */
static char *PeripheralDeviceType[32] = static char *PeripheralDeviceType[32] =
{ {
"Disk Drive", /* 0 */ "Disk Drive", /* 0 */
@@ -49,10 +49,10 @@ static char *PeripheralDeviceType[32] =
"Write-once", /* 4 */ "Write-once", /* 4 */
"CD-ROM", /* 5 */ "CD-ROM", /* 5 */
"Scanner", /* 6 */ "Scanner", /* 6 */
"Optical", /* 7 */ "Optical", /* 7 */
"Medium Changer", /* 8 */ "Medium Changer", /* 8 */
"Communications", /* 9 */ "Communications", /* 9 */
"ASC IT8", /* a */ "ASC IT8", /* a */
"ASC IT8", /* b */ "ASC IT8", /* b */
"RAID Array", /* c */ "RAID Array", /* c */
"Enclosure Services", /* d */ "Enclosure Services", /* d */
@@ -113,7 +113,7 @@ static void Transfer(void);
static void Eepos(void); static void Eepos(void);
static void NoAttach(void); static void NoAttach(void);
static void Version(void); static void Version(void);
static void do_Inventory(void); static void do_Inventory(void);
static void do_Unload(void); static void do_Unload(void);
static void do_Erase(void); static void do_Erase(void);
static void NoBarCode(void); static void NoBarCode(void);
@@ -150,7 +150,7 @@ command_table[] =
{ 0, "erase", do_Erase, 1, 0}, { 0, "erase", do_Erase, 1, 0},
{ 0, "nobarcode", NoBarCode, 0,0}, { 0, "nobarcode", NoBarCode, 0,0},
{ 1, "position", do_Position, 1, 1}, { 1, "position", do_Position, 1, 1},
{ 0, "invert2", Invert2, 0, 0}, { 0, "invert2", Invert2, 0, 0},
{ 3, "exchange", Exchange, 1, 1 }, { 3, "exchange", Exchange, 1, 1 },
{ 0, "altres", AltReadElementStatus, 0,0}, { 0, "altres", AltReadElementStatus, 0,0},
{ 0, NULL, NULL } { 0, NULL, NULL }
@@ -185,7 +185,7 @@ static void Usage()
static void Version(void) static void Version(void)
{ {
fprintf(stderr, "mtx version %s\n\n", VERSION); fprintf(stderr, "mtx version %s\n\n", VERSION);
Usage(); Usage();
} }
@@ -259,7 +259,7 @@ static void First(void)
arg1 = ElementStatus->DataTransferElementSourceStorageElementNumber[driveno] + 1; arg1 = ElementStatus->DataTransferElementSourceStorageElementNumber[driveno] + 1;
if (arg1 == 1) if (arg1 == 1)
{ {
printf("loading...done.\n"); /* it already has tape #1 in it! */ printf("loading...done.\n"); /* it already has tape #1 in it! */
return; return;
} }
arg2 = driveno; arg2 = driveno;
@@ -293,7 +293,7 @@ static void Last(void)
arg1 = ElementStatus->DataTransferElementSourceStorageElementNumber[driveno] + 1; arg1 = ElementStatus->DataTransferElementSourceStorageElementNumber[driveno] + 1;
if (arg1 >= (ElementStatus->StorageElementCount - ElementStatus->ImportExportCount)) if (arg1 >= (ElementStatus->StorageElementCount - ElementStatus->ImportExportCount))
{ {
printf("loading...done.\n"); /* it already has last tape in it! */ printf("loading...done.\n"); /* it already has last tape in it! */
return; return;
} }
arg2 = driveno; arg2 = driveno;
@@ -393,7 +393,7 @@ static void Next(void)
FatalError("No More Media\n"); /* last slot */ FatalError("No More Media\n"); /* last slot */
} }
static void do_Inventory(void) static void do_Inventory(void)
{ {
if (Inventory(MediumChangerFD) < 0) if (Inventory(MediumChangerFD) < 0)
{ {
@@ -421,7 +421,7 @@ static void do_Erase(void)
exit(1); /* exit with an error status. */ exit(1); /* exit with an error status. */
} }
} }
/* This should eject a tape or magazine, depending upon the device sent /* This should eject a tape or magazine, depending upon the device sent
* to. * to.
@@ -442,12 +442,12 @@ static void ReportInquiry(void)
int i; int i;
Inquiry = RequestInquiry(MediumChangerFD,&RequestSense); Inquiry = RequestInquiry(MediumChangerFD,&RequestSense);
if (Inquiry == NULL) if (Inquiry == NULL)
{ {
PrintRequestSense(&RequestSense); PrintRequestSense(&RequestSense);
FatalError("INQUIRY Command Failed\n"); FatalError("INQUIRY Command Failed\n");
} }
printf("Product Type: %s\n", PeripheralDeviceType[Inquiry->PeripheralDeviceType]); printf("Product Type: %s\n", PeripheralDeviceType[Inquiry->PeripheralDeviceType]);
printf("Vendor ID: '"); printf("Vendor ID: '");
for (i = 0; i < sizeof(Inquiry->VendorIdentification); i++) for (i = 0; i < sizeof(Inquiry->VendorIdentification); i++)
@@ -494,7 +494,7 @@ static void Status(void)
ElementStatus->ImportExportCount); ElementStatus->ImportExportCount);
for (TransferElementNumber = 0; for (TransferElementNumber = 0;
TransferElementNumber < ElementStatus->DataTransferElementCount; TransferElementNumber < ElementStatus->DataTransferElementCount;
TransferElementNumber++) TransferElementNumber++)
{ {
@@ -504,7 +504,7 @@ static void Status(void)
else { else {
printf("Data Transfer Element %d ", ElementStatus->DataTransferElementAddress[TransferElementNumber]); printf("Data Transfer Element %d ", ElementStatus->DataTransferElementAddress[TransferElementNumber]);
phys_loc = (PhysicalLocation_T *) &ElementStatus->DataTransferElementPhysicalLocation[TransferElementNumber]; phys_loc = (PhysicalLocation_T *) &ElementStatus->DataTransferElementPhysicalLocation[TransferElementNumber];
printf("Phys Loc F%u,C%u,R%u,Z%u SN%s ID %s:", printf("Phys Loc F%u,C%u,R%u,Z%u SN%s ID %s:",
phys_loc->frame, phys_loc->column, phys_loc->row, phys_loc->zone, phys_loc->frame, phys_loc->column, phys_loc->row, phys_loc->zone,
ElementStatus->DataTransferElementSerialNumber[TransferElementNumber], ElementStatus->DataTransferElementSerialNumber[TransferElementNumber],
ElementStatus->DataTransferElementProductId[TransferElementNumber] ElementStatus->DataTransferElementProductId[TransferElementNumber]
@@ -535,7 +535,7 @@ static void Status(void)
if (ElementStatus->DataTransferAlternateVolumeTag[TransferElementNumber][0]) if (ElementStatus->DataTransferAlternateVolumeTag[TransferElementNumber][0])
{ {
printf(":AlternateVolumeTag = %s", ElementStatus->DataTransferAlternateVolumeTag[TransferElementNumber]); printf(":AlternateVolumeTag = %s", ElementStatus->DataTransferAlternateVolumeTag[TransferElementNumber]);
} }
putchar('\n'); putchar('\n');
} }
@@ -559,7 +559,7 @@ static void Status(void)
ElementStatus->StorageElementPhysicalLocation[StorageElementNumber], ElementStatus->StorageElementPhysicalLocation[StorageElementNumber],
(ElementStatus->StorageElementIsImportExport[StorageElementNumber]) ? " IMPORT/EXPORT" : "", (ElementStatus->StorageElementIsImportExport[StorageElementNumber]) ? " IMPORT/EXPORT" : "",
(ElementStatus->StorageElementFull[StorageElementNumber] ? "Full " : "Empty")); (ElementStatus->StorageElementFull[StorageElementNumber] ? "Full " : "Empty"));
} }
if (ElementStatus->PrimaryVolumeTag[StorageElementNumber][0]) if (ElementStatus->PrimaryVolumeTag[StorageElementNumber][0])
{ {
@@ -588,7 +588,7 @@ void Position(int dest)
void Move(int src, int dest) { void Move(int src, int dest) {
RequestSense_T *result; /* from MoveMedium */ RequestSense_T *result; /* from MoveMedium */
result = MoveMedium(MediumChangerFD, src, dest, ElementStatus, inquiry_info, &SCSI_Flags); result = MoveMedium(MediumChangerFD, src, dest, ElementStatus, inquiry_info, &SCSI_Flags);
if (result) if (result)
{ {
@@ -646,7 +646,7 @@ static void Load(void)
if (!device_opened) if (!device_opened)
{ {
FatalError("No Media Changer Device Specified\n"); FatalError("No Media Changer Device Specified\n");
} }
if (arg1 < 0 || arg1 >= ElementStatus->StorageElementCount) if (arg1 < 0 || arg1 >= ElementStatus->StorageElementCount)
{ {
@@ -750,7 +750,7 @@ static void Exchange(void)
src = ElementStatus->StorageElementAddress[arg1 - 1]; src = ElementStatus->StorageElementAddress[arg1 - 1];
dest = ElementStatus->StorageElementAddress[arg2 - 1]; dest = ElementStatus->StorageElementAddress[arg2 - 1];
dest2 = ElementStatus->StorageElementAddress[arg3 - 1]; dest2 = ElementStatus->StorageElementAddress[arg3 - 1];
result = ExchangeMedium(MediumChangerFD, src, dest, dest2, ElementStatus, &SCSI_Flags); result = ExchangeMedium(MediumChangerFD, src, dest, dest2, ElementStatus, &SCSI_Flags);
if (result) if (result)
{ {
@@ -809,7 +809,7 @@ static void Unload(void)
if (!device_opened) if (!device_opened)
{ {
FatalError("No Media Changer Device Specified\n"); FatalError("No Media Changer Device Specified\n");
} }
/* okay, we should be there: */ /* okay, we should be there: */
if (arg1 < 0) if (arg1 < 0)
@@ -866,7 +866,7 @@ static void Unload(void)
} }
fprintf(stdout, "Unloading drive %d into Storage Element %d...", arg2, arg1 + 1); fprintf(stdout, "Unloading drive %d into Storage Element %d...", arg2, arg1 + 1);
fflush(stdout); /* make it real-time :-( */ fflush(stdout); /* make it real-time :-( */
Move(src,dest); Move(src,dest);
@@ -878,7 +878,7 @@ static void Unload(void)
} }
/***************************************************************** /*****************************************************************
** ARGUMENT PARSING SUBROUTINES: Parse arguments, dispatch. ** ARGUMENT PARSING SUBROUTINES: Parse arguments, dispatch.
*****************************************************************/ *****************************************************************/
/* *** /* ***
@@ -886,9 +886,9 @@ static void Unload(void)
* *
* If we have an actual argument at the index position indicated (i.e. we * If we have an actual argument at the index position indicated (i.e. we
* have not gone off the edge of the world), we return * have not gone off the edge of the world), we return
* its number. If we don't, or it's not a numeric argument, * its number. If we don't, or it's not a numeric argument,
* we return -1. Note that 'get_arg' is kind of misleading, we only accept * we return -1. Note that 'get_arg' is kind of misleading, we only accept
* numeric arguments, not any other kind. * numeric arguments, not any other kind.
*/ */
int get_arg(int idx) int get_arg(int idx)
{ {
@@ -924,12 +924,11 @@ void open_device(void)
/* we see if we've got a file open. If not, we open one :-(. Then /* we see if we've got a file open. If not, we open one :-(. Then
* we execute the actual command. Or not :-(. * we execute the actual command. Or not :-(.
*/ */
void execute_command(struct command_table_struct *command) void execute_command(struct command_table_struct *command)
{ {
RequestSense_T RequestSense; RequestSense_T RequestSense;
if (device == NULL && command->need_device) if (device == NULL && command->need_device)
{ {
/* try to get it from TAPE environment variable... */ /* try to get it from TAPE environment variable... */
@@ -944,6 +943,11 @@ void execute_command(struct command_table_struct *command)
} }
open_device(); open_device();
} }
if (command->need_status && absolute_addressing)
{
FreeElementData(ElementStatus);
ElementStatus = NULL;
}
if (!ElementStatus && command->need_status) if (!ElementStatus && command->need_status)
{ {
inquiry_info = RequestInquiry(MediumChangerFD,&RequestSense); inquiry_info = RequestInquiry(MediumChangerFD,&RequestSense);
@@ -957,7 +961,7 @@ void execute_command(struct command_table_struct *command)
if (!ElementStatus) if (!ElementStatus)
{ {
PrintRequestSense(&RequestSense); PrintRequestSense(&RequestSense);
FatalError("READ ELEMENT STATUS Command Failed\n"); FatalError("READ ELEMENT STATUS Command Failed\n");
} }
} }
@@ -971,8 +975,8 @@ void execute_command(struct command_table_struct *command)
* load in another tape into drive 0, and we execute these commands one * load in another tape into drive 0, and we execute these commands one
* at a time as we come to them. If we don't have a -f at the start, we * at a time as we come to them. If we don't have a -f at the start, we
* barf. If we leave out a drive #, we default to drive 0 (the first drive * barf. If we leave out a drive #, we default to drive 0 (the first drive
* in the cabinet). * in the cabinet).
*/ */
int parse_args(void) int parse_args(void)
{ {
@@ -1033,7 +1037,7 @@ int parse_args(void)
if (command->num_args>=2 && arg1 != -1) if (command->num_args>=2 && arg1 != -1)
{ {
arg2 = get_arg(i); arg2 = get_arg(i);
if (arg2 != -1) if (arg2 != -1)
{ {
i++; i++;
@@ -1089,7 +1093,7 @@ int main(int ArgCount, char *ArgVector[])
if (!ElementStatus) if (!ElementStatus)
{ {
PrintRequestSense(&RequestSense); PrintRequestSense(&RequestSense);
FatalError("READ ELEMENT STATUS Command Failed\n"); FatalError("READ ELEMENT STATUS Command Failed\n");
} }
VMS_DefineStatusSymbols(); VMS_DefineStatusSymbols();
SCSI_CloseDevice(device, MediumChangerFD); SCSI_CloseDevice(device, MediumChangerFD);

View File

@@ -523,8 +523,12 @@ ElementModeSense_T *ReadAssignmentPage(DEVICE_TYPE MediumChangerFD)
return retval; return retval;
} }
static void FreeElementData(ElementStatus_T *data) void FreeElementData(ElementStatus_T *data)
{ {
if (!data)
{
return;
}
free(data->DataTransferElementAddress); free(data->DataTransferElementAddress);
free(data->DataTransferElementSourceStorageElementNumber); free(data->DataTransferElementSourceStorageElementNumber);
free(data->DataTransferElementPhysicalLocation); free(data->DataTransferElementPhysicalLocation);

View File

@@ -60,6 +60,7 @@ ElementStatus_T *ReadElementStatus( DEVICE_TYPE MediumChangerFD,
RequestSense_T *RequestSense, RequestSense_T *RequestSense,
Inquiry_T *inquiry_info, Inquiry_T *inquiry_info,
SCSI_Flags_T *flags); SCSI_Flags_T *flags);
void FreeElementData(ElementStatus_T *data);
Inquiry_T *RequestInquiry( DEVICE_TYPE fd, Inquiry_T *RequestInquiry( DEVICE_TYPE fd,
RequestSense_T *RequestSense); RequestSense_T *RequestSense);