summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2001-09-29 01:23:06 +0000
committerChristopher Faylor <me@cgf.cx>2001-09-29 01:23:06 +0000
commita1dc0932f42604d6bd51ebf13f668e8e6debf409 (patch)
tree72da95ada5c8d6b1956697021dfff362e4e64351
parente19332c6677f4e1a41387102ded9010a2b99229f (diff)
downloadcygnal-a1dc0932f42604d6bd51ebf13f668e8e6debf409.tar.gz
cygnal-a1dc0932f42604d6bd51ebf13f668e8e6debf409.tar.bz2
cygnal-a1dc0932f42604d6bd51ebf13f668e8e6debf409.zip
* pipe.cc (fhandler_pipe::fixup_after_fork): New method.
* fhandler.h (fhandler_pipe::fixup_after_fork): Declare new method.
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/fhandler.h1
-rw-r--r--winsup/cygwin/pipe.cc22
3 files changed, 24 insertions, 4 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index a9718b3e6..a2783de57 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+Fri Sep 28 21:18:50 2001 Christopher Faylor <cgf@cygnus.com>
+
+ * pipe.cc (fhandler_pipe::fixup_after_fork): New method.
+ * fhandler.h (fhandler_pipe::fixup_after_fork): Declare new method.
+
Fri Sep 28 03:23:04 2001 Christopher Faylor <cgf@cygnus.com>
* passwd.cc (read_etc_passwd): Bother with unlocking when not
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index ed9ca350b..8f3368e78 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -452,6 +452,7 @@ public:
int close ();
void create_guard (SECURITY_ATTRIBUTES *sa) {guard = CreateMutex (sa, FALSE, NULL);}
int dup (fhandler_base *child);
+ void fixup_after_fork (HANDLE);
bool hit_eof ();
friend int make_pipe (int fildes[2], unsigned int psize, int mode);
};
diff --git a/winsup/cygwin/pipe.cc b/winsup/cygwin/pipe.cc
index 1166b511d..03af86228 100644
--- a/winsup/cygwin/pipe.cc
+++ b/winsup/cygwin/pipe.cc
@@ -63,9 +63,7 @@ int fhandler_pipe::close ()
if (guard)
CloseHandle (guard);
if (writepipe_exists)
-{debug_printf ("writepipe_exists closed");
CloseHandle (writepipe_exists);
-}
return res;
}
@@ -83,6 +81,16 @@ fhandler_pipe::hit_eof ()
return ev == NULL;
}
+void
+fhandler_pipe::fixup_after_fork (HANDLE parent)
+{
+ this->fhandler_base::fixup_after_fork (parent);
+ if (guard)
+ fork_fixup (parent, guard, "guard");
+ if (writepipe_exists)
+ fork_fixup (parent, writepipe_exists, "guard");
+}
+
int
fhandler_pipe::dup (fhandler_base *child)
{
@@ -96,14 +104,20 @@ fhandler_pipe::dup (fhandler_base *child)
ftp->guard = NULL;
else if (!DuplicateHandle (hMainProc, guard, hMainProc, &ftp->guard, 0, 1,
DUPLICATE_SAME_ACCESS))
- return -1;
+ {
+ debug_printf ("couldn't duplicate guard %p, %E", guard);
+ return -1;
+ }
if (writepipe_exists == NULL)
ftp->writepipe_exists = NULL;
else if (!DuplicateHandle (hMainProc, writepipe_exists, hMainProc,
&ftp->writepipe_exists, 0, 1,
DUPLICATE_SAME_ACCESS))
- return -1;
+ {
+ debug_printf ("couldn't duplicate writepipe_exists %p, %E", writepipe_exists);
+ return -1;
+ }
ftp->id = id;
ftp->orig_pid = orig_pid;