X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=changer-src%2Fscsi-changer-driver.c;h=c9dad844638e9e2beda7edbf7530d45645c1ac6e;hb=1194fb66aa28d9929c3f2bef3cc6c1c3f40a60a4;hp=2bc0507326119a31518c435a297efc4e5577f750;hpb=3ab887b9bc819a846c75dd7f2ee5d41fac22b19f;p=debian%2Famanda diff --git a/changer-src/scsi-changer-driver.c b/changer-src/scsi-changer-driver.c index 2bc0507..c9dad84 100644 --- a/changer-src/scsi-changer-driver.c +++ b/changer-src/scsi-changer-driver.c @@ -1,5 +1,5 @@ - #ifndef lint -static char rcsid[] = "$Id: scsi-changer-driver.c,v 1.1.2.27.2.7.2.10 2003/01/26 19:20:56 martinea Exp $"; +#ifndef lint +static char rcsid[] = "$Id: scsi-changer-driver.c,v 1.49 2006/03/16 00:20:53 paddy_s Exp $"; #endif /* * Interface to control a tape robot/library connected to the SCSI bus @@ -103,7 +103,7 @@ void C1553APage30(LogParameter_T *, int); void C1553APage37(LogParameter_T *, int); void EXB85058HEPage39(LogParameter_T *, int); void EXB85058HEPage3c(LogParameter_T *, int); -int Decode(LogParameter_T *, int *); +int Decode(LogParameter_T *, int *); int DecodeModeSense(char *buffer, int offset, char *pstring, char block, FILE *out); int SCSI_Run(int DeviceFD, @@ -119,14 +119,14 @@ int SCSI_Move(int DeviceFD, unsigned char chm, int from, int to); int SCSI_LoadUnload(int DeviceFD, RequestSense_T *pRequestSense, unsigned char byte1, unsigned char load); int SCSI_TestUnitReady(int, RequestSense_T *); int SCSI_ModeSense(int DeviceFD, char *buffer, u_char size, u_char byte1, u_char byte2); -int SCSI_ModeSelect(int DeviceFD, +int SCSI_ModeSelect(int DeviceFD, char *buffer, unsigned char length, unsigned char save, unsigned char mode, unsigned char lun); -int SCSI_ReadElementStatus(int DeviceFD, +int SCSI_ReadElementStatus(int DeviceFD, unsigned char type, unsigned char lun, unsigned char VolTag, @@ -167,7 +167,7 @@ SC_COM_T SCSICommand[] = { "UNLOAD"}, {0x4D, 10, - "LOG SENSE"}, + "LOG SENSE"}, {0xA5, 12, "MOVE MEDIUM"}, @@ -205,9 +205,9 @@ ChangerCMD_T ChangerIO[] = { GenericRewind, GenericBarCode, GenericSearch, - GenericSenseHandler}, + GenericSenseHandler}, /* Exabyte Devices */ - {"EXB-10e", + {"EXB-10e", "Exabyte Robot [EXB-10e]", GenericMove, GenericElementStatus, @@ -219,7 +219,7 @@ ChangerCMD_T ChangerIO[] = { GenericBarCode, GenericSearch, GenericSenseHandler}, - {"EXB-120", + {"EXB-120", "Exabyte Robot [EXB-120]", GenericMove, GenericElementStatus, @@ -231,7 +231,7 @@ ChangerCMD_T ChangerIO[] = { EXB_BarCode, GenericSearch, GenericSenseHandler}, - {"EXB-210", + {"EXB-210", "Exabyte Robot [EXB-210]", GenericMove, GenericElementStatus, @@ -243,7 +243,7 @@ ChangerCMD_T ChangerIO[] = { EXB_BarCode, GenericSearch, GenericSenseHandler}, - {"EXB-85058HE-0000", + {"EXB-85058HE-0000", "Exabyte Tape [EXB-85058HE-0000]", DoNothing, DoNothing, @@ -256,7 +256,7 @@ ChangerCMD_T ChangerIO[] = { GenericSearch, GenericSenseHandler}, /* Tandberg Devices */ - {"TDS 1420", + {"TDS 1420", "Tandberg Robot (TDS 1420)", GenericMove, GenericElementStatus, @@ -269,7 +269,7 @@ ChangerCMD_T ChangerIO[] = { GenericSearch, GenericSenseHandler}, /* ADIC Devices */ - {"VLS DLT", + {"VLS DLT", "ADIC VLS DLT Library [VLS DLT]", GenericMove, GenericElementStatus, @@ -281,7 +281,7 @@ ChangerCMD_T ChangerIO[] = { GenericBarCode, GenericSearch, GenericSenseHandler}, - {"VLS SDX", + {"VLS SDX", "ADIC VLS DLT Library [VLS SDX]", SDXMove, SDXElementStatus, @@ -293,7 +293,7 @@ ChangerCMD_T ChangerIO[] = { GenericBarCode, GenericSearch, GenericSenseHandler}, - {"FastStor DLT", + {"FastStor DLT", "ADIC FastStor DLT Library [FastStor DLT]", SDXMove, DLT448ElementStatus, @@ -356,7 +356,7 @@ ChangerCMD_T ChangerIO[] = { GenericBarCode, GenericSearch, GenericSenseHandler}, - /* + /* * And now the tape devices */ /* The generic handler if nothing matches */ @@ -384,7 +384,7 @@ ChangerCMD_T ChangerIO[] = { GenericBarCode, GenericSearch, GenericSenseHandler}, - {"DLT7000", + {"DLT7000", "DLT Tape [DLT7000]", DoNothing, DoNothing, @@ -396,7 +396,7 @@ ChangerCMD_T ChangerIO[] = { GenericBarCode, GenericSearch, GenericSenseHandler}, - {"DLT4000", + {"DLT4000", "DLT Tape [DLT4000]", DoNothing, DoNothing, @@ -405,11 +405,11 @@ ChangerCMD_T ChangerIO[] = { DLT4000Eject, GenericClean, GenericRewind, - NoBarCode, + NoBarCode, GenericSearch, GenericSenseHandler}, {NULL, NULL, NULL,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL} -}; +}; LogPageDecode_T DecodePages[] = { @@ -462,9 +462,9 @@ ElementInfo_T *pDTE = NULL; /*Data Transfer Element */ int MTE = 0; /*Counter for the above element types */ int STE = 0; int IEE = 0; -int DTE = 0; +int DTE = 0; -char *chgscsi_datestamp = NULL; /* Result pointer for tape_rdlabel */ +char *chgscsi_datestamp = NULL; /* Result pointer for tape_rdlabel */ char *chgscsi_label = NULL; /* Result pointer for tape_rdlabel */ char *chgscsi_result = NULL; /* Needed for the result string of MapBarCode */ @@ -515,7 +515,7 @@ void PrintConf() printf("sleep ??? # How long to wait after an eject command before moving\n"); printf(" # the tape\n"); printf(" #\n"); - + for (count = 0; count < CHG_MAXDEV ; count++) { if (pDev[count].dev) @@ -527,7 +527,7 @@ void PrintConf() } } } - + /* * Did we reach the end of the list ? * If no we found an changer and now we try to @@ -535,11 +535,11 @@ void PrintConf() */ if (count < CHG_MAXDEV) { - pDev[count].functions->function_status(count, 1); + pDev[count].functions->function_status(count, 1); } else { printf("changerdev ??? # Ups nothing found. Please check the docs\n"); } - + printf(" #\n"); printf(" # Here now comes the config for the first tape\n"); printf("config 0 # This value is the one which is used in the amanda\n"); @@ -592,7 +592,7 @@ void PrintConf() printf(" #\n"); cwd = getcwd(NULL, 0); - + printf("statfile %s/tape0-slot #\n",cwd); printf("cleanfile %s/tape0-clean #\n", cwd); printf("usagecount %s/tape0-totaltime #\n", cwd); @@ -601,11 +601,11 @@ void PrintConf() } - + /* * Try to create a list of tapes and labels which are in the current * magazin. The drive must be empty !! - * + * * labelfile -> file name of the db * drive -> which drive should we use * eject -> the tape device needs an eject before move @@ -613,7 +613,7 @@ void PrintConf() * stop -> stop at slot stop * clean -> if we have an cleaning tape than this is the slot number of it * - * return + * return * 0 -> fail * 1 -> successfull * @@ -626,33 +626,37 @@ void Inventory(char *labelfile, int drive, int eject, int start, int stop, int c { extern OpenFiles_T *pDev; int x; - char *datestamp = malloc(1); /* stupid, but tapefd_rdlabel does an free at the begining ... */ - char *label = malloc(1); /* the same here ..... */ - char *result; /* Used to store the result of MapBarCode */ - int barcode; /* cache the result from the BarCode function */ - static int inv_done = 0; /* Inventory function called ?, marker to disable recursion */ - MBC_T *pbarcoderes = malloc(sizeof(MBC_T)); /* Here we will pass the parameter to MapBarCode and get the result */ - + char *result; /* Used to store the result of MapBarCode */ + int barcode; /* cache the result from the BarCode function */ + static int inv_done = 0; /* Inventory function called ?, marker to disable recursion */ + MBC_T *pbarcoderes; /* Here we will pass the parameter to MapBarCode and get the result */ + DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE, "##### START Inventory\n"); + if ((pbarcoderes = malloc(sizeof(MBC_T))) == NULL) + { + DebugPrint(DEBUG_ERROR, SECTION_MAP_BARCODE,"##### malloc failed (-1)\n"); + return; + } memset(pbarcoderes, 0 , sizeof(MBC_T)); if (inv_done != 0) { DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE, "##### STOP inv_done -> %d Inventory\n",inv_done); + free(pbarcoderes); return; } inv_done = 1; barcode = BarCode(INDEX_CHANGER); - + pbarcoderes->action = RESET_VALID; MapBarCode(labelfile,pbarcoderes); - + /* * Check if an tape is loaded, if yes unload it * and do an INIT ELEMENT STATUS */ - + if (pDTE[0].status == 'F') { if (eject) @@ -661,16 +665,16 @@ void Inventory(char *labelfile, int drive, int eject, int start, int stop, int c } (void)unload(INDEX_TAPE, 0, 0); } - + GenericResetStatus(INDEX_CHANGER); - + for (x = 0; x < STE; x++) { if (x == clean) { continue; } - + /* * Load the tape, on error try the next * error could be an empty slot for example @@ -688,10 +692,10 @@ void Inventory(char *labelfile, int drive, int eject, int start, int stop, int c SCSI_CloseDevice(INDEX_TAPE); - if ((result = (char *)tape_rdlabel(pDev[INDEX_TAPE].dev, &datestamp, &label)) == NULL) + if ((result = (char *)tape_rdlabel(pDev[INDEX_TAPE].dev, &chgscsi_datestamp, &chgscsi_label)) == NULL) { pbarcoderes->action = UPDATE_SLOT; - strcpy(pbarcoderes->data.voltag, label); + strcpy(pbarcoderes->data.voltag, chgscsi_label); pbarcoderes->data.slot = x; pbarcoderes->data.from = 0; pbarcoderes->data.LoadCount = 1; @@ -714,6 +718,7 @@ void Inventory(char *labelfile, int drive, int eject, int start, int stop, int c (void)unload(INDEX_TAPE, drive, x); } DebugPrint(DEBUG_INFO,SECTION_MAP_BARCODE, "##### STOP Inventory\n"); + free(pbarcoderes); } /* @@ -748,7 +753,7 @@ int get_clean_state(char *tapedev) extern OpenFiles_T *pDev; /* Return 1 if cleaning is needed */ int ret; - + DebugPrint(DEBUG_INFO,SECTION_TAPE,"##### START get_clean_state\n"); if (pDev[INDEX_TAPECTL].SCSI == 0) @@ -758,7 +763,7 @@ int get_clean_state(char *tapedev) } ret=pDev[INDEX_TAPECTL].functions->function_clean(tapedev); DebugPrint(DEBUG_INFO,SECTION_TAPE,"##### STOP get_clean_state [%d]\n", ret); - return(ret); + return(ret); } /* @@ -792,7 +797,7 @@ int eject_tape(char *tapedev, int type) { SCSI_CloseDevice(INDEX_TAPE); } - + chgscsi_result = (char *)tape_rdlabel(pDev[INDEX_TAPE].dev, &chgscsi_datestamp, &chgscsi_label); } @@ -802,7 +807,7 @@ int eject_tape(char *tapedev, int type) DebugPrint(DEBUG_INFO,SECTION_TAPE,"##### STOP (SCSI)eject_tape [%d]\n", ret); return(ret); } - + if (pDev[INDEX_TAPE].avail == 1) { ret=Tape_Ioctl(INDEX_TAPE, IOCTL_EJECT); @@ -832,26 +837,26 @@ int find_empty(int fd, int start, int count) return(-1); } } - + if (count == 0) { end = STE; } else { end = start + count; } - + if (end > STE) { end = STE; } - + DebugPrint(DEBUG_INFO,SECTION_ELEMENT,"start at %d, end at %d\n", start, end); for (x = start; x < end; x++) { if (pSTE[x].status == 'E') { - DebugPrint(DEBUG_INFO,SECTION_ELEMENT,"###### END find_empty [%d]\n", x); + DebugPrint(DEBUG_INFO,SECTION_ELEMENT,"###### END find_empty [%d]\n", x); return(x); } } @@ -873,8 +878,8 @@ int drive_loaded(int fd, int drivenum) DebugPrint(DEBUG_INFO,SECTION_TAPE,"###### START drive_loaded\n"); DebugPrint(DEBUG_INFO,SECTION_TAPE,"%-20s : fd %d drivenum %d \n", "drive_loaded", fd, drivenum); - - + + if (ElementStatusValid == 0) { if (pDev[INDEX_CHANGER].functions->function_status(INDEX_CHANGER, 1) != 0) @@ -883,7 +888,7 @@ int drive_loaded(int fd, int drivenum) return(-1); } } - + if (pDTE[drivenum].status == 'E') { DebugPrint(DEBUG_INFO,SECTION_TAPE,"###### STOP drive_loaded (empty)\n"); return(0); @@ -901,18 +906,23 @@ int drive_loaded(int fd, int drivenum) * TODO: * Check if the MTE is empty */ -int unload(int fd, int drive, int slot) +int unload(int fd, int drive, int slot) { extern OpenFiles_T *pDev; int ret; extern changer_t chg; /* Needed for the infos about emubarcode and labelfile */ extern int do_inventory; - MBC_T *pbarcoderes = malloc(sizeof(MBC_T)); + MBC_T *pbarcoderes; DebugPrint(DEBUG_INFO, SECTION_TAPE,"###### START unload\n"); DebugPrint(DEBUG_INFO, SECTION_TAPE,"%-20s : fd %d, slot %d, drive %d \n", "unload", fd, slot, drive); + if ((pbarcoderes = malloc(sizeof(MBC_T))) == NULL) + { + DebugPrint(DEBUG_ERROR, SECTION_TAPE,"##### malloc failed (-1)\n"); + return(-1); + } memset(pbarcoderes, 0, sizeof(MBC_T)); - + /* * If the Element Status is not valid try to * init it @@ -923,16 +933,17 @@ int unload(int fd, int drive, int slot) { DebugPrint(DEBUG_ERROR, SECTION_TAPE,"Element Status not valid, reset failed\n"); DebugPrint(DEBUG_ERROR, SECTION_TAPE,"##### STOP unload (-1)\n"); + free(pbarcoderes); return(-1); } } - - DebugPrint(DEBUG_INFO, SECTION_TAPE,"%-20s : unload drive %d[%d] slot %d[%d]\n", "unload", - drive, - pDTE[drive].address, - slot, + + DebugPrint(DEBUG_INFO, SECTION_TAPE,"%-20s : unload drive %d[%d] slot %d[%d]\n", "unload", + drive, + pDTE[drive].address, + slot, pSTE[slot].address); - + /* * Unloading an empty tape unit makes no sense * so return with an error @@ -941,32 +952,35 @@ int unload(int fd, int drive, int slot) { DebugPrint(DEBUG_ERROR, SECTION_TAPE,"unload : Drive %d address %d is empty\n", drive, pDTE[drive].address); DebugPrint(DEBUG_ERROR, SECTION_TAPE,"##### STOP unload (-1)\n"); + free(pbarcoderes); return(-1); } - + /* * If the destination slot is full * try to find an enpty slot */ - if (pSTE[slot].status == 'F') + if (pSTE[slot].status == 'F') { DebugPrint(DEBUG_INFO, SECTION_TAPE,"unload : Slot %d address %d is full\n", drive, pSTE[slot].address); if ( ElementStatusValid == 0) { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT, "unload: Element Status not valid, can't find an empty slot\n"); + free(pbarcoderes); return(-1); } - + slot = find_empty(fd, 0, 0); if (slot == -1 ) { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT, "unload: No Empty slot found\n"); + free(pbarcoderes); return(-1); } DebugPrint(DEBUG_INFO, SECTION_TAPE,"unload : found empty one, try to unload to slot %d\n", slot); } - + /* * If eject is not set we must read the label info @@ -982,14 +996,14 @@ int unload(int fd, int drive, int slot) } else { pDev[INDEX_TAPE].functions->function_rewind(INDEX_TAPE); } - + if (pDev[INDEX_TAPE].devopen == 1) { SCSI_CloseDevice(INDEX_TAPE); } - + chgscsi_result = (char *)tape_rdlabel(pDev[INDEX_TAPE].dev, &chgscsi_datestamp, &chgscsi_label); - } + } } /* @@ -1003,9 +1017,10 @@ int unload(int fd, int drive, int slot) if (pDev[INDEX_CHANGER].functions->function_status(INDEX_CHANGER , 1) != 0) { DebugPrint(DEBUG_ERROR, SECTION_TAPE,"##### STOP unload (-1 update status failed)\n"); + free(pbarcoderes); return(-1); } - + /* * Did we get an error from tape_rdlabel * if no update the vol/label mapping @@ -1020,7 +1035,7 @@ int unload(int fd, int drive, int slot) */ if (BarCode(INDEX_CHANGER) == 0 && chg.emubarcode == 1) { - /* + /* * We got something, update the db * but before check if the db has as entry the slot * to where we placed the tape, if no force an inventory @@ -1031,8 +1046,8 @@ int unload(int fd, int drive, int slot) pbarcoderes->data.slot = 0; pbarcoderes->data.from = 0; pbarcoderes->data.LoadCount = 0; - - + + if ( MapBarCode(chg.labelfile, pbarcoderes) == 0) /* Nothing known about this, do an Inventory */ { do_inventory = 1; @@ -1047,6 +1062,7 @@ int unload(int fd, int drive, int slot) } DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### STOP unload(0)\n"); + free(pbarcoderes); return(0); } @@ -1065,15 +1081,18 @@ int load(int fd, int drive, int slot) { extern changer_t chg; /* Needed for the infos about emubarcode and labelfile */ char *result = NULL; /* Needed for the result of tape_rdlabel */ - char *datestamp = NULL; /* Result pointer for tape_rdlabel */ - char *label = NULL; /* Result pointer for tape_rdlabel */ int ret; extern OpenFiles_T *pDev; extern int do_inventory; - MBC_T *pbarcoderes = malloc(sizeof(MBC_T)); + MBC_T *pbarcoderes; DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"###### START load\n"); DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"%-20s : fd %d, drive %d, slot %d \n", "load", fd, drive, slot); + if ((pbarcoderes = malloc(sizeof(MBC_T))) == NULL) + { + DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"##### malloc failed (-1)\n"); + return(-1); + } memset(pbarcoderes, 0 , sizeof(MBC_T)); if (ElementStatusValid == 0) @@ -1082,6 +1101,7 @@ int load(int fd, int drive, int slot) { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"##### STOP load (-1)\n"); DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"##### STOP load (-1 update status failed)\n"); + free(pbarcoderes); return(-1); } } @@ -1094,16 +1114,16 @@ int load(int fd, int drive, int slot) */ if (slot >= STE) { - DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"load : slot %d ge STE %d\n",slot, STE); + DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"load : slot %d ge STE %d\n",slot, STE); ChgExit("load", "slot >= STE", FATAL); } - - /* + + /* * And the same for the tape drives */ if (drive >= DTE) { - DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"load : drive %d ge DTE %d\n",drive, DTE); + DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"load : drive %d ge DTE %d\n",drive, DTE); ChgExit("load", "drive >= DTE", FATAL); } @@ -1111,21 +1131,23 @@ int load(int fd, int drive, int slot) pDTE[drive].address, slot, pSTE[slot].address); - + if (pDTE[drive].status == 'F') { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"load : Drive %d address %d is full\n", drive, pDTE[drive].address); DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"##### STOP load (-1 update status failed)\n"); + free(pbarcoderes); return(-1); } - + if (pSTE[slot].status == 'E') { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"load : Slot %d address %d is empty\n", drive, pSTE[slot].address); DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"##### STOP load (-1 update status failed)\n"); + free(pbarcoderes); return(-1); } - + ret = pDev[fd].functions->function_move(fd, pSTE[slot].address, pDTE[drive].address); /* @@ -1134,6 +1156,7 @@ int load(int fd, int drive, int slot) if (pDev[fd].functions->function_status(fd, 1) != 0) { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"##### STOP load (-1 update status failed)\n"); + free(pbarcoderes); return(-1); } @@ -1149,38 +1172,38 @@ int load(int fd, int drive, int slot) } else { pDev[INDEX_TAPE].functions->function_rewind(INDEX_TAPE); } - + if (pDev[INDEX_TAPE].devopen == 1) { SCSI_CloseDevice(INDEX_TAPE); } - - result = (char *)tape_rdlabel(pDev[INDEX_TAPE].dev, &datestamp, &label); + + result = (char *)tape_rdlabel(pDev[INDEX_TAPE].dev, &chgscsi_datestamp, &chgscsi_label); } - + /* * Did we get an error from tape_rdlabel * if no update the vol/label mapping */ - if (result == NULL && chg.labelfile != NULL && label != NULL ) + if (result == NULL && chg.labelfile != NULL && chgscsi_label != NULL ) { - /* + /* * We got something, update the db * but before check if the db has as entry the slot * to where we placed the tape, if no force an inventory */ - strcpy(pbarcoderes->data.voltag, label); + strcpy(pbarcoderes->data.voltag, chgscsi_label); pbarcoderes->data.slot = 0; pbarcoderes->data.from = 0; pbarcoderes->data.LoadCount = 0; - - + + /* * If we have an barcode reader we only do an update * If emubarcode is set we check if the * info in the DB is up to date, if no we set the do_inventory flag */ - + if (BarCode(INDEX_CHANGER) == 1 && chg.emubarcode == 0) { pbarcoderes->action = UPDATE_SLOT; @@ -1189,7 +1212,7 @@ int load(int fd, int drive, int slot) pbarcoderes->data.slot = slot; MapBarCode(chg.labelfile, pbarcoderes); } - + if (BarCode(INDEX_CHANGER) == 0 && chg.emubarcode == 1) { pbarcoderes->action = FIND_SLOT; @@ -1209,16 +1232,18 @@ int load(int fd, int drive, int slot) } } } - + if (BarCode(INDEX_CHANGER) == 1 && chg.emubarcode == 1) { ChgExit("Load", "BarCode == 1 and emubarcode == 1", FATAL); } - + DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"##### STOP load (%d)\n",ret); + free(pbarcoderes); return(ret); } DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"##### STOP load (%d)\n",ret); + free(pbarcoderes); return(ret); } @@ -1226,7 +1251,7 @@ int load(int fd, int drive, int slot) * Returns the number of Storage Slots which the library has * fd -> pointer to the internal devie structure pDev * return -> Number of slots - */ + */ int get_slot_count(int fd) { extern OpenFiles_T *pDev; @@ -1244,7 +1269,7 @@ int get_slot_count(int fd) * return the number of slots in the robot * to the caller */ - + } @@ -1252,7 +1277,7 @@ int get_slot_count(int fd) * retreive the number of data-transfer devices /Tape drives) * fd -> pointer to the internal devie structure pDev * return -> -1 on failure - */ + */ int get_drive_count(int fd) { @@ -1289,12 +1314,12 @@ int OpenDevice(int ip , char *DeviceName, char *ConfigName, char *ident) extern OpenFiles_T *pDev; char tmpstr[15]; ChangerCMD_T *p = (ChangerCMD_T *)&ChangerIO; - + DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### START OpenDevice\n"); DebugPrint(DEBUG_INFO, SECTION_SCSI,"OpenDevice : %s\n", DeviceName); - - pDev[ip].ConfigName = stralloc(ConfigName); - pDev[ip].dev = stralloc(DeviceName); + + pDev[ip].ConfigName = strdup(ConfigName); + pDev[ip].dev = strdup(DeviceName); if (SCSI_OpenDevice(ip) != 0 ) { @@ -1341,12 +1366,12 @@ int OpenDevice(int ip , char *DeviceName, char *ConfigName, char *ident) return(1); } p++; - } + } } else { /* Something failed, lets see what */ DebugPrint(DEBUG_ERROR, SECTION_SCSI,"##### STOP OpenDevice failed\n"); } DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### STOP OpenDevice (nothing found) !!\n"); - return(0); + return(0); } @@ -1383,12 +1408,12 @@ int Tape_Ready(int fd, int wait_time) int true = 1; int ret; int cnt = 0; - + RequestSense_T *pRequestSense; DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### START Tape_Ready\n"); - + /* - * Which device should we use to get the + * Which device should we use to get the * tape status */ @@ -1399,7 +1424,7 @@ int Tape_Ready(int fd, int wait_time) { fd = INDEX_TAPE; } - + /* * But if available and can do SCSI * the scsitapedev @@ -1408,14 +1433,14 @@ int Tape_Ready(int fd, int wait_time) { fd = INDEX_TAPECTL; } - + if (pDev[fd].avail == 1 && pDev[fd].SCSI == 0) { DebugPrint(DEBUG_INFO, SECTION_TAPE,"Tape_Ready : Can't send SCSI commands, try ioctl\n"); /* * Do we get an non negative result. * If yes this function is available - * and we can use it to get the status + * and we can use it to get the status * of the tape */ ret = Tape_Status(fd); @@ -1437,7 +1462,7 @@ int Tape_Ready(int fd, int wait_time) DebugPrint(DEBUG_INFO, SECTION_TAPE,"Tape_Ready : not ready, stop after %d seconds\n",cnt); DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### STOP Tape_Ready\n"); return(0); - + } else { DebugPrint(DEBUG_INFO, SECTION_TAPE,"Tape_Ready : no ioctl interface, will sleep for %d seconds\n", wait_time); sleep(wait_time); @@ -1445,23 +1470,23 @@ int Tape_Ready(int fd, int wait_time) return(0); } } - + if ((pRequestSense = (RequestSense_T *)malloc(sizeof(RequestSense_T))) == NULL) { DebugPrint(DEBUG_INFO, SECTION_TAPE,"Tape_Ready : malloc failed\n"); DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### STOP Tape_Ready\n"); return(-1); } - + /* * Ignore errors at this point */ GenericRewind(fd); - + /* * Wait until we get an ready condition */ - + while (true && cnt < wait_time) { ret = SCSI_TestUnitReady(fd, pRequestSense ); @@ -1486,6 +1511,7 @@ int Tape_Ready(int fd, int wait_time) break; case SENSE_ABORT: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"TapeReady (TestUnitReady) SENSE_ABORT\n"); + free(pRequestSense); return(-1); break; case SENSE_RETRY: @@ -1499,6 +1525,7 @@ int Tape_Ready(int fd, int wait_time) break; case SCSI_ERROR: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"TapeReady (TestUnitReady) SCSI_ERROR\n"); + free(pRequestSense); return(-1); break; case SCSI_BUSY: @@ -1515,10 +1542,9 @@ int Tape_Ready(int fd, int wait_time) cnt++; } - free(pRequestSense); - DebugPrint(DEBUG_INFO, SECTION_TAPE,"Tape_Ready after %d sec\n", cnt); - DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### STOP Tape_Ready\n"); + DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### STOP Tape_Ready\n"); + free(pRequestSense); return(0); } @@ -1563,7 +1589,7 @@ int DecodeModeSense(char *buffer, int offset, char *pstring, char block, FILE *o /* Jump over the Parameter List header and an offset if we have something * Unknown at the start (ADIC-218) at the moment - * + * */ buffer = buffer + 4 + offset; @@ -1583,7 +1609,7 @@ int DecodeModeSense(char *buffer, int offset, char *pstring, char block, FILE *o fprintf(out, "DecodeModeSense : Block Length %d\n", V3(buffer)); buffer = buffer + 3; } - + while (length > 0) { switch (*buffer & 0x3f) @@ -1595,7 +1621,7 @@ int DecodeModeSense(char *buffer, int offset, char *pstring, char block, FILE *o case 0x1: prp = (ReadWriteErrorRecoveryPage_T *)buffer; if (out != NULL) - { + { fprintf(out, "DecodeModeSense : Read/Write Error Recovery Page\n"); fprintf(out,"\tTransfer Block %d\n", prp->tb); fprintf(out,"\tEnable Early Recovery %d\n", prp->eer); @@ -1614,9 +1640,9 @@ int DecodeModeSense(char *buffer, int offset, char *pstring, char block, FILE *o fprintf(out, "DecodeModeSense : Disconnect/Reconnect Page\n"); fprintf(out,"\tBuffer Full Ratio %d\n", pdrp->BufferFullRatio); fprintf(out,"\tBuffer Empty Ratio %d\n", pdrp->BufferEmptyRatio); - fprintf(out,"\tBus Inactivity Limit %d\n", + fprintf(out,"\tBus Inactivity Limit %d\n", V2(pdrp->BusInactivityLimit)); - fprintf(out,"\tDisconnect Time Limit %d\n", + fprintf(out,"\tDisconnect Time Limit %d\n", V2(pdrp->DisconnectTimeLimit)); fprintf(out,"\tConnect Time Limit %d\n", V2(pdrp->ConnectTimeLimit)); @@ -1631,21 +1657,21 @@ int DecodeModeSense(char *buffer, int offset, char *pstring, char block, FILE *o if (out != NULL) { fprintf(out,"DecodeModeSense : Element Address Assignment Page\n"); - fprintf(out,"\tMedium Transport Element Address %d\n", + fprintf(out,"\tMedium Transport Element Address %d\n", V2(pEAAPage->MediumTransportElementAddress)); - fprintf(out,"\tNumber of Medium Transport Elements %d\n", + fprintf(out,"\tNumber of Medium Transport Elements %d\n", V2(pEAAPage->NoMediumTransportElements)); - fprintf(out, "\tFirst Storage Element Address %d\n", + fprintf(out, "\tFirst Storage Element Address %d\n", V2(pEAAPage->FirstStorageElementAddress)); - fprintf(out, "\tNumber of Storage Elements %d\n", + fprintf(out, "\tNumber of Storage Elements %d\n", V2(pEAAPage->NoStorageElements)); - fprintf(out, "\tFirst Import/Export Element Address %d\n", + fprintf(out, "\tFirst Import/Export Element Address %d\n", V2(pEAAPage->FirstImportExportElementAddress)); - fprintf(out, "\tNumber of ImportExport Elements %d\n", + fprintf(out, "\tNumber of ImportExport Elements %d\n", V2(pEAAPage->NoImportExportElements)); - fprintf(out, "\tFirst Data Transfer Element Address %d\n", + fprintf(out, "\tFirst Data Transfer Element Address %d\n", V2(pEAAPage->FirstDataTransferElementAddress)); - fprintf(out, "\tNumber of Data Transfer Elements %d\n", + fprintf(out, "\tNumber of Data Transfer Elements %d\n", V2(pEAAPage->NoDataTransferElements)); } buffer++; @@ -1707,7 +1733,7 @@ int DecodeModeSense(char *buffer, int offset, char *pstring, char block, FILE *o return(-1); } length = length - *buffer - 2; - buffer = buffer + *buffer + 1; + buffer = buffer + *buffer + 1; } return(0); } @@ -1781,7 +1807,7 @@ int DecodeSense(RequestSense_T *sense, char *pstring, FILE *out) fprintf(out,"\t\tReserved\n"); break; } - return(0); + return(0); } int DecodeExtSense(ExtendedRequestSense_T *sense, char *pstring, FILE *out) @@ -1796,7 +1822,7 @@ int DecodeExtSense(ExtendedRequestSense_T *sense, char *pstring, FILE *out) fprintf(out,"\tLog Parameter Page Code %02X\n", sense->LogParameterPageCode); fprintf(out,"\tLog Parameter Code %02X\n", sense->LogParameterCode); fprintf(out,"\tUnderrun/Overrun Counter %02X\n", sense->UnderrunOverrunCounter); - fprintf(out,"\tRead/Write Error Counter %d\n", V3((char *)sense->ReadWriteDataErrorCounter)); + fprintf(out,"\tRead/Write Error Counter %d\n", V3((char *)sense->ReadWriteDataErrorCounter)); if (sense->AdditionalSenseLength > sizeof(RequestSense_T)) { if (sense->PF) @@ -1903,18 +1929,18 @@ int TreeFrogBarCode(int DeviceFD) return(-1); } } - + if (SCSI_ModeSense(DeviceFD, pModePage, 0xff, 0x0, 0x3f) == 0) { DecodeModeSense(pModePage, 0, "TreeFrogBarCode :", 0, debug_file); - + if (pVendorUnique == NULL) { dbprintf(("TreeFrogBarCode : no pVendorUnique\n")); return(0); } pVendor = ( ModePageTreeFrogVendorUnique_T *)pVendorUnique; - + dbprintf(("TreeFrogBarCode : EBARCO %d\n", pVendor->EBARCO)); dbprintf(("TreeFrogCheckSum : CHKSUM %d\n", pVendor->CHKSUM)); @@ -1929,7 +1955,7 @@ int EXB_BarCode(int DeviceFD) extern OpenFiles_T *pDev; ModePageEXB120VendorUnique_T *pVendor; - ModePageEXB120VendorUnique_T *pVendorWork; + ModePageEXB120VendorUnique_T *pVendorWork = NULL; DebugPrint(DEBUG_INFO, SECTION_BARCODE,"##### START EXB_BarCode\n"); if (pModePage == NULL && LibModeSenseValid == 0) @@ -1947,7 +1973,7 @@ int EXB_BarCode(int DeviceFD) LibModeSenseValid = -1; } } - + if (LibModeSenseValid == 1) { if (pVendorUnique == NULL) @@ -1956,7 +1982,7 @@ int EXB_BarCode(int DeviceFD) return(0); } pVendor = ( ModePageEXB120VendorUnique_T *)pVendorUnique; - + DebugPrint(DEBUG_INFO, SECTION_BARCODE,"EXB_BarCode : NBL %d\n", pVendor->NBL); DebugPrint(DEBUG_INFO, SECTION_BARCODE,"EXB_BarCode : PS %d\n", pVendor->PS); if (pVendor->NBL == 1 && pVendor->PS == 1 ) @@ -1977,19 +2003,20 @@ int EXB_BarCode(int DeviceFD) /* Hack !!!!!! */ pVendor->NBL = 0; - + /* And now again !!! */ GenericResetStatus(DeviceFD); } else { DebugPrint(DEBUG_INFO, SECTION_BARCODE,"EXB_BarCode : SCSI_ModeSelect failed\n"); } + amfree(pVendorWork); } dump_hex((char *)pDev[INDEX_CHANGER].inquiry, INQUIRY_SIZE, DEBUG_INFO, SECTION_BARCODE); DebugPrint(DEBUG_INFO, SECTION_BARCODE,"EXB_BarCode : vendor_specific[19] %x\n", pDev[INDEX_CHANGER].inquiry->vendor_specific[19]); } - + return(1); } @@ -2003,7 +2030,7 @@ int NoBarCode(int DeviceFD) int GenericBarCode(int DeviceFD) { extern changer_t chg; - + DebugPrint(DEBUG_INFO, SECTION_BARCODE,"##### START GenericBarCode\n"); if ( chg.havebarcode >= 1) { @@ -2048,7 +2075,7 @@ int TapeStatus() int ret; int true = 1; int cnt = 0; - RequestSense_T *pRequestSense; + RequestSense_T *pRequestSense = NULL; DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### START TapeStatus\n"); @@ -2064,7 +2091,7 @@ int TapeStatus() dbprintf(("%-20s : malloc failed\n","TapeStatus")); return(-1); } - + while (true && cnt < 60) { ret = SCSI_TestUnitReady(INDEX_TAPECTL, pRequestSense); @@ -2117,11 +2144,12 @@ int TapeStatus() sleep(2); cnt++; } + amfree(pRequestSense); } else { ret = Tape_Status(INDEX_TAPE); if ( ret & TAPE_ONLINE) { - pDTE[0].status ='F'; + pDTE[0].status ='F'; DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### FULL\n"); } else { pDTE[0].status = 'E'; @@ -2153,47 +2181,49 @@ int DLT4000Eject(char *Device, int type) if ((pExtendedRequestSense = malloc(sizeof(ExtendedRequestSense_T))) == NULL) { dbprintf(("%-20s : malloc failed\n","DLT4000Eject")); + free(pRequestSense); return(-1); } - + if ( type > 1) { dbprintf(("DLT4000Eject : use mtio ioctl for eject on %s\n", pDev[INDEX_TAPE].dev)); + free(pExtendedRequestSense); + free(pRequestSense); return(Tape_Ioctl(INDEX_TAPE, IOCTL_EJECT)); } - - - + + + if (pDev[INDEX_TAPECTL].SCSI == 0) { dbprintf(("DLT4000Eject : Device %s not able to receive SCSI commands\n", pDev[INDEX_TAPE].dev)); + free(pExtendedRequestSense); + free(pRequestSense); return(Tape_Ioctl(INDEX_TAPE, IOCTL_EJECT)); } - - + + dbprintf(("DLT4000Eject : SCSI eject on %s = %s\n", pDev[INDEX_TAPECTL].dev, pDev[INDEX_TAPECTL].ConfigName)); - - RequestSense(INDEX_TAPECTL, pExtendedRequestSense, 0); + + RequestSense(INDEX_TAPECTL, pExtendedRequestSense, 0); DecodeExtSense(pExtendedRequestSense, "DLT4000Eject : ", debug_file); /* Unload the tape, 0 == wait for success - * 0 == unload + * 0 == unload */ ret = SCSI_LoadUnload(INDEX_TAPECTL, pRequestSense, 0, 0); - RequestSense(INDEX_TAPECTL, pExtendedRequestSense, 0); + RequestSense(INDEX_TAPECTL, pExtendedRequestSense, 0); DecodeExtSense(pExtendedRequestSense, "DLT4000Eject : ", debug_file); - + /* < 0 == fatal */ - if (ret < 0) - return(-1); - - if ( ret > 0) - { + if (ret >= 0) { + free(pExtendedRequestSense); + free(pRequestSense); + return(-1); } - + true = 1; - - while (true && cnt < 300) { ret = SCSI_TestUnitReady(INDEX_TAPECTL, pRequestSense); @@ -2220,8 +2250,9 @@ int DLT4000Eject(char *Device, int type) break; case SENSE_ABORT: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"DLT4000Eject (TestUnitReady) SENSE_ABORT\n"); + free(pExtendedRequestSense); + free(pRequestSense); return(-1); - break; case SENSE_RETRY: DebugPrint(DEBUG_INFO, SECTION_SCSI,"DLT4000Eject (TestUnitReady) SENSE_RETRY\n"); break; @@ -2233,8 +2264,9 @@ int DLT4000Eject(char *Device, int type) break; case SCSI_ERROR: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"DLT4000Eject (TestUnitReady) SCSI_ERROR\n"); + free(pExtendedRequestSense); + free(pRequestSense); return(-1); - break; case SCSI_BUSY: DebugPrint(DEBUG_INFO, SECTION_SCSI,"DLT4000Eject (TestUnitReady) SCSI_BUSY\n"); break; @@ -2245,17 +2277,17 @@ int DLT4000Eject(char *Device, int type) DebugPrint(DEBUG_ERROR, SECTION_SCSI,"DLT4000Eject (TestUnitReady) unknown (%d)\n",ret); break; } - + cnt++; sleep(2); } - - - free(pRequestSense); - + dbprintf(("DLT4000Eject : Ready after %d sec, true = %d\n", cnt * 2, true)); + + free(pExtendedRequestSense); + free(pRequestSense); + return(0); - } /* @@ -2273,40 +2305,37 @@ int GenericEject(char *Device, int type) int ret; int cnt = 0; int true = 1; - + DebugPrint(DEBUG_INFO, SECTION_TAPE, "##### START GenericEject\n"); - + if ((pRequestSense = malloc(sizeof(RequestSense_T))) == NULL) { DebugPrint(DEBUG_ERROR, SECTION_TAPE, "%-20s : malloc failed\n","GenericEject"); return(-1); } - - DebugPrint(DEBUG_INFO, SECTION_TAPE,"GenericEject : SCSI eject on %s = %s\n", pDev[INDEX_TAPECTL].dev, pDev[INDEX_TAPECTL].ConfigName); - + + DebugPrint(DEBUG_INFO, SECTION_TAPE,"GenericEject : SCSI eject on %s = %s\n", + pDev[INDEX_TAPECTL].dev, pDev[INDEX_TAPECTL].ConfigName); + /* * Can we use SCSI commands ? */ if (pDev[INDEX_TAPECTL].SCSI == 1) { LogSense(INDEX_TAPECTL); - /* + /* * Unload the tape, 1 == don't wait for success - * 0 == unload + * 0 == unload */ ret = SCSI_LoadUnload(INDEX_TAPECTL, pRequestSense, 1, 0); - + /* < 0 == fatal */ - if (ret < 0) + if (ret < 0) { + free(pRequestSense); return(-1); - - if ( ret > 0) - { - } - + } + true = 1; - - while (true && cnt < 300) { ret = SCSI_TestUnitReady(INDEX_TAPECTL, pRequestSense); @@ -2329,8 +2358,8 @@ int GenericEject(char *Device, int type) break; case SENSE_ABORT: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"GenericEject (TestUnitReady) SENSE_ABORT\n"); + free(pRequestSense); return(-1); - break; case SENSE_RETRY: DebugPrint(DEBUG_INFO, SECTION_SCSI,"GenericEject (TestUnitReady) SENSE_RETRY\n"); break; @@ -2341,8 +2370,8 @@ int GenericEject(char *Device, int type) break; case SCSI_ERROR: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"GenericEject (TestUnitReady) SCSI_ERROR\n"); + free(pRequestSense); return(-1); - break; case SCSI_BUSY: DebugPrint(DEBUG_INFO, SECTION_SCSI,"GenericEject (TestUnitReady) SCSI_BUSY\n"); break; @@ -2352,23 +2381,21 @@ int GenericEject(char *Device, int type) default: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"GenericEject (TestUnitReady) unknown (%d)\n",ret); break; - } + } cnt++; sleep(2); } - - free(pRequestSense); - } else { DebugPrint(DEBUG_INFO, SECTION_TAPE,"GenericEject : Device can't understand SCSI try ioctl\n"); Tape_Ioctl(INDEX_TAPECTL, IOCTL_EJECT); } DebugPrint(DEBUG_INFO, SECTION_TAPE,"GenericEject : Ready after %d sec, true = %d\n", cnt * 2, true); + free(pRequestSense); return(0); } /* - * Rewind the tape + * Rewind the tape * * TODO: * Make the retry counter an config option, @@ -2380,8 +2407,8 @@ int GenericEject(char *Device, int type) int GenericRewind(int DeviceFD) { CDB_T CDB; - extern OpenFiles_T *pDev; - RequestSense_T *pRequestSense; + extern OpenFiles_T *pDev; + RequestSense_T *pRequestSense = NULL; char *errstr; /* Used by tape_rewind */ int ret; int cnt = 0; @@ -2404,7 +2431,7 @@ int GenericRewind(int DeviceFD) /* * Before doing the rewind check if the tape is ready to accept commands */ - + while (true == 1) { ret = SCSI_TestUnitReady(DeviceFD, (RequestSense_T *)pRequestSense ); @@ -2423,6 +2450,7 @@ int GenericRewind(int DeviceFD) break; case SENSE_TAPE_NOT_ONLINE: DebugPrint(DEBUG_INFO, SECTION_SCSI,"GenericRewind (TestUnitReady) SENSE_TAPE_NOT_ONLINE\n"); + free(pRequestSense); return(-1); break; case SENSE_IGNORE: @@ -2431,6 +2459,7 @@ int GenericRewind(int DeviceFD) break; case SENSE_ABORT: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"GenericRewind (TestUnitReady) SENSE_ABORT\n"); + free(pRequestSense); return(-1); break; case SENSE_RETRY: @@ -2445,6 +2474,7 @@ int GenericRewind(int DeviceFD) case SCSI_ERROR: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"GenericRewind (TestUnitReady) SCSI_ERROR\n"); + free(pRequestSense); return(-1); break; case SCSI_BUSY: @@ -2457,36 +2487,37 @@ int GenericRewind(int DeviceFD) DebugPrint(DEBUG_ERROR, SECTION_SCSI,"GenericRewind (TestUnitReady) unknown (%d)\n",ret); break; } - + sleep(1); DebugPrint(DEBUG_INFO, SECTION_TAPE," Wait .... (%d)\n",cnt); if (cnt > 180) { DebugPrint(DEBUG_ERROR, SECTION_TAPE,"##### STOP GenericRewind (-1)\n"); + free(pRequestSense); return(-1); } } /* while true == 1 */ - + cnt = 0; true = 1; - + CDB[0] = SC_COM_REWIND; - CDB[1] = 1; + CDB[1] = 1; CDB[2] = 0; CDB[3] = 0; CDB[4] = 0; CDB[5] = 0; - + while (true) { ret = SCSI_Run(DeviceFD, Input, CDB, 6, - NULL, 0, + NULL, 0, (char *) pRequestSense, sizeof(RequestSense_T)); - + DecodeSense(pRequestSense, "GenericRewind : ", debug_file); - - if (ret > 0) + + if (ret > 0) { if (pRequestSense->SenseKey != UNIT_ATTENTION) { @@ -2503,9 +2534,9 @@ int GenericRewind(int DeviceFD) true = 0; } } - + true = 1; - + while (true && cnt < 300) { ret = SCSI_TestUnitReady(DeviceFD, pRequestSense); @@ -2524,6 +2555,7 @@ int GenericRewind(int DeviceFD) break; case SENSE_TAPE_NOT_ONLINE: DebugPrint(DEBUG_INFO, SECTION_SCSI,"GenericRewind (TestUnitReady) SENSE_TAPE_NOT_ONLINE\n"); + free(pRequestSense); return(-1); break; case SENSE_IGNORE: @@ -2532,6 +2564,7 @@ int GenericRewind(int DeviceFD) break; case SENSE_ABORT: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"GenericRewind (TestUnitReady) SENSE_ABORT\n"); + free(pRequestSense); return(-1); break; case SENSE_RETRY: @@ -2545,8 +2578,9 @@ int GenericRewind(int DeviceFD) break; case SCSI_ERROR: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"GenericRewind (TestUnitReady) SCSI_ERROR\n"); + free(pRequestSense); return(-1); - break; + break; case SCSI_BUSY: DebugPrint(DEBUG_INFO, SECTION_SCSI,"GenericRewind (TestUnitReady) SCSI_BUSY\n"); break; @@ -2561,47 +2595,32 @@ int GenericRewind(int DeviceFD) cnt++; sleep(2); } - - free(pRequestSense); - + + amfree(pRequestSense); + DebugPrint(DEBUG_INFO, SECTION_TAPE,"GenericRewind : Ready after %d sec, true = %d\n", cnt * 2, true); DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### STOP GenericRewind (0)\n"); } else { DebugPrint(DEBUG_INFO, SECTION_TAPE,"GenericRewind : use ioctl rewind\n"); - if (pDev[DeviceFD].devopen == 1) + if (pDev[DeviceFD].devopen == 1) { DebugPrint(DEBUG_INFO, SECTION_TAPE,"Close Device\n"); SCSI_CloseDevice(DeviceFD); } - /* - * Hmm retry it if it fails ? - */ - cnt = 0; - true = 1; - while (true) - { - if ((errstr = tape_rewind(pDev[DeviceFD].dev)) == NULL) - { - true = 0; - DebugPrint(DEBUG_INFO, SECTION_TAPE,"Rewind OK, (after %d tries)\n", cnt); - } else { - DebugPrint(DEBUG_INFO, SECTION_TAPE,"Rewind failed %s\n",errstr); - /* - * DebugPrint(DEBUG_ERROR, SECTION_TAPE,"##### STOP GenericRewind (-1)\n"); - * return(-1); - */ - cnt++; - sleep(1); - if (cnt > 60) - { - DebugPrint(DEBUG_ERROR, SECTION_TAPE,"##### STOP GenericRewind (-1), retry limit reached\n"); - return(-1); - } - } - } + /* We don't retry if it fails; that is left to the vtape driver. */ + if ((errstr = tape_rewind(pDev[DeviceFD].dev)) == NULL) { + true = 0; + DebugPrint(DEBUG_INFO, SECTION_TAPE,"Rewind OK,\n", cnt); + } else { + DebugPrint(DEBUG_ERROR, SECTION_TAPE,"Rewind failed %s\n",errstr); + DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### STOP GenericRewind (-1)\n"); + amfree(pRequestSense); + return(-1); + } DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### STOP GenericRewind (0)\n"); } + amfree(pRequestSense); return(0); } @@ -2630,7 +2649,7 @@ int GenericClean(char * Device) */ if ( RequestSense(INDEX_TAPECTL, &ExtRequestSense, 1) == 0) { - + DecodeExtSense(&ExtRequestSense, "GenericClean : ", debug_file); if(ExtRequestSense.CLN) { ret = 1; @@ -2650,9 +2669,9 @@ int GenericResetStatus(int DeviceFD) RequestSense_T *pRequestSense; int ret = 0; int retry = 1; - + DebugPrint(DEBUG_INFO, SECTION_ELEMENT, "##### START GenericResetStatus\n"); - + if ((pRequestSense = (RequestSense_T *)malloc(sizeof(RequestSense_T))) == NULL) { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT, "GenericResetStatus : malloc failed\n"); @@ -2681,6 +2700,7 @@ int GenericResetStatus(int DeviceFD) /* for (i = 1; i < sizeof(RequestSense_T); i++) */ /* fprintf(stderr, " %02X", ((unsigned char *) &pRequestSense)[i]); */ /* fprintf(stderr, "\n"); */ + free(pRequestSense); return(ret); } if ( ret > 0 ) @@ -2688,9 +2708,11 @@ int GenericResetStatus(int DeviceFD) switch (SenseHandler(DeviceFD, 0, pRequestSense->SenseKey, pRequestSense->AdditionalSenseCode, pRequestSense->AdditionalSenseCodeQualifier, (char *)pRequestSense)) { case SENSE_IGNORE: + free(pRequestSense); return(0); break; case SENSE_ABORT: + free(pRequestSense); return(-1); break; case SENSE_RETRY: @@ -2701,11 +2723,13 @@ int GenericResetStatus(int DeviceFD) sleep(2); } else { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT, "GenericResetStatus : return (-1)\n"); + free(pRequestSense); return(-1); } break; default: DebugPrint(DEBUG_ERROR, SECTION_ELEMENT, "GenericResetStatus : (default) return (-1)\n"); + free(pRequestSense); return(-1); break; } @@ -2714,6 +2738,7 @@ int GenericResetStatus(int DeviceFD) retry = 0; } DebugPrint(DEBUG_ERROR, SECTION_ELEMENT, "##### STOP GenericResetStatus (%d)\n",ret); + free(pRequestSense); return(ret); } @@ -2722,7 +2747,7 @@ int GenericResetStatus(int DeviceFD) * pwork is an pointer to the structure OpenFiles_T, which is filled with information * about the device to which we talk. Information are for example * The vendor, the ident, which fd, etc. This strucure is filled when we open the - * device + * device * flag tells how to handle the information passed in the buffer, * 0 -> Sense Key available * 1 -> No Sense key available @@ -2732,23 +2757,23 @@ int GenericResetStatus(int DeviceFD) * Limit recursion, may run in an infinite loop */ int GenericSenseHandler(int ip, int flag, unsigned char SenseKey, unsigned char AdditionalSenseCode, unsigned char AdditionalSenseCodeQualifier, char *buffer) -{ +{ extern OpenFiles_T *pDev; RequestSense_T *pRequestSense = (RequestSense_T *)buffer; int ret = 0; unsigned char *info = NULL; - + dbprintf(("##### START GenericSenseHandler\n")); - + DecodeSense(pRequestSense, "GenericSenseHandler : ", debug_file); - + ret = Sense2Action(pDev[ip].ident, pDev[ip].inquiry->type, flag, SenseKey, AdditionalSenseCode, AdditionalSenseCodeQualifier, (char **)&info); - + dbprintf(("##### STOP GenericSenseHandler\n")); return(ret); } @@ -2762,7 +2787,7 @@ int GenericSenseHandler(int ip, int flag, unsigned char SenseKey, unsigned char * Return: * == 0 -> success * != 0 -> error either from the SCSI command or from - * the element handling + * the element handling * TODO: */ int SDXMove(int DeviceFD, int from, int to) @@ -2778,32 +2803,32 @@ int SDXMove(int DeviceFD, int from, int to) int SDX_DTE = -1; /* AlignElements */ DebugPrint(DEBUG_INFO, SECTION_MOVE,"##### START SDXMove\n"); - + DebugPrint(DEBUG_INFO, SECTION_MOVE,"%-20s : from = %d, to = %d\n", "SDXMove", from, to); - + if ((pfrom = LookupElement(from)) == NULL) { DebugPrint(DEBUG_INFO, SECTION_MOVE,"SDXMove : ElementInfo for %d not found\n", from); DebugPrint(DEBUG_INFO, SECTION_MOVE,"##### STOP SDXMove\n"); return(-1); } - + if ((pto = LookupElement(to)) == NULL) { DebugPrint(DEBUG_INFO, SECTION_MOVE,"SDXMove : ElementInfo for %d not found\n", to); DebugPrint(DEBUG_INFO, SECTION_MOVE,"##### STOP SDXMove\n"); return(-1); } - - if (pfrom->status == 'E') + + if (pfrom->status == 'E') { DebugPrint(DEBUG_INFO, SECTION_MOVE,"SDXMove : from %d is empty\n", from); DebugPrint(DEBUG_INFO, SECTION_MOVE,"##### STOP SDXMove\n"); return(-1); } - if (pto->status == 'F') + if (pto->status == 'F') { switch (pto->status) { @@ -2876,9 +2901,9 @@ int SDXMove(int DeviceFD, int from, int to) return(-1); } - /* - * If from is a tape we must check if it is loaded - * and if yes we have to eject it + /* + * If from is a tape we must check if it is loaded + * and if yes we have to eject it */ if (pfrom->type == TAPETYPE) { @@ -2886,7 +2911,7 @@ int SDXMove(int DeviceFD, int from, int to) if ( tapestat & TAPE_ONLINE) { if (pDev[INDEX_TAPECTL].SCSI == 1) - { + { ret = eject_tape(pDev[INDEX_TAPECTL].dev,1); } else { ret = eject_tape(pDev[INDEX_TAPE].dev,2); @@ -2912,7 +2937,7 @@ int SDXMove(int DeviceFD, int from, int to) * Return: * == 0 -> success * != 0 -> error either from the SCSI command or from - * the element handling + * the element handling * TODO: */ int GenericMove(int DeviceFD, int from, int to) @@ -2920,34 +2945,34 @@ int GenericMove(int DeviceFD, int from, int to) ElementInfo_T *pfrom; ElementInfo_T *pto; int ret = 0; - + DebugPrint(DEBUG_INFO, SECTION_MOVE, "##### START GenericMove\n"); - + DebugPrint(DEBUG_INFO, SECTION_MOVE, "%-20s : from = %d, to = %d\n", "GenericMove", from, to); - - + + if ((pfrom = LookupElement(from)) == NULL) { DebugPrint(DEBUG_INFO, SECTION_MOVE, "GenericMove : ElementInfo for %d not found\n", from); DebugPrint(DEBUG_INFO, SECTION_MOVE,"##### STOP GenericMove\n"); return(-1); } - + if ((pto = LookupElement(to)) == NULL) { DebugPrint(DEBUG_INFO, SECTION_MOVE, "GenericMove : ElementInfo for %d not found\n", to); DebugPrint(DEBUG_INFO, SECTION_MOVE,"##### STOP GenericMove\n"); return(-1); } - - if (pfrom->status == 'E') + + if (pfrom->status == 'E') { DebugPrint(DEBUG_INFO, SECTION_MOVE, "GenericMove : from %d is empty\n", from); DebugPrint(DEBUG_INFO, SECTION_MOVE,"##### STOP GenericMove\n"); return(-1); } - - if (pto->status == 'F') + + if (pto->status == 'F') { DebugPrint(DEBUG_INFO, SECTION_MOVE, "GenericMove : Destination Element %d Type %d is full\n", pto->address, pto->type); @@ -2965,7 +2990,7 @@ int GenericMove(int DeviceFD, int from, int to) return(-1); } } - + if (CheckMove(pfrom, pto)) { ret = SCSI_Move(DeviceFD, 0, from, to); @@ -3148,14 +3173,14 @@ int CheckMove(ElementInfo_T *from, ElementInfo_T *to) */ moveok=1; } - + DebugPrint(DEBUG_INFO, SECTION_MOVE, "###### STOP CheckMove\n"); return(moveok); } /* */ - + int GetCurrentSlot(int fd, int drive) { extern OpenFiles_T *pDev; @@ -3174,7 +3199,7 @@ int GetCurrentSlot(int fd, int drive) { return(-1); } - } + } /* If the from address is the as the same as the tape address skip it */ if (pDTE[drive].from >= 0 && pDTE[drive].from != pDTE[drive].address) @@ -3248,7 +3273,7 @@ int GenericElementStatus(int DeviceFD, int InitStatus) } } } - + if (GetElementStatus(DeviceFD) == 0 && loop > 0) { loop--; @@ -3422,7 +3447,7 @@ int DLT448ElementStatus(int DeviceFD, int InitStatus) } } } - + if (GetElementStatus(DeviceFD) == 0 && loop > 0) { loop--; @@ -3552,7 +3577,7 @@ int DLT448ElementStatus(int DeviceFD, int InitStatus) } -/* +/* * Much the same like GenericElementStatus but * it seemes that for the STE Elements ASC/ASCQ is not set * on an error, only the except bit is set @@ -3719,7 +3744,7 @@ int SDXElementStatus(int DeviceFD, int InitStatus) * Only do the read, error handling is done by the calling function * * Return Values: - * < 0 -> Error + * < 0 -> Error * == 0 -> OK * * TODO: @@ -3739,13 +3764,13 @@ int GetElementStatus(int DeviceFD) int length = 0; /* Length of an Element */ int barcode = 0; /* To store the result of the BarCode function */ int NoOfElements; - + DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"##### START GetElementStatus\n"); - + barcode = BarCode(DeviceFD); - /* - * If the MODE_SENSE was successfull we use this Information to read the Elelement Info + /* + * If the MODE_SENSE was successfull we use this Information to read the Elelement Info */ if (pEAAPage != NULL) { @@ -3753,19 +3778,17 @@ int GetElementStatus(int DeviceFD) /* First the Medim Transport*/ if (V2(pEAAPage->NoMediumTransportElements) > 0) { + free(pMTE); MTE = V2(pEAAPage->NoMediumTransportElements) ; - if (pMTE == NULL) + if ((pMTE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * MTE)) == NULL) { - if ((pMTE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * MTE)) == NULL) - { - DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); - return(-1); - } + DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); + return(-1); } memset(pMTE, 0, sizeof(ElementInfo_T) * MTE); - - if (SCSI_ReadElementStatus(DeviceFD, - CHANGER, + + if (SCSI_ReadElementStatus(DeviceFD, + CHANGER, 0, barcode, V2(pEAAPage->MediumTransportElementAddress), @@ -3773,52 +3796,50 @@ int GetElementStatus(int DeviceFD) sizeof(MediumTransportElementDescriptor_T), (char **)&DataBuffer) != 0) { - if (DataBuffer != 0) - { - free(DataBuffer); - } + free(pMTE); + free(DataBuffer); ChgExit("genericElementStatus","Can't read MTE status", FATAL); } ElementStatusData = (ElementStatusData_T *)DataBuffer; offset = sizeof(ElementStatusData_T); - + ElementStatusPage = (ElementStatusPage_T *)&DataBuffer[offset]; offset = offset + sizeof(ElementStatusPage_T); length = V2(ElementStatusPage->length); DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"MTE Length %d(%d)\n",length,sizeof(MediumTransportElementDescriptor_T)); - + for (x = 0; x < MTE; x++) { MediumTransportElementDescriptor = (MediumTransportElementDescriptor_T *)&DataBuffer[offset]; - + if (ElementStatusPage->pvoltag == 1) { - strncpy(pMTE[x].VolTag, - MediumTransportElementDescriptor->pvoltag, + strncpy((char *)pMTE[x].VolTag, + (char *)MediumTransportElementDescriptor->pvoltag, TAG_SIZE); TerminateString(pMTE[x].VolTag, TAG_SIZE+1); } - + pMTE[x].type = ElementStatusPage->type; pMTE[x].address = V2(MediumTransportElementDescriptor->address); pMTE[x].except = MediumTransportElementDescriptor->except; pMTE[x].status = (MediumTransportElementDescriptor->full > 0) ? 'F':'E'; pMTE[x].full = MediumTransportElementDescriptor->full; - + if (length >= 5) { pMTE[x].ASC = MediumTransportElementDescriptor->asc; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASC MTE\n"); } - + if (length >= 6) { pMTE[x].ASCQ = MediumTransportElementDescriptor->ascq; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASCQ MTE\n"); } - + if (length >= 0xa) { if (MediumTransportElementDescriptor->svalid == 1) @@ -3830,27 +3851,26 @@ int GetElementStatus(int DeviceFD) } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip source MTE\n"); } - offset = offset + length; + offset = offset + length; } } - /* - * Storage Elements + /* + * Storage Elements */ if ( V2(pEAAPage->NoStorageElements) > 0) { + free(pSTE); STE = V2(pEAAPage->NoStorageElements); - if (pSTE == NULL) + if ((pSTE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * STE)) == NULL) { - if ((pSTE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * STE)) == NULL) - { - DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); - return(-1); - } + DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); + free(pMTE); + return(-1); } memset(pSTE, 0, sizeof(ElementInfo_T) * STE); - - if (SCSI_ReadElementStatus(DeviceFD, - STORAGE, + + if (SCSI_ReadElementStatus(DeviceFD, + STORAGE, 0, barcode, V2(pEAAPage->FirstStorageElementAddress), @@ -3858,53 +3878,50 @@ int GetElementStatus(int DeviceFD) sizeof(StorageElementDescriptor_T), (char **)&DataBuffer) != 0) { - if (DataBuffer != 0) - { - free(DataBuffer); - } + free(DataBuffer); ChgExit("GetElementStatus", "Can't read STE status", FATAL); } - + ElementStatusData = (ElementStatusData_T *)DataBuffer; offset = sizeof(ElementStatusData_T); - + ElementStatusPage = (ElementStatusPage_T *)&DataBuffer[offset]; offset = offset + sizeof(ElementStatusPage_T); length = V2(ElementStatusPage->length); DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"STE Length %d\n",length); - + for (x = 0; x < STE; x++) { StorageElementDescriptor = (StorageElementDescriptor_T *)&DataBuffer[offset]; if (ElementStatusPage->pvoltag == 1) { - strncpy(pSTE[x].VolTag, - StorageElementDescriptor->pvoltag, + strncpy(pSTE[x].VolTag, + (char *)StorageElementDescriptor->pvoltag, TAG_SIZE); TerminateString(pSTE[x].VolTag, TAG_SIZE+1); } - - + + pSTE[x].type = ElementStatusPage->type; pSTE[x].address = V2(StorageElementDescriptor->address); pSTE[x].except = StorageElementDescriptor->except; pSTE[x].status = (StorageElementDescriptor->full > 0) ? 'F':'E'; pSTE[x].full = StorageElementDescriptor->full; - + if (length >= 5) { pSTE[x].ASC = StorageElementDescriptor->asc; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASC STE\n"); } - + if (length >= 6) { pSTE[x].ASCQ = StorageElementDescriptor->ascq; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASCQ STE\n"); } - + if (length >= 0xa) { if (StorageElementDescriptor->svalid == 1) @@ -3912,32 +3929,32 @@ int GetElementStatus(int DeviceFD) pSTE[x].from = V2(StorageElementDescriptor->source); } else { pSTE[x].from = -1; - } + } } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip source STE\n"); } - - offset = offset + length; + + offset = offset + length; } - + } - /* + /* * Import/Export Elements */ if ( V2(pEAAPage->NoImportExportElements) > 0) { + free(pIEE); IEE = V2(pEAAPage->NoImportExportElements); - if (pIEE == NULL) + if ((pIEE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * IEE)) == NULL) { - if ((pIEE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * IEE)) == NULL) - { - DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); - return(-1); - } + DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); + free(DataBuffer); + return(-1); } memset(pIEE, 0, sizeof(ElementInfo_T) * IEE); - if (SCSI_ReadElementStatus(DeviceFD, - IMPORT, + + if (SCSI_ReadElementStatus(DeviceFD, + IMPORT, 0, barcode, V2(pEAAPage->FirstImportExportElementAddress), @@ -3951,22 +3968,22 @@ int GetElementStatus(int DeviceFD) } ChgExit("GetElementStatus", "Can't read IEE status", FATAL); } - + ElementStatusData = (ElementStatusData_T *)DataBuffer; offset = sizeof(ElementStatusData_T); - + ElementStatusPage = (ElementStatusPage_T *)&DataBuffer[offset]; offset = offset + sizeof(ElementStatusPage_T); length = V2(ElementStatusPage->length); DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"IEE Length %d\n",length); - + for (x = 0; x < IEE; x++) { ImportExportElementDescriptor = (ImportExportElementDescriptor_T *)&DataBuffer[offset]; if (ElementStatusPage->pvoltag == 1) { - strncpy(pIEE[x].VolTag, - ImportExportElementDescriptor->pvoltag, + strncpy(pIEE[x].VolTag, + (char *)ImportExportElementDescriptor->pvoltag, TAG_SIZE); TerminateString(pIEE[x].VolTag, TAG_SIZE+1); } @@ -3975,21 +3992,21 @@ int GetElementStatus(int DeviceFD) pIEE[x].except = ImportExportElementDescriptor->except; pIEE[x].status = (ImportExportElementDescriptor->full > 0) ? 'F':'E'; pIEE[x].full = ImportExportElementDescriptor->full; - + if (length >= 5) { pIEE[x].ASC = ImportExportElementDescriptor->asc; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASC IEE\n"); } - + if (length >= 6) { pIEE[x].ASCQ = ImportExportElementDescriptor->ascq; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASCQ IEE\n"); } - + if (length >= 0xa) { if (ImportExportElementDescriptor->svalid == 1) @@ -3997,32 +4014,32 @@ int GetElementStatus(int DeviceFD) pIEE[x].from = V2(ImportExportElementDescriptor->source); } else { pIEE[x].from = -1; - } + } } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip source IEE\n"); } - - offset = offset + length; + + offset = offset + length; } - + } - /* + /* * Data Transfer Elements */ if (V2(pEAAPage->NoDataTransferElements) >0) { + free(pDTE); DTE = V2(pEAAPage->NoDataTransferElements) ; - if (pDTE == NULL) + if ((pDTE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * DTE)) == NULL) { - if ((pDTE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * DTE)) == NULL) - { - DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); - return(-1); - } + DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); + free(DataBuffer); + return(-1); } memset(pDTE, 0, sizeof(ElementInfo_T) * DTE); - if (SCSI_ReadElementStatus(DeviceFD, - TAPETYPE, + + if (SCSI_ReadElementStatus(DeviceFD, + TAPETYPE, 0, barcode, V2(pEAAPage->FirstDataTransferElementAddress), @@ -4030,28 +4047,25 @@ int GetElementStatus(int DeviceFD) sizeof(DataTransferElementDescriptor_T), (char **)&DataBuffer) != 0) { - if (DataBuffer != 0) - { - free(DataBuffer); - } + free(DataBuffer); ChgExit("GenericElementStatus", "Can't read DTE status", FATAL); } - + ElementStatusData = (ElementStatusData_T *)DataBuffer; offset = sizeof(ElementStatusData_T); - + ElementStatusPage = (ElementStatusPage_T *)&DataBuffer[offset]; offset = offset + sizeof(ElementStatusPage_T); length = V2(ElementStatusPage->length); DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"DTE Length %d\n",length); - + for (x = 0; x < DTE; x++) { DataTransferElementDescriptor = (DataTransferElementDescriptor_T *)&DataBuffer[offset]; if (ElementStatusPage->pvoltag == 1) { - strncpy(pDTE[x].VolTag, - DataTransferElementDescriptor->pvoltag, + strncpy(pDTE[x].VolTag, + (char *)DataTransferElementDescriptor->pvoltag, TAG_SIZE); TerminateString(pDTE[x].VolTag, TAG_SIZE+1); } @@ -4061,21 +4075,21 @@ int GetElementStatus(int DeviceFD) pDTE[x].scsi = DataTransferElementDescriptor->scsi; pDTE[x].status = (DataTransferElementDescriptor->full > 0) ? 'F':'E'; pDTE[x].full = DataTransferElementDescriptor->full; - + if (length >= 5) { pDTE[x].ASC = DataTransferElementDescriptor->asc; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASC DTE\n"); } - + if (length >= 6) { pDTE[x].ASCQ = DataTransferElementDescriptor->ascq; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASCQ DTE\n"); } - + if (length >= 0xa) { if (DataTransferElementDescriptor->svalid == 1) @@ -4087,8 +4101,8 @@ int GetElementStatus(int DeviceFD) } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip source STE\n"); } - - offset = offset + length; + + offset = offset + length; } } } else { @@ -4096,8 +4110,8 @@ int GetElementStatus(int DeviceFD) * And now the old way, when we get here the read mode sense page has failed ... */ DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Reading Element Status the old way .... (max 255 elements)\n"); - if (SCSI_ReadElementStatus(DeviceFD, - 0, + if (SCSI_ReadElementStatus(DeviceFD, + 0, 0, barcode, 0, @@ -4111,42 +4125,46 @@ int GetElementStatus(int DeviceFD) } ChgExit("GenericElementStatus","Can't get ElementStatus", FATAL); } - + ElementStatusData = (ElementStatusData_T *)DataBuffer; DataBufferLength = V3(ElementStatusData->count); - + offset = sizeof(ElementStatusData_T); - - if (DataBufferLength <= 0) + + if (DataBufferLength <= 0) { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"DataBufferLength %d\n",DataBufferLength); + free(DataBuffer); return(1); } - - while (offset < DataBufferLength) + + while (offset < DataBufferLength) { ElementStatusPage = (ElementStatusPage_T *)&DataBuffer[offset]; NoOfElements = V3(ElementStatusPage->count) / V2(ElementStatusPage->length); offset = offset + sizeof(ElementStatusPage_T); length = V2(ElementStatusPage->length); - + switch (ElementStatusPage->type) { case CHANGER: + free(pMTE); MTE = NoOfElements; if ((pMTE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * MTE)) == NULL) { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); + free(DataBuffer); return(-1); } memset(pMTE, 0, sizeof(ElementInfo_T) * MTE); + for (x = 0; x < NoOfElements; x++) - { + { MediumTransportElementDescriptor = (MediumTransportElementDescriptor_T *)&DataBuffer[offset]; if (ElementStatusPage->pvoltag == 1) { - strncpy(pMTE[x].VolTag, - MediumTransportElementDescriptor->pvoltag, + strncpy(pMTE[x].VolTag, + (char *)MediumTransportElementDescriptor->pvoltag, TAG_SIZE); TerminateString(pMTE[x].VolTag, TAG_SIZE+1); } @@ -4155,22 +4173,22 @@ int GetElementStatus(int DeviceFD) pMTE[x].except = MediumTransportElementDescriptor->except; pMTE[x].status = (MediumTransportElementDescriptor->full > 0) ? 'F':'E'; pMTE[x].full = MediumTransportElementDescriptor->full; - - + + if (length >= 5) { pMTE[x].ASC = MediumTransportElementDescriptor->asc; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASC MTE\n"); } - + if (length >= 6) { pMTE[x].ASCQ = MediumTransportElementDescriptor->ascq; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASCQ MTE\n"); } - + if (length >= 0xa) { if (MediumTransportElementDescriptor->svalid == 1) @@ -4178,33 +4196,36 @@ int GetElementStatus(int DeviceFD) pMTE[x].from = V2(MediumTransportElementDescriptor->source); } else { pMTE[x].from = -1; - } + } } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip source MTE\n"); } - offset = offset + length; + offset = offset + length; } break; case STORAGE: + free(pSTE); STE = NoOfElements; if ((pSTE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * STE)) == NULL) { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); + free(DataBuffer); return(-1); } memset(pSTE, 0, sizeof(ElementInfo_T) * STE); + for (x = 0; x < NoOfElements; x++) { StorageElementDescriptor = (StorageElementDescriptor_T *)&DataBuffer[offset]; if (ElementStatusPage->pvoltag == 1) { - strncpy(pSTE[x].VolTag, - StorageElementDescriptor->pvoltag, + strncpy(pSTE[x].VolTag, + (char *)StorageElementDescriptor->pvoltag, TAG_SIZE); TerminateString(pSTE[x].VolTag, TAG_SIZE+1); } - + pSTE[x].type = ElementStatusPage->type; pSTE[x].address = V2(StorageElementDescriptor->address); pSTE[x].except = StorageElementDescriptor->except; @@ -4217,14 +4238,14 @@ int GetElementStatus(int DeviceFD) } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASC STE\n"); } - + if (length >= 6) { pSTE[x].ASCQ = StorageElementDescriptor->ascq; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASCQ STE\n"); } - + if (length >= 0xa) { if (StorageElementDescriptor->svalid == 1) @@ -4232,30 +4253,32 @@ int GetElementStatus(int DeviceFD) pSTE[x].from = V2(StorageElementDescriptor->source); } else { pSTE[x].from = -1; - } + } } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip source STE\n"); } - - offset = offset + length; + + offset = offset + length; } break; case IMPORT: + free(pIEE); IEE = NoOfElements; if ((pIEE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * IEE)) == NULL) { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); + free(DataBuffer); return(-1); } memset(pIEE, 0, sizeof(ElementInfo_T) * IEE); - + for (x = 0; x < NoOfElements; x++) { ImportExportElementDescriptor = (ImportExportElementDescriptor_T *)&DataBuffer[offset]; if (ElementStatusPage->pvoltag == 1) { - strncpy(pIEE[x].VolTag, - ImportExportElementDescriptor->pvoltag, + strncpy(pIEE[x].VolTag, + (char *)ImportExportElementDescriptor->pvoltag, TAG_SIZE); TerminateString(pIEE[x].VolTag, TAG_SIZE+1); } @@ -4265,21 +4288,21 @@ int GetElementStatus(int DeviceFD) pIEE[x].except = ImportExportElementDescriptor->except; pIEE[x].status = (ImportExportElementDescriptor->full > 0) ? 'F':'E'; pIEE[x].full = ImportExportElementDescriptor->full; - + if (length >= 5) { pIEE[x].ASC = ImportExportElementDescriptor->asc; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASC IEE\n"); } - + if (length >= 6) { pIEE[x].ASCQ = ImportExportElementDescriptor->ascq; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASCQ IEE\n"); } - + if (length >= 0xa) { if (ImportExportElementDescriptor->svalid == 1) @@ -4287,30 +4310,32 @@ int GetElementStatus(int DeviceFD) pIEE[x].from = V2(ImportExportElementDescriptor->source); } else { pIEE[x].from = -1; - } + } } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip source IEE\n"); } - - offset = offset + length; + + offset = offset + length; } break; case TAPETYPE: + free(pDTE); DTE = NoOfElements; if ((pDTE = (ElementInfo_T *)malloc(sizeof(ElementInfo_T) * DTE)) == NULL) { DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GenericElementStatus : malloc failed\n"); + free(DataBuffer); return(-1); } memset(pDTE, 0, sizeof(ElementInfo_T) * DTE); - + for (x = 0; x < NoOfElements; x++) { DataTransferElementDescriptor = (DataTransferElementDescriptor_T *)&DataBuffer[offset]; if (ElementStatusPage->pvoltag == 1) { - strncpy(pSTE[x].VolTag, - DataTransferElementDescriptor->pvoltag, + strncpy(pSTE[x].VolTag, + (char *)DataTransferElementDescriptor->pvoltag, TAG_SIZE); TerminateString(pSTE[x].VolTag, TAG_SIZE+1); } @@ -4327,14 +4352,14 @@ int GetElementStatus(int DeviceFD) } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASC DTE\n"); } - + if (length >= 6) { pDTE[x].ASCQ = DataTransferElementDescriptor->ascq; } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip ASCQ DTE\n"); } - + if (length >= 0xa) { if (DataTransferElementDescriptor->svalid == 1) @@ -4346,12 +4371,12 @@ int GetElementStatus(int DeviceFD) } else { DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"Skip source STE\n"); } - - offset = offset + length; + + offset = offset + length; } break; default: - offset = offset + length; + offset = offset + length; DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"GetElementStatus : UnGknown Type %d\n",ElementStatusPage->type); break; } @@ -4373,7 +4398,7 @@ int GetElementStatus(int DeviceFD) pSTE[x].ASCQ, pSTE[x].type, pSTE[x].from, pSTE[x].VolTag); DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"\n\n\tData Transfer Elements (tape drives) :\n"); - + for ( x = 0; x < DTE; x++) DebugPrint(DEBUG_INFO, SECTION_ELEMENT,"\t\tElement #%04d %c\n\t\t\tEXCEPT = %02X\n\t\t\tASC = %02X ASCQ = %02X\n\t\t\tType %d From = %04d\n\t\t\tTAG = %s\n\t\t\tSCSI ADDRESS = %d\n", pDTE[x].address, pDTE[x].status, pDTE[x].except, pDTE[x].ASC, @@ -4403,37 +4428,37 @@ int RequestSense(int DeviceFD, ExtendedRequestSense_T *ExtendedRequestSense, int { CDB_T CDB; int ret; - + DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### START RequestSense\n"); - - CDB[0] = SC_COM_REQUEST_SENSE; /* REQUEST SENSE */ - CDB[1] = 0; /* Logical Unit Number = 0, Reserved */ - CDB[2] = 0; /* Reserved */ + + CDB[0] = SC_COM_REQUEST_SENSE; /* REQUEST SENSE */ + CDB[1] = 0; /* Logical Unit Number = 0, Reserved */ + CDB[2] = 0; /* Reserved */ CDB[3] = 0; /* Reserved */ - CDB[4] = sizeof(ExtendedRequestSense_T); /* Allocation Length */ + CDB[4] = sizeof(ExtendedRequestSense_T); /* Allocation Length */ CDB[5] = (ClearErrorCounters << 7) & 0x80; /* */ - + memset(ExtendedRequestSense, 0, sizeof(ExtendedRequestSense_T)); - - ret = SCSI_Run(DeviceFD, Input, CDB, 6, + + ret = SCSI_Run(DeviceFD, Input, CDB, 6, (char *) ExtendedRequestSense, - sizeof(ExtendedRequestSense_T), + sizeof(ExtendedRequestSense_T), (char *) ExtendedRequestSense, sizeof(ExtendedRequestSense_T)); - - + + if (ret < 0) { DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### STOP RequestSense (%d)\n",ret); return(ret); } - + if ( ret > 0) { DecodeExtSense(ExtendedRequestSense, "RequestSense : ",debug_file); DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### STOP RequestSense (%d)\n", ExtendedRequestSense->SenseKey); return(ExtendedRequestSense->SenseKey); } - + dump_hex((char *)ExtendedRequestSense , sizeof(ExtendedRequestSense_T) , DEBUG_INFO, SECTION_SCSI); DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### STOP RequestSense (0)\n"); return(0); @@ -4516,9 +4541,6 @@ int LogSense(DeviceFD) LogParameter_T *LogParameter; struct LogPageDecode *p; int found; - char *datestamp = NULL; - char *label = NULL; - char *result = NULL; extern char *tapestatfile; int i; int ParameterCode; @@ -4532,22 +4554,23 @@ int LogSense(DeviceFD) DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### START LogSense\n"); - if (tapestatfile != NULL && - (StatFile = fopen(tapestatfile,"a")) != NULL && - pDev[INDEX_TAPECTL].SCSI == 1) + if ((tapestatfile != NULL) && (pDev[INDEX_TAPECTL].SCSI == 1) && + ((StatFile = fopen(tapestatfile,"a")) != NULL)) { - if ((pRequestSense = (RequestSense_T *)malloc(sizeof(RequestSense_T))) == NULL) + if ((pRequestSense = (RequestSense_T *)malloc(sizeof(RequestSense_T))) == NULL) { DebugPrint(DEBUG_ERROR, SECTION_TAPE,"LogSense : malloc failed\n"); + fclose(StatFile); return(-1); } - - if (GenericRewind(INDEX_TAPECTL) < 0) - { + + if (GenericRewind(INDEX_TAPECTL) < 0) + { DebugPrint(DEBUG_INFO, SECTION_TAPE,"LogSense : Rewind failed\n"); free(pRequestSense); - return(0); - } + fclose(StatFile); + return(0); + } /* * Try to read the tape label */ @@ -4557,25 +4580,27 @@ int LogSense(DeviceFD) { SCSI_CloseDevice(INDEX_TAPE); } - - if ((result = (char *)tape_rdlabel(pDev[INDEX_TAPE].dev, &datestamp, &label)) == NULL) + + if ((chgscsi_result = (char *)tape_rdlabel(pDev[INDEX_TAPE].dev, &chgscsi_datestamp, &chgscsi_label)) == NULL) { - fprintf(StatFile, "==== %s ==== %s ====\n", datestamp, label); + fprintf(StatFile, "==== %s ==== %s ====\n", chgscsi_datestamp, chgscsi_label); } else { - fprintf(StatFile, "%s\n", result); + fprintf(StatFile, "%s\n", chgscsi_result); } } if ((buffer = (char *)malloc(size)) == NULL) { DebugPrint(DEBUG_ERROR, SECTION_TAPE,"LogSense : malloc failed\n"); + free(pRequestSense); + fclose(StatFile); return(-1); } memset(buffer, 0, size); /* - * Get the known log pages + * Get the known log pages */ - + CDB[0] = SC_COM_LOG_SENSE; CDB[1] = 0; CDB[2] = 0x40; /* 0x40 for current values */ @@ -4585,34 +4610,36 @@ int LogSense(DeviceFD) CDB[6] = 00; MSB2(&CDB[7], size); CDB[9] = 0; - + if (SCSI_Run(INDEX_TAPECTL, Input, CDB, 10, buffer, - size, + size, (char *)pRequestSense, sizeof(RequestSense_T)) != 0) { DecodeSense(pRequestSense, "LogSense : ",debug_file); - free(buffer); free(pRequestSense); + free(buffer); + fclose(StatFile); return(0); } - + LogSenseHeader = (LogSenseHeader_T *)buffer; nologpages = V2(LogSenseHeader->PageLength); if ((logpages = (char *)malloc(nologpages)) == NULL) { DebugPrint(DEBUG_ERROR, SECTION_TAPE,"LogSense : malloc failed\n"); + free(pRequestSense); + free(buffer); + fclose(StatFile); return(-1); } - + memcpy(logpages, buffer + sizeof(LogSenseHeader_T), nologpages); - + for (count = 0; count < nologpages; count++) { if (logpages[count] != 0 ) { memset(buffer, 0, size); - - CDB[0] = SC_COM_LOG_SENSE; CDB[1] = 0; CDB[2] = 0x40 | logpages[count]; /* 0x40 for current values */ @@ -4622,16 +4649,18 @@ int LogSense(DeviceFD) CDB[6] = 00; MSB2(&CDB[7], size); CDB[9] = 0; - + if (SCSI_Run(INDEX_TAPECTL, Input, CDB, 10, buffer, - size, + size, (char *)pRequestSense, sizeof(RequestSense_T)) != 0) - { + { DecodeSense(pRequestSense, "LogSense : ",debug_file); - free(buffer); free(pRequestSense); + free(logpages); + free(buffer); + fclose(StatFile); return(0); } LogSenseHeader = (LogSenseHeader_T *)buffer; @@ -4655,14 +4684,9 @@ int LogSense(DeviceFD) p++; } - /* - * Hack to disable the printing of unknown pages - */ - found = 1; - if (!found) { fprintf(StatFile, "Logpage No %d = %x\n", count ,logpages[count]); - + while ((char *)LogParameter < (buffer + length)) { i = LogParameter->ParameterLength; ParameterCode = V2(LogParameter->ParameterCode); @@ -4699,11 +4723,11 @@ int LogSense(DeviceFD) /* * Test only !!!! - * Reset the cumulative counters + * Reset the cumulative counters */ CDB[0] = SC_COM_LOG_SELECT; CDB[1] = 2; - CDB[2] = 0xc0; + CDB[2] = 0xc0; CDB[3] = 0; CDB[4] = 0; CDB[5] = 0; @@ -4711,24 +4735,27 @@ int LogSense(DeviceFD) CDB[7] = 0; CDB[8] = 0; CDB[9] = 0; - + if (SCSI_Run(INDEX_TAPECTL, Input, CDB, 10, buffer, - size, + size, (char *)pRequestSense, sizeof(RequestSense_T)) != 0) { DecodeSense(pRequestSense, "LogSense : ",debug_file); - free(buffer); free(pRequestSense); + free(logpages); + free(buffer); + fclose(StatFile); return(0); } free(pRequestSense); + free(logpages); free(buffer); + fclose(StatFile); } DebugPrint(DEBUG_INFO, SECTION_TAPE,"##### STOP LogSense\n"); - return(0); } @@ -4775,7 +4802,7 @@ void WriteErrorCountersPage(LogParameter_T *buffer, int length) value); break; default: - fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", + fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", ParameterCode, value, i); break; @@ -4829,7 +4856,7 @@ void ReadErrorCountersPage(LogParameter_T *buffer, int length) value); break; default: - fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", + fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", ParameterCode, value, i); break; @@ -4858,7 +4885,7 @@ void C1553APage30(LogParameter_T *buffer, int length) if (Decode(LogParameter, &value) == 0) { switch (ParameterCode) { default: - fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", + fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", ParameterCode, value, i); break; @@ -4900,7 +4927,7 @@ void C1553APage37(LogParameter_T *buffer, int length) value); break; default: - fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", + fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", ParameterCode, value, i); break; @@ -4937,13 +4964,13 @@ void EXB85058HEPage39(LogParameter_T *buffer, int length) value); break; default: - fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", + fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", ParameterCode, value, i); break; } } - LogParameter = (LogParameter_T *)((char *)LogParameter + sizeof(LogParameter_T) + i); + LogParameter = (LogParameter_T *)((char *)LogParameter + sizeof(LogParameter_T) + i); } } @@ -5004,13 +5031,13 @@ void EXB85058HEPage3c(LogParameter_T *buffer, int length) case 0x14: break; default: - fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", + fprintf(StatFile, "Unknown ParameterCode %02X = %u(%d)\n", ParameterCode, value, i); break; } } - LogParameter = (LogParameter_T *)((char *)LogParameter + sizeof(LogParameter_T) + i); + LogParameter = (LogParameter_T *)((char *)LogParameter + sizeof(LogParameter_T) + i); } } @@ -5068,12 +5095,12 @@ void ChangerReplay(char *option) char buffer[1024]; FILE *ip; int x = 0, bufferx; - + if ((ip=fopen("/tmp/chg-scsi-trace", "r")) == NULL) { exit(1); } - + while (fscanf(ip, "%2x", &bufferx) != EOF) { buffer[x] = bufferx; @@ -5081,6 +5108,7 @@ void ChangerReplay(char *option) } DecodeModeSense(&buffer[0], 12, "DLT448ElementStatus :", 0, debug_file); + fclose(ip); } /* @@ -5092,23 +5120,31 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer int x; FILE *out; ExtendedRequestSense_T ExtRequestSense; - MBC_T *pbarcoderes = malloc(sizeof(MBC_T)); - + MBC_T *pbarcoderes; + ChangerCMD_T *p = (ChangerCMD_T *)&ChangerIO; + if ((pbarcoderes = malloc(sizeof(MBC_T))) == NULL) + { + printf("malloc failed \n"); + return; + } memset(pbarcoderes, 0, sizeof(MBC_T)); - if ((pModePage = (char *)malloc(0xff)) == NULL) + if ((pModePage == NULL) && ((pModePage = (char *)malloc(0xff)) == NULL)) { + DebugPrint(DEBUG_ERROR, SECTION_ELEMENT,"##### malloc failed (-1)\n"); printf("malloc failed \n"); + free(pbarcoderes); return; } if ((out = fdopen(1 , "w")) == NULL) { printf("Error fdopen stdout\n"); + free(pbarcoderes); return; } - + if (strcmp("types", option) == 0 || strcmp("all", option) == 0) { while(p->ident != NULL) @@ -5126,6 +5162,8 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer if (pDev[INDEX_CHANGER].functions->function_status(pDev[INDEX_CHANGER].fd, 1) != 0) { printf("Can not initialize changer status\n"); + free(pbarcoderes); + fclose(out); return; } } @@ -5137,8 +5175,8 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer printf("Address Type Status From\n"); } printf("-------------------------------------------\n"); - - + + for ( x = 0; x < MTE; x++) if (HasBarCode) { @@ -5150,9 +5188,9 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer { pbarcoderes->action = BARCODE_BARCODE; strcpy(pbarcoderes->data.barcode, pMTE[x].VolTag); - + if (MapBarCode(labelfile, pbarcoderes) == 0 ) - { + { printf("No mapping\n"); } else { printf("%s \n",pbarcoderes->data.voltag); @@ -5165,12 +5203,12 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer (pMTE[x].full ? "Full " :"Empty"), pMTE[x].from); } - - + + for ( x = 0; x < STE; x++) if (HasBarCode) { - printf("%07d STE %s %04d %s ",pSTE[x].address, + printf("%07d STE %s %04d %s ",pSTE[x].address, (pSTE[x].full ? "Full ":"Empty"), pSTE[x].from, pSTE[x].VolTag); @@ -5178,7 +5216,7 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer { pbarcoderes->action = BARCODE_BARCODE; strcpy(pbarcoderes->data.barcode, pSTE[x].VolTag); - + if (MapBarCode(labelfile, pbarcoderes) == 0 ) { printf("No mapping\n"); @@ -5189,16 +5227,16 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer printf("\n"); } } else { - printf("%07d STE %s %04d %s\n",pSTE[x].address, + printf("%07d STE %s %04d %s\n",pSTE[x].address, (pSTE[x].full ? "Full ":"Empty"), pSTE[x].from, pSTE[x].VolTag); } - - + + for ( x = 0; x < DTE; x++) if (HasBarCode) { - printf("%07d DTE %s %04d %s ",pDTE[x].address, + printf("%07d DTE %s %04d %s ",pDTE[x].address, (pDTE[x].full ? "Full " : "Empty"), pDTE[x].from, pDTE[x].VolTag); @@ -5206,7 +5244,7 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer { pbarcoderes->action = BARCODE_BARCODE; strcpy(pbarcoderes->data.barcode, pDTE[x].VolTag); - + if (MapBarCode(labelfile, pbarcoderes) == 0 ) { printf("No mapping\n"); @@ -5218,15 +5256,15 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer } } else { - printf("%07d DTE %s %04d %s\n",pDTE[x].address, + printf("%07d DTE %s %04d %s\n",pDTE[x].address, (pDTE[x].full ? "Full " : "Empty"), pDTE[x].from, pDTE[x].VolTag); } - + for ( x = 0; x < IEE; x++) if (HasBarCode) - { - printf("%07d IEE %s %04d %s ",pIEE[x].address, + { + printf("%07d IEE %s %04d %s ",pIEE[x].address, (pIEE[x].full ? "Full " : "Empty"), pIEE[x].from, pIEE[x].VolTag); @@ -5234,7 +5272,7 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer { pbarcoderes->action = BARCODE_BARCODE; strcpy(pbarcoderes->data.barcode, pIEE[x].VolTag); - + if (MapBarCode(labelfile, pbarcoderes) == 0 ) { printf("No mapping\n"); @@ -5246,11 +5284,11 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer } } else { - printf("%07d IEE %s %04d %s\n",pIEE[x].address, + printf("%07d IEE %s %04d %s\n",pIEE[x].address, (pIEE[x].full ? "Full " : "Empty"), pIEE[x].from, pIEE[x].VolTag); } - + } if (strcmp("sense", option) == 0 || strcmp("all", option) == 0) @@ -5261,12 +5299,12 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer RequestSense(INDEX_CHANGER , &ExtRequestSense, 0); DecodeExtSense(&ExtRequestSense, "", out); } - + if (pDev[INDEX_TAPE].SCSI == 1) { printf("\n"); printf("Sense Status from tape (tapectl):\n"); - RequestSense(INDEX_TAPE, &ExtRequestSense, 0); + RequestSense(INDEX_TAPE, &ExtRequestSense, 0); DecodeExtSense(&ExtRequestSense, "", out); } @@ -5274,7 +5312,7 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer { printf("\n"); printf("Sense Status from tape (tapectl):\n"); - RequestSense(INDEX_TAPECTL, &ExtRequestSense, 0); + RequestSense(INDEX_TAPECTL, &ExtRequestSense, 0); DecodeExtSense(&ExtRequestSense, "", out); } } @@ -5284,10 +5322,10 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer printf("\n"); if (SCSI_ModeSense(INDEX_CHANGER, pModePage, 0xff, 0x08, 0x3f) == 0) { - DecodeModeSense(pModePage, 0, "Changer :" , 0, out); + DecodeModeSense(pModePage, 0, "Changer :" , 0, out); } } - + if (strcmp("ModeSenseTape", option) == 0 || strcmp("all", option) == 0) { if (pDev[INDEX_TAPECTL].SCSI == 1) @@ -5295,7 +5333,7 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer printf("\n"); if (SCSI_ModeSense(INDEX_TAPECTL, pModePage, 0xff, 0x0, 0x3f) == 0) { - DecodeModeSense(pModePage, 0, "Tape :" , 1, out); + DecodeModeSense(pModePage, 0, "Tape :" , 1, out); } } } @@ -5311,7 +5349,10 @@ void ChangerStatus(char *option, char * labelfile, int HasBarCode, char *changer } if (GenericClean("") == 1) - printf("Tape needs cleaning\n"); + printf("Tape needs cleaning\n"); + + free(pbarcoderes); + fclose(out); } void dump_hex(char *p, int size, int level, int section) @@ -5342,7 +5383,7 @@ void dump_hex(char *p, int size, int level, int section) void TerminateString(char *string, int length) { int x; - + for (x = length; x >= 0 && !isalnum((int)string[x]); x--) string[x] = '\0'; } @@ -5351,7 +5392,7 @@ void ChgExit(char *where, char *reason, int level) { dbprintf(("ChgExit in %s, reason %s\n", where, reason)); fprintf(stderr,"%s\n",reason); - exit(2); + exit(2); } /* OK here starts a new set of functions. @@ -5422,7 +5463,7 @@ int SCSI_Run(int DeviceFD, case SCSI_ERROR: DebugPrint(DEBUG_ERROR, SECTION_SCSI,"SCSI_Run (TestUnitReady) SCSI_ERROR\n"); return(-1); - break; + break; case SCSI_BUSY: DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_Run (TestUnitReady) SCSI_BUSY\n"); break; @@ -5439,9 +5480,9 @@ int SCSI_Run(int DeviceFD, maxtries++; } } - + DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_Run TestUnitReady after %d sec:\n",maxtries); - + if (ok != 1) { DebugPrint(DEBUG_ERROR, SECTION_SCSI,"SCSI_Run Exit %d\n",ret); @@ -5460,7 +5501,7 @@ int SCSI_Run(int DeviceFD, DataBufferLength, pRequestSense, RequestSenseLength); - + DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_Run Exit %d\n",ret); switch (ret) { @@ -5512,7 +5553,7 @@ int SCSI_Run(int DeviceFD, maxtries++; sleep(1); } - + if (ok == 1) { return(0); @@ -5521,27 +5562,27 @@ int SCSI_Run(int DeviceFD, } } -/* - * This a vendor specific command !!!!!! - * First seen at AIT :-) - */ +/* + * This a vendor specific command !!!!!! + * First seen at AIT :-) + */ int SCSI_AlignElements(int DeviceFD, int AE_MTE, int AE_DTE, int AE_STE) { RequestSense_T *pRequestSense; - int retry = 1; + int retry; CDB_T CDB; - int ret; + int ret = -1; int i; - + DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### START SCSI_AlignElements\n"); - + if ((pRequestSense = (RequestSense_T *)malloc(sizeof(RequestSense_T))) == NULL) { DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_AlignElements : malloc failed\n"); return(-1); } - - while (retry > 0 && retry < MAX_RETRIES) + + for (retry = 0; retry < MAX_RETRIES; retry++) { CDB[0] = 0xE5; CDB[1] = 0; @@ -5552,20 +5593,20 @@ int SCSI_AlignElements(int DeviceFD, int AE_MTE, int AE_DTE, int AE_STE) CDB[9] = 0; CDB[10] = 0; CDB[11] = 0; - + ret = SCSI_Run(DeviceFD, Input, CDB, 12, - NULL, 0, (char *)pRequestSense, sizeof(RequestSense_T)); + NULL, 0, (char *)pRequestSense, sizeof(RequestSense_T)); DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_AlignElements : SCSI_Run = %d\n", ret); DecodeSense(pRequestSense, "SCSI_AlignElements :",debug_file); if (ret < 0) { - DebugPrint(DEBUG_ERROR, SECTION_SCSI,"%s: Request Sense[Inquiry]: %02X", - "chs", ((unsigned char *) &pRequestSense)[0]); - for (i = 1; i < sizeof(RequestSense_T); i++) - DebugPrint(DEBUG_ERROR, SECTION_SCSI," %02X", ((unsigned char *) &pRequestSense)[i]); - DebugPrint(DEBUG_ERROR, SECTION_SCSI,"\n"); + DebugPrint(DEBUG_ERROR, SECTION_SCSI,"%s: Request Sense[Inquiry]: %02X", + "chs", ((unsigned char *) &pRequestSense)[0]); + for (i = 1; i < sizeof(RequestSense_T); i++) + DebugPrint(DEBUG_ERROR, SECTION_SCSI," %02X", ((unsigned char *) &pRequestSense)[i]); + DebugPrint(DEBUG_ERROR, SECTION_SCSI,"\n"); return(ret); } if ( ret > 0) @@ -5597,18 +5638,20 @@ int SCSI_AlignElements(int DeviceFD, int AE_MTE, int AE_DTE, int AE_STE) { DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_AlignElements : end %d\n", ret); return(ret); - } + } } - return(ret); + DebugPrint(DEBUG_ERROR, SECTION_SCSI,"SCSI_AlignElements :" + "Retries exceeded = %d\n", retry); + return(-1); } int SCSI_Move(int DeviceFD, unsigned char chm, int from, int to) { RequestSense_T *pRequestSense; - int retry = 1; + int retry; CDB_T CDB; - int ret; + int ret = -1; int i; DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### START SCSI_Move\n"); @@ -5619,7 +5662,7 @@ int SCSI_Move(int DeviceFD, unsigned char chm, int from, int to) return(-1); } - while (retry > 0 && retry < MAX_RETRIES) + for (retry = 0; (ret != 0) && (retry < MAX_RETRIES); retry++) { CDB[0] = SC_MOVE_MEDIUM; CDB[1] = 0; @@ -5631,20 +5674,20 @@ int SCSI_Move(int DeviceFD, unsigned char chm, int from, int to) CDB[9] = 0; CDB[10] = 0; CDB[11] = 0; - + ret = SCSI_Run(DeviceFD, Input, CDB, 12, - NULL, 0, (char *)pRequestSense, sizeof(RequestSense_T)); + NULL, 0, (char *)pRequestSense, sizeof(RequestSense_T)); DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_Move : SCSI_Run = %d\n", ret); DecodeSense(pRequestSense, "SCSI_Move :",debug_file); if (ret < 0) { - DebugPrint(DEBUG_ERROR, SECTION_SCSI,"%s: Request Sense[Inquiry]: %02X", - "chs", ((unsigned char *) &pRequestSense)[0]); - for (i = 1; i < sizeof(RequestSense_T); i++) - DebugPrint(DEBUG_ERROR, SECTION_SCSI," %02X", ((unsigned char *) &pRequestSense)[i]); - DebugPrint(DEBUG_INFO, SECTION_SCSI,"\n"); + DebugPrint(DEBUG_ERROR, SECTION_SCSI,"%s: Request Sense[Inquiry]: %02X", + "chs", ((unsigned char *) &pRequestSense)[0]); + for (i = 1; i < sizeof(RequestSense_T); i++) + DebugPrint(DEBUG_ERROR, SECTION_SCSI," %02X", ((unsigned char *) &pRequestSense)[i]); + DebugPrint(DEBUG_INFO, SECTION_SCSI,"\n"); return(ret); } if ( ret > 0) @@ -5672,12 +5715,8 @@ int SCSI_Move(int DeviceFD, unsigned char chm, int from, int to) break; } } - if (ret == 0) - { - dbprintf(("SCSI_Move : end %d\n", ret)); - return(ret); - } } + dbprintf(("SCSI_Move : end %d\n", ret)); return(ret); } @@ -5687,25 +5726,25 @@ int SCSI_LoadUnload(int DeviceFD, RequestSense_T *pRequestSense, unsigned char b int ret; dbprintf(("##### START SCSI_LoadUnload\n")); - + CDB[0] = SC_COM_UNLOAD; - CDB[1] = byte1; + CDB[1] = byte1; CDB[2] = 0; CDB[3] = 0; CDB[4] = load; CDB[5] = 0; - - + + ret = SCSI_Run(DeviceFD, Input, CDB, 6, - NULL, 0, + NULL, 0, (char *) pRequestSense, sizeof(RequestSense_T)); - + if (ret < 0) { dbprintf(("SCSI_Unload : failed %d\n", ret)); return(-1); - } + } return(ret); } @@ -5725,12 +5764,12 @@ int SCSI_TestUnitReady(int DeviceFD, RequestSense_T *pRequestSense) CDB[5] = 0; ret = SCSI_ExecuteCommand(DeviceFD, Input, CDB, 6, - NULL, 0, + NULL, 0, (char *) pRequestSense, sizeof(RequestSense_T)); /* - * We got an error, so let the calling function handle this + * We got an error, so let the calling function handle this */ if (ret > 0) { @@ -5760,10 +5799,10 @@ int SCSI_ModeSelect(int DeviceFD, char *buffer, unsigned char length, unsigned c { CDB_T CDB; RequestSense_T *pRequestSense; - int ret; + int ret = -1; int retry = 1; char *sendbuf; - + dbprintf(("##### START SCSI_ModeSelect\n")); dbprintf(("SCSI_ModeSelect start length = %d:\n", length)); @@ -5773,10 +5812,11 @@ int SCSI_ModeSelect(int DeviceFD, char *buffer, unsigned char length, unsigned c return(-1); } - + if ((sendbuf = (char *)malloc(length + 4)) == NULL) { dbprintf(("SCSI_ModeSelect : malloc failed\n")); + free(pRequestSense); return(-1); } @@ -5785,33 +5825,40 @@ int SCSI_ModeSelect(int DeviceFD, char *buffer, unsigned char length, unsigned c memcpy(&sendbuf[4], buffer, length); dump_hex(sendbuf, length+4, DEBUG_INFO, SECTION_SCSI); - while (retry > 0 && retry < MAX_RETRIES) + for (retry = 0; (ret != 0) && (retry < MAX_RETRIES); retry++) { memset(pRequestSense, 0, sizeof(RequestSense_T)); - + CDB[0] = SC_COM_MODE_SELECT; CDB[1] = ((lun << 5) & 0xF0) | ((mode << 4) & 0x10) | (save & 1); CDB[2] = 0; CDB[3] = 0; CDB[4] = length + 4; CDB[5] = 0; - ret = SCSI_Run(DeviceFD, Output, CDB, 6, + ret = SCSI_Run(DeviceFD, Output, CDB, 6, sendbuf, - length + 4, + length + 4, (char *) pRequestSense, sizeof(RequestSense_T)); if (ret < 0) { dbprintf(("SCSI_ModeSelect : ret %d\n", ret)); + free(pRequestSense); + free(sendbuf); return(ret); } - + if ( ret > 0) { - switch(SenseHandler(DeviceFD, 0, pRequestSense->SenseKey, pRequestSense->AdditionalSenseCode, pRequestSense->AdditionalSenseCodeQualifier, (char *)pRequestSense)) + switch(SenseHandler(DeviceFD, 0, pRequestSense->SenseKey, + pRequestSense->AdditionalSenseCode, + pRequestSense->AdditionalSenseCodeQualifier, + (char *)pRequestSense)) { case SENSE_IGNORE: dbprintf(("SCSI_ModeSelect : SENSE_IGNORE\n")); + free(pRequestSense); + free(sendbuf); return(0); break; case SENSE_RETRY: @@ -5819,18 +5866,16 @@ int SCSI_ModeSelect(int DeviceFD, char *buffer, unsigned char length, unsigned c break; default: dbprintf(("SCSI_ModeSelect : end %d\n", pRequestSense->SenseKey)); + free(pRequestSense); + free(sendbuf); return(pRequestSense->SenseKey); break; } } - retry++; - if (ret == 0) - { - dbprintf(("SCSI_ModeSelect end: %d\n", ret)); - return(ret); - } } dbprintf(("SCSI_ModeSelect end: %d\n", ret)); + free(pRequestSense); + free(sendbuf); return(ret); } @@ -5856,23 +5901,23 @@ int SCSI_ModeSense(int DeviceFD, char *buffer, u_char size, u_char byte1, u_char { memset(pRequestSense, 0, sizeof(RequestSense_T)); memset(buffer, 0, size); - + CDB[0] = SC_COM_MODE_SENSE; CDB[1] = byte1; CDB[2] = byte2; CDB[3] = 0; CDB[4] = size; CDB[5] = 0; - ret = SCSI_Run(DeviceFD, Input, CDB, 6, + ret = SCSI_Run(DeviceFD, Input, CDB, 6, buffer, - size, + size, (char *) pRequestSense, sizeof(RequestSense_T)); if (ret < 0) { return(ret); } - + if ( ret > 0) { switch(SenseHandler(DeviceFD, 0, pRequestSense->SenseKey, pRequestSense->AdditionalSenseCode, pRequestSense->AdditionalSenseCodeQualifier, (char *)pRequestSense)) @@ -5924,19 +5969,19 @@ int SCSI_Inquiry(int DeviceFD, SCSIInquiry_T *buffer, u_char size) CDB[3] = 0; CDB[4] = size; CDB[5] = 0; - - ret = SCSI_ExecuteCommand(DeviceFD, Input, CDB, 6, + + ret = SCSI_ExecuteCommand(DeviceFD, Input, CDB, 6, buffer, - size, + size, (char *) pRequestSense, sizeof(RequestSense_T)); if (ret < 0) { DebugPrint(DEBUG_ERROR, SECTION_SCSI,"%s: Request Sense[Inquiry]: %02X", "chs", ((unsigned char *) pRequestSense)[0]); - for (i = 1; i < sizeof(RequestSense_T); i++) + for (i = 1; i < sizeof(RequestSense_T); i++) DebugPrint(DEBUG_ERROR, SECTION_SCSI," %02X", ((unsigned char *) pRequestSense)[i]); - DebugPrint(DEBUG_ERROR, SECTION_SCSI, "\n"); + DebugPrint(DEBUG_ERROR, SECTION_SCSI, "\n"); DebugPrint(DEBUG_ERROR, SECTION_SCSI, "Inquiry end: %d\n", ret); return(ret); } @@ -5965,24 +6010,24 @@ int SCSI_Inquiry(int DeviceFD, SCSIInquiry_T *buffer, u_char size) return(ret); } } - + DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_Inquiry end: %d\n", ret); return(ret); } /* - * Read the Element Status. If DescriptorSize != 0 then + * Read the Element Status. If DescriptorSize != 0 then * allocate DescriptorSize * NoOfElements for the result from the - * Read Element Status command. + * Read Element Status command. * If DescriptorSize == 0 than try to figure out how much space is needed - * by + * by * 1. do an read with an allocation size of 8 * 2. from the result take the 'Byte Count of Descriptor Available' * 3. do again an Read Element Status with the result from 2. * */ -int SCSI_ReadElementStatus(int DeviceFD, - unsigned char type, +int SCSI_ReadElementStatus(int DeviceFD, + unsigned char type, unsigned char lun, unsigned char VolTag, int StartAddress, @@ -5995,8 +6040,8 @@ int SCSI_ReadElementStatus(int DeviceFD, ElementStatusData_T *ElementStatusData; RequestSense_T *pRequestSense; int retry = 1; - int ret = -1; - + int ret = -1; + DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### START SCSI_ReadElementStatus\n"); if ((pRequestSense = (RequestSense_T *)malloc(sizeof(RequestSense_T))) == NULL) @@ -6004,7 +6049,7 @@ int SCSI_ReadElementStatus(int DeviceFD, DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_ReadElementStatus : malloc failed\n"); ChgExit("SCSI_ReadElementStatus","malloc failed", FATAL); } - + /* * How many elements, if <= 0 than exit with an fatal error */ @@ -6029,29 +6074,29 @@ int SCSI_ReadElementStatus(int DeviceFD, } else { *data = malloc(8); } - + memset(*data, 0, 8); - - - + + + while (retry > 0 && retry < MAX_RETRIES) { memset(pRequestSense, 0, sizeof(RequestSense_T) ); - + CDB[0] = SC_COM_RES; /* READ ELEMENT STATUS */ CDB[1] = VolTag | type | lun; /* Element Type Code , VolTag, LUN */ MSB2(&CDB[2], StartAddress); /* Starting Element Address */ MSB2(&CDB[4], NoOfElements); /* Number Of Element */ - CDB[6] = 0; /* Reserved */ - MSB3(&CDB[7],8); /* Allocation Length */ - CDB[10] = 0; /* Reserved */ - CDB[11] = 0; /* Control */ - - ret = SCSI_Run(DeviceFD, Input, CDB, 12, - *data, 8, + CDB[6] = 0; /* Reserved */ + MSB3(&CDB[7],8); /* Allocation Length */ + CDB[10] = 0; /* Reserved */ + CDB[11] = 0; /* Control */ + + ret = SCSI_Run(DeviceFD, Input, CDB, 12, + *data, 8, (char *)pRequestSense, sizeof(RequestSense_T)); - - + + DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_ReadElementStatus : (1) SCSI_Run %d\n", ret); if (ret < 0) { @@ -6088,12 +6133,12 @@ int SCSI_ReadElementStatus(int DeviceFD, DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### STOP SCSI_ReadElementStatus (%d)\n",ret); return(ret); } - + ElementStatusData = (ElementStatusData_T *)*data; DataBufferLength = V3(ElementStatusData->count); DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_ReadElementStatus: DataBufferLength %X, ret %d\n",DataBufferLength, ret); - + dump_hex(*data, 8, DEBUG_INFO, SECTION_ELEMENT); } else { /* DescriptorSize != 0 */ DataBufferLength = NoOfElements * DescriptorSize; @@ -6107,21 +6152,21 @@ int SCSI_ReadElementStatus(int DeviceFD, while (retry > 0 && retry < MAX_RETRIES) { memset(pRequestSense, 0, sizeof(RequestSense_T) ); - + CDB[0] = SC_COM_RES; /* READ ELEMENT STATUS */ CDB[1] = VolTag | type | lun; /* Element Type Code, VolTag, LUN */ MSB2(&CDB[2], StartAddress); /* Starting Element Address */ MSB2(&CDB[4], NoOfElements); /* Number Of Element */ - CDB[6] = 0; /* Reserved */ - MSB3(&CDB[7],DataBufferLength); /* Allocation Length */ - CDB[10] = 0; /* Reserved */ - CDB[11] = 0; /* Control */ - - ret = SCSI_Run(DeviceFD, Input, CDB, 12, - *data, DataBufferLength, + CDB[6] = 0; /* Reserved */ + MSB3(&CDB[7],DataBufferLength); /* Allocation Length */ + CDB[10] = 0; /* Reserved */ + CDB[11] = 0; /* Control */ + + ret = SCSI_Run(DeviceFD, Input, CDB, 12, + *data, DataBufferLength, (char *)pRequestSense, sizeof(RequestSense_T)); - - + + DebugPrint(DEBUG_INFO, SECTION_SCSI,"SCSI_ReadElementStatus : (2) SCSI_Run %d\n", ret); if (ret < 0) { @@ -6159,7 +6204,7 @@ int SCSI_ReadElementStatus(int DeviceFD, DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### STOP SCSI_ReadElementStatus (%d)\n",ret); return(ret); } - + dump_hex(*data, DataBufferLength, DEBUG_INFO, SECTION_SCSI); DebugPrint(DEBUG_INFO, SECTION_SCSI,"##### STOP SCSI_ReadElementStatus (%d)\n",ret); return(ret); @@ -6197,6 +6242,5 @@ printf_arglist_function2(void DebugPrint, int, level, int, section, char *, fmt) } } } - arglist_end(argp); - + arglist_end(argp); }