Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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