Blame


1 76193d7c 2003-09-30 devnull #include "sam.h"
2 76193d7c 2003-09-30 devnull #include "parse.h"
3 76193d7c 2003-09-30 devnull
4 76193d7c 2003-09-30 devnull extern jmp_buf mainloop;
5 76193d7c 2003-09-30 devnull
6 76193d7c 2003-09-30 devnull char errfile[64];
7 76193d7c 2003-09-30 devnull String plan9cmd; /* null terminated */
8 76193d7c 2003-09-30 devnull Buffer plan9buf;
9 76193d7c 2003-09-30 devnull void checkerrs(void);
10 76193d7c 2003-09-30 devnull
11 c7c29d26 2006-08-24 devnull void
12 c7c29d26 2006-08-24 devnull setname(File *f)
13 c7c29d26 2006-08-24 devnull {
14 c7c29d26 2006-08-24 devnull char buf[1024];
15 21c4c727 2006-08-29 devnull if(f)
16 21c4c727 2006-08-29 devnull snprint(buf, sizeof buf, "%.*S", f->name.n, f->name.s);
17 21c4c727 2006-08-29 devnull else
18 21c4c727 2006-08-29 devnull buf[0] = 0;
19 c7c29d26 2006-08-24 devnull putenv("samfile", buf);
20 c7c29d26 2006-08-24 devnull }
21 c7c29d26 2006-08-24 devnull
22 76193d7c 2003-09-30 devnull int
23 76193d7c 2003-09-30 devnull plan9(File *f, int type, String *s, int nest)
24 76193d7c 2003-09-30 devnull {
25 76193d7c 2003-09-30 devnull long l;
26 76193d7c 2003-09-30 devnull int m;
27 f7b74c17 2004-12-28 devnull int volatile pid;
28 f7b74c17 2004-12-28 devnull int fd;
29 76193d7c 2003-09-30 devnull int retcode;
30 76193d7c 2003-09-30 devnull int pipe1[2], pipe2[2];
31 76193d7c 2003-09-30 devnull
32 76193d7c 2003-09-30 devnull if(s->s[0]==0 && plan9cmd.s[0]==0)
33 76193d7c 2003-09-30 devnull error(Enocmd);
34 76193d7c 2003-09-30 devnull else if(s->s[0])
35 76193d7c 2003-09-30 devnull Strduplstr(&plan9cmd, s);
36 76193d7c 2003-09-30 devnull if(downloaded){
37 76193d7c 2003-09-30 devnull samerr(errfile);
38 76193d7c 2003-09-30 devnull remove(errfile);
39 76193d7c 2003-09-30 devnull }
40 76193d7c 2003-09-30 devnull if(type!='!' && pipe(pipe1)==-1)
41 76193d7c 2003-09-30 devnull error(Epipe);
42 76193d7c 2003-09-30 devnull if(type=='|')
43 76193d7c 2003-09-30 devnull snarf(f, addr.r.p1, addr.r.p2, &plan9buf, 1);
44 76193d7c 2003-09-30 devnull if((pid=fork()) == 0){
45 c7c29d26 2006-08-24 devnull setname(f);
46 76193d7c 2003-09-30 devnull if(downloaded){ /* also put nasty fd's into errfile */
47 76193d7c 2003-09-30 devnull fd = create(errfile, 1, 0666L);
48 76193d7c 2003-09-30 devnull if(fd < 0)
49 76193d7c 2003-09-30 devnull fd = create("/dev/null", 1, 0666L);
50 76193d7c 2003-09-30 devnull dup(fd, 2);
51 76193d7c 2003-09-30 devnull close(fd);
52 76193d7c 2003-09-30 devnull /* 2 now points at err file */
53 76193d7c 2003-09-30 devnull if(type == '>')
54 76193d7c 2003-09-30 devnull dup(2, 1);
55 76193d7c 2003-09-30 devnull else if(type=='!'){
56 76193d7c 2003-09-30 devnull dup(2, 1);
57 76193d7c 2003-09-30 devnull fd = open("/dev/null", 0);
58 76193d7c 2003-09-30 devnull dup(fd, 0);
59 76193d7c 2003-09-30 devnull close(fd);
60 76193d7c 2003-09-30 devnull }
61 76193d7c 2003-09-30 devnull }
62 76193d7c 2003-09-30 devnull if(type != '!') {
63 76193d7c 2003-09-30 devnull if(type=='<' || type=='|')
64 76193d7c 2003-09-30 devnull dup(pipe1[1], 1);
65 76193d7c 2003-09-30 devnull else if(type == '>')
66 76193d7c 2003-09-30 devnull dup(pipe1[0], 0);
67 76193d7c 2003-09-30 devnull close(pipe1[0]);
68 76193d7c 2003-09-30 devnull close(pipe1[1]);
69 76193d7c 2003-09-30 devnull }
70 76193d7c 2003-09-30 devnull if(type == '|'){
71 76193d7c 2003-09-30 devnull if(pipe(pipe2) == -1)
72 76193d7c 2003-09-30 devnull exits("pipe");
73 76193d7c 2003-09-30 devnull if((pid = fork())==0){
74 76193d7c 2003-09-30 devnull /*
75 76193d7c 2003-09-30 devnull * It's ok if we get SIGPIPE here
76 76193d7c 2003-09-30 devnull */
77 76193d7c 2003-09-30 devnull close(pipe2[0]);
78 76193d7c 2003-09-30 devnull io = pipe2[1];
79 76193d7c 2003-09-30 devnull if(retcode=!setjmp(mainloop)){ /* assignment = */
80 76193d7c 2003-09-30 devnull char *c;
81 76193d7c 2003-09-30 devnull for(l = 0; l<plan9buf.nc; l+=m){
82 76193d7c 2003-09-30 devnull m = plan9buf.nc-l;
83 76193d7c 2003-09-30 devnull if(m>BLOCKSIZE-1)
84 76193d7c 2003-09-30 devnull m = BLOCKSIZE-1;
85 76193d7c 2003-09-30 devnull bufread(&plan9buf, l, genbuf, m);
86 76193d7c 2003-09-30 devnull genbuf[m] = 0;
87 76193d7c 2003-09-30 devnull c = Strtoc(tmprstr(genbuf, m+1));
88 76193d7c 2003-09-30 devnull Write(pipe2[1], c, strlen(c));
89 76193d7c 2003-09-30 devnull free(c);
90 76193d7c 2003-09-30 devnull }
91 76193d7c 2003-09-30 devnull }
92 76193d7c 2003-09-30 devnull exits(retcode? "error" : 0);
93 76193d7c 2003-09-30 devnull }
94 76193d7c 2003-09-30 devnull if(pid==-1){
95 76193d7c 2003-09-30 devnull fprint(2, "Can't fork?!\n");
96 76193d7c 2003-09-30 devnull exits("fork");
97 76193d7c 2003-09-30 devnull }
98 76193d7c 2003-09-30 devnull dup(pipe2[0], 0);
99 76193d7c 2003-09-30 devnull close(pipe2[0]);
100 76193d7c 2003-09-30 devnull close(pipe2[1]);
101 76193d7c 2003-09-30 devnull }
102 76193d7c 2003-09-30 devnull if(type=='<'){
103 76193d7c 2003-09-30 devnull close(0); /* so it won't read from terminal */
104 76193d7c 2003-09-30 devnull open("/dev/null", 0);
105 76193d7c 2003-09-30 devnull }
106 76193d7c 2003-09-30 devnull execl(SHPATH, SH, "-c", Strtoc(&plan9cmd), (char *)0);
107 76193d7c 2003-09-30 devnull exits("exec");
108 76193d7c 2003-09-30 devnull }
109 76193d7c 2003-09-30 devnull if(pid == -1)
110 76193d7c 2003-09-30 devnull error(Efork);
111 76193d7c 2003-09-30 devnull if(type=='<' || type=='|'){
112 76193d7c 2003-09-30 devnull int nulls;
113 76193d7c 2003-09-30 devnull if(downloaded && addr.r.p1 != addr.r.p2)
114 76193d7c 2003-09-30 devnull outTl(Hsnarflen, addr.r.p2-addr.r.p1);
115 76193d7c 2003-09-30 devnull snarf(f, addr.r.p1, addr.r.p2, &snarfbuf, 0);
116 76193d7c 2003-09-30 devnull logdelete(f, addr.r.p1, addr.r.p2);
117 76193d7c 2003-09-30 devnull close(pipe1[1]);
118 76193d7c 2003-09-30 devnull io = pipe1[0];
119 76193d7c 2003-09-30 devnull f->tdot.p1 = -1;
120 76193d7c 2003-09-30 devnull f->ndot.r.p2 = addr.r.p2+readio(f, &nulls, 0, FALSE);
121 76193d7c 2003-09-30 devnull f->ndot.r.p1 = addr.r.p2;
122 76193d7c 2003-09-30 devnull closeio((Posn)-1);
123 76193d7c 2003-09-30 devnull }else if(type=='>'){
124 76193d7c 2003-09-30 devnull close(pipe1[0]);
125 76193d7c 2003-09-30 devnull io = pipe1[1];
126 76193d7c 2003-09-30 devnull bpipeok = 1;
127 76193d7c 2003-09-30 devnull writeio(f);
128 76193d7c 2003-09-30 devnull bpipeok = 0;
129 76193d7c 2003-09-30 devnull closeio((Posn)-1);
130 76193d7c 2003-09-30 devnull }
131 76193d7c 2003-09-30 devnull retcode = waitfor(pid);
132 76193d7c 2003-09-30 devnull if(type=='|' || type=='<')
133 76193d7c 2003-09-30 devnull if(retcode!=0)
134 76193d7c 2003-09-30 devnull warn(Wbadstatus);
135 76193d7c 2003-09-30 devnull if(downloaded)
136 76193d7c 2003-09-30 devnull checkerrs();
137 76193d7c 2003-09-30 devnull if(!nest)
138 76193d7c 2003-09-30 devnull dprint("!\n");
139 76193d7c 2003-09-30 devnull return retcode;
140 76193d7c 2003-09-30 devnull }
141 76193d7c 2003-09-30 devnull
142 76193d7c 2003-09-30 devnull void
143 76193d7c 2003-09-30 devnull checkerrs(void)
144 76193d7c 2003-09-30 devnull {
145 76193d7c 2003-09-30 devnull char buf[256];
146 76193d7c 2003-09-30 devnull int f, n, nl;
147 76193d7c 2003-09-30 devnull char *p;
148 76193d7c 2003-09-30 devnull long l;
149 76193d7c 2003-09-30 devnull
150 76193d7c 2003-09-30 devnull if(statfile(errfile, 0, 0, 0, &l, 0) > 0 && l != 0){
151 76193d7c 2003-09-30 devnull if((f=open((char *)errfile, 0)) != -1){
152 76193d7c 2003-09-30 devnull if((n=read(f, buf, sizeof buf-1)) > 0){
153 76193d7c 2003-09-30 devnull for(nl=0,p=buf; nl<3 && p<&buf[n]; p++)
154 76193d7c 2003-09-30 devnull if(*p=='\n')
155 76193d7c 2003-09-30 devnull nl++;
156 76193d7c 2003-09-30 devnull *p = 0;
157 76193d7c 2003-09-30 devnull dprint("%s", buf);
158 76193d7c 2003-09-30 devnull if(p-buf < l-1)
159 76193d7c 2003-09-30 devnull dprint("(sam: more in %s)\n", errfile);
160 76193d7c 2003-09-30 devnull }
161 76193d7c 2003-09-30 devnull close(f);
162 76193d7c 2003-09-30 devnull }
163 76193d7c 2003-09-30 devnull }else
164 76193d7c 2003-09-30 devnull remove((char *)errfile);
165 76193d7c 2003-09-30 devnull }