From decd3e5d72bb72dc93ea314583f5c25e18c8ff1d Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 31 Mar 2004 12:04:07 +0000 Subject: [PATCH] * fhandler_tape.cc (mtinfo_drive::get_pos): Only set partition if GetTapePosition returned a non-zero partition number. (mtinfo_drive::create_partitions): Reinitialize to partition 0. Support TAPE_DRIVE_INITIATOR and TAPE_DRIVE_FIXED partitioning. (mtinfo_drive::set_partition): Initialize new partition. (mtinfo_drive::status): Readd accidentally dropped setting of mt_resid. * net.cc (wsock_event::prepare): Always print debug output in case of error. --- winsup/cygwin/ChangeLog | 12 ++++++++++++ winsup/cygwin/fhandler_tape.cc | 31 +++++++++++++++++++++++++++---- winsup/cygwin/net.cc | 5 +++-- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 27b0d7306..297d8a385 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2004-03-31 Corinna Vinschen + + * fhandler_tape.cc (mtinfo_drive::get_pos): Only set partition if + GetTapePosition returned a non-zero partition number. + (mtinfo_drive::create_partitions): Reinitialize to partition 0. + Support TAPE_DRIVE_INITIATOR and TAPE_DRIVE_FIXED partitioning. + (mtinfo_drive::set_partition): Initialize new partition. + (mtinfo_drive::status): Readd accidentally dropped setting of mt_resid. + + * net.cc (wsock_event::prepare): Always print debug output in case + of error. + 2004-03-31 Corinna Vinschen * fhandler_socket.cc (fhandler_socket::sendmsg): Add SIGPIPE handling. diff --git a/winsup/cygwin/fhandler_tape.cc b/winsup/cygwin/fhandler_tape.cc index bbcc67063..4cebc13a8 100644 --- a/winsup/cygwin/fhandler_tape.cc +++ b/winsup/cygwin/fhandler_tape.cc @@ -324,7 +324,8 @@ mtinfo_drive::get_pos (HANDLE mt, long *ppartition, long *pblock) TAPE_FUNC (GetTapePosition (mt, TAPE_ABSOLUTE_POSITION, &p, &low, &high)); if (!lasterr) { - partition = (long) (p > 0 ? p - 1 : p); + if (p > 0) + partition = (long) p - 1; block = (long) low; if (ppartition) *ppartition= partition; @@ -511,9 +512,26 @@ mtinfo_drive::create_partitions (HANDLE mt, long count) return ERROR_INVALID_PARAMETER; if (set_pos (mt, TAPE_REWIND, 0, false)) goto out; + partition = 0; + part (partition)->initialize (0); debug_printf ("Format tape with %s partition(s)", count <= 0 ? "one" : "two"); - TAPE_FUNC (CreateTapePartition (mt, TAPE_SELECT_PARTITIONS, - count <= 0 ? 1 : 2, 0)); + if (get_feature (TAPE_DRIVE_INITIATOR)) + { + if (count <= 0) + TAPE_FUNC (CreateTapePartition (mt, TAPE_INITIATOR_PARTITIONS, + count <= 0 ? 0 : 2, (DWORD) count)); + } + else if (get_feature (TAPE_DRIVE_FIXED)) + { + /* This is supposed to work for Tandberg SLR drivers up to version + 1.6 which missed to set the TAPE_DRIVE_INITIATOR flag. According + to Tandberg, CreateTapePartition(TAPE_FIXED_PARTITIONS) apparently + does not ignore the dwCount parameter. Go figure! */ + TAPE_FUNC (CreateTapePartition (mt, TAPE_FIXED_PARTITIONS, + count <= 0 ? 0 : 2, (DWORD) count)); + } + else + lasterr = ERROR_INVALID_PARAMETER; out: return error ("partition"); } @@ -545,7 +563,11 @@ mtinfo_drive::set_partition (HANDLE mt, long count) lasterr = err; } else - partition = count; + { + partition = count; + if (part (partition)->block == -1) + part (partition)->initialize (0); + } } return error ("set_partition"); } @@ -727,6 +749,7 @@ mtinfo_drive::status (HANDLE mt, struct mtget *get) if (!notape) { + get->mt_resid = partition; get->mt_fileno = part (partition)->file; get->mt_blkno = part (partition)->fblock; diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc index b53dacdf7..0bdff32e3 100644 --- a/winsup/cygwin/net.cc +++ b/winsup/cygwin/net.cc @@ -54,8 +54,9 @@ bool wsock_event::prepare (int sock, long event_mask) { WSASetLastError (0); - if ((event = WSACreateEvent ()) != WSA_INVALID_EVENT - && WSAEventSelect (sock, event, event_mask) == SOCKET_ERROR) + if ((event = WSACreateEvent ()) == WSA_INVALID_EVENT) + debug_printf ("WSACreateEvent: %E"); + else if (WSAEventSelect (sock, event, event_mask) == SOCKET_ERROR) { debug_printf ("WSAEventSelect: %E"); WSACloseEvent (event);