1*01a344a2SDavid du Colombier #include <u.h> 2*01a344a2SDavid du Colombier #include <libc.h> 3*01a344a2SDavid du Colombier #include <ctype.h> 4*01a344a2SDavid du Colombier #define Tfile Tfilescsi /* avoid name conflict */ 5*01a344a2SDavid du Colombier #include <disk.h> 6*01a344a2SDavid du Colombier #undef Tfile 7*01a344a2SDavid du Colombier #include <bio.h> 8*01a344a2SDavid du Colombier #include <ip.h> 9*01a344a2SDavid du Colombier 10*01a344a2SDavid du Colombier #include "dat.h" 11*01a344a2SDavid du Colombier #include "portfns.h" 12*01a344a2SDavid du Colombier 13*01a344a2SDavid du Colombier #define malloc(n) ialloc(n, 0) 14*01a344a2SDavid du Colombier 15*01a344a2SDavid du Colombier #define CHAT(cp) ((cons.flags&chatflag) || \ 16*01a344a2SDavid du Colombier ((cp) && (((Chan*)(cp))->flags&chatflag))) 17*01a344a2SDavid du Colombier #define QID9P1(a,b) (Qid9p1){a,b} 18*01a344a2SDavid du Colombier 19*01a344a2SDavid du Colombier #define SECOND(n) (n) 20*01a344a2SDavid du Colombier #define MINUTE(n) ((n)*SECOND(60)) 21*01a344a2SDavid du Colombier #define HOUR(n) ((n)*MINUTE(60)) 22*01a344a2SDavid du Colombier #define DAY(n) ((n)*HOUR(24)) 23*01a344a2SDavid du Colombier 24*01a344a2SDavid du Colombier enum { 25*01a344a2SDavid du Colombier QPDIR = 0x80000000L, 26*01a344a2SDavid du Colombier QPNONE = 0, 27*01a344a2SDavid du Colombier QPROOT = 1, 28*01a344a2SDavid du Colombier QPSUPER = 2, 29*01a344a2SDavid du Colombier 30*01a344a2SDavid du Colombier /* 31*01a344a2SDavid du Colombier * perm argument in 9P create 32*01a344a2SDavid du Colombier */ 33*01a344a2SDavid du Colombier PDIR = 1L<<31, /* is a directory */ 34*01a344a2SDavid du Colombier PAPND = 1L<<30, /* is append only */ 35*01a344a2SDavid du Colombier PLOCK = 1L<<29, /* is locked on open */ 36*01a344a2SDavid du Colombier 37*01a344a2SDavid du Colombier FID1 = 1, 38*01a344a2SDavid du Colombier FID2 = 2, 39*01a344a2SDavid du Colombier 40*01a344a2SDavid du Colombier MAXBIAS = SECOND(20), 41*01a344a2SDavid du Colombier TLOCK = MINUTE(5), 42*01a344a2SDavid du Colombier }; 43*01a344a2SDavid du Colombier 44*01a344a2SDavid du Colombier Uid* uid; 45*01a344a2SDavid du Colombier short* gidspace; 46*01a344a2SDavid du Colombier Lock printing; 47*01a344a2SDavid du Colombier Time tim; 48*01a344a2SDavid du Colombier File* files; 49*01a344a2SDavid du Colombier Wpath* wpaths; 50*01a344a2SDavid du Colombier Lock wpathlock; 51*01a344a2SDavid du Colombier char* errstr9p[MAXERR]; 52*01a344a2SDavid du Colombier Chan* chans; 53*01a344a2SDavid du Colombier RWLock mainlock; 54*01a344a2SDavid du Colombier Timet fs_mktime; 55*01a344a2SDavid du Colombier Timet boottime; 56*01a344a2SDavid du Colombier Queue* serveq; 57*01a344a2SDavid du Colombier Queue* raheadq; 58*01a344a2SDavid du Colombier Rabuf* rabuffree; 59*01a344a2SDavid du Colombier QLock reflock; 60*01a344a2SDavid du Colombier Lock rabuflock; 61*01a344a2SDavid du Colombier Tlock tlocks[NTLOCK]; 62*01a344a2SDavid du Colombier Lock tlocklock; 63*01a344a2SDavid du Colombier Device* devnone; 64*01a344a2SDavid du Colombier Startsb startsb[5]; 65*01a344a2SDavid du Colombier int mballocs[MAXCAT]; 66*01a344a2SDavid du Colombier 67*01a344a2SDavid du Colombier /* from config block */ 68*01a344a2SDavid du Colombier char service[50]; /* my name */ 69*01a344a2SDavid du Colombier Filsys filsys[30]; /* named file systems */ 70*01a344a2SDavid du Colombier /* 71*01a344a2SDavid du Colombier * these are only documentation, but putting them in the config block makes 72*01a344a2SDavid du Colombier * them visible. the real values are compiled into cwfs. 73*01a344a2SDavid du Colombier */ 74*01a344a2SDavid du Colombier typedef struct Fspar Fspar; 75*01a344a2SDavid du Colombier struct Fspar { 76*01a344a2SDavid du Colombier char* name; 77*01a344a2SDavid du Colombier long actual; /* compiled-in value */ 78*01a344a2SDavid du Colombier long declared; 79*01a344a2SDavid du Colombier } fspar[]; 80*01a344a2SDavid du Colombier 81*01a344a2SDavid du Colombier ulong roflag; 82*01a344a2SDavid du Colombier ulong errorflag; 83*01a344a2SDavid du Colombier ulong chatflag; 84*01a344a2SDavid du Colombier ulong attachflag; 85*01a344a2SDavid du Colombier ulong authdebugflag; 86*01a344a2SDavid du Colombier ulong authdisableflag; 87*01a344a2SDavid du Colombier int noattach; 88*01a344a2SDavid du Colombier int wstatallow; /* set to circumvent wstat permissions */ 89*01a344a2SDavid du Colombier int writeallow; /* set to circumvent write permissions */ 90*01a344a2SDavid du Colombier int duallow; /* single user to allow du */ 91*01a344a2SDavid du Colombier int readonly; /* disable writes if true */ 92*01a344a2SDavid du Colombier 93*01a344a2SDavid du Colombier int noauth; /* Debug */ 94*01a344a2SDavid du Colombier 95*01a344a2SDavid du Colombier int rawreadok; /* allow reading raw data */ 96*01a344a2SDavid du Colombier 97*01a344a2SDavid du Colombier File* flist[5003]; /* base of file structures */ 98*01a344a2SDavid du Colombier Lock flock; /* manipulate flist */ 99*01a344a2SDavid du Colombier 100*01a344a2SDavid du Colombier long growacct[1000]; 101*01a344a2SDavid du Colombier 102*01a344a2SDavid du Colombier struct 103*01a344a2SDavid du Colombier { 104*01a344a2SDavid du Colombier RWLock uidlock; 105*01a344a2SDavid du Colombier Iobuf* uidbuf; 106*01a344a2SDavid du Colombier int flen; 107*01a344a2SDavid du Colombier int find; 108*01a344a2SDavid du Colombier } uidgc; 109*01a344a2SDavid du Colombier 110*01a344a2SDavid du Colombier extern char statecall[]; 111*01a344a2SDavid du Colombier extern char* wormscode[]; 112*01a344a2SDavid du Colombier extern char* tagnames[]; 113