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