X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=blobdiff_plain;f=exec.c;h=d9f5b1b6f6838b4800b4310300e07b89a535d225;hp=e796ebf28e38b10170a10cd53ade53243616c1e0;hb=723146898de138324dd6e421af05fd61c6cda848;hpb=2a2d1f8d52477af7e6e161d60c722b7a2f1a4651 diff --git a/exec.c b/exec.c index e796ebf..d9f5b1b 100644 --- a/exec.c +++ b/exec.c @@ -1,3 +1,9 @@ +/* + * Copyright (C) 2003-2008 Andre Noll + * + * Licensed under the GPL v2. For licencing details see COPYING. + */ + /** \file exec.c Helper functions for spawning new processes. */ #include @@ -11,6 +17,7 @@ #include "gcc-compat.h" +#include "log.h" #include "error.h" #include "string.h" @@ -41,7 +48,7 @@ int dss_exec(pid_t *pid, const char *file, char *const *const args, int *fds) goto err_out; if (!fds[0] || !fds[1] || !fds[2]) { ret = -E_NULL_OPEN; - null = open("/dev/null", O_RDONLY); + null = open("/dev/null", O_RDWR); if (null < 0) goto err_out; } @@ -96,7 +103,7 @@ int dss_exec(pid_t *pid, const char *file, char *const *const args, int *fds) close(null); return 1; err_out: - make_err_msg("failed to exec %s", file); + DSS_ERROR_LOG("failed to exec %s\n", file); if (err[0] >= 0) close(err[0]); if (err[1] >= 0) @@ -113,3 +120,42 @@ err_out: close(null); return ret; } + + +/** + * 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 fds A pointer to a value-result array. + * + * This function uses fork/exec to create a new process. \a fds must be a + * pointer to three integers, corresponding to stdin, stdout and stderr + * respectively. It specifies how to deal with fd 0, 1, 2 in the child. The + * contents of \a fds are interpreted as follows: + * + * - fd[i] < 0: leave fd \a i alone. + * - fd[i] = 0: dup fd \a i to \p /dev/null. + * - 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. + * + * \return Standard. + */ +int dss_exec_cmdline_pid(pid_t *pid, const char *cmdline, int *fds) +{ + int argc, ret; + char **argv; + char *tmp = dss_strdup(cmdline); + + if (!tmp) + exit(EXIT_FAILURE); + argc = split_args(tmp, &argv, " \t"); + ret = dss_exec(pid, argv[0], argv, fds); + free(argv); + free(tmp); + return ret; +} + +