da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * spawnveg -- spawnve with process group or session control
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * pgid <0 setsid() [session group leader]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 0 nothing [retain session and process group]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 1 setpgid(0,0) [process group leader]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * >1 setpgid(0,pgid) [join process group]
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_posix_spawn > 1 /* reports underlying exec() errors */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinspawnveg(const char* path, char* const argv[], char* const envv[], pid_t pgid)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (err = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETPGROUP))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (err = posix_spawn(&pid, path, NiL, &attr, argv, envv ? envv : environ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (waitpid(pid, &err, WNOHANG|WNOWAIT) == pid && EXIT_STATUS(err) == 127)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinspawnveg(const char* path, char* const argv[], char* const envv[], pid_t pgid)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return spawnve(pgid ? P_DETACH : P_NOWAIT, path, argv, envv ? envv : environ);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * open-edition/mvs/zos fork+exec+(setpgid)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinspawnveg(const char* path, char* const argv[], char* const envv[], pid_t pgid)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return spawn(path, 0, (int*)0, &inherit, (const char**)argv, (const char**)envv);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fork+exec+(setsid|setpgid)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinspawnveg(const char* path, char* const argv[], char* const envv[], pid_t pgid)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin volatile int exec_errno;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin volatile int* volatile exec_errno_ptr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (pgid > 0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (pid != -1 && read(err[0], &m, sizeof(m)) == sizeof(m) && m)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * parent and child are in a race here
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (setpgid(pid, pgid) < 0 && pid != pgid && errno == EPERM)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;