⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scsi-changer-driver.c

📁 开源备份软件源码 AMANDA, the Advanced Maryland Automatic Network Disk Archiver, is a backup system that a
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -