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