📄 scsi-changer-driver.c
字号:
static char rcsid[] = "$Id: scsi-changer-driver.c,v 1.52 2006/07/21 00:25:50 martinea Exp $";/* * Interface to control a tape robot/library connected to the SCSI bus * * Copyright (c) Thomas Hepper th@ant.han.de */#include "amanda.h"#include "arglist.h"#include "scsi-defs.h"#include "tapeio.h"extern FILE *debug_file;extern changer_t *changer; /* Needed for the infos about emubarcode and labelfile */int PrintInquiry(SCSIInquiry_T *);int GenericElementStatus(int DeviceFD, int InitStatus);int SDXElementStatus(int DeviceFD, int InitStatus);int DLT448ElementStatus(int DeviceFD, int InitStatus);ElementInfo_T *LookupElement(int addr);int GenericResetStatus(int DeviceFD);int RequestSense(int, ExtendedRequestSense_T *, int );void dump_hex(u_char *, size_t, int, int);void TerminateString(char *string, size_t length);void ChgExit(char *, char *, int);int BarCode(int fd);int LogSense(int fd);int SenseHandler(int fd, u_char flag, u_char SenseKey, u_char AdditionalSenseCode, u_char AdditionalSenseCodeQualifier, RequestSense_T *buffer);int SCSI_AlignElements(int DeviceFD, size_t MTE, size_t DTE, size_t STE);int DoNothing0(void);int DoNothing1(int);int DoNothing2(int, int);int DoNothing3(int, int, int);int GenericMove(int, int, int);int SDXMove(int, int, int);int CheckMove(ElementInfo_T *from, ElementInfo_T *to);int GenericRewind(int);/* int GenericStatus(void); */int GenericFree(void);int TapeStatus(void); /* Is the tape loaded ? */int DLT4000Eject(char *Device, int type);int GenericEject(char *Device, int type);int SCSI_LogSenseClean(char *Device); /* Does the tape need a clean */int GenericClean(char *Device); /* Does the tape need a clean */int GenericBarCode(int DeviceFD); /* Do we have Barcode reader support */int NoBarCode(int DeviceFD);int GenericSearch(void);void Inventory(char *labelfile, int drive, int eject, int start, int stop, int clean);int TreeFrogBarCode(int DeviceFD);int EXB_BarCode(int DeviceFD);int GenericSenseHandler(int fd, u_char flags, u_char SenseKey, u_char AdditionalSenseCode, u_char AdditionalSenseCodeQualifier, RequestSense_T *);ElementInfo_T *LookupElement(int address);int eject_tape(char *tapedev, int type);int unload(int fd, int drive, int slot);int load(int fd, int drive, int slot);int GetElementStatus(int DeviceFD);int drive_loaded(int fd, int drivenum);/* * Log Pages Decode */void WriteErrorCountersPage(LogParameter_T *, size_t);void ReadErrorCountersPage(LogParameter_T *, size_t);void C1553APage30(LogParameter_T *, size_t);void C1553APage37(LogParameter_T *, size_t);void EXB85058HEPage39(LogParameter_T *, size_t);void EXB85058HEPage3c(LogParameter_T *, size_t);int Decode(LogParameter_T *, unsigned *);int DecodeModeSense(u_char *buffer, size_t offset, char *pstring, char block, FILE *out);int SCSI_Run(int DeviceFD, Direction_T Direction, CDB_T CDB, size_t CDB_Length, void *DataBuffer, size_t DataBufferLength, RequestSense_T *pRequestSense, size_t RequestSenseLength);int SCSI_Move(int DeviceFD, u_char chm, int from, int to);int SCSI_LoadUnload(int DeviceFD, RequestSense_T *pRequestSense, u_char byte1, u_char load);int SCSI_TestUnitReady(int, RequestSense_T *);int SCSI_ModeSense(int DeviceFD, u_char *buffer, u_char size, u_char byte1, u_char byte2);int SCSI_ModeSelect(int DeviceFD, u_char *buffer, u_char length, u_char save, u_char mode, u_char lun);int SCSI_ReadElementStatus(int DeviceFD, u_char type, u_char lun, u_char VolTag, int StartAddress, size_t NoOfElements, size_t DescriptorSize, u_char **data);FILE *StatFile;static int barcode; /* cache the result from the BarCode function */SC_COM_T SCSICommand[] = { {0x00, 6, "TEST UNIT READY"}, {0x01, 6, "REWIND"}, {0x03, 6, "REQUEST SENSE"}, {0x07, 6, "INITIALIZE ELEMENT STATUS"}, {0x12, 6, "INQUIRY"}, {0x13, 6, "ERASE"}, {0x15, 6, "MODE SELECT"}, {0x1A, 6, "MODE SENSE"}, {0x1B, 6, "UNLOAD"}, {0x4D, 10, "LOG SENSE"}, {0xA5, 12, "MOVE MEDIUM"}, { 0xE5, 12, "VENDOR SPECIFIC"}, {0xB8, 12, "READ ELEMENT STATUS"}, {0, 0, 0}};ChangerCMD_T ChangerIO[] = { {"generic_changer", "Generic driver changer [generic_changer]", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, /* HP Devices */ {"C1553A", "HP Auto Loader [C1553A]", GenericMove, GenericElementStatus, DoNothing1, GenericFree, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, /* Exabyte Devices */ {"EXB-10e", "Exabyte Robot [EXB-10e]", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, {"EXB-120", "Exabyte Robot [EXB-120]", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, EXB_BarCode, GenericSearch, GenericSenseHandler}, {"EXB-210", "Exabyte Robot [EXB-210]", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, EXB_BarCode, GenericSearch, GenericSenseHandler}, {"EXB-85058HE-0000", "Exabyte Tape [EXB-85058HE-0000]", DoNothing3, DoNothing2, DoNothing1, DoNothing0, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, /* Tandberg Devices */ {"TDS 1420", "Tandberg Robot (TDS 1420)", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, /* ADIC Devices */ {"VLS DLT", "ADIC VLS DLT Library [VLS DLT]", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, {"VLS SDX", "ADIC VLS DLT Library [VLS SDX]", SDXMove, SDXElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, {"FastStor DLT", "ADIC FastStor DLT Library [FastStor DLT]", SDXMove, DLT448ElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, {"Scalar DLT 448", "ADIC DLT 448 [Scalar DLT 448]", GenericMove, DLT448ElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, /* Sepctra Logic Devices */ {"215", "Spectra Logic TreeFrog[215]", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, TreeFrogBarCode, GenericSearch, GenericSenseHandler}, /* BreeceHill Q7 */ {"Quad 7", "Breece Hill Quad 7", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, /* Quantum Devices */ {"L500", "ATL [L500]", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, /* * And now the tape devices */ /* The generic handler if nothing matches */ {"generic_tape", "Generic driver tape [generic_tape]", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, GenericClean, GenericRewind, NoBarCode, GenericSearch, GenericSenseHandler}, {"DLT8000", "DLT Tape [DLT8000]", DoNothing3, DoNothing2, DoNothing1, DoNothing0, DLT4000Eject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, {"DLT7000", "DLT Tape [DLT7000]", DoNothing3, DoNothing2, DoNothing1, DoNothing0, DLT4000Eject, GenericClean, GenericRewind, GenericBarCode, GenericSearch, GenericSenseHandler}, {"DLT4000", "DLT Tape [DLT4000]", DoNothing3, DoNothing2, DoNothing1, DoNothing0, DLT4000Eject, GenericClean, GenericRewind, NoBarCode, GenericSearch, GenericSenseHandler}, {"SLR100", "Tandberg SLR100", GenericMove, GenericElementStatus, GenericResetStatus, GenericFree, GenericEject, SCSI_LogSenseClean, GenericRewind, NoBarCode, GenericSearch, GenericSenseHandler}, {NULL, NULL, NULL,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};LogPageDecode_T DecodePages[] = { {2, "C1553A", WriteErrorCountersPage}, {3, "C1553A", ReadErrorCountersPage}, {0x30, "C1553A", C1553APage30}, {0x37, "C1553A", C1553APage37}, {2, "*", WriteErrorCountersPage}, {3, "*", ReadErrorCountersPage}, {0x39, "EXB-85058HE-0000", EXB85058HEPage39}, {0x3c, "EXB-85058HE-0000", EXB85058HEPage3c}, {0, NULL, NULL}};int ElementStatusValid = 0; /* Set if the READ ELEMENT STATUS was OK, an no error is pending */int LibModeSenseValid = 0; /* Set if we did an scussefull MODE SENSE */char *SlotArgs = 0;/* Pointer to MODE SENSE Pages */u_char *pModePage = NULL;EAAPage_T *pEAAPage = NULL;DeviceCapabilitiesPage_T *pDeviceCapabilitiesPage = NULL;u_char *pVendorUnique = NULL;/* * New way, every element type has its on array * which is dynamic allocated by the ElementStatus function,*/ElementInfo_T *pMTE = NULL; /*Medium Transport Element */ElementInfo_T *pSTE = NULL; /*Storage Element */ElementInfo_T *pIEE = NULL; /*Import Export Element */ElementInfo_T *pDTE = NULL; /*Data Transfer Element */size_t MTE = 0; /*Counter for the above element types */size_t STE = 0;size_t IEE = 0;size_t DTE = 0;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 *//* * First all functions which are called from extern */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -