1 enum 2 { 3 FHSIZE = 32 4 }; 5 6 typedef struct Accept Accept; 7 typedef struct Auth Auth; 8 typedef struct Authunix Authunix; 9 typedef struct Chalstuff Chalstuff; 10 typedef uchar Fhandle[FHSIZE]; 11 typedef struct Fid Fid; 12 typedef struct Procmap Procmap; 13 typedef struct Progmap Progmap; 14 typedef struct Reject Reject; 15 typedef struct Rpccall Rpccall; 16 typedef struct Rpccache Rpccache; 17 typedef struct Sattr Sattr; 18 typedef struct Session Session; 19 typedef struct String String; 20 typedef struct Strnode Strnode; 21 typedef struct Unixid Unixid; 22 typedef struct Unixidmap Unixidmap; 23 typedef struct Unixmap Unixmap; 24 typedef struct Unixscmap Unixscmap; 25 typedef struct Xfid Xfid; 26 typedef struct Xfile Xfile; 27 28 struct String 29 { 30 ulong n; 31 char * s; 32 }; 33 34 struct Progmap 35 { 36 int progno; 37 int vers; 38 void (*init)(int, char**); 39 Procmap *pmap; 40 }; 41 42 struct Procmap 43 { 44 int procno; 45 int (*procp)(int, Rpccall*, Rpccall*); 46 }; 47 48 struct Auth 49 { 50 ulong flavor; 51 ulong count; 52 void * data; 53 }; 54 55 struct Authunix 56 { 57 ulong stamp; 58 String mach; 59 ulong uid; 60 ulong gid; 61 int gidlen; 62 ulong gids[10]; 63 }; 64 65 struct Accept 66 { 67 Auth averf; 68 ulong astat; 69 union{ 70 void * results; /* SUCCESS */ 71 struct{ /* PROG_MISMATCH */ 72 ulong plow; /* acceptable version numbers */ 73 ulong phigh; 74 }; 75 }; 76 }; 77 78 struct Reject 79 { 80 ulong rstat; 81 union{ 82 struct{ /* RPC_MISMATCH */ 83 ulong rlow; /* acceptable rpc version numbers */ 84 ulong rhigh; 85 }; 86 ulong authstat; /* AUTH_ERROR */ 87 }; 88 }; 89 90 struct Rpccall 91 { 92 uchar prefix0[12]; 93 ulong host; /* prefixed to RPC message */ 94 uchar prefix1[12]; 95 ulong lhost; /* prefixed to RPC message */ 96 ulong port; /* prefixed to RPC message */ 97 ulong lport; /* prefixed to RPC message */ 98 ulong xid; /* transaction id */ 99 ulong mtype; /* CALL or REPLY */ 100 union{ 101 struct{ /* CALL */ 102 ulong rpcvers; /* must be equal to two (2) */ 103 ulong prog; /* program number */ 104 ulong vers; /* program version */ 105 ulong proc; /* procedure number */ 106 Auth cred; /* authentication credentials */ 107 Auth verf; /* authentication verifier */ 108 Unixidmap *up; 109 char * user; 110 void * args; /* procedure-specific */ 111 }; 112 struct{ /* REPLY */ 113 ulong stat; /* MSG_ACCEPTED or MSG_DENIED */ 114 union{ 115 Accept; 116 Reject; 117 }; 118 }; 119 }; 120 }; 121 122 struct Rpccache 123 { 124 Rpccache *prev; 125 Rpccache *next; 126 ulong host; 127 ulong port; 128 ulong xid; 129 int n; 130 uchar data[4]; 131 }; 132 133 struct Sattr 134 { 135 ulong mode; 136 ulong uid; 137 ulong gid; 138 ulong size; 139 ulong atime; /* sec's */ 140 ulong ausec; /* microsec's */ 141 ulong mtime; 142 ulong musec; 143 }; 144 145 struct Strnode 146 { 147 Strnode *next; /* in hash bucket */ 148 char str[4]; 149 }; 150 151 struct Unixid 152 { 153 Unixid *next; 154 char * name; 155 int id; 156 }; 157 158 struct Unixmap 159 { 160 char * file; 161 int style; 162 long timestamp; 163 Unixid *ids; 164 }; 165 166 struct Unixidmap 167 { 168 Unixidmap *next; 169 int flag; 170 char * server; 171 char * client; 172 Reprog *sexp; 173 Reprog *cexp; 174 Unixmap u; 175 Unixmap g; 176 }; 177 178 struct Unixscmap 179 { 180 Unixscmap *next; 181 char * server; 182 ulong clientip; 183 Unixidmap *map; 184 }; 185 186 struct Xfile 187 { 188 Xfile * next; /* hash chain */ 189 Session *s; 190 Qid qid; /* from stat */ 191 Xfile * parent; 192 Xfile * child; /* if directory */ 193 Xfile * sib; /* siblings */ 194 char * name; /* path element */ 195 Xfid * users; 196 }; 197 198 enum 199 { 200 Oread = 1, 201 Owrite = 2, 202 Open = 3, 203 Trunc = 4 204 }; 205 206 struct Xfid 207 { 208 Xfid * next; /* Xfile's user list */ 209 Xfile * xp; 210 char * uid; 211 Fid * urfid; 212 Fid * opfid; 213 ulong mode; /* open mode, if opfid is non-zero */ 214 ulong offset; 215 }; 216 217 struct Fid 218 { 219 Fid ** owner; /* null for root fids */ 220 Fid * prev; 221 Fid * next; 222 long tstale; /* auto-clunk */ 223 }; 224 225 enum 226 { 227 Maxfdata = 8192, 228 Maxstatdata = 2048, 229 }; 230 231 struct Session 232 { 233 Session *next; 234 char * service; /* for dial */ 235 int fd; 236 #define CHALLEN 1 237 char cchal[CHALLEN]; /* client challenge */ 238 char schal[CHALLEN]; /* server challenge */ 239 char authid[ANAMELEN]; /* server encryption uid */ 240 char authdom[DOMLEN]; /* server encryption domain */ 241 char * spec; /* for attach */ 242 Xfile * root; /* to answer mount rpc */ 243 ushort tag; 244 Fcall f; 245 uchar data[IOHDRSZ+Maxfdata]; 246 uchar statbuf[Maxstatdata]; 247 Fid * free; /* available */ 248 Fid list; /* active, most-recently-used order */ 249 Fid fids[1000]; 250 int noauth; 251 }; 252 253 struct Chalstuff 254 { 255 Chalstuff *next; 256 Xfid * xf; 257 long tstale; 258 Chalstate; 259 }; 260 261 extern int rpcdebug; 262 extern int p9debug; 263 extern int chatty; 264 extern void (*rpcalarm)(void); 265 extern long starttime; 266 extern long nfstime; 267 extern char * config; 268 extern int staletime; 269 extern int messagesize; 270 extern char * commonopts; 271