summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/spawn.cc
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2002-08-18 05:49:26 +0000
committerChristopher Faylor <me@cgf.cx>2002-08-18 05:49:26 +0000
commit8dca9e230217cc6f4ded94e5fa0ab3f63df941b9 (patch)
tree7eae73aeb5feb07bfb241edbd41134270d9867a5 /winsup/cygwin/spawn.cc
parentd17ba05c1c9dbb15b846682fd98e65b80260623d (diff)
downloadcygnal-8dca9e230217cc6f4ded94e5fa0ab3f63df941b9.tar.gz
cygnal-8dca9e230217cc6f4ded94e5fa0ab3f63df941b9.tar.bz2
cygnal-8dca9e230217cc6f4ded94e5fa0ab3f63df941b9.zip
* perthread.h (vfork_save): Add ctty, sid, pgid, exitval fields.
(vfork_save::restore_pid): New method. (vfork_save::restore_exit): New method. * fork.cc (vfork): Save ctty, sid, pgid and restore them when returning to "parent". Use exitval field if exiting but never created a new process. * syscalls.cc (setsid): Detect when in "vfork" and force an actual fork so that pid will be allocated (UGLY!). (getsid): New function. * dcrt0.cc (do_exit): Use vfork_save::restore_exit method for returning from a vfork. * spawn.cc (spawnve): Use vfork_save::{restore_pid,restore_exit} methods for returning from vfork. * cygwin.din: Export getsid. * include/cygwin/version.h: Bump api minor number. * malloc.cc: #ifdef sYSTRIm for when MORECORE_CANNOT_TRIM is true.
Diffstat (limited to 'winsup/cygwin/spawn.cc')
-rw-r--r--winsup/cygwin/spawn.cc8
1 files changed, 5 insertions, 3 deletions
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 602c0af69..8c1c18adb 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -907,11 +907,13 @@ spawnve (int mode, const char *path, const char *const *argv,
case _P_DETACH:
subproc_init ();
ret = spawn_guts (path, argv, envp, mode);
- if (vf && ret > 0)
+ if (vf)
{
debug_printf ("longjmping due to vfork");
- vf->pid = ret;
- longjmp (vf->j, 1);
+ if (ret < 0)
+ vf->restore_exit (ret);
+ else
+ vf->restore_pid (ret);
}
break;
default: