Add very old versions (for history).
[opsoft_archive.git] / silentbob / silentbob-1.4.1 / gclib / gclib_c / dfork.c
blob8ae33e7feb0042da9b29a9b186df9b02c25c770f
1 /*
2 * (c) Oleg Puchinin 2006
3 * graycardinalster@gmail.com
5 */
7 #include <gclib_c.h>
8 #define __export
10 __export int Dfork (char *exec, int *fd_in, int *fd_out, int *fd_err)
12 int ret;
13 int pipe_in[2];
14 int pipe_out[2];
15 int pipe_err[2];
17 if (fd_in)
18 pipe (pipe_in);
20 if (fd_out)
21 pipe (pipe_out);
23 if (fd_err)
24 pipe (pipe_err);
26 ret = fork ();
27 if (ret < 0) {
28 if (fd_in)
29 close_pipe (pipe_in);
31 if (fd_out)
32 close_pipe (pipe_out);
34 if (fd_err)
35 close_pipe (pipe_err);
37 return ret;
40 if (ret == 0) {
41 if (fd_in) {
42 dup2 (pipe_in[0], fileno (stdin));
43 close (pipe_in[1]);
46 if (fd_out) {
47 dup2 (pipe_out[1], fileno (stdout));
48 close (pipe_out[0]);
51 if (fd_err) {
52 dup2 (pipe_err[1], fileno (stderr));
53 close (pipe_err[0]);
56 if (exec)
57 execlp ("sh", "sh", "-c", exec, NULL);
59 return 0;
62 if (fd_in) {
63 close (pipe_in[0]);
64 *fd_in = pipe_in[1];
67 if (fd_out) {
68 close (pipe_out[1]);
69 *fd_out = pipe_out[0];
72 if (fd_err) {
73 close (pipe_err[1]);
74 *fd_err = pipe_err[0];
77 return ret;