diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2000-10-31 22:20:59 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2000-10-31 22:20:59 +0000 |
commit | 7cccedf8dead27e59bbe11c37622b260f6699e1f (patch) | |
tree | d754ddb4c85c47da6a99a18139138ddaa296029a /winsup/cygwin/fhandler_raw.cc | |
parent | 8e32a18e796dc9f8a0f92b720cf12aa1bf9dc5b5 (diff) | |
download | cygnal-7cccedf8dead27e59bbe11c37622b260f6699e1f.tar.gz cygnal-7cccedf8dead27e59bbe11c37622b260f6699e1f.tar.bz2 cygnal-7cccedf8dead27e59bbe11c37622b260f6699e1f.zip |
* fhandler.h (fhandler_dev_raw): Add definition for method
`fixup_after_fork'.
* fhandler_raw.cc (fhandler_dev_raw::fhandler_dev_raw): Add
`set_need_fixup_after_fork' call.
(fhandler_dev_raw::~fhandler_dev_raw): Revert to user space
allocation.
(fhandler_dev_raw::open): Ditto.
(fhandler_dev_raw::dup): Ditto. Reset buffer pointer.
(fhandler_dev_raw::fixup_after_fork): New function.
* fhandler_tape.cc (fhandler_dev_tape::open): Revert to user space
memory allocation.
(fhandler_dev_tape::ioctl): Ditto. Change behaviour on MTSETBLK when
new size is 1.
Diffstat (limited to 'winsup/cygwin/fhandler_raw.cc')
-rw-r--r-- | winsup/cygwin/fhandler_raw.cc | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc index f34a02da9..70cf8284c 100644 --- a/winsup/cygwin/fhandler_raw.cc +++ b/winsup/cygwin/fhandler_raw.cc @@ -117,12 +117,13 @@ fhandler_dev_raw::fhandler_dev_raw (DWORD devtype, const char *name, int unit) : { clear (); this->unit = unit; + set_need_fork_fixup (); } fhandler_dev_raw::~fhandler_dev_raw (void) { - if (devbufsiz >= 1L) - cfree (devbuf); + if (devbufsiz > 1L) + delete [] devbuf; clear (); } @@ -139,7 +140,7 @@ fhandler_dev_raw::open (const char *path, int flags, mode_t) if (ret) { if (devbufsiz > 1L) - devbuf = (char *) cmalloc (HEAP_BUF, devbufsiz); + devbuf = new char [devbufsiz]; } else devbufsiz = 0; @@ -444,21 +445,28 @@ fhandler_dev_raw::dup (fhandler_base *child) fhc->devbufsiz = devbufsiz; if (devbufsiz > 1L) - { - fhc->devbuf = (char *) cmalloc (HEAP_BUF, devbufsiz); - memcpy (fhc->devbuf, devbuf, devbufend); - } - fhc->devbufstart = devbufstart; - fhc->devbufend = devbufend; + fhc->devbuf = new char [devbufsiz]; + fhc->devbufstart = 0; + fhc->devbufend = 0; fhc->eom_detected = eom_detected; fhc->eof_detected = eof_detected; - fhc->lastblk_to_read = lastblk_to_read; + fhc->lastblk_to_read = 0; fhc->varblkop = varblkop; fhc->unit = unit; } return ret; } +void +fhandler_dev_raw::fixup_after_fork (HANDLE) +{ + if (devbufsiz > 1L) + devbuf = new char [devbufsiz]; + devbufstart = 0; + devbufend = 0; + lastblk_to_read = 0; +} + int fhandler_dev_raw::ioctl (unsigned int cmd, void *buf) { @@ -488,12 +496,12 @@ fhandler_dev_raw::ioctl (unsigned int cmd, void *buf) ret = ERROR_INVALID_PARAMETER; else if (!devbuf || op->rd_parm != devbufsiz) { - char *buf = (char *) cmalloc (HEAP_BUF, op->rd_parm); - if (devbuf) + char *buf = new char [op->rd_parm]; + if (devbufsiz > 1L) { memcpy (buf, devbuf + devbufstart, devbufend - devbufstart); devbufend -= devbufstart; - cfree (devbuf); + delete [] devbuf; } else devbufend = 0; |