/* mtinfo.h: Defininitions for the Cygwin tape driver class. This file is part of Cygwin. This software is a copyrighted work licensed under the terms of the Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ /* Maximum number of supported partitions per drive. */ #define MAX_PARTITION_NUM 64 /* Maximum number of supported drives. */ #define MAX_DRIVE_NUM 8 /* Values for bookkeeping of the tape position relative to filemarks and eod/eom. */ enum eom_val { no_eof, eof_hit, eof, eod_hit, eod, eom_hit, eom }; enum dirty_state { clean, has_read, has_written, async_write_pending }; enum lock_state { unlocked, lock_error, auto_locked, locked }; /* Partition specific information */ class mtinfo_part { public: int64_t block; /* logical block no */ int64_t fblock; /* relative block no */ int32_t file; /* current file no */ bool smark; /* At setmark? */ eom_val emark; /* "end-of"-mark */ void initialize (int64_t nblock = -1); }; class mtinfo_drive { int drive; int lasterr; int32_t partition; int64_t block; dirty_state dirty; lock_state lock; TAPE_GET_DRIVE_PARAMETERS _dp; TAPE_GET_MEDIA_PARAMETERS _mp; /* sizeof(OVERLAPPED) == 20 on 32 bit, 32 on 64 bit. A drive is always opened exclusively by a single process, though, so instead of the OVERLAPPED structure, we just keep track of the pointer to the OVERLAPPED structure in the application's fhandler. */ LPOVERLAPPED ov; struct status_flags { unsigned buffer_writes : 1; unsigned async_writes : 1; unsigned two_fm : 1; unsigned fast_eom : 1; unsigned auto_lock : 1; unsigned sysv : 1; unsigned nowait : 1; } status; mtinfo_part _part[MAX_PARTITION_NUM]; inline int error (const char *str) { if (lasterr) debug_printf ("%s: Win32 error %d", str, lasterr); return lasterr; } inline bool get_feature (DWORD parm) { return ((parm & TAPE_DRIVE_HIGH_FEATURES) ? ((_dp.FeaturesHigh & parm) != 0) : ((_dp.FeaturesLow & parm) != 0)); } int get_pos (HANDLE mt, int32_t *ppartition = NULL, int64_t *pblock = NULL); int _set_pos (HANDLE mt, int mode, int64_t count, int partition, BOOL dont_wait); int create_partitions (HANDLE mt, int32_t count); int set_partition (HANDLE mt, int32_t count); int write_marks (HANDLE mt, int marktype, DWORD count); int erase (HANDLE mt, int mode); int prepare (HANDLE mt, int action, bool is_auto = false); int set_compression (HANDLE mt, int32_t count); int set_blocksize (HANDLE mt, DWORD count); int get_status (HANDLE mt, struct mtget *get); int set_options (HANDLE mt, int32_t options); int async_wait (HANDLE mt, DWORD *bytes_written); public: void initialize (int num, bool first_time); int get_dp (HANDLE mt); int get_mp (HANDLE mt); int open (HANDLE mt); int close (HANDLE mt, bool rewind); int read (HANDLE mt, LPOVERLAPPED pov, void *ptr, size_t &ulen); int write (HANDLE mt, LPOVERLAPPED pov, const void *ptr, size_t &len); int ioctl (HANDLE mt, unsigned int cmd, void *buf); int set_pos (HANDLE mt, int mode, int64_t count, bool sfm_func); IMPLEMENT_STATUS_FLAG (bool, buffer_writes) IMPLEMENT_STATUS_FLAG (bool, async_writes) IMPLEMENT_STATUS_FLAG (bool, two_fm) IMPLEMENT_STATUS_FLAG (bool, fast_eom) IMPLEMENT_STATUS_FLAG (bool, auto_lock) IMPLEMENT_STATUS_FLAG (bool, sysv) IMPLEMENT_STATUS_FLAG (bool, nowait) PTAPE_GET_DRIVE_PARAMETERS dp () { return &_dp; } PTAPE_GET_MEDIA_PARAMETERS mp () { return &_mp; } mtinfo_part *part (int num) { return &_part[num]; } }; class mtinfo { mtinfo_drive _drive[MAX_DRIVE_NUM]; public: void initialize (); mtinfo_drive *drive (int num) { return &_drive[num]; } };