1*a60fa48cSCharles.Forsyth 2*a60fa48cSCharles.Forsyth #define Qroot 0 3*a60fa48cSCharles.Forsyth 4*a60fa48cSCharles.Forsyth #define MSGMAX ((((8192+128)*2)+3) & ~3) 5*a60fa48cSCharles.Forsyth 6*a60fa48cSCharles.Forsyth extern char Enomem[]; /* out of memory */ 7*a60fa48cSCharles.Forsyth extern char Eperm[]; /* permission denied */ 8*a60fa48cSCharles.Forsyth extern char Enodev[]; /* no free devices */ 9*a60fa48cSCharles.Forsyth extern char Ehungup[]; /* i/o on hungup channel */ 10*a60fa48cSCharles.Forsyth extern char Eexist[]; /* file exists */ 11*a60fa48cSCharles.Forsyth extern char Enonexist[]; /* file does not exist */ 12*a60fa48cSCharles.Forsyth extern char Ebadcmd[]; /* bad command */ 13*a60fa48cSCharles.Forsyth extern char Ebadarg[]; /* bad arguments */ 14*a60fa48cSCharles.Forsyth 15*a60fa48cSCharles.Forsyth typedef uvlong Path; 16*a60fa48cSCharles.Forsyth typedef struct Styxserver Styxserver; 17*a60fa48cSCharles.Forsyth typedef struct Styxops Styxops; 18*a60fa48cSCharles.Forsyth typedef struct Styxfile Styxfile; 19*a60fa48cSCharles.Forsyth typedef struct Client Client; 20*a60fa48cSCharles.Forsyth typedef struct Fid Fid; 21*a60fa48cSCharles.Forsyth 22*a60fa48cSCharles.Forsyth struct Styxserver 23*a60fa48cSCharles.Forsyth { 24*a60fa48cSCharles.Forsyth Styxops *ops; 25*a60fa48cSCharles.Forsyth Path qidgen; 26*a60fa48cSCharles.Forsyth int connfd; 27*a60fa48cSCharles.Forsyth int needfile; 28*a60fa48cSCharles.Forsyth Client *clients; 29*a60fa48cSCharles.Forsyth Client *curc; 30*a60fa48cSCharles.Forsyth Styxfile *root; 31*a60fa48cSCharles.Forsyth Styxfile **ftab; 32*a60fa48cSCharles.Forsyth void *priv; /* private */ 33*a60fa48cSCharles.Forsyth }; 34*a60fa48cSCharles.Forsyth 35*a60fa48cSCharles.Forsyth struct Client 36*a60fa48cSCharles.Forsyth { 37*a60fa48cSCharles.Forsyth Styxserver *server; 38*a60fa48cSCharles.Forsyth Client *next; 39*a60fa48cSCharles.Forsyth int fd; 40*a60fa48cSCharles.Forsyth char msg[MSGMAX]; 41*a60fa48cSCharles.Forsyth uint nread; /* valid bytes in msg (including nc)*/ 42*a60fa48cSCharles.Forsyth int nc; /* bytes consumed from front of msg by convM2S */ 43*a60fa48cSCharles.Forsyth char data[MSGMAX]; /* Tread/Rread data */ 44*a60fa48cSCharles.Forsyth int state; 45*a60fa48cSCharles.Forsyth Fid *fids; 46*a60fa48cSCharles.Forsyth char *uname; /* uid */ 47*a60fa48cSCharles.Forsyth char *aname; /* attach name */ 48*a60fa48cSCharles.Forsyth void *u; 49*a60fa48cSCharles.Forsyth }; 50*a60fa48cSCharles.Forsyth 51*a60fa48cSCharles.Forsyth struct Styxops 52*a60fa48cSCharles.Forsyth { 53*a60fa48cSCharles.Forsyth char *(*newclient)(Client *c); 54*a60fa48cSCharles.Forsyth char *(*freeclient)(Client *c); 55*a60fa48cSCharles.Forsyth 56*a60fa48cSCharles.Forsyth char *(*attach)(char *uname, char *aname); 57*a60fa48cSCharles.Forsyth char *(*walk)(Qid *qid, char *name); 58*a60fa48cSCharles.Forsyth char *(*open)(Qid *qid, int mode); 59*a60fa48cSCharles.Forsyth char *(*create)(Qid *qid, char *name, int perm, int mode); 60*a60fa48cSCharles.Forsyth char *(*read)(Qid qid, char *buf, ulong *n, vlong offset); 61*a60fa48cSCharles.Forsyth char *(*write)(Qid qid, char *buf, ulong *n, vlong offset); 62*a60fa48cSCharles.Forsyth char *(*close)(Qid qid, int mode); 63*a60fa48cSCharles.Forsyth char *(*remove)(Qid qid); 64*a60fa48cSCharles.Forsyth char *(*stat)(Qid qid, Dir *d); 65*a60fa48cSCharles.Forsyth char *(*wstat)(Qid qid, Dir *d); 66*a60fa48cSCharles.Forsyth }; 67*a60fa48cSCharles.Forsyth 68*a60fa48cSCharles.Forsyth struct Styxfile 69*a60fa48cSCharles.Forsyth { 70*a60fa48cSCharles.Forsyth Dir d; 71*a60fa48cSCharles.Forsyth Styxfile *parent; 72*a60fa48cSCharles.Forsyth Styxfile *child; 73*a60fa48cSCharles.Forsyth Styxfile *sibling; 74*a60fa48cSCharles.Forsyth Styxfile *next; 75*a60fa48cSCharles.Forsyth int ref; 76*a60fa48cSCharles.Forsyth int open; 77*a60fa48cSCharles.Forsyth void *u; 78*a60fa48cSCharles.Forsyth }; 79*a60fa48cSCharles.Forsyth 80*a60fa48cSCharles.Forsyth char *styxinit(Styxserver *server, Styxops *ops, char *port, int perm, int needfile); 81*a60fa48cSCharles.Forsyth char *styxwait(Styxserver *server); 82*a60fa48cSCharles.Forsyth char *styxprocess(Styxserver *server); 83*a60fa48cSCharles.Forsyth char *styxend(Styxserver *server); 84*a60fa48cSCharles.Forsyth 85*a60fa48cSCharles.Forsyth Client *styxclient(Styxserver *server); 86*a60fa48cSCharles.Forsyth 87*a60fa48cSCharles.Forsyth Styxfile *styxaddfile(Styxserver *server, Path pqid, Path qid, char *name, int mode, char *owner); 88*a60fa48cSCharles.Forsyth Styxfile *styxadddir(Styxserver *server, Path pqid, Path qid, char *name, int mode, char *owner); 89*a60fa48cSCharles.Forsyth int styxrmfile(Styxserver *server, Path qid); 90*a60fa48cSCharles.Forsyth Styxfile *styxfindfile(Styxserver *server, Path qid); 91*a60fa48cSCharles.Forsyth 92*a60fa48cSCharles.Forsyth int styxperm(Styxfile *file, char *uid, int mode); 93*a60fa48cSCharles.Forsyth long styxreadstr(ulong off, char *buf, ulong n, char *str); 94*a60fa48cSCharles.Forsyth Qid styxqid(int path, int isdir); 95*a60fa48cSCharles.Forsyth void *styxmalloc(int n); 96*a60fa48cSCharles.Forsyth void styxfree(void *p); 97*a60fa48cSCharles.Forsyth void styxdebug(void); 98*a60fa48cSCharles.Forsyth void styxsetowner(char*); 99