diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2004-03-26 21:43:49 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2004-03-26 21:43:49 +0000 |
commit | dee563095deb2bbdba5d4e04e48c99694061e302 (patch) | |
tree | a2134a3b338c171f09e28111b883621f712b3bd1 /winsup/cygwin/mtinfo.h | |
parent | 359b6e4c49105718a9ff5341172685d98790dd7e (diff) | |
download | newlib-dee563095deb2bbdba5d4e04e48c99694061e302.zip newlib-dee563095deb2bbdba5d4e04e48c99694061e302.tar.gz newlib-dee563095deb2bbdba5d4e04e48c99694061e302.tar.bz2 |
* errno.cc (errmap): Map ERROR_SHARING_VIOLATION to EBUSY,
ERROR_EOM_OVERFLOW and ERROR_NO_DATA_DETECTED to EIO. Add mappings
for ERROR_NO_MEDIA_IN_DRIVE, ERROR_DEVICE_REQUIRES_CLEANING and
ERROR_DEVICE_DOOR_OPEN.
* fhandler.h (class fhandler_dev_raw): Drop varblkop member.
(fhandler_dev_raw::is_eom): De-virtualize.
(fhandler_dev_raw::is_eof): Ditto.
(class fhandler_dev_tape): Drop lasterr and dp member. Add mt_mtx
member. Drop all private methods formerly used by ioctl.
(fhandler_dev_tape::is_rewind_device): Use get_minor for clarity.
(fhandler_dev_tape::driveno): New method.
(fhandler_dev_tape::drive_init): New method.
(fhandler_dev_tape::clear): Remove method.
(fhandler_dev_tape::is_eom): Ditto.
(fhandler_dev_tape::is_eof): Ditto.
(fhandler_dev_tape::write_file): Ditto.
(fhandler_dev_tape::read_file): Ditto.
(fhandler_dev_tape::_lock): New method.
(fhandler_dev_tape::unlock): New method.
(fhandler_dev_tape::raw_read): New method.
(fhandler_dev_tape::raw_write): New method.
* fhandler_raw.cc (fhandler_dev_raw::is_eom): New method.
(fhandler_dev_raw::is_eof): New method.
(fhandler_dev_raw::open): Allow setting write through option by
using the O_TEXT flag as ... flag.
(fhandler_dev_raw::writebuf): Remove usage of varblkop and other
tape specific code.
(fhandler_dev_raw::raw_read): Ditto.
(fhandler_dev_raw::dup): Ditto.
* fhandler_tape.cc: Rewrite tape operations entirely. Implement
new tape driver classes mtinfo, mtinfo_drive and mtinfo_part.
Reduce fhandler_dev_tape methods to mostly just calling appropriate
mtinfo_drive methods.
(mtinfo_init): New function adding the mtinfo shared memory area.
* mtinfo.h: New file, containing the definition of the new tape
driver classes.
* shared.cc: Include mtinfo.h.
(offsets): Add entry for mtinfo shared memory area.
(memory_init): Call mtinfo_init.
* shared_info.h (shared_locations): Add SH_MTINFO shared location.
* include/cygwin/mtio.h: Change and add various comments. Add GMT_xxx
macros for new generic flags. Add MT_ST_xxx bitfield definitions
for MTSETDRVBUFFER ioctl.
* include/cygwin/version.h: Bump API minor version number.
Diffstat (limited to 'winsup/cygwin/mtinfo.h')
-rw-r--r-- | winsup/cygwin/mtinfo.h | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/winsup/cygwin/mtinfo.h b/winsup/cygwin/mtinfo.h new file mode 100644 index 0000000..31260d1 --- /dev/null +++ b/winsup/cygwin/mtinfo.h @@ -0,0 +1,133 @@ +/* mtinfo.h: Defininitions for the Cygwin tape driver class. + + Copyright 2004 Red Hat, Inc. + +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. */ + +#define MTINFO_MAGIC 0x179b2af0 +#define MTINFO_VERSION 1 + +/* 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 +}; + +enum lock_state +{ + unlocked, + lock_error, + auto_locked, + locked +}; + +/* Partition specific information */ +class mtinfo_part +{ +public: + long block; /* logical block no */ + long file; /* current file no */ + long fblock; /* relative block no */ + bool smark; /* At setmark? */ + eom_val emark; /* "end-of"-mark */ + + void initialize (long nblock = -1); +}; + +class mtinfo_drive +{ + int drive; + int lasterr; + long partition; + long block; + dirty_state dirty; + lock_state lock; + TAPE_GET_DRIVE_PARAMETERS _dp; + TAPE_GET_MEDIA_PARAMETERS _mp; + bool buffer_writes; + bool two_fm; + bool fast_eom; + bool auto_lock; + bool sysv; + bool nowait; + mtinfo_part _part[MAX_PARTITION_NUM]; + + inline int error (const char *str) + { + if (lasterr) + debug_printf ("%s: Win32 error %d", 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, long *ppartition = NULL, long *pblock = NULL); + int _set_pos (HANDLE mt, int mode, long count, int partition); + int create_partitions (HANDLE mt, long count); + int set_partition (HANDLE mt, long 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, long count); + int set_blocksize (HANDLE mt, long count); + int status (HANDLE mt, struct mtget *get); + int set_options (HANDLE mt, long options); + +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, void *ptr, size_t &ulen); + int write (HANDLE mt, const void *ptr, size_t &len); + int ioctl (HANDLE mt, unsigned int cmd, void *buf); + int set_pos (HANDLE mt, int mode, long count, bool sfm_func); + + inline bool buffered_writes (void) { return buffer_writes; } + PTAPE_GET_DRIVE_PARAMETERS dp (void) { return &_dp; } + PTAPE_GET_MEDIA_PARAMETERS mp (void) { return &_mp; } + mtinfo_part *part (int num) { return &_part[num]; } +}; + +class mtinfo +{ + DWORD magic; + DWORD version; + mtinfo_drive _drive[MAX_DRIVE_NUM]; + +public: + void initialize (void); + mtinfo_drive *drive (int num) { return &_drive[num]; } +}; + +extern HANDLE mt_h; +extern mtinfo *mt; + +extern void __stdcall mtinfo_init (); |