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