xref: /inferno-os/include/styxserver.h (revision a60fa48ce2f27a689f276bea9538b5db2b74ff86)
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