loadlwipv6 inlined
[vde.git] / vde-2 / src / dpipe.c
blob2aa40914ebaa19bb7f8db87e1ed4ef3cab5e7a8c
1 /* Copyright 2003 Renzo Davoli
2 * Licensed under the GPL
3 */
5 #include <stdio.h>
6 #include <unistd.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <sys/types.h>
10 #include <signal.h>
11 #include <fcntl.h>
13 #include <config.h>
14 #include <vde.h>
15 #include <vdecommon.h>
17 #if 0
18 #define execvp(X,Y) \
19 ({ char **y; \
20 fprintf(stderr,"execvp \"%s\" -",(X)); \
21 for (y=(Y); *y != NULL; y++) \
22 fprintf(stderr,"\"%s\"",*y); \
23 fprintf(stderr,"\n"); \
24 sleep (10); \
26 #endif
28 static char *progname;
30 int splitindex(int argc, char *argv[], int *dirchar)
32 register int i;
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] == '{')
40 *dirchar=argv[i][1];
41 break;
44 return i;
47 void usage()
49 fprintf(stderr,"Usage:\n\t%s cmd1 [arg1...] = cmd2 [arg2...]\n\n",progname);
50 kill(getpgrp(),SIGTERM);
51 exit (-1);
54 static int alternate_stdin;
55 static int alternate_stdout;
56 static void alternate_fd()
58 char numstr[10];
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)
71 int split;
72 int newdirchar=olddirchar;
74 split=splitindex(argc,argv,&newdirchar);
75 if (split >= argc) {
76 if (newdirchar != 0)
77 usage();
78 execvp(argv[0],argv);
80 else {
81 char **argv1,**argv2;
82 int p1[2],p2[2];
84 if (argc < 3 || split == 0 || split == argc-1)
85 usage();
87 pipe(p1);
88 if (olddirchar == 0) pipe(p2);
89 argv[split]=NULL;
90 argv1=argv;
91 argv2=argv+(split+1);
93 if (fork()) {
94 switch (olddirchar) {
95 case 0:
96 close(p1[1]); close(p2[0]);
97 if (p1[0] != alternate_stdin){
98 dup2(p1[0],alternate_stdin);
99 close(p1[0]);
101 if (p1[0] != alternate_stdout){
102 dup2(p2[1],alternate_stdout);
103 close(p2[1]);
105 break;
106 case '}':
107 close(p1[0]);
108 dup2(p1[1],STDOUT_FILENO);
109 close(p1[1]);
110 break;
111 case '{':
112 close(p1[1]);
113 dup2(p1[0],STDIN_FILENO);
114 close(p1[0]);
115 break;
116 default:
117 fprintf(stderr,"CHECA\n");
119 execvp(argv1[0],argv1);
120 } else {
121 switch (olddirchar) {
122 case 0:
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]);
127 break;
128 case '}':
129 close(p1[1]);
130 dup2(p1[0],STDIN_FILENO);
131 close(p1[0]);
132 break;
133 case '{':
134 close(p1[0]);
135 dup2(p1[1],STDOUT_FILENO);
136 close(p1[1]);
137 break;
138 default:
139 fprintf(stderr,"CHECA\n");
141 recmain(argc-split-1,argv2,newdirchar);
144 return 0;
147 int main(int argc, char *argv[])
150 int split;
151 char **argv1,**argv2;
152 int p1[2],p2[2];
153 int dirchar=0;
155 progname=argv[0];
156 argv++;
157 argc--;
159 alternate_fd();
160 split=splitindex(argc,argv,&dirchar);
162 if (argc < 3 || split == 0 || split >= argc-1)
163 usage();
165 pipe(p1);
166 pipe(p2);
167 argv[split]=NULL;
168 argv1=argv;
169 argv2=argv+(split+1);
171 if (fork()) {
172 close(p1[1]); close(p2[0]);
173 dup2(p1[0],STDIN_FILENO);
174 dup2(p2[1],STDOUT_FILENO);
175 close(p1[0]); close(p2[1]);
176 execvp(argv1[0],argv1);
177 } else {
178 close(p2[1]); close(p1[0]);
179 dup2(p2[0],STDIN_FILENO);
180 dup2(p1[1],STDOUT_FILENO);
181 close(p1[1]); close(p2[0]);
182 recmain(argc-split-1,argv2,dirchar);
184 return (0);