]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/cwfs/console.c
kernel: keep segment locked for data2txt
[plan9front.git] / sys / src / cmd / cwfs / console.c
1 #include        "all.h"
2 #include        "9p1.h"
3
4 void
5 fcall9p1(Chan *cp, Fcall *in, Fcall *ou)
6 {
7         int t;
8
9         rlock(&mainlock);
10         t = in->type;
11         if(t < 0 || t >= MAXSYSCALL || (t&1) || !call9p1[t]) {
12                 print("bad message type %d\n", t);
13                 panic("");
14         }
15         ou->type = t+1;
16         ou->err = 0;
17
18         rlock(&cp->reflock);
19         (*call9p1[t])(cp, in, ou);
20         runlock(&cp->reflock);
21
22         if(ou->err && CHAT(cp))
23                 print("\terror: %s\n", errstr9p[ou->err]);
24         runlock(&mainlock);
25 }
26
27 int
28 con_session(void)
29 {
30         Fcall in, ou;
31
32         in.type = Tsession;
33         fcall9p1(cons.chan, &in, &ou);
34         return ou.err;
35 }
36
37 int
38 con_attach(int fid, char *uid, char *arg)
39 {
40         Fcall in, ou;
41
42         in.type = Tattach;
43         in.fid = fid;
44         strncpy(in.uname, uid, NAMELEN);
45         strncpy(in.aname, arg, NAMELEN);
46         fcall9p1(cons.chan, &in, &ou);
47         return ou.err;
48 }
49
50 int
51 con_clone(int fid1, int fid2)
52 {
53         Fcall in, ou;
54
55         in.type = Tclone;
56         in.fid = fid1;
57         in.newfid = fid2;
58         fcall9p1(cons.chan, &in, &ou);
59         return ou.err;
60 }
61
62 int
63 con_walk(int fid, char *name)
64 {
65         Fcall in, ou;
66
67         in.type = Twalk;
68         in.fid = fid;
69         strncpy(in.name, name, NAMELEN);
70         fcall9p1(cons.chan, &in, &ou);
71         return ou.err;
72 }
73
74 int
75 con_open(int fid, int mode)
76 {
77         Fcall in, ou;
78
79         in.type = Topen;
80         in.fid = fid;
81         in.mode = mode;
82         fcall9p1(cons.chan, &in, &ou);
83         return ou.err;
84 }
85
86 int
87 con_read(int fid, char *data, Off offset, int count)
88 {
89         Fcall in, ou;
90
91         in.type = Tread;
92         in.fid = fid;
93         in.offset = offset;
94         in.count = count;
95         ou.data = data;
96         fcall9p1(cons.chan, &in, &ou);
97         if(ou.err)
98                 return 0;
99         return ou.count;
100 }
101
102 int
103 con_write(int fid, char *data, Off offset, int count)
104 {
105         Fcall in, ou;
106
107         in.type = Twrite;
108         in.fid = fid;
109         in.data = data;
110         in.offset = offset;
111         in.count = count;
112         fcall9p1(cons.chan, &in, &ou);
113         if(ou.err)
114                 return 0;
115         return ou.count;
116 }
117
118 int
119 con_remove(int fid)
120 {
121         Fcall in, ou;
122
123         in.type = Tremove;
124         in.fid = fid;
125         fcall9p1(cons.chan, &in, &ou);
126         return ou.err;
127 }
128
129 int
130 con_create(int fid, char *name, int uid, int gid, long perm, int mode)
131 {
132         Fcall in, ou;
133
134         in.type = Tcreate;
135         in.fid = fid;
136         strncpy(in.name, name, NAMELEN);
137         in.perm = perm;
138         in.mode = mode;
139         cons.uid = uid;                 /* beyond ugly */
140         cons.gid = gid;
141         fcall9p1(cons.chan, &in, &ou);
142         return ou.err;
143 }
144
145 int
146 doclri(File *f)
147 {
148         Iobuf *p, *p1;
149         Dentry *d, *d1;
150         int err;
151
152         err = 0;
153         p = 0;
154         p1 = 0;
155         if(f->fs->dev->type == Devro) {
156                 err = Eronly;
157                 goto out;
158         }
159         /*
160          * check on parent directory of file to be deleted
161          */
162         if(f->wpath == 0 || f->wpath->addr == f->addr) {
163                 err = Ephase;
164                 goto out;
165         }
166         p1 = getbuf(f->fs->dev, f->wpath->addr, Brd);
167         d1 = getdir(p1, f->wpath->slot);
168         if(!d1 || checktag(p1, Tdir, QPNONE) || !(d1->mode & DALLOC)) {
169                 err = Ephase;
170                 goto out;
171         }
172
173         accessdir(p1, d1, FWRITE, 0);
174         putbuf(p1);
175         p1 = 0;
176
177         /*
178          * check on file to be deleted
179          */
180         p = getbuf(f->fs->dev, f->addr, Brd);
181         d = getdir(p, f->slot);
182
183         /*
184          * do it
185          */
186         memset(d, 0, sizeof(Dentry));
187         settag(p, Tdir, QPNONE);
188         freewp(f->wpath);
189         freefp(f);
190
191 out:
192         if(p1)
193                 putbuf(p1);
194         if(p)
195                 putbuf(p);
196         return err;
197 }
198
199 void
200 f_fstat(Chan *cp, Fcall *in, Fcall *ou)
201 {
202         File *f;
203         Iobuf *p;
204         Dentry *d;
205         int i;
206
207         if(CHAT(cp)) {
208                 print("c_fstat %d\n", cp->chan);
209                 print("\tfid = %d\n", in->fid);
210         }
211
212         p = 0;
213         f = filep(cp, in->fid, 0);
214         if(!f) {
215                 ou->err = Efid;
216                 goto out;
217         }
218         p = getbuf(f->fs->dev, f->addr, Brd);
219         d = getdir(p, f->slot);
220         if(d == 0)
221                 goto out;
222
223         print("name = %.*s\n", NAMELEN, d->name);
224         print("uid = %d; gid = %d; muid = %d\n", d->uid, d->gid, d->muid);
225         print("size = %lld; qid = %llux/%lux\n", (Wideoff)d->size,
226                 (Wideoff)d->qid.path, d->qid.version);
227         print("atime = %ld; mtime = %ld\n", d->atime, d->mtime);
228         print("dblock =");
229         for(i=0; i<NDBLOCK; i++)
230                 print(" %lld", (Wideoff)d->dblock[i]);
231         for (i = 0; i < NIBLOCK; i++)
232                 print("; iblocks[%d] = %lld", i, (Wideoff)d->iblocks[i]);
233         print("\n\n");
234
235 out:
236         if(p)
237                 putbuf(p);
238         ou->fid = in->fid;
239         if(f)
240                 qunlock(f);
241 }
242
243 void
244 f_clri(Chan *cp, Fcall *in, Fcall *ou)
245 {
246         File *f;
247
248         if(CHAT(cp)) {
249                 print("c_clri %d\n", cp->chan);
250                 print("\tfid = %d\n", in->fid);
251         }
252
253         f = filep(cp, in->fid, 0);
254         if(!f) {
255                 ou->err = Efid;
256                 goto out;
257         }
258         ou->err = doclri(f);
259
260 out:
261         ou->fid = in->fid;
262         if(f)
263                 qunlock(f);
264 }
265
266 int
267 con_clri(int fid)
268 {
269         Fcall in, ou;
270         Chan *cp;
271
272         in.type = Tremove;
273         in.fid = fid;
274         cp = cons.chan;
275
276         rlock(&mainlock);
277         ou.type = Tremove+1;
278         ou.err = 0;
279
280         rlock(&cp->reflock);
281         f_clri(cp, &in, &ou);
282         runlock(&cp->reflock);
283
284         runlock(&mainlock);
285         return ou.err;
286 }
287
288 int
289 con_fstat(int fid)
290 {
291         Fcall in, ou;
292         Chan *cp;
293
294         in.type = Tstat;
295         in.fid = fid;
296         cp = cons.chan;
297
298         rlock(&mainlock);
299         ou.type = Tstat+1;
300         ou.err = 0;
301
302         rlock(&cp->reflock);
303         f_fstat(cp, &in, &ou);
304         runlock(&cp->reflock);
305
306         runlock(&mainlock);
307         return ou.err;
308 }