mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-15 04:32:24 +00:00
libast: Use POSIX_SPAWN_SETSID in spawnveg when needed (#439)
This commit implements support for POSIX_SPAWN_SETSID in spawnveg(3). The fork/vfork fallback for spawnveg already attempts to use setsid in the manner described by the man page, so the posix_spawn implementation should also do so. src/lib/libast/comp/spawnveg.c: - Add support for POSIX_SPAWN_SETSID to the posix_spawn version of spawnveg. - Minor extra: Remove dead code that's never used (the _lib_posix_spawn < 2 code block is inside of _lib_posix_spawn > 1, plus when it's manually enabled by changing the previous #if condition you'll find it causes many regression test failures (at least on OpenBSD)). src/lib/libast/man/spawnveg.3: - Document that spawnveg cannot make the new process a session leader if the operating system doesn't support POSIX_SPAWN_SETSID and the new process was created using posix_spawn.
This commit is contained in:
parent
7259153f1a
commit
bd9faa81bf
2 changed files with 19 additions and 14 deletions
|
@ -47,20 +47,27 @@ NoN(spawnveg)
|
||||||
pid_t
|
pid_t
|
||||||
spawnveg(const char* path, char* const argv[], char* const envv[], pid_t pgid)
|
spawnveg(const char* path, char* const argv[], char* const envv[], pid_t pgid)
|
||||||
{
|
{
|
||||||
int err;
|
int err, flags = 0;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
posix_spawnattr_t attr;
|
posix_spawnattr_t attr;
|
||||||
|
|
||||||
if (err = posix_spawnattr_init(&attr))
|
if (err = posix_spawnattr_init(&attr))
|
||||||
goto nope;
|
goto nope;
|
||||||
|
#if POSIX_SPAWN_SETSID
|
||||||
|
if (pgid == -1)
|
||||||
|
flags |= POSIX_SPAWN_SETSID;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
if (pgid)
|
if (pgid)
|
||||||
|
flags |= POSIX_SPAWN_SETPGROUP;
|
||||||
|
if (flags && (err = posix_spawnattr_setflags(&attr, flags)))
|
||||||
|
goto bad;
|
||||||
|
if (pgid && pgid != -1)
|
||||||
{
|
{
|
||||||
if (pgid <= 1)
|
if (pgid <= 1)
|
||||||
pgid = 0;
|
pgid = 0;
|
||||||
if (err = posix_spawnattr_setpgroup(&attr, pgid))
|
if (err = posix_spawnattr_setpgroup(&attr, pgid))
|
||||||
goto bad;
|
goto bad;
|
||||||
if (err = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETPGROUP))
|
|
||||||
goto bad;
|
|
||||||
}
|
}
|
||||||
if (err = posix_spawn(&pid, path, NiL, &attr, argv, envv ? envv : environ))
|
if (err = posix_spawn(&pid, path, NiL, &attr, argv, envv ? envv : environ))
|
||||||
{
|
{
|
||||||
|
@ -68,15 +75,6 @@ spawnveg(const char* path, char* const argv[], char* const envv[], pid_t pgid)
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
posix_spawnattr_destroy(&attr);
|
posix_spawnattr_destroy(&attr);
|
||||||
#if _lib_posix_spawn < 2
|
|
||||||
if (waitpid(pid, &err, WNOHANG|WNOWAIT) == pid && EXIT_STATUS(err) == 127)
|
|
||||||
{
|
|
||||||
while (waitpid(pid, NiL, 0) == -1 && errno == EINTR);
|
|
||||||
if (!access(path, X_OK))
|
|
||||||
errno = ENOEXEC;
|
|
||||||
pid = -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return pid;
|
return pid;
|
||||||
bad:
|
bad:
|
||||||
posix_spawnattr_destroy(&attr);
|
posix_spawnattr_destroy(&attr);
|
||||||
|
|
|
@ -68,7 +68,7 @@ are as in
|
||||||
.L pgid
|
.L pgid
|
||||||
controls the new process group and session:
|
controls the new process group and session:
|
||||||
.TP
|
.TP
|
||||||
.L <0
|
.L -1
|
||||||
The new process becomes a session leader.
|
The new process becomes a session leader.
|
||||||
It is called in the child context.
|
It is called in the child context.
|
||||||
.TP
|
.TP
|
||||||
|
@ -86,5 +86,12 @@ The
|
||||||
.L spawnveg
|
.L spawnveg
|
||||||
function cannot set the terminal process group.
|
function cannot set the terminal process group.
|
||||||
As a result, it is incompatible with job control when used with terminals.
|
As a result, it is incompatible with job control when used with terminals.
|
||||||
|
Additionally, if the
|
||||||
|
.L POSIX_SPAWN_SETSID
|
||||||
|
attribute is not supported, then
|
||||||
|
.L spawnveg
|
||||||
|
cannot make the new process a session leader when using the
|
||||||
|
.I posix_spawn
|
||||||
|
API.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
fork(2), exec(2), setpgid(2), setsid(2), spawnve(2)
|
fork(2), posix_spawn(3), exec(2), setpgid(2), setsid(2), spawnve(2)
|
||||||
|
|
Loading…
Reference in a new issue