xref: /plan9/sys/src/cmd/aux/stub.c (revision 0eaa34de0a46536251d3ec568681dc67b0f0e144)
13ff48bf5SDavid du Colombier #include <u.h>
23ff48bf5SDavid du Colombier #include <libc.h>
33ff48bf5SDavid du Colombier #include <fcall.h>
43ff48bf5SDavid du Colombier #include <thread.h>
53ff48bf5SDavid du Colombier #include <9p.h>
63ff48bf5SDavid du Colombier 
73ff48bf5SDavid du Colombier uint time0;
83ff48bf5SDavid du Colombier 
93ff48bf5SDavid du Colombier enum
103ff48bf5SDavid du Colombier {
113ff48bf5SDavid du Colombier 	Qroot = 0,
123ff48bf5SDavid du Colombier 	Qkid,
133ff48bf5SDavid du Colombier };
143ff48bf5SDavid du Colombier 
153ff48bf5SDavid du Colombier char *kidname;
163ff48bf5SDavid du Colombier uint kidmode;
173ff48bf5SDavid du Colombier 
183ff48bf5SDavid du Colombier void
fsattach(Req * r)193ff48bf5SDavid du Colombier fsattach(Req *r)
203ff48bf5SDavid du Colombier {
213ff48bf5SDavid du Colombier 	char *spec;
223ff48bf5SDavid du Colombier 
233ff48bf5SDavid du Colombier 	spec = r->ifcall.aname;
243ff48bf5SDavid du Colombier 	if(spec && spec[0]){
253ff48bf5SDavid du Colombier 		respond(r, "invalid attach specifier");
263ff48bf5SDavid du Colombier 		return;
273ff48bf5SDavid du Colombier 	}
283ff48bf5SDavid du Colombier 	r->ofcall.qid = (Qid){Qroot, 0, QTDIR};
293ff48bf5SDavid du Colombier 	r->fid->qid = r->ofcall.qid;
303ff48bf5SDavid du Colombier 	respond(r, nil);
313ff48bf5SDavid du Colombier }
323ff48bf5SDavid du Colombier 
333ff48bf5SDavid du Colombier char*
fswalk1(Fid * fid,char * name,Qid * qid)343ff48bf5SDavid du Colombier fswalk1(Fid *fid, char *name, Qid *qid)
353ff48bf5SDavid du Colombier {
363ff48bf5SDavid du Colombier 	switch((int)fid->qid.path){
373ff48bf5SDavid du Colombier 	default:
383ff48bf5SDavid du Colombier 		return "path not found";
393ff48bf5SDavid du Colombier 	case Qroot:
403ff48bf5SDavid du Colombier 		if(strcmp(name, "..") == 0)
413ff48bf5SDavid du Colombier 			break;
423ff48bf5SDavid du Colombier 		if(strcmp(name, kidname) == 0){
433ff48bf5SDavid du Colombier 			fid->qid = (Qid){Qkid, 0, kidmode>>24};
443ff48bf5SDavid du Colombier 			break;
453ff48bf5SDavid du Colombier 		}
463ff48bf5SDavid du Colombier 		return "path not found";
473ff48bf5SDavid du Colombier 	case Qkid:
483ff48bf5SDavid du Colombier 		if(strcmp(name, "..") == 0){
493ff48bf5SDavid du Colombier 			fid->qid = (Qid){Qroot, 0, QTDIR};
503ff48bf5SDavid du Colombier 			break;
513ff48bf5SDavid du Colombier 		}
523ff48bf5SDavid du Colombier 		return "path not found";
533ff48bf5SDavid du Colombier 	}
543ff48bf5SDavid du Colombier 	*qid = fid->qid;
553ff48bf5SDavid du Colombier 	return nil;
563ff48bf5SDavid du Colombier }
573ff48bf5SDavid du Colombier 
583ff48bf5SDavid du Colombier void
fsstat(Req * r)593ff48bf5SDavid du Colombier fsstat(Req *r)
603ff48bf5SDavid du Colombier {
613ff48bf5SDavid du Colombier 	int q;
623ff48bf5SDavid du Colombier 	Dir *d;
633ff48bf5SDavid du Colombier 
643ff48bf5SDavid du Colombier 	d = &r->d;
653ff48bf5SDavid du Colombier 	memset(d, 0, sizeof *d);
663ff48bf5SDavid du Colombier 	q = r->fid->qid.path;
673ff48bf5SDavid du Colombier 	d->qid = r->fid->qid;
683ff48bf5SDavid du Colombier 	switch(q){
693ff48bf5SDavid du Colombier 	case Qroot:
703ff48bf5SDavid du Colombier 		d->name = estrdup9p("/");
713ff48bf5SDavid du Colombier 		d->mode = DMDIR|0777;
723ff48bf5SDavid du Colombier 		break;
733ff48bf5SDavid du Colombier 
743ff48bf5SDavid du Colombier 	case Qkid:
753ff48bf5SDavid du Colombier 		d->name = estrdup9p(kidname);
763ff48bf5SDavid du Colombier 		d->mode = kidmode;
773ff48bf5SDavid du Colombier 		break;
783ff48bf5SDavid du Colombier 	}
793ff48bf5SDavid du Colombier 
803ff48bf5SDavid du Colombier 	d->atime = d->mtime = time0;
813ff48bf5SDavid du Colombier 	d->uid = estrdup9p("stub");
823ff48bf5SDavid du Colombier 	d->gid = estrdup9p("stub");
833ff48bf5SDavid du Colombier 	d->muid = estrdup9p("");
843ff48bf5SDavid du Colombier 	respond(r, nil);
853ff48bf5SDavid du Colombier }
863ff48bf5SDavid du Colombier 
873ff48bf5SDavid du Colombier int
dirgen(int off,Dir * d,void *)883ff48bf5SDavid du Colombier dirgen(int off, Dir *d, void*)
893ff48bf5SDavid du Colombier {
903ff48bf5SDavid du Colombier 	if(off != 0)
913ff48bf5SDavid du Colombier 		return -1;
923ff48bf5SDavid du Colombier 
933ff48bf5SDavid du Colombier 	memset(d, 0, sizeof *d);
943ff48bf5SDavid du Colombier 	d->atime = d->mtime = time0;
953ff48bf5SDavid du Colombier 	d->name = estrdup9p(kidname);
963ff48bf5SDavid du Colombier 	d->mode = kidmode;
973ff48bf5SDavid du Colombier 	d->qid = (Qid){Qkid, 0, kidmode>>24};
983ff48bf5SDavid du Colombier 	d->qid.type = d->mode>>24;
993ff48bf5SDavid du Colombier 	d->uid = estrdup9p("stub");
1003ff48bf5SDavid du Colombier 	d->gid = estrdup9p("stub");
1013ff48bf5SDavid du Colombier 	d->muid = estrdup9p("");
1023ff48bf5SDavid du Colombier 	return 0;
1033ff48bf5SDavid du Colombier }
1043ff48bf5SDavid du Colombier 
1053ff48bf5SDavid du Colombier void
fsread(Req * r)1063ff48bf5SDavid du Colombier fsread(Req *r)
1073ff48bf5SDavid du Colombier {
1083ff48bf5SDavid du Colombier 	int q;
1093ff48bf5SDavid du Colombier 
1103ff48bf5SDavid du Colombier 	q = r->fid->qid.path;
1113ff48bf5SDavid du Colombier 	switch(q){
1123ff48bf5SDavid du Colombier 	default:
1133ff48bf5SDavid du Colombier 		respond(r, "bug");
1143ff48bf5SDavid du Colombier 		return;
1153ff48bf5SDavid du Colombier 
1163ff48bf5SDavid du Colombier 	case Qroot:
1173ff48bf5SDavid du Colombier 		dirread9p(r, dirgen, nil);
1183ff48bf5SDavid du Colombier 		respond(r, nil);
1193ff48bf5SDavid du Colombier 		return;
1203ff48bf5SDavid du Colombier 	}
1213ff48bf5SDavid du Colombier }
1223ff48bf5SDavid du Colombier 
1233ff48bf5SDavid du Colombier void
fswrite(Req * r)1243ff48bf5SDavid du Colombier fswrite(Req *r)
1253ff48bf5SDavid du Colombier {
1263ff48bf5SDavid du Colombier 	respond(r, "no writing");
1273ff48bf5SDavid du Colombier }
1283ff48bf5SDavid du Colombier 
1293ff48bf5SDavid du Colombier void
fsopen(Req * r)1303ff48bf5SDavid du Colombier fsopen(Req *r)
1313ff48bf5SDavid du Colombier {
1323ff48bf5SDavid du Colombier 	if(r->fid->qid.path != Qroot){
1333ff48bf5SDavid du Colombier 		respond(r, "permission denied");
1343ff48bf5SDavid du Colombier 		return;
1353ff48bf5SDavid du Colombier 	}
1363ff48bf5SDavid du Colombier 
1373ff48bf5SDavid du Colombier 	if(r->ifcall.mode != OREAD)
1383ff48bf5SDavid du Colombier 		respond(r, "permission denied");
1393ff48bf5SDavid du Colombier 	else
1403ff48bf5SDavid du Colombier 		respond(r, nil);
1413ff48bf5SDavid du Colombier }
1423ff48bf5SDavid du Colombier 
1433ff48bf5SDavid du Colombier Srv fs = {
1443ff48bf5SDavid du Colombier 	.attach=	fsattach,
1453ff48bf5SDavid du Colombier 	.open=	fsopen,
1463ff48bf5SDavid du Colombier 	.read=	fsread,
1473ff48bf5SDavid du Colombier 	.write=	fswrite,
1483ff48bf5SDavid du Colombier 	.stat=	fsstat,
1493ff48bf5SDavid du Colombier 	.walk1=	fswalk1,
1503ff48bf5SDavid du Colombier };
1513ff48bf5SDavid du Colombier 
1523ff48bf5SDavid du Colombier void
usage(void)1533ff48bf5SDavid du Colombier usage(void)
1543ff48bf5SDavid du Colombier {
15594c27eb3SDavid du Colombier 	fprint(2, "usage: aux/stub [-Dd] path/name\n");
1563ff48bf5SDavid du Colombier 	exits("usage");
1573ff48bf5SDavid du Colombier }
1583ff48bf5SDavid du Colombier 
1593ff48bf5SDavid du Colombier void
main(int argc,char ** argv)1603ff48bf5SDavid du Colombier main(int argc, char **argv)
1613ff48bf5SDavid du Colombier {
1623ff48bf5SDavid du Colombier 	char *p, *mtpt;
1633ff48bf5SDavid du Colombier 
1643ff48bf5SDavid du Colombier 	quotefmtinstall();
1653ff48bf5SDavid du Colombier 
1663ff48bf5SDavid du Colombier 	time0 = time(0);
1673ff48bf5SDavid du Colombier 	ARGBEGIN{
1683ff48bf5SDavid du Colombier 	case 'D':
1693ff48bf5SDavid du Colombier 		chatty9p++;
1703ff48bf5SDavid du Colombier 		break;
1713ff48bf5SDavid du Colombier 	case 'd':
1723ff48bf5SDavid du Colombier 		kidmode = DMDIR;
1733ff48bf5SDavid du Colombier 		break;
1743ff48bf5SDavid du Colombier 	default:
1753ff48bf5SDavid du Colombier 		usage();
1763ff48bf5SDavid du Colombier 	}ARGEND
1773ff48bf5SDavid du Colombier 
1783ff48bf5SDavid du Colombier 	if(argc != 1)
1793ff48bf5SDavid du Colombier 		usage();
1803ff48bf5SDavid du Colombier 
1813ff48bf5SDavid du Colombier 	if((p = strrchr(argv[0], '/')) == 0){
1823ff48bf5SDavid du Colombier 		mtpt = ".";
1833ff48bf5SDavid du Colombier 		kidname = argv[0];
18494c27eb3SDavid du Colombier 	}else if(p == argv[0]){
18594c27eb3SDavid du Colombier 		mtpt = "/";
18694c27eb3SDavid du Colombier 		kidname = argv[0]+1;
1873ff48bf5SDavid du Colombier 	}else{
1883ff48bf5SDavid du Colombier 		mtpt = argv[0];
1893ff48bf5SDavid du Colombier 		*p++ = '\0';
1903ff48bf5SDavid du Colombier 		kidname = p;
1913ff48bf5SDavid du Colombier 	}
192*0eaa34deSDavid du Colombier 	/* don't leave standard descriptors open to confuse mk */
193*0eaa34deSDavid du Colombier 	close(0);
194*0eaa34deSDavid du Colombier 	close(1);
195*0eaa34deSDavid du Colombier 	close(2);
1963ff48bf5SDavid du Colombier 	postmountsrv(&fs, nil, mtpt, MBEFORE);
19794c27eb3SDavid du Colombier 	exits(nil);
1983ff48bf5SDavid du Colombier }
199