1 /* Copyright 2003 Renzo Davoli
2 * Licensed under the GPL
15 #include <vdecommon.h>
20 fprintf(stderr,"execvp \"%s\" -",(X)); \
21 for (y=(Y); *y != NULL; y++) \
22 fprintf(stderr,"\"%s\"",*y); \
23 fprintf(stderr,"\n"); \
28 static char *progname
;
30 int splitindex(int argc
, char *argv
[], int *dirchar
)
34 for (i
=0; i
<argc
; i
++) {
35 if (*dirchar
== argv
[i
][0] && argv
[i
][1] == '=' ) {
36 (argv
[i
])++;*dirchar
=0;
38 if (argv
[i
][0] == '=') {
39 if (argv
[i
][1] == '}' || argv
[i
][1] == '{')
49 fprintf(stderr
,"Usage:\n\t%s cmd1 [arg1...] = cmd2 [arg2...]\n\n",progname
);
50 kill(getpgrp(),SIGTERM
);
54 static int alternate_stdin
;
55 static int alternate_stdout
;
56 static void alternate_fd()
59 alternate_stdin
=open("/dev/null",O_RDONLY
);
60 alternate_stdout
=open("/dev/null",O_RDONLY
);
61 close(alternate_stdin
);
62 close(alternate_stdout
);
63 snprintf(numstr
,10,"%d",alternate_stdin
);
64 setenv("ALTERNATE_STDIN",numstr
,1);
65 snprintf(numstr
,10,"%d",alternate_stdout
);
66 setenv("ALTERNATE_STDOUT",numstr
,1);
69 int recmain(int argc
, char *argv
[],int olddirchar
)
72 int newdirchar
=olddirchar
;
74 split
=splitindex(argc
,argv
,&newdirchar
);
84 if (argc
< 3 || split
== 0 || split
== argc
-1)
88 if (olddirchar
== 0) pipe(p2
);
96 close(p1
[1]); close(p2
[0]);
97 if (p1
[0] != alternate_stdin
){
98 dup2(p1
[0],alternate_stdin
);
101 if (p1
[0] != alternate_stdout
){
102 dup2(p2
[1],alternate_stdout
);
108 dup2(p1
[1],STDOUT_FILENO
);
113 dup2(p1
[0],STDIN_FILENO
);
117 fprintf(stderr
,"Error\n");
119 execvp(argv1
[0],argv1
);
121 switch (olddirchar
) {
123 close(p2
[1]); close(p1
[0]);
124 dup2(p2
[0],STDIN_FILENO
);
125 dup2(p1
[1],STDOUT_FILENO
);
126 close(p2
[0]); close(p1
[1]);
130 dup2(p1
[0],STDIN_FILENO
);
135 dup2(p1
[1],STDOUT_FILENO
);
139 fprintf(stderr
,"Error\n");
141 recmain(argc
-split
-1,argv2
,newdirchar
);
147 int main(int argc
, char *argv
[])
151 char **argv1
,**argv2
;
166 if (argv
[0] && *argv
[0] == '-') {
169 if (*argv
[0] == '-') {
171 if (strcmp(argv
[0],"daemon") == 0)
173 else if (strcmp(argv
[0],"pidfile") == 0) {
174 pidfile
= argv
[argflag
];
177 fprintf(stderr
,"unknown option --%s\n",argv
[0]);
181 while (*argv
[0] != 0) {
184 case 'd': daemonize
= 1; break;
185 case 'p': pidfile
= argv
[argflag
];
188 default: fprintf(stderr
,"unknown option -%c\n",*argv
[0]);
191 if (*argv
[0] != 0) argv
[0]++;
204 else if (setpgrp() != 0) {
205 fprintf(stderr
,"Err: cannot create pgrp\n");
211 if (pidfile
!= NULL
) {
212 FILE *f
=fopen(pidfile
, "w");
214 fprintf(f
,"-%d\n",pgrp
);
220 split
=splitindex(argc
,argv
,&dirchar
);
222 if (argc
< 3 || split
== 0 || split
>= argc
-1)
229 argv2
=argv
+(split
+1);
232 close(p1
[1]); close(p2
[0]);
233 dup2(p1
[0],STDIN_FILENO
);
234 dup2(p2
[1],STDOUT_FILENO
);
235 close(p1
[0]); close(p2
[1]);
236 execvp(argv1
[0],argv1
);
238 close(p2
[1]); close(p1
[0]);
239 dup2(p2
[0],STDIN_FILENO
);
240 dup2(p1
[1],STDOUT_FILENO
);
241 close(p1
[1]); close(p2
[0]);
242 recmain(argc
-split
-1,argv2
,dirchar
);