summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2013-08-26 16:14:40 +0000
committerCorinna Vinschen <corinna@vinschen.de>2013-08-26 16:14:40 +0000
commit6585330779f88deedd9d215bd7c15b534f430d4a (patch)
tree7af2d8cf37959e4343778f2b7d3626ec9ef1f498
parent8451a289ccfb394922470880952aaa6a372122a1 (diff)
downloadcygnal-6585330779f88deedd9d215bd7c15b534f430d4a.tar.gz
cygnal-6585330779f88deedd9d215bd7c15b534f430d4a.tar.bz2
cygnal-6585330779f88deedd9d215bd7c15b534f430d4a.zip
* mtinfo.h (class mtinfo_part): Change type of block numbers to int64_t.
(mtinfo_part::initialize): Ditto for nblock parameter in declaration. (class mtinfo_drive): Change type of block number to int64_t. Change all parameters indicating a block number to int64_t in method declarations. * fhandler_tape.cc (mtinfo_part::initialize): Ditto in definition. (mtinfo_drive::get_pos): Ditto. Replace low and high with a ULARGE_INTEGER and use it's components in call to GetTapePosition. Store full value in block. (mtinfo_drive::_set_pos): Change type of count parameter to int64_t. Change call to SetTapePosition accordingly. (mtinfo_drive::set_pos): Change type of count parameter to int64_t. Change local variables holding block numbers accordingly. (mtinfo_drive::get_status): Don't bail out early if fetching media parameters fails. (mtinfo_drive::ioctl): Add explicit cast matching receiving type in MTTELL and MTIOCPOS calls.
-rw-r--r--winsup/cygwin/ChangeLog20
-rw-r--r--winsup/cygwin/fhandler_tape.cc44
-rw-r--r--winsup/cygwin/mtinfo.h16
3 files changed, 51 insertions, 29 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 8dda31cca..5cd2a5366 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,23 @@
+2013-08-26 Corinna Vinschen <corinna@vinschen.de>
+
+ * mtinfo.h (class mtinfo_part): Change type of block numbers to int64_t.
+ (mtinfo_part::initialize): Ditto for nblock parameter in declaration.
+ (class mtinfo_drive): Change type of block number to int64_t. Change
+ all parameters indicating a block number to int64_t in method
+ declarations.
+ * fhandler_tape.cc (mtinfo_part::initialize): Ditto in definition.
+ (mtinfo_drive::get_pos): Ditto. Replace low and high with a
+ ULARGE_INTEGER and use it's components in call to GetTapePosition.
+ Store full value in block.
+ (mtinfo_drive::_set_pos): Change type of count parameter to int64_t.
+ Change call to SetTapePosition accordingly.
+ (mtinfo_drive::set_pos): Change type of count parameter to int64_t.
+ Change local variables holding block numbers accordingly.
+ (mtinfo_drive::get_status): Don't bail out early if fetching media
+ parameters fails.
+ (mtinfo_drive::ioctl): Add explicit cast matching receiving type in
+ MTTELL and MTIOCPOS calls.
+
2013-08-23 Corinna Vinschen <corinna@vinschen.de>
* flock.cc (lockf_t::from_obj_name): Fix test for valid pid.
diff --git a/winsup/cygwin/fhandler_tape.cc b/winsup/cygwin/fhandler_tape.cc
index 969ee7653..14f3e9d1b 100644
--- a/winsup/cygwin/fhandler_tape.cc
+++ b/winsup/cygwin/fhandler_tape.cc
@@ -53,7 +53,7 @@ details. */
/* mtinfo_part */
void
-mtinfo_part::initialize (int32_t nblock)
+mtinfo_part::initialize (int64_t nblock)
{
block = nblock;
if (block == 0)
@@ -353,18 +353,21 @@ mtinfo_drive::write (HANDLE mt, LPOVERLAPPED pov, const void *ptr, size_t &len)
}
int
-mtinfo_drive::get_pos (HANDLE mt, int32_t *ppartition, int32_t *pblock)
+mtinfo_drive::get_pos (HANDLE mt, int32_t *ppartition, int64_t *pblock)
{
- DWORD p, low, high;
+ DWORD p;
+ ULARGE_INTEGER b;
- TAPE_FUNC (GetTapePosition (mt, TAPE_LOGICAL_POSITION, &p, &low, &high));
+ TAPE_FUNC (GetTapePosition (mt, TAPE_LOGICAL_POSITION, &p,
+ &b.LowPart, &b.HighPart));
if (lasterr == ERROR_INVALID_FUNCTION)
- TAPE_FUNC (GetTapePosition (mt, TAPE_ABSOLUTE_POSITION, &p, &low, &high));
+ TAPE_FUNC (GetTapePosition (mt, TAPE_ABSOLUTE_POSITION, &p,
+ &b.LowPart, &b.HighPart));
if (!lasterr)
{
if (p > 0)
partition = (int32_t) p - 1;
- block = (int32_t) low;
+ block = (int64_t) b.QuadPart;
if (ppartition)
*ppartition= partition;
if (pblock)
@@ -379,23 +382,24 @@ mtinfo_drive::get_pos (HANDLE mt, int32_t *ppartition, int32_t *pblock)
}
int
-mtinfo_drive::_set_pos (HANDLE mt, int mode, int32_t count, int partition,
+mtinfo_drive::_set_pos (HANDLE mt, int mode, int64_t count, int partition,
BOOL dont_wait)
{
/* If an async write is still pending, wait for completion. */
if (dirty == async_write_pending)
lasterr = async_wait (mt, NULL);
dirty = clean;
- TAPE_FUNC (SetTapePosition (mt, mode, partition, count, count < 0 ? -1 : 0,
+ LARGE_INTEGER c = { QuadPart:count };
+ TAPE_FUNC (SetTapePosition (mt, mode, partition, c.LowPart, c.HighPart,
dont_wait));
return lasterr;
}
int
-mtinfo_drive::set_pos (HANDLE mt, int mode, int32_t count, bool sfm_func)
+mtinfo_drive::set_pos (HANDLE mt, int mode, int64_t count, bool sfm_func)
{
int err = 0;
- int32_t undone = count;
+ int64_t undone = count;
BOOL dont_wait = FALSE;
switch (mode)
@@ -589,12 +593,12 @@ mtinfo_drive::set_partition (HANDLE mt, int32_t count)
lasterr = ERROR_IO_DEVICE;
else
{
- int part_block = part (count)->block >= 0 ? part (count)->block : 0;
+ uint64_t part_block = part (count)->block >= 0 ? part (count)->block : 0;
int err = _set_pos (mt, TAPE_LOGICAL_BLOCK, part_block, count + 1, FALSE);
if (err)
{
- int sav_block = block;
- int sav_partition = partition;
+ int64_t sav_block = block;
+ int32_t sav_partition = partition;
get_pos (mt);
if (sav_partition != partition)
{
@@ -649,8 +653,8 @@ mtinfo_drive::write_marks (HANDLE mt, int marktype, DWORD count)
}
else
{
- int sav_block = block;
- int sav_partition = partition;
+ int64_t sav_block = block;
+ int32_t sav_partition = partition;
get_pos (mt);
if (sav_partition != partition)
{
@@ -758,12 +762,10 @@ mtinfo_drive::get_status (HANDLE mt, struct mtget *get)
if (!get)
return ERROR_INVALID_PARAMETER;
- if ((tstat = GetTapeStatus (mt)) == ERROR_NO_MEDIA_IN_DRIVE)
+ if ((tstat = GetTapeStatus (mt)) == ERROR_NO_MEDIA_IN_DRIVE
+ || get_mp (mt) == ERROR_NO_MEDIA_IN_DRIVE)
notape = 1;
- if (get_mp (mt))
- return lasterr;
-
memset (get, 0, sizeof *get);
get->mt_type = MT_ISUNKNOWN;
@@ -1082,7 +1084,7 @@ mtinfo_drive::ioctl (HANDLE mt, unsigned int cmd, void *buf)
break;
case MTTELL:
if (!get_pos (mt))
- op->mt_count = block;
+ op->mt_count = (int) block;
break;
case MTFSS:
set_pos (mt, TAPE_SPACE_SETMARKS, op->mt_count, false);
@@ -1123,7 +1125,7 @@ mtinfo_drive::ioctl (HANDLE mt, unsigned int cmd, void *buf)
else if (cmd == MTIOCGET)
get_status (mt, (struct mtget *) buf);
else if (cmd == MTIOCPOS && !get_pos (mt))
- ((struct mtpos *) buf)->mt_blkno = block;
+ ((struct mtpos *) buf)->mt_blkno = (long) block;
return lasterr;
}
diff --git a/winsup/cygwin/mtinfo.h b/winsup/cygwin/mtinfo.h
index 157fe1bf9..e7624b704 100644
--- a/winsup/cygwin/mtinfo.h
+++ b/winsup/cygwin/mtinfo.h
@@ -1,6 +1,6 @@
/* mtinfo.h: Defininitions for the Cygwin tape driver class.
- Copyright 2004, 2005, 2006, 2008, 2012 Red Hat, Inc.
+ Copyright 2004, 2005, 2006, 2008, 2012, 2013 Red Hat, Inc.
This file is part of Cygwin.
@@ -46,13 +46,13 @@ enum lock_state
class mtinfo_part
{
public:
- int32_t block; /* logical block no */
+ int64_t block; /* logical block no */
+ int64_t fblock; /* relative block no */
int32_t file; /* current file no */
- int32_t fblock; /* relative block no */
bool smark; /* At setmark? */
eom_val emark; /* "end-of"-mark */
- void initialize (int32_t nblock = -1);
+ void initialize (int64_t nblock = -1);
};
class mtinfo_drive
@@ -60,7 +60,7 @@ class mtinfo_drive
int drive;
int lasterr;
int32_t partition;
- int32_t block;
+ int64_t block;
dirty_state dirty;
lock_state lock;
TAPE_GET_DRIVE_PARAMETERS _dp;
@@ -94,8 +94,8 @@ class mtinfo_drive
? ((_dp.FeaturesHigh & parm) != 0)
: ((_dp.FeaturesLow & parm) != 0));
}
- int get_pos (HANDLE mt, int32_t *ppartition = NULL, int32_t *pblock = NULL);
- int _set_pos (HANDLE mt, int mode, int32_t count, int partition, BOOL dont_wait);
+ 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);
@@ -116,7 +116,7 @@ public:
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, int32_t count, bool sfm_func);
+ 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)