Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <auth.h>
#include <fcall.h>
#include <bio.h>

enum {
        MAXRPC = 8192,

        Qroot = 1,              /* fixed QID's */
        Qallow,
        Qdelay,
        Qblock,
        Qdial,
        Qdeny,
        Qtrusted,
        Qctl,
        Qdummy,
        Qaddr,                  /* Qid's for "ip" & "account" subdirs (Qaddr-99) */

        Qtrustedfile = 100,     /* Qid's for trusted files (100-999)*/
        Qaddrfile   = 1000,     /* Qid's for address files (> 1000) */

                                /* type codes in node.d.type */
        Directory =     0,      /* normal directory */
        Addrdir,                /* contains "ip" and "account" directories */
        IPaddr,                 /* contains IP address "files" */
        Acctaddr,               /* contains Account address "files" */
        Trusted,                /* contains trusted IP files */
        Trustedperm,            /* permanently trusted IP pseudo-file */
        Trustedtemp,            /* temporarily trusted IP pseudo-file */
        Ctlfile,                /* ctl file under root */
        Dummynode,              /* place holder for Address pseudo-files */
};

typedef struct Fid      Fid;
typedef struct Node     Node;
typedef struct Address  Address;
typedef struct Cidraddr Cidraddr;
typedef struct Keyword  Keyword;

        /* an active fid */
struct Fid
{
        int     fid;
        int     dirindex;
        Node    *node;          /* current position in path */
        int     busy;
        int     open;           /* directories only */
        char    *name;
        char *uid;
        Fid     *next;
};

struct  Cidraddr
{
        ulong   ipaddr;         /* CIDR base addr */
        ulong   mask;           /* CIDR mask */
};

        /* an address is either an account name (domain!user) or Ip address */
struct  Address
{
        char    *name;          /* from the control file */
        Cidraddr ip;            /* CIDR Address */
};

/* Fids point to either a directory or pseudo-file */
struct Node
{
        Dir     d;              /* d.name, d.uid, d.gid, d.muid are atoms */
        int     count;
        int     allocated;      /* number of Address structs allocated */
        ulong   baseqid;        /* base of Qid's in this set */
        Node    *parent;        /* points to self in root node*/
        Node    *sibs;          /* 0 in Ipaddr and Acctaddr dirs */
        union {
                Node    *children;      /* type == Directory || Addrdir || Trusted */
                Address *addrs;         /* type == Ipaddr || Acctaddr */
                Cidraddr ip;            /* type == Trustedfile */
        };
};

struct Keyword {
        char    *name;
        int     code;
};

Node    *root;                  /* root of directory tree */
Node    dummy;                  /* dummy node for fid's pointing to an Address */
int     srvfd;                  /* fd for 9fs */
uchar rbuf[IOHDRSZ+MAXRPC+1];
int     debugfd;
char    *ctlfile;
char    *conffile;
long    lastconftime;
long    lastctltime;
int     trustedqid;

char*   atom(char*);
void    cidrparse(Cidraddr*, char*);
void    cleantrusted(void);
Node*   dirwalk(char*, Node*);
int     dread(Fid*, int);
void    fatal(char*, ...);
Node*   finddir(int);
int     findkey(char*, Keyword*);
void    getconf(void);
int     hread(Fid*, int);
void    io(void);
Node*   newnode(Node*, char*, ushort, int, ulong);
void    printfid(Fid*);
void    printnode(Node*);
void    printtree(Node*);
void    reload(void);
char*   subslash(char*);
char*   walk(char*, Fid*);