Blame


1 76193d7c 2003-09-30 devnull #include "sam.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull #define NSYSFILE 3
4 76193d7c 2003-09-30 devnull #define NOFILE 128
5 76193d7c 2003-09-30 devnull
6 76193d7c 2003-09-30 devnull void
7 76193d7c 2003-09-30 devnull checkqid(File *f)
8 76193d7c 2003-09-30 devnull {
9 76193d7c 2003-09-30 devnull int i, w;
10 76193d7c 2003-09-30 devnull File *g;
11 76193d7c 2003-09-30 devnull
12 76193d7c 2003-09-30 devnull w = whichmenu(f);
13 76193d7c 2003-09-30 devnull for(i=1; i<file.nused; i++){
14 76193d7c 2003-09-30 devnull g = file.filepptr[i];
15 76193d7c 2003-09-30 devnull if(w == i)
16 76193d7c 2003-09-30 devnull continue;
17 76193d7c 2003-09-30 devnull if(f->dev==g->dev && f->qidpath==g->qidpath)
18 76193d7c 2003-09-30 devnull warn_SS(Wdupfile, &f->name, &g->name);
19 76193d7c 2003-09-30 devnull }
20 76193d7c 2003-09-30 devnull }
21 76193d7c 2003-09-30 devnull
22 76193d7c 2003-09-30 devnull void
23 76193d7c 2003-09-30 devnull writef(File *f)
24 76193d7c 2003-09-30 devnull {
25 76193d7c 2003-09-30 devnull Posn n;
26 76193d7c 2003-09-30 devnull char *name;
27 76193d7c 2003-09-30 devnull int i, samename, newfile;
28 76193d7c 2003-09-30 devnull ulong dev;
29 76193d7c 2003-09-30 devnull uvlong qid;
30 76193d7c 2003-09-30 devnull long mtime, appendonly, length;
31 76193d7c 2003-09-30 devnull
32 76193d7c 2003-09-30 devnull newfile = 0;
33 76193d7c 2003-09-30 devnull samename = Strcmp(&genstr, &f->name) == 0;
34 76193d7c 2003-09-30 devnull name = Strtoc(&f->name);
35 76193d7c 2003-09-30 devnull i = statfile(name, &dev, &qid, &mtime, 0, 0);
36 76193d7c 2003-09-30 devnull if(i == -1)
37 76193d7c 2003-09-30 devnull newfile++;
38 76193d7c 2003-09-30 devnull else if(samename &&
39 76193d7c 2003-09-30 devnull (f->dev!=dev || f->qidpath!=qid || f->mtime<mtime)){
40 76193d7c 2003-09-30 devnull f->dev = dev;
41 76193d7c 2003-09-30 devnull f->qidpath = qid;
42 76193d7c 2003-09-30 devnull f->mtime = mtime;
43 76193d7c 2003-09-30 devnull warn_S(Wdate, &genstr);
44 76193d7c 2003-09-30 devnull return;
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull if(genc)
47 76193d7c 2003-09-30 devnull free(genc);
48 76193d7c 2003-09-30 devnull genc = Strtoc(&genstr);
49 76193d7c 2003-09-30 devnull if((io=create(genc, 1, 0666L)) < 0)
50 76193d7c 2003-09-30 devnull error_r(Ecreate, genc);
51 76193d7c 2003-09-30 devnull dprint("%s: ", genc);
52 76193d7c 2003-09-30 devnull if(statfd(io, 0, 0, 0, &length, &appendonly) > 0 && appendonly && length>0)
53 76193d7c 2003-09-30 devnull error(Eappend);
54 76193d7c 2003-09-30 devnull n = writeio(f);
55 76193d7c 2003-09-30 devnull if(f->name.s[0]==0 || samename){
56 522b0689 2003-09-30 devnull if(addr.r.p1==0 && addr.r.p2==f->b.nc)
57 76193d7c 2003-09-30 devnull f->cleanseq = f->seq;
58 76193d7c 2003-09-30 devnull state(f, f->cleanseq==f->seq? Clean : Dirty);
59 76193d7c 2003-09-30 devnull }
60 76193d7c 2003-09-30 devnull if(newfile)
61 76193d7c 2003-09-30 devnull dprint("(new file) ");
62 76193d7c 2003-09-30 devnull if(addr.r.p2>0 && filereadc(f, addr.r.p2-1)!='\n')
63 76193d7c 2003-09-30 devnull warn(Wnotnewline);
64 76193d7c 2003-09-30 devnull closeio(n);
65 76193d7c 2003-09-30 devnull if(f->name.s[0]==0 || samename){
66 d3ee9f70 2021-09-30 rsc if(statfile(genc, &dev, &qid, &mtime, 0, 0) > 0){
67 76193d7c 2003-09-30 devnull f->dev = dev;
68 76193d7c 2003-09-30 devnull f->qidpath = qid;
69 76193d7c 2003-09-30 devnull f->mtime = mtime;
70 76193d7c 2003-09-30 devnull checkqid(f);
71 76193d7c 2003-09-30 devnull }
72 76193d7c 2003-09-30 devnull }
73 76193d7c 2003-09-30 devnull }
74 76193d7c 2003-09-30 devnull
75 76193d7c 2003-09-30 devnull Posn
76 76193d7c 2003-09-30 devnull readio(File *f, int *nulls, int setdate, int toterm)
77 76193d7c 2003-09-30 devnull {
78 76193d7c 2003-09-30 devnull int n, b, w;
79 76193d7c 2003-09-30 devnull Rune *r;
80 76193d7c 2003-09-30 devnull Posn nt;
81 76193d7c 2003-09-30 devnull Posn p = addr.r.p2;
82 76193d7c 2003-09-30 devnull ulong dev;
83 76193d7c 2003-09-30 devnull uvlong qid;
84 76193d7c 2003-09-30 devnull long mtime;
85 76193d7c 2003-09-30 devnull char buf[BLOCKSIZE+1], *s;
86 76193d7c 2003-09-30 devnull
87 76193d7c 2003-09-30 devnull *nulls = FALSE;
88 76193d7c 2003-09-30 devnull b = 0;
89 76193d7c 2003-09-30 devnull if(f->unread){
90 522b0689 2003-09-30 devnull nt = bufload(&f->b, 0, io, nulls);
91 76193d7c 2003-09-30 devnull if(toterm)
92 76193d7c 2003-09-30 devnull raspload(f);
93 76193d7c 2003-09-30 devnull }else
94 76193d7c 2003-09-30 devnull for(nt = 0; (n = read(io, buf+b, BLOCKSIZE-b))>0; nt+=(r-genbuf)){
95 76193d7c 2003-09-30 devnull n += b;
96 76193d7c 2003-09-30 devnull b = 0;
97 76193d7c 2003-09-30 devnull r = genbuf;
98 76193d7c 2003-09-30 devnull s = buf;
99 76193d7c 2003-09-30 devnull while(n > 0){
100 76193d7c 2003-09-30 devnull if((*r = *(uchar*)s) < Runeself){
101 76193d7c 2003-09-30 devnull if(*r)
102 76193d7c 2003-09-30 devnull r++;
103 76193d7c 2003-09-30 devnull else
104 76193d7c 2003-09-30 devnull *nulls = TRUE;
105 76193d7c 2003-09-30 devnull --n;
106 76193d7c 2003-09-30 devnull s++;
107 76193d7c 2003-09-30 devnull continue;
108 76193d7c 2003-09-30 devnull }
109 76193d7c 2003-09-30 devnull if(fullrune(s, n)){
110 76193d7c 2003-09-30 devnull w = chartorune(r, s);
111 76193d7c 2003-09-30 devnull if(*r)
112 76193d7c 2003-09-30 devnull r++;
113 76193d7c 2003-09-30 devnull else
114 76193d7c 2003-09-30 devnull *nulls = TRUE;
115 76193d7c 2003-09-30 devnull n -= w;
116 76193d7c 2003-09-30 devnull s += w;
117 76193d7c 2003-09-30 devnull continue;
118 76193d7c 2003-09-30 devnull }
119 76193d7c 2003-09-30 devnull b = n;
120 76193d7c 2003-09-30 devnull memmove(buf, s, b);
121 76193d7c 2003-09-30 devnull break;
122 76193d7c 2003-09-30 devnull }
123 76193d7c 2003-09-30 devnull loginsert(f, p, genbuf, r-genbuf);
124 76193d7c 2003-09-30 devnull }
125 76193d7c 2003-09-30 devnull if(b)
126 76193d7c 2003-09-30 devnull *nulls = TRUE;
127 76193d7c 2003-09-30 devnull if(*nulls)
128 76193d7c 2003-09-30 devnull warn(Wnulls);
129 76193d7c 2003-09-30 devnull if(setdate){
130 76193d7c 2003-09-30 devnull if(statfd(io, &dev, &qid, &mtime, 0, 0) > 0){
131 76193d7c 2003-09-30 devnull f->dev = dev;
132 76193d7c 2003-09-30 devnull f->qidpath = qid;
133 76193d7c 2003-09-30 devnull f->mtime = mtime;
134 76193d7c 2003-09-30 devnull checkqid(f);
135 76193d7c 2003-09-30 devnull }
136 76193d7c 2003-09-30 devnull }
137 76193d7c 2003-09-30 devnull return nt;
138 76193d7c 2003-09-30 devnull }
139 76193d7c 2003-09-30 devnull
140 76193d7c 2003-09-30 devnull Posn
141 76193d7c 2003-09-30 devnull writeio(File *f)
142 76193d7c 2003-09-30 devnull {
143 76193d7c 2003-09-30 devnull int m, n;
144 76193d7c 2003-09-30 devnull Posn p = addr.r.p1;
145 76193d7c 2003-09-30 devnull char *c;
146 76193d7c 2003-09-30 devnull
147 76193d7c 2003-09-30 devnull while(p < addr.r.p2){
148 76193d7c 2003-09-30 devnull if(addr.r.p2-p>BLOCKSIZE)
149 76193d7c 2003-09-30 devnull n = BLOCKSIZE;
150 76193d7c 2003-09-30 devnull else
151 76193d7c 2003-09-30 devnull n = addr.r.p2-p;
152 522b0689 2003-09-30 devnull bufread(&f->b, p, genbuf, n);
153 76193d7c 2003-09-30 devnull c = Strtoc(tmprstr(genbuf, n));
154 76193d7c 2003-09-30 devnull m = strlen(c);
155 76193d7c 2003-09-30 devnull if(Write(io, c, m) != m){
156 76193d7c 2003-09-30 devnull free(c);
157 76193d7c 2003-09-30 devnull if(p > 0)
158 76193d7c 2003-09-30 devnull p += n;
159 76193d7c 2003-09-30 devnull break;
160 76193d7c 2003-09-30 devnull }
161 76193d7c 2003-09-30 devnull free(c);
162 76193d7c 2003-09-30 devnull p += n;
163 76193d7c 2003-09-30 devnull }
164 76193d7c 2003-09-30 devnull return p-addr.r.p1;
165 76193d7c 2003-09-30 devnull }
166 76193d7c 2003-09-30 devnull void
167 76193d7c 2003-09-30 devnull closeio(Posn p)
168 76193d7c 2003-09-30 devnull {
169 a1ead676 2019-12-19 rsc Close(io);
170 76193d7c 2003-09-30 devnull io = 0;
171 76193d7c 2003-09-30 devnull if(p >= 0)
172 76193d7c 2003-09-30 devnull dprint("#%lud\n", p);
173 76193d7c 2003-09-30 devnull }
174 76193d7c 2003-09-30 devnull
175 76193d7c 2003-09-30 devnull int remotefd0 = 0;
176 76193d7c 2003-09-30 devnull int remotefd1 = 1;
177 76193d7c 2003-09-30 devnull
178 76193d7c 2003-09-30 devnull void
179 17ab31aa 2005-01-27 devnull bootterm(char *machine, char **argv)
180 76193d7c 2003-09-30 devnull {
181 76193d7c 2003-09-30 devnull int ph2t[2], pt2h[2];
182 76193d7c 2003-09-30 devnull
183 76193d7c 2003-09-30 devnull if(machine){
184 76193d7c 2003-09-30 devnull dup(remotefd0, 0);
185 76193d7c 2003-09-30 devnull dup(remotefd1, 1);
186 76193d7c 2003-09-30 devnull close(remotefd0);
187 76193d7c 2003-09-30 devnull close(remotefd1);
188 76193d7c 2003-09-30 devnull argv[0] = "samterm";
189 e6c4346b 2003-11-23 devnull execvp(samterm, argv);
190 522b0689 2003-09-30 devnull fprint(2, "can't exec %s: %r\n", samterm);
191 76193d7c 2003-09-30 devnull _exits("damn");
192 76193d7c 2003-09-30 devnull }
193 76193d7c 2003-09-30 devnull if(pipe(ph2t)==-1 || pipe(pt2h)==-1)
194 76193d7c 2003-09-30 devnull panic("pipe");
195 76193d7c 2003-09-30 devnull switch(fork()){
196 76193d7c 2003-09-30 devnull case 0:
197 76193d7c 2003-09-30 devnull dup(ph2t[0], 0);
198 76193d7c 2003-09-30 devnull dup(pt2h[1], 1);
199 76193d7c 2003-09-30 devnull close(ph2t[0]);
200 76193d7c 2003-09-30 devnull close(ph2t[1]);
201 76193d7c 2003-09-30 devnull close(pt2h[0]);
202 76193d7c 2003-09-30 devnull close(pt2h[1]);
203 76193d7c 2003-09-30 devnull argv[0] = "samterm";
204 e6c4346b 2003-11-23 devnull execvp(samterm, argv);
205 76193d7c 2003-09-30 devnull fprint(2, "can't exec: ");
206 76193d7c 2003-09-30 devnull perror(samterm);
207 76193d7c 2003-09-30 devnull _exits("damn");
208 76193d7c 2003-09-30 devnull case -1:
209 76193d7c 2003-09-30 devnull panic("can't fork samterm");
210 76193d7c 2003-09-30 devnull }
211 76193d7c 2003-09-30 devnull dup(pt2h[0], 0);
212 76193d7c 2003-09-30 devnull dup(ph2t[1], 1);
213 76193d7c 2003-09-30 devnull close(ph2t[0]);
214 76193d7c 2003-09-30 devnull close(ph2t[1]);
215 76193d7c 2003-09-30 devnull close(pt2h[0]);
216 76193d7c 2003-09-30 devnull close(pt2h[1]);
217 76193d7c 2003-09-30 devnull }
218 76193d7c 2003-09-30 devnull
219 76193d7c 2003-09-30 devnull void
220 8538a660 2004-05-14 devnull connectto(char *machine, char **argv)
221 76193d7c 2003-09-30 devnull {
222 76193d7c 2003-09-30 devnull int p1[2], p2[2];
223 8538a660 2004-05-14 devnull char **av;
224 8538a660 2004-05-14 devnull int ac;
225 76193d7c 2003-09-30 devnull
226 cbeb0b26 2006-04-01 devnull /* count args */
227 8538a660 2004-05-14 devnull for(av = argv; *av; av++)
228 8538a660 2004-05-14 devnull ;
229 2387495b 2006-03-20 devnull av = malloc(sizeof(char*)*((av-argv) + 5));
230 8538a660 2004-05-14 devnull if(av == nil){
231 8538a660 2004-05-14 devnull dprint("out of memory\n");
232 8538a660 2004-05-14 devnull exits("fork/exec");
233 8538a660 2004-05-14 devnull }
234 8538a660 2004-05-14 devnull ac = 0;
235 8538a660 2004-05-14 devnull av[ac++] = RX;
236 8538a660 2004-05-14 devnull av[ac++] = machine;
237 8538a660 2004-05-14 devnull av[ac++] = rsamname;
238 8538a660 2004-05-14 devnull av[ac++] = "-R";
239 8538a660 2004-05-14 devnull while(*argv)
240 8538a660 2004-05-14 devnull av[ac++] = *argv++;
241 8538a660 2004-05-14 devnull av[ac] = 0;
242 76193d7c 2003-09-30 devnull if(pipe(p1)<0 || pipe(p2)<0){
243 76193d7c 2003-09-30 devnull dprint("can't pipe\n");
244 76193d7c 2003-09-30 devnull exits("pipe");
245 76193d7c 2003-09-30 devnull }
246 76193d7c 2003-09-30 devnull remotefd0 = p1[0];
247 76193d7c 2003-09-30 devnull remotefd1 = p2[1];
248 76193d7c 2003-09-30 devnull switch(fork()){
249 76193d7c 2003-09-30 devnull case 0:
250 76193d7c 2003-09-30 devnull dup(p2[0], 0);
251 76193d7c 2003-09-30 devnull dup(p1[1], 1);
252 76193d7c 2003-09-30 devnull close(p1[0]);
253 76193d7c 2003-09-30 devnull close(p1[1]);
254 76193d7c 2003-09-30 devnull close(p2[0]);
255 76193d7c 2003-09-30 devnull close(p2[1]);
256 8538a660 2004-05-14 devnull execvp(RXPATH, av);
257 76193d7c 2003-09-30 devnull dprint("can't exec %s\n", RXPATH);
258 76193d7c 2003-09-30 devnull exits("exec");
259 76193d7c 2003-09-30 devnull
260 76193d7c 2003-09-30 devnull case -1:
261 76193d7c 2003-09-30 devnull dprint("can't fork\n");
262 76193d7c 2003-09-30 devnull exits("fork");
263 76193d7c 2003-09-30 devnull }
264 8538a660 2004-05-14 devnull free(av);
265 76193d7c 2003-09-30 devnull close(p1[1]);
266 76193d7c 2003-09-30 devnull close(p2[0]);
267 76193d7c 2003-09-30 devnull }
268 76193d7c 2003-09-30 devnull
269 76193d7c 2003-09-30 devnull void
270 17ab31aa 2005-01-27 devnull startup(char *machine, int Rflag, char **argv, char **files)
271 76193d7c 2003-09-30 devnull {
272 76193d7c 2003-09-30 devnull if(machine)
273 8538a660 2004-05-14 devnull connectto(machine, files);
274 76193d7c 2003-09-30 devnull if(!Rflag)
275 17ab31aa 2005-01-27 devnull bootterm(machine, argv);
276 76193d7c 2003-09-30 devnull downloaded = 1;
277 76193d7c 2003-09-30 devnull outTs(Hversion, VERSION);
278 76193d7c 2003-09-30 devnull }