xref: /plan9/sys/src/cmd/ratfs/ratfs.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include <auth.h>
4*9a747e4fSDavid du Colombier #include <fcall.h>
5*9a747e4fSDavid du Colombier #include <bio.h>
6*9a747e4fSDavid du Colombier 
7*9a747e4fSDavid du Colombier enum {
8*9a747e4fSDavid du Colombier 	MAXRPC = 8192,
9*9a747e4fSDavid du Colombier 
10*9a747e4fSDavid du Colombier 	Qroot = 1,		/* fixed QID's */
11*9a747e4fSDavid du Colombier 	Qallow,
12*9a747e4fSDavid du Colombier 	Qdelay,
13*9a747e4fSDavid du Colombier 	Qblock,
14*9a747e4fSDavid du Colombier 	Qdial,
15*9a747e4fSDavid du Colombier 	Qdeny,
16*9a747e4fSDavid du Colombier 	Qtrusted,
17*9a747e4fSDavid du Colombier 	Qctl,
18*9a747e4fSDavid du Colombier 	Qdummy,
19*9a747e4fSDavid du Colombier 	Qaddr,			/* Qid's for "ip" & "account" subdirs (Qaddr-99) */
20*9a747e4fSDavid du Colombier 
21*9a747e4fSDavid du Colombier 	Qtrustedfile = 100,	/* Qid's for trusted files (100-999)*/
22*9a747e4fSDavid du Colombier 	Qaddrfile   = 1000,	/* Qid's for address files (> 1000) */
23*9a747e4fSDavid du Colombier 
24*9a747e4fSDavid du Colombier 				/* type codes in node.d.type */
25*9a747e4fSDavid du Colombier 	Directory =	0,	/* normal directory */
26*9a747e4fSDavid du Colombier 	Addrdir,		/* contains "ip" and "account" directories */
27*9a747e4fSDavid du Colombier 	IPaddr,			/* contains IP address "files" */
28*9a747e4fSDavid du Colombier 	Acctaddr,		/* contains Account address "files" */
29*9a747e4fSDavid du Colombier 	Trusted,		/* contains trusted IP files */
30*9a747e4fSDavid du Colombier 	Trustedperm,		/* permanently trusted IP pseudo-file */
31*9a747e4fSDavid du Colombier 	Trustedtemp,		/* temporarily trusted IP pseudo-file */
32*9a747e4fSDavid du Colombier 	Ctlfile,		/* ctl file under root */
33*9a747e4fSDavid du Colombier 	Dummynode,		/* place holder for Address pseudo-files */
34*9a747e4fSDavid du Colombier };
35*9a747e4fSDavid du Colombier 
36*9a747e4fSDavid du Colombier typedef struct Fid	Fid;
37*9a747e4fSDavid du Colombier typedef struct Node	Node;
38*9a747e4fSDavid du Colombier typedef	struct Address	Address;
39*9a747e4fSDavid du Colombier typedef struct Cidraddr	Cidraddr;
40*9a747e4fSDavid du Colombier typedef struct Keyword	Keyword;
41*9a747e4fSDavid du Colombier 
42*9a747e4fSDavid du Colombier 	/* an active fid */
43*9a747e4fSDavid du Colombier struct Fid
44*9a747e4fSDavid du Colombier {
45*9a747e4fSDavid du Colombier 	int	fid;
46*9a747e4fSDavid du Colombier 	int	dirindex;
47*9a747e4fSDavid du Colombier 	Node	*node;		/* current position in path */
48*9a747e4fSDavid du Colombier 	int	busy;
49*9a747e4fSDavid du Colombier 	int	open;		/* directories only */
50*9a747e4fSDavid du Colombier 	char	*name;
51*9a747e4fSDavid du Colombier 	char *uid;
52*9a747e4fSDavid du Colombier 	Fid	*next;
53*9a747e4fSDavid du Colombier };
54*9a747e4fSDavid du Colombier 
55*9a747e4fSDavid du Colombier struct	Cidraddr
56*9a747e4fSDavid du Colombier {
57*9a747e4fSDavid du Colombier 	ulong	ipaddr;		/* CIDR base addr */
58*9a747e4fSDavid du Colombier 	ulong	mask;		/* CIDR mask */
59*9a747e4fSDavid du Colombier };
60*9a747e4fSDavid du Colombier 
61*9a747e4fSDavid du Colombier 	/* an address is either an account name (domain!user) or Ip address */
62*9a747e4fSDavid du Colombier struct	Address
63*9a747e4fSDavid du Colombier {
64*9a747e4fSDavid du Colombier 	char	*name;		/* from the control file */
65*9a747e4fSDavid du Colombier 	Cidraddr ip;		/* CIDR Address */
66*9a747e4fSDavid du Colombier };
67*9a747e4fSDavid du Colombier 
68*9a747e4fSDavid du Colombier /* Fids point to either a directory or pseudo-file */
69*9a747e4fSDavid du Colombier struct Node
70*9a747e4fSDavid du Colombier {
71*9a747e4fSDavid du Colombier 	Dir	d;		/* d.name, d.uid, d.gid, d.muid are atoms */
72*9a747e4fSDavid du Colombier 	int	count;
73*9a747e4fSDavid du Colombier 	int	allocated;	/* number of Address structs allocated */
74*9a747e4fSDavid du Colombier 	ulong	baseqid;	/* base of Qid's in this set */
75*9a747e4fSDavid du Colombier 	Node	*parent;	/* points to self in root node*/
76*9a747e4fSDavid du Colombier 	Node	*sibs;		/* 0 in Ipaddr and Acctaddr dirs */
77*9a747e4fSDavid du Colombier 	union {
78*9a747e4fSDavid du Colombier 		Node	*children;	/* type == Directory || Addrdir || Trusted */
79*9a747e4fSDavid du Colombier 		Address	*addrs;		/* type == Ipaddr || Acctaddr */
80*9a747e4fSDavid du Colombier 		Cidraddr ip;		/* type == Trustedfile */
81*9a747e4fSDavid du Colombier 	};
82*9a747e4fSDavid du Colombier };
83*9a747e4fSDavid du Colombier 
84*9a747e4fSDavid du Colombier struct Keyword {
85*9a747e4fSDavid du Colombier 	char	*name;
86*9a747e4fSDavid du Colombier 	int	code;
87*9a747e4fSDavid du Colombier };
88*9a747e4fSDavid du Colombier 
89*9a747e4fSDavid du Colombier Node	*root;			/* root of directory tree */
90*9a747e4fSDavid du Colombier Node	dummy;			/* dummy node for fid's pointing to an Address */
91*9a747e4fSDavid du Colombier int	srvfd;			/* fd for 9fs */
92*9a747e4fSDavid du Colombier uchar rbuf[IOHDRSZ+MAXRPC+1];
93*9a747e4fSDavid du Colombier int	debugfd;
94*9a747e4fSDavid du Colombier char	*ctlfile;
95*9a747e4fSDavid du Colombier char	*conffile;
96*9a747e4fSDavid du Colombier long	lastconftime;
97*9a747e4fSDavid du Colombier long	lastctltime;
98*9a747e4fSDavid du Colombier int	trustedqid;
99*9a747e4fSDavid du Colombier 
100*9a747e4fSDavid du Colombier char*	atom(char*);
101*9a747e4fSDavid du Colombier void	cidrparse(Cidraddr*, char*);
102*9a747e4fSDavid du Colombier void	cleantrusted(void);
103*9a747e4fSDavid du Colombier Node*	dirwalk(char*, Node*);
104*9a747e4fSDavid du Colombier int	dread(Fid*, int);
105*9a747e4fSDavid du Colombier void	fatal(char*, ...);
106*9a747e4fSDavid du Colombier Node*	finddir(int);
107*9a747e4fSDavid du Colombier int	findkey(char*, Keyword*);
108*9a747e4fSDavid du Colombier void	getconf(void);
109*9a747e4fSDavid du Colombier int	hread(Fid*, int);
110*9a747e4fSDavid du Colombier void	io(void);
111*9a747e4fSDavid du Colombier Node*	newnode(Node*, char*, ushort, int, ulong);
112*9a747e4fSDavid du Colombier void	printfid(Fid*);
113*9a747e4fSDavid du Colombier void	printnode(Node*);
114*9a747e4fSDavid du Colombier void	printtree(Node*);
115*9a747e4fSDavid du Colombier void	reload(void);
116*9a747e4fSDavid du Colombier char*	subslash(char*);
117*9a747e4fSDavid du Colombier char*	walk(char*, Fid*);
118*9a747e4fSDavid du Colombier 
119