8 #define NULL ((void*) 0)
11 static void replacefd(int fd
, const char *filename
, int flags
, int mode
) {
13 n
= open(filename
, flags
, mode
);
23 int main(int argc
, char **argv
) {
24 int do_fork
= 1, command_start
, i
;
25 char *infile
= NULL
, *outfile
= NULL
, *errfile
= NULL
, *pidfile
= NULL
;
28 /* Parse command line */
29 for(i
= 1; i
< argc
; i
++) {
30 if(!strcmp(argv
[i
], "-e")) errfile
= argv
[++i
];
31 else if(!strcmp(argv
[i
], "-f")) do_fork
= 0;
32 else if(!strcmp(argv
[i
], "-i")) infile
= argv
[++i
];
33 else if(!strcmp(argv
[i
], "-o")) outfile
= argv
[++i
];
34 else if(!strcmp(argv
[i
], "-p")) pidfile
= argv
[++i
];
35 else if(!strcmp(argv
[i
], "--")) {
38 } else if(argv
[i
][0] == '-') {
39 fprintf(stderr
, "Invalid option: %s\n", argv
[i
]);
45 if(do_fork
&& fork()) return 0;
48 pidfh
= fopen(pidfile
, "w");
53 fprintf(pidfh
, "%d\n", getpid());
57 if(infile
) replacefd(0, infile
, O_RDONLY
, 0666);
59 if(outfile
) replacefd(1, outfile
, O_WRONLY
| O_CREAT
| O_TRUNC
, 0666);
61 if(errfile
) replacefd(2, errfile
, O_WRONLY
| O_CREAT
| O_TRUNC
, 0666);
65 execvp(argv
[command_start
], &argv
[command_start
]);
67 perror(argv
[command_start
]);