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