diff --git a/mtx-1.3.12/Makefile.in b/mtx-1.3.12/Makefile.in index 6b967cf..05894d2 100644 --- a/mtx-1.3.12/Makefile.in +++ b/mtx-1.3.12/Makefile.in @@ -33,6 +33,7 @@ INSTALL_DOC = $(INSTALL) -m 644 INSTALL_BIN = $(INSTALL) -m 755 INSTALL_DIR = $(INSTALL) -m 755 -d +DESTDIR = prefix = @prefix@ exec_prefix = @exec_prefix@ sbindir = @sbindir@ @@ -109,13 +110,13 @@ all: $(BINS) dbgs: $(DBGS) install: $(BINS) - $(INSTALL_DIR) $(sbindir) + $(INSTALL_DIR) $(DESTDIR)$(sbindir) for file in $(BINS); do \ - $(INSTALL_BIN) "$$file" $(sbindir) ; \ + $(INSTALL_BIN) "$$file" $(DESTDIR)$(sbindir) ; \ done - $(INSTALL_DIR) $(mandir) $(mandir)/man1 + $(INSTALL_DIR) $(DESTDIR)$(mandir) $(DESTDIR)$(mandir)/man1 for file in mtx.1 tapeinfo.1 scsitape.1 scsieject.1 loaderinfo.1 ; do \ - $(INSTALL_DOC) "$$file" $(mandir)/man1 ; \ + $(INSTALL_DOC) "$$file" $(DESTDIR)$(mandir)/man1 ; \ done clean: diff --git a/mtx-1.3.12/loaderinfo.c b/mtx-1.3.12/loaderinfo.c index b23867e..11aaeac 100644 --- a/mtx-1.3.12/loaderinfo.c +++ b/mtx-1.3.12/loaderinfo.c @@ -488,7 +488,6 @@ int main(int argc, char **argv) argv0=argv[0]; if (argc != 3) { - fprintf(stderr,"argc=%d",argc); usage(); } diff --git a/mtx-1.3.12/mtx.1 b/mtx-1.3.12/mtx.1 index a5e6cc6..108836e 100644 --- a/mtx-1.3.12/mtx.1 +++ b/mtx-1.3.12/mtx.1 @@ -131,13 +131,16 @@ may need to eject the tape using your OS's tape control commands first). Note that this command may not be what you want on large tape libraries -- e.g. on Exabyte 220, the first slot is usually a cleaning tape. If is omitted, defaults to first drive. - .TP 10 .B last [] Loads drive from the last slot in the media changer. Unloads the drive if there is already a tape in it. (Note: you may need to eject the tape using your OS's tape control commands first). .TP 10 +.B previous [] +Unloads the drive and loads the previous tape in sequence. If the drive +was empty, loads the first tape into the drive. +.TP 10 .B next [] Unloads the drive and loads the next tape in sequence. If the drive was empty, loads the first tape into the drive. @@ -145,6 +148,9 @@ empty, loads the first tape into the drive. .B position Positions the robot at a specific slot. Needed by some changers to move to and open the import/export, or mailbox, slot. +.TP 10 +.B eject +Eject the tape currently in the drive. .SH AUTHORS The original 'mtx' program was written by Leonard Zubkoff and extensively diff --git a/mtx-1.3.12/mtxl.c b/mtx-1.3.12/mtxl.c index 3ae77a6..c468f88 100644 --- a/mtx-1.3.12/mtxl.c +++ b/mtx-1.3.12/mtxl.c @@ -39,6 +39,9 @@ /* zap the following define when we finally add real import/export support */ #define IMPORT_EXPORT_HACK 1 /* for the moment, import/export == storage */ +/* only so many element per SCSI Read Element Status */ +#define SCSI_RES_ELEMENTS 5000 + /* First, do some SCSI routines: */ /* the camlib is used on FreeBSD. */ @@ -1055,7 +1058,7 @@ static void ParseElementStatus( int *EmptyStorageElementAddress, ElementStatus->DataTransferElementSourceStorageElementNumber[ElementStatus->DataTransferElementCount] = BigEndian16(TransportElementDescriptor->SourceStorageElementAddress); -#if DEBUG +#ifdef DEBUG fprintf(stderr, "%d: ElementAddress = %d, Full = %d, SourceElement = %d\n", ElementStatus->DataTransferElementCount, ElementStatus->DataTransferElementAddress[ElementStatus->DataTransferElementCount], @@ -1141,6 +1144,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * int empty_idx = 0; boolean is_attached = false; int i,j; + int FirstElem, NumElements, NumThisRES; ElementModeSense_T *mode_sense = NULL; @@ -1205,35 +1209,46 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * { #ifdef DEBUG fprintf(stderr,"Using original element status polling method (storage, import/export, drivers etc independantly)\n"); + fprintf(stderr,"Storage start %d, Num %d, max %d\n", mode_sense->StorageStart, mode_sense->NumStorage - mode_sense->NumImportExport, mode_sense->MaxReadElementStatusData); #endif flags->elementtype = StorageElement; /* sigh! */ - DataBuffer = SendElementStatusRequest( MediumChangerFD, RequestSense, - inquiry_info, flags, - mode_sense->StorageStart, - /* adjust for import/export. */ - mode_sense->NumStorage - mode_sense->NumImportExport, - mode_sense->MaxReadElementStatusData); - if (!DataBuffer) + NumElements = mode_sense->NumStorage - mode_sense->NumImportExport; + FirstElem = mode_sense->StorageStart; + + do { + NumThisRES = (NumElements > SCSI_RES_ELEMENTS ? SCSI_RES_ELEMENTS : NumElements); + DataBuffer = SendElementStatusRequest( MediumChangerFD, RequestSense, + inquiry_info, flags, + FirstElem, + /* adjust for import/export. */ + NumThisRES, + SCSI_RES_ELEMENTS * 52 +120); + + if (!DataBuffer) + { #ifdef DEBUG - fprintf(stderr,"Had no elements!\n"); + fprintf(stderr,"Had no elements!\n"); #endif - /* darn. Free up stuff and return. */ + /* darn. Free up stuff and return. */ #ifdef DEBUG_MODE_SENSE - PrintRequestSense(RequestSense); + PrintRequestSense(RequestSense); #endif - FreeElementData(ElementStatus); - return NULL; - } + FreeElementData(ElementStatus); + return NULL; + } #ifdef DEBUG - fprintf(stderr, "Parsing storage elements\n"); + fprintf(stderr, "Parsing storage elements\n"); #endif - ParseElementStatus(EmptyStorageElementAddress, &EmptyStorageElementCount, - DataBuffer,ElementStatus,mode_sense,NULL); + ParseElementStatus(EmptyStorageElementAddress, &EmptyStorageElementCount, + DataBuffer,ElementStatus,mode_sense,NULL); - free(DataBuffer); /* sigh! */ + free(DataBuffer); /* sigh! */ + FirstElem += SCSI_RES_ELEMENTS; + NumElements -= SCSI_RES_ELEMENTS; + } while ( NumElements > 0 ); /* --------------IMPORT/EXPORT--------------- */ /* Next let's see if we need to do Import/Export: */ @@ -1247,8 +1262,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * inquiry_info, flags, mode_sense->ImportExportStart, mode_sense->NumImportExport, - mode_sense->MaxReadElementStatusData); - + SCSI_RES_ELEMENTS * 52 +120); if (!DataBuffer) { #ifdef DEBUG @@ -1269,7 +1283,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * #endif ParseElementStatus( EmptyStorageElementAddress, &EmptyStorageElementCount, DataBuffer, ElementStatus, mode_sense, NULL); - + free(DataBuffer); ElementStatus->StorageElementCount += ElementStatus->ImportExportCount; } @@ -1283,7 +1297,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * inquiry_info, flags, mode_sense->DataTransferStart, mode_sense->NumDataTransfer, - mode_sense->MaxReadElementStatusData); + SCSI_RES_ELEMENTS * 52 +120); if (!DataBuffer) { #ifdef DEBUG @@ -1322,7 +1336,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * inquiry_info, flags, mode_sense->MediumTransportStart, 1, /* only get 1, sigh. */ - mode_sense->MaxReadElementStatusData); + SCSI_RES_ELEMENTS * 52 +120); if (!DataBuffer) { #ifdef DEBUG diff --git a/mtx-1.3.12/patches/emc-fix-fail-with-too-high-slot-count_cleanupver.patch b/mtx-1.3.12/patches/emc-fix-fail-with-too-high-slot-count_cleanupver.patch new file mode 100644 index 0000000..242b28d --- /dev/null +++ b/mtx-1.3.12/patches/emc-fix-fail-with-too-high-slot-count_cleanupver.patch @@ -0,0 +1,123 @@ +diff --git a/mtxl.c b/mtxl.c +index 3ae77a6..12ea157 100644 +--- a/mtxl.c ++++ b/mtxl.c +@@ -39,6 +39,9 @@ + /* zap the following define when we finally add real import/export support */ + #define IMPORT_EXPORT_HACK 1 /* for the moment, import/export == storage */ + ++/* only so many element per SCSI Read Element Status */ ++#define SCSI_RES_ELEMENTS 5000 ++ + /* First, do some SCSI routines: */ + + /* the camlib is used on FreeBSD. */ +@@ -1055,7 +1058,7 @@ static void ParseElementStatus( int *EmptyStorageElementAddress, + ElementStatus->DataTransferElementSourceStorageElementNumber[ElementStatus->DataTransferElementCount] = + BigEndian16(TransportElementDescriptor->SourceStorageElementAddress); + +-#if DEBUG ++#ifdef DEBUG + fprintf(stderr, "%d: ElementAddress = %d, Full = %d, SourceElement = %d\n", + ElementStatus->DataTransferElementCount, + ElementStatus->DataTransferElementAddress[ElementStatus->DataTransferElementCount], +@@ -1141,6 +1144,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * + int empty_idx = 0; + boolean is_attached = false; + int i,j; ++ int FirstElem, NumElements, NumThisRES; + + ElementModeSense_T *mode_sense = NULL; + +@@ -1205,35 +1209,46 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * + { + #ifdef DEBUG + fprintf(stderr,"Using original element status polling method (storage, import/export, drivers etc independantly)\n"); ++ fprintf(stderr,"Storage start %d, Num %d, max %d\n", mode_sense->StorageStart, mode_sense->NumStorage - mode_sense->NumImportExport, mode_sense->MaxReadElementStatusData); + #endif + flags->elementtype = StorageElement; /* sigh! */ +- DataBuffer = SendElementStatusRequest( MediumChangerFD, RequestSense, ++ ++ NumElements = mode_sense->NumStorage - mode_sense->NumImportExport; ++ FirstElem = mode_sense->StorageStart; ++ ++ do ++ { ++ NumThisRES = (NumElements > SCSI_RES_ELEMENTS ? SCSI_RES_ELEMENTS : NumElements); ++ DataBuffer = SendElementStatusRequest( MediumChangerFD, RequestSense, + inquiry_info, flags, +- mode_sense->StorageStart, ++ FirstElem, + /* adjust for import/export. */ +- mode_sense->NumStorage - mode_sense->NumImportExport, +- mode_sense->MaxReadElementStatusData); ++ NumThisRES, ++ SCSI_RES_ELEMENTS * 52 +120); + +- if (!DataBuffer) +- { ++ if (!DataBuffer) ++ { + #ifdef DEBUG +- fprintf(stderr,"Had no elements!\n"); ++ fprintf(stderr,"Had no elements!\n"); + #endif +- /* darn. Free up stuff and return. */ ++ /* darn. Free up stuff and return. */ + #ifdef DEBUG_MODE_SENSE +- PrintRequestSense(RequestSense); ++ PrintRequestSense(RequestSense); + #endif +- FreeElementData(ElementStatus); +- return NULL; +- } ++ FreeElementData(ElementStatus); ++ return NULL; ++ } + + #ifdef DEBUG +- fprintf(stderr, "Parsing storage elements\n"); ++ fprintf(stderr, "Parsing storage elements\n"); + #endif +- ParseElementStatus(EmptyStorageElementAddress, &EmptyStorageElementCount, +- DataBuffer,ElementStatus,mode_sense,NULL); ++ ParseElementStatus(EmptyStorageElementAddress, &EmptyStorageElementCount, ++ DataBuffer,ElementStatus,mode_sense,NULL); + +- free(DataBuffer); /* sigh! */ ++ free(DataBuffer); /* sigh! */ ++ FirstElem += SCSI_RES_ELEMENTS; ++ NumElements -= SCSI_RES_ELEMENTS; ++ } while ( NumElements > 0 ); + + /* --------------IMPORT/EXPORT--------------- */ + /* Next let's see if we need to do Import/Export: */ +@@ -1247,8 +1262,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * + inquiry_info, flags, + mode_sense->ImportExportStart, + mode_sense->NumImportExport, +- mode_sense->MaxReadElementStatusData); +- ++ SCSI_RES_ELEMENTS * 52 +120); + if (!DataBuffer) + { + #ifdef DEBUG +@@ -1283,7 +1297,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * + inquiry_info, flags, + mode_sense->DataTransferStart, + mode_sense->NumDataTransfer, +- mode_sense->MaxReadElementStatusData); ++ SCSI_RES_ELEMENTS * 52 +120); + if (!DataBuffer) + { + #ifdef DEBUG +@@ -1322,7 +1336,7 @@ ElementStatus_T *ReadElementStatus(DEVICE_TYPE MediumChangerFD, RequestSense_T * + inquiry_info, flags, + mode_sense->MediumTransportStart, + 1, /* only get 1, sigh. */ +- mode_sense->MaxReadElementStatusData); ++ SCSI_RES_ELEMENTS * 52 +120); + if (!DataBuffer) + { + #ifdef DEBUG + diff --git a/mtx-1.3.12/patches/mtx-1.3.12-for-shared-library.patch b/mtx-1.3.12/patches/mtx-1.3.12-for-shared-library.patch deleted file mode 100644 index 9942ef1..0000000 --- a/mtx-1.3.12/patches/mtx-1.3.12-for-shared-library.patch +++ /dev/null @@ -1,62 +0,0 @@ ---- ../mtx-1.3.12/Makefile.in 2018-07-27 17:19:28.789345628 -0500 -+++ ./Makefile.in 2018-07-30 13:48:52.794193274 -0500 -@@ -13,6 +13,7 @@ - - BINS = mtx@EXEEXT@ tapeinfo@EXEEXT@ loaderinfo@EXEEXT@ scsitape@EXEEXT@ scsieject@EXEEXT@ - EXTRA_BINS = nsmhack@EXEEXT@ -+LIB=libmtx.a - DBGS := $(BINS:%@EXEEXT@=%.dbg) - MAN = mtx.1 tapeinfo.1 loaderinfo.1 scsitape.1 scsieject.1 - MAN_HTML := $(MAN:%.1=%.html) -@@ -32,6 +33,7 @@ - INSTALL_DOC = $(INSTALL) -m 644 - INSTALL_BIN = $(INSTALL) -m 755 - INSTALL_DIR = $(INSTALL) -m 755 -d -+INSTALL_LIB = $(INSTALL) -m 755 - - DESTDIR = - prefix = @prefix@ -@@ -39,6 +41,7 @@ - sbindir = @sbindir@ - mandir = @mandir@ - srcdir = @srcdir@ -+libdir = @libdir@ - - VPATH = $(srcdir) - -@@ -105,7 +108,7 @@ - strip $< -o $@ - endif - --all: $(BINS) -+all: $(BINS) $(LIB) - - dbgs: $(DBGS) - -@@ -118,6 +121,7 @@ - for file in mtx.1 tapeinfo.1 scsitape.1 scsieject.1 loaderinfo.1 ; do \ - $(INSTALL_DOC) "$$file" $(DESTDIR)$(mandir)/man1 ; \ - done -+ $(INSTALL_LIB) $(LIB) $ $(DESTDIR(libdir); - - clean: - rm -f *.o *~ mtx-*.zip -@@ -134,6 +138,8 @@ - dist: distclean - ./makedist $(VERSION) - -+libmtx: libmtx.a -+ - loaderinfo@EXEEXT@: loaderinfo.o mtxl.o mtxl.h mtx.h $(EXTRA) - $(CC) $(LDFLAGS) -o loaderinfo@EXEEXT@ loaderinfo.o mtxl.o $(EXTRA) $(LIBS) - -@@ -160,6 +166,9 @@ - scsieject@EXEEXT@: scsieject.o mtxl.o mtxl.h mtx.h $(EXTRA) - $(CC) $(LDFLAGS) -o scsieject@EXEEXT@ scsieject.o mtxl.o $(EXTRA) $(LIBS) - -+$(LIB): mtx.o mtxl.o -+ ar qvs $(LIB) mtx.o mtxl.o -+ - scsieject.o: scsieject.c mtx.h mtxl.h - - loaderinfo.o: loaderinfo.c mtx.h mtxl.h diff --git a/mtx-1.3.12/scsitape.c b/mtx-1.3.12/scsitape.c index dd52dd5..63f4977 100644 --- a/mtx-1.3.12/scsitape.c +++ b/mtx-1.3.12/scsitape.c @@ -63,7 +63,7 @@ #endif void Usage(void) { - FatalError("Usage: scsitape -f where is:\n setblk | fsf | bsf | eod | rewind | eject | mark |\n seek | read [ [] \n"); + FatalError("Usage: scsitape -f where is:\n setblk | fsf | bsf | eod | rewind | eject | erase |\n mark | seek | read [ []\n"); } #define arg1 (arg[0]) /* for backward compatibility, sigh */ diff --git a/mtx-1.3.12/tapeinfo.c b/mtx-1.3.12/tapeinfo.c index 1a5a0cb..276abc2 100644 --- a/mtx-1.3.12/tapeinfo.c +++ b/mtx-1.3.12/tapeinfo.c @@ -933,7 +933,6 @@ int main(int argc, char **argv) if (argc != 3) { - fprintf(stderr,"argc=%d",argc); usage(); }