17dd7cddfSDavid du Colombier enum 27dd7cddfSDavid du Colombier { 37dd7cddfSDavid du Colombier FHSIZE = 32 47dd7cddfSDavid du Colombier }; 57dd7cddfSDavid du Colombier 67dd7cddfSDavid du Colombier typedef struct Accept Accept; 77dd7cddfSDavid du Colombier typedef struct Auth Auth; 87dd7cddfSDavid du Colombier typedef struct Authunix Authunix; 97dd7cddfSDavid du Colombier typedef struct Chalstuff Chalstuff; 107dd7cddfSDavid du Colombier typedef uchar Fhandle[FHSIZE]; 117dd7cddfSDavid du Colombier typedef struct Fid Fid; 127dd7cddfSDavid du Colombier typedef struct Procmap Procmap; 137dd7cddfSDavid du Colombier typedef struct Progmap Progmap; 147dd7cddfSDavid du Colombier typedef struct Reject Reject; 157dd7cddfSDavid du Colombier typedef struct Rpccall Rpccall; 167dd7cddfSDavid du Colombier typedef struct Rpccache Rpccache; 177dd7cddfSDavid du Colombier typedef struct Sattr Sattr; 187dd7cddfSDavid du Colombier typedef struct Session Session; 197dd7cddfSDavid du Colombier typedef struct String String; 207dd7cddfSDavid du Colombier typedef struct Strnode Strnode; 217dd7cddfSDavid du Colombier typedef struct Unixid Unixid; 227dd7cddfSDavid du Colombier typedef struct Unixidmap Unixidmap; 237dd7cddfSDavid du Colombier typedef struct Unixmap Unixmap; 247dd7cddfSDavid du Colombier typedef struct Unixscmap Unixscmap; 257dd7cddfSDavid du Colombier typedef struct Xfid Xfid; 267dd7cddfSDavid du Colombier typedef struct Xfile Xfile; 277dd7cddfSDavid du Colombier 287dd7cddfSDavid du Colombier struct String 297dd7cddfSDavid du Colombier { 307dd7cddfSDavid du Colombier ulong n; 317dd7cddfSDavid du Colombier char * s; 327dd7cddfSDavid du Colombier }; 337dd7cddfSDavid du Colombier 347dd7cddfSDavid du Colombier struct Progmap 357dd7cddfSDavid du Colombier { 367dd7cddfSDavid du Colombier int progno; 377dd7cddfSDavid du Colombier int vers; 387dd7cddfSDavid du Colombier void (*init)(int, char**); 397dd7cddfSDavid du Colombier Procmap *pmap; 407dd7cddfSDavid du Colombier }; 417dd7cddfSDavid du Colombier 427dd7cddfSDavid du Colombier struct Procmap 437dd7cddfSDavid du Colombier { 447dd7cddfSDavid du Colombier int procno; 457dd7cddfSDavid du Colombier int (*procp)(int, Rpccall*, Rpccall*); 467dd7cddfSDavid du Colombier }; 477dd7cddfSDavid du Colombier 487dd7cddfSDavid du Colombier struct Auth 497dd7cddfSDavid du Colombier { 507dd7cddfSDavid du Colombier ulong flavor; 517dd7cddfSDavid du Colombier ulong count; 527dd7cddfSDavid du Colombier void * data; 537dd7cddfSDavid du Colombier }; 547dd7cddfSDavid du Colombier 557dd7cddfSDavid du Colombier struct Authunix 567dd7cddfSDavid du Colombier { 577dd7cddfSDavid du Colombier ulong stamp; 587dd7cddfSDavid du Colombier String mach; 597dd7cddfSDavid du Colombier ulong uid; 607dd7cddfSDavid du Colombier ulong gid; 617dd7cddfSDavid du Colombier int gidlen; 627dd7cddfSDavid du Colombier ulong gids[10]; 637dd7cddfSDavid du Colombier }; 647dd7cddfSDavid du Colombier 657dd7cddfSDavid du Colombier struct Accept 667dd7cddfSDavid du Colombier { 677dd7cddfSDavid du Colombier Auth averf; 687dd7cddfSDavid du Colombier ulong astat; 697dd7cddfSDavid du Colombier union{ 707dd7cddfSDavid du Colombier void * results; /* SUCCESS */ 717dd7cddfSDavid du Colombier struct{ /* PROG_MISMATCH */ 727dd7cddfSDavid du Colombier ulong plow; /* acceptable version numbers */ 737dd7cddfSDavid du Colombier ulong phigh; 747dd7cddfSDavid du Colombier }; 757dd7cddfSDavid du Colombier }; 767dd7cddfSDavid du Colombier }; 777dd7cddfSDavid du Colombier 787dd7cddfSDavid du Colombier struct Reject 797dd7cddfSDavid du Colombier { 807dd7cddfSDavid du Colombier ulong rstat; 817dd7cddfSDavid du Colombier union{ 827dd7cddfSDavid du Colombier struct{ /* RPC_MISMATCH */ 837dd7cddfSDavid du Colombier ulong rlow; /* acceptable rpc version numbers */ 847dd7cddfSDavid du Colombier ulong rhigh; 857dd7cddfSDavid du Colombier }; 867dd7cddfSDavid du Colombier ulong authstat; /* AUTH_ERROR */ 877dd7cddfSDavid du Colombier }; 887dd7cddfSDavid du Colombier }; 897dd7cddfSDavid du Colombier 907dd7cddfSDavid du Colombier struct Rpccall 917dd7cddfSDavid du Colombier { 92*883a8c51SDavid du Colombier /* corresponds to Udphdr */ 937dd7cddfSDavid du Colombier uchar prefix0[12]; 94*883a8c51SDavid du Colombier ulong host; /* ipv4 subset: prefixed to RPC message */ 957dd7cddfSDavid du Colombier uchar prefix1[12]; 96*883a8c51SDavid du Colombier ulong lhost; /* ipv4 subset: prefixed to RPC message */ 97*883a8c51SDavid du Colombier /* ignore ifcaddr */ 987dd7cddfSDavid du Colombier ulong port; /* prefixed to RPC message */ 997dd7cddfSDavid du Colombier ulong lport; /* prefixed to RPC message */ 100*883a8c51SDavid du Colombier 1017dd7cddfSDavid du Colombier ulong xid; /* transaction id */ 1027dd7cddfSDavid du Colombier ulong mtype; /* CALL or REPLY */ 1037dd7cddfSDavid du Colombier union{ 1047dd7cddfSDavid du Colombier struct{ /* CALL */ 1057dd7cddfSDavid du Colombier ulong rpcvers; /* must be equal to two (2) */ 1067dd7cddfSDavid du Colombier ulong prog; /* program number */ 1077dd7cddfSDavid du Colombier ulong vers; /* program version */ 1087dd7cddfSDavid du Colombier ulong proc; /* procedure number */ 1097dd7cddfSDavid du Colombier Auth cred; /* authentication credentials */ 1107dd7cddfSDavid du Colombier Auth verf; /* authentication verifier */ 1117dd7cddfSDavid du Colombier Unixidmap *up; 1127dd7cddfSDavid du Colombier char * user; 1137dd7cddfSDavid du Colombier void * args; /* procedure-specific */ 1147dd7cddfSDavid du Colombier }; 1157dd7cddfSDavid du Colombier struct{ /* REPLY */ 1167dd7cddfSDavid du Colombier ulong stat; /* MSG_ACCEPTED or MSG_DENIED */ 1177dd7cddfSDavid du Colombier union{ 1187dd7cddfSDavid du Colombier Accept; 1197dd7cddfSDavid du Colombier Reject; 1207dd7cddfSDavid du Colombier }; 1217dd7cddfSDavid du Colombier }; 1227dd7cddfSDavid du Colombier }; 1237dd7cddfSDavid du Colombier }; 1247dd7cddfSDavid du Colombier 1257dd7cddfSDavid du Colombier struct Rpccache 1267dd7cddfSDavid du Colombier { 1277dd7cddfSDavid du Colombier Rpccache *prev; 1287dd7cddfSDavid du Colombier Rpccache *next; 1297dd7cddfSDavid du Colombier ulong host; 1307dd7cddfSDavid du Colombier ulong port; 1317dd7cddfSDavid du Colombier ulong xid; 1327dd7cddfSDavid du Colombier int n; 1337dd7cddfSDavid du Colombier uchar data[4]; 1347dd7cddfSDavid du Colombier }; 1357dd7cddfSDavid du Colombier 1367dd7cddfSDavid du Colombier struct Sattr 1377dd7cddfSDavid du Colombier { 1387dd7cddfSDavid du Colombier ulong mode; 1397dd7cddfSDavid du Colombier ulong uid; 1407dd7cddfSDavid du Colombier ulong gid; 1417dd7cddfSDavid du Colombier ulong size; 1427dd7cddfSDavid du Colombier ulong atime; /* sec's */ 1437dd7cddfSDavid du Colombier ulong ausec; /* microsec's */ 1447dd7cddfSDavid du Colombier ulong mtime; 1457dd7cddfSDavid du Colombier ulong musec; 1467dd7cddfSDavid du Colombier }; 1477dd7cddfSDavid du Colombier 1487dd7cddfSDavid du Colombier struct Strnode 1497dd7cddfSDavid du Colombier { 1507dd7cddfSDavid du Colombier Strnode *next; /* in hash bucket */ 1517dd7cddfSDavid du Colombier char str[4]; 1527dd7cddfSDavid du Colombier }; 1537dd7cddfSDavid du Colombier 1547dd7cddfSDavid du Colombier struct Unixid 1557dd7cddfSDavid du Colombier { 1567dd7cddfSDavid du Colombier Unixid *next; 1577dd7cddfSDavid du Colombier char * name; 1587dd7cddfSDavid du Colombier int id; 1597dd7cddfSDavid du Colombier }; 1607dd7cddfSDavid du Colombier 1617dd7cddfSDavid du Colombier struct Unixmap 1627dd7cddfSDavid du Colombier { 1637dd7cddfSDavid du Colombier char * file; 1647dd7cddfSDavid du Colombier int style; 1657dd7cddfSDavid du Colombier long timestamp; 1667dd7cddfSDavid du Colombier Unixid *ids; 1677dd7cddfSDavid du Colombier }; 1687dd7cddfSDavid du Colombier 1697dd7cddfSDavid du Colombier struct Unixidmap 1707dd7cddfSDavid du Colombier { 1717dd7cddfSDavid du Colombier Unixidmap *next; 1727dd7cddfSDavid du Colombier int flag; 1737dd7cddfSDavid du Colombier char * server; 1747dd7cddfSDavid du Colombier char * client; 1757dd7cddfSDavid du Colombier Reprog *sexp; 1767dd7cddfSDavid du Colombier Reprog *cexp; 1777dd7cddfSDavid du Colombier Unixmap u; 1787dd7cddfSDavid du Colombier Unixmap g; 1797dd7cddfSDavid du Colombier }; 1807dd7cddfSDavid du Colombier 1817dd7cddfSDavid du Colombier struct Unixscmap 1827dd7cddfSDavid du Colombier { 1837dd7cddfSDavid du Colombier Unixscmap *next; 1847dd7cddfSDavid du Colombier char * server; 1857dd7cddfSDavid du Colombier ulong clientip; 1867dd7cddfSDavid du Colombier Unixidmap *map; 1877dd7cddfSDavid du Colombier }; 1887dd7cddfSDavid du Colombier 1897dd7cddfSDavid du Colombier struct Xfile 1907dd7cddfSDavid du Colombier { 1917dd7cddfSDavid du Colombier Xfile * next; /* hash chain */ 1927dd7cddfSDavid du Colombier Session *s; 1939a747e4fSDavid du Colombier Qid qid; /* from stat */ 1947dd7cddfSDavid du Colombier Xfile * parent; 1957dd7cddfSDavid du Colombier Xfile * child; /* if directory */ 1967dd7cddfSDavid du Colombier Xfile * sib; /* siblings */ 1977dd7cddfSDavid du Colombier char * name; /* path element */ 1987dd7cddfSDavid du Colombier Xfid * users; 1997dd7cddfSDavid du Colombier }; 2007dd7cddfSDavid du Colombier 2017dd7cddfSDavid du Colombier enum 2027dd7cddfSDavid du Colombier { 2037dd7cddfSDavid du Colombier Oread = 1, 2047dd7cddfSDavid du Colombier Owrite = 2, 2057dd7cddfSDavid du Colombier Open = 3, 2067dd7cddfSDavid du Colombier Trunc = 4 2077dd7cddfSDavid du Colombier }; 2087dd7cddfSDavid du Colombier 2097dd7cddfSDavid du Colombier struct Xfid 2107dd7cddfSDavid du Colombier { 2117dd7cddfSDavid du Colombier Xfid * next; /* Xfile's user list */ 2127dd7cddfSDavid du Colombier Xfile * xp; 2137dd7cddfSDavid du Colombier char * uid; 2147dd7cddfSDavid du Colombier Fid * urfid; 2157dd7cddfSDavid du Colombier Fid * opfid; 2167dd7cddfSDavid du Colombier ulong mode; /* open mode, if opfid is non-zero */ 2177dd7cddfSDavid du Colombier ulong offset; 2187dd7cddfSDavid du Colombier }; 2197dd7cddfSDavid du Colombier 2207dd7cddfSDavid du Colombier struct Fid 2217dd7cddfSDavid du Colombier { 2227dd7cddfSDavid du Colombier Fid ** owner; /* null for root fids */ 2237dd7cddfSDavid du Colombier Fid * prev; 2247dd7cddfSDavid du Colombier Fid * next; 2257dd7cddfSDavid du Colombier long tstale; /* auto-clunk */ 2267dd7cddfSDavid du Colombier }; 2277dd7cddfSDavid du Colombier 2289a747e4fSDavid du Colombier enum 2299a747e4fSDavid du Colombier { 2309a747e4fSDavid du Colombier Maxfdata = 8192, 2319a747e4fSDavid du Colombier Maxstatdata = 2048, 2329a747e4fSDavid du Colombier }; 2339a747e4fSDavid du Colombier 2347dd7cddfSDavid du Colombier struct Session 2357dd7cddfSDavid du Colombier { 2367dd7cddfSDavid du Colombier Session *next; 2377dd7cddfSDavid du Colombier char * service; /* for dial */ 2387dd7cddfSDavid du Colombier int fd; 2399a747e4fSDavid du Colombier #define CHALLEN 1 2407dd7cddfSDavid du Colombier char cchal[CHALLEN]; /* client challenge */ 2417dd7cddfSDavid du Colombier char schal[CHALLEN]; /* server challenge */ 2429a747e4fSDavid du Colombier char authid[ANAMELEN]; /* server encryption uid */ 2437dd7cddfSDavid du Colombier char authdom[DOMLEN]; /* server encryption domain */ 2447dd7cddfSDavid du Colombier char * spec; /* for attach */ 2457dd7cddfSDavid du Colombier Xfile * root; /* to answer mount rpc */ 2467dd7cddfSDavid du Colombier ushort tag; 2477dd7cddfSDavid du Colombier Fcall f; 2489a747e4fSDavid du Colombier uchar data[IOHDRSZ+Maxfdata]; 2499a747e4fSDavid du Colombier uchar statbuf[Maxstatdata]; 2507dd7cddfSDavid du Colombier Fid * free; /* available */ 2517dd7cddfSDavid du Colombier Fid list; /* active, most-recently-used order */ 2527dd7cddfSDavid du Colombier Fid fids[1000]; 2537dd7cddfSDavid du Colombier int noauth; 2547dd7cddfSDavid du Colombier }; 2557dd7cddfSDavid du Colombier 2567dd7cddfSDavid du Colombier struct Chalstuff 2577dd7cddfSDavid du Colombier { 2587dd7cddfSDavid du Colombier Chalstuff *next; 2597dd7cddfSDavid du Colombier Xfid * xf; 2607dd7cddfSDavid du Colombier long tstale; 2617dd7cddfSDavid du Colombier Chalstate; 2627dd7cddfSDavid du Colombier }; 2637dd7cddfSDavid du Colombier 2647dd7cddfSDavid du Colombier extern int rpcdebug; 2659a747e4fSDavid du Colombier extern int p9debug; 2667dd7cddfSDavid du Colombier extern int chatty; 2677dd7cddfSDavid du Colombier extern void (*rpcalarm)(void); 2687dd7cddfSDavid du Colombier extern long starttime; 2697dd7cddfSDavid du Colombier extern long nfstime; 2707dd7cddfSDavid du Colombier extern char * config; 2717dd7cddfSDavid du Colombier extern int staletime; 2729a747e4fSDavid du Colombier extern int messagesize; 273363b328dSDavid du Colombier extern char * commonopts; 274