-/*
- * Copyright (C) 2003-2009 Andre Noll <maan@systemlinux.org>
- *
- * Licensed under the GPL v2. For licencing details see COPYING.
- */
+/* Copyright (C) 2003 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
/** \file exec.c Helper functions for spawning new processes. */
#include <regex.h>
-#include <dirent.h>
#include "para.h"
-#include "close_on_fork.h"
#include "error.h"
#include "fd.h"
#include "string.h"
}
*pid = ret;
if (!(*pid)) { /* child */
- if (fds[0] >= 0) {
- if (fds[0]) {
- close(in[1]);
- if (in[0] != STDIN_FILENO)
- dup2(in[0], STDIN_FILENO);
- } else
- dup2(null, STDIN_FILENO);
+ if (fds[0] == 0)
+ dup2(null, STDIN_FILENO);
+ else if (fds[0] > 0) {
+ close(in[1]);
+ if (in[0] != STDIN_FILENO)
+ dup2(in[0], STDIN_FILENO);
}
- if (fds[1] >= 0) {
- if (fds[1]) {
- close(out[0]);
- if (out[1] != STDOUT_FILENO)
- dup2(out[1], STDOUT_FILENO);
- } else
- dup2(null, STDOUT_FILENO);
+ if (fds[1] == 0)
+ dup2(null, STDOUT_FILENO);
+ else if (fds[1] > 0) {
+ close(out[0]);
+ if (out[1] != STDOUT_FILENO)
+ dup2(out[1], STDOUT_FILENO);
}
- if (fds[2] >= 0) {
- if (fds[2]) {
- close(err[0]);
- if (err[1] != STDERR_FILENO)
- dup2(err[1], STDERR_FILENO);
- } else
- dup2(null, STDERR_FILENO);
+ if (fds[2] == 0)
+ dup2(null, STDERR_FILENO);
+ else if (fds[2] > 0) {
+ close(err[0]);
+ if (err[1] != STDERR_FILENO)
+ dup2(err[1], STDERR_FILENO);
}
if (null >= 0)
close(null);
* Exec the given command.
*
* \param pid Will hold the pid of the created process upon return.
- * \param cmdline Holds the command and its arguments, seperated by spaces.
+ * \param cmdline Holds the command and its arguments, separated by spaces.
* \param fds A pointer to a value-result array.
*
* This function uses fork/exec to create a new process. \a fds must be a
* - fd[i] > 0: create a pipe and dup i to one end of that pipe.
* Upon return, fd[i] contains the file descriptor of the pipe.
*
- * In any case, all unneeded filedescriptors are closed.
+ * In any case, all unneeded file descriptors are closed.
*
* \return Standard.
*/