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