It makes descriptor juggling much more reliable. Increase version
requirement on mLib to 2.1.0.
AC_SEARCH_LIBS([gethostbyname], [nsl resolv])
dnl Packages.
AC_SEARCH_LIBS([gethostbyname], [nsl resolv])
dnl Packages.
-PKG_CHECK_MODULES([mLib], [mLib >= 2.0.4])
+PKG_CHECK_MODULES([mLib], [mLib >= 2.1.0])
dnl Functions.
AC_CHECK_FUNCS([inet_aton])
dnl Functions.
AC_CHECK_FUNCS([inet_aton])
if (kid == 0) {
xopts *xo = xe->xo;
if (kid == 0) {
xopts *xo = xe->xo;
/* --- Fiddle with the file descriptors --- *
*
/* --- Fiddle with the file descriptors --- *
*
- if (dup2(in->fd, STDIN_FILENO) < 0 ||
- dup2(out->fd, STDOUT_FILENO) < 0 ||
- dup2(fd[1], STDERR_FILENO) < 0) {
+ md[0].cur = in->fd; md[0].want = STDIN_FILENO;
+ md[1].cur = out->fd; md[1].want = STDOUT_FILENO;
+ md[2].cur = fd[1]; md[2].want = STDERR_FILENO;
+ if (mdup(md, 3)) {
moan("couldn't manipulate file descriptors: %s", strerror(errno));
_exit(1);
}
moan("couldn't manipulate file descriptors: %s", strerror(errno));
_exit(1);
}
- if (in->fd > 2)
- close(in->fd);
- if (out->fd > 2)
- close(out->fd);
-
fdflags(STDIN_FILENO, O_NONBLOCK, 0, FD_CLOEXEC, 0);
fdflags(STDOUT_FILENO, O_NONBLOCK, 0, FD_CLOEXEC, 0);
fdflags(STDERR_FILENO, O_NONBLOCK, 0, FD_CLOEXEC, 0);
fdflags(STDIN_FILENO, O_NONBLOCK, 0, FD_CLOEXEC, 0);
fdflags(STDOUT_FILENO, O_NONBLOCK, 0, FD_CLOEXEC, 0);
fdflags(STDERR_FILENO, O_NONBLOCK, 0, FD_CLOEXEC, 0);
#include <mLib/fdflags.h>
#include <mLib/fdpass.h>
#include <mLib/ident.h>
#include <mLib/fdflags.h>
#include <mLib/fdpass.h>
#include <mLib/ident.h>
#include <mLib/mdwopt.h>
#include <mLib/quis.h>
#include <mLib/report.h>
#include <mLib/mdwopt.h>
#include <mLib/quis.h>
#include <mLib/report.h>