1 #define g2byte(x) (((x)[1]<<8) + (x)[0]) /* little-endian */ 2 #define g3byte(x) (((x)[2]<<16) + ((x)[1]<<8) + (x)[0]) 3 #define g4byte(x) (((x)[3]<<24) + ((x)[2]<<16) + ((x)[1]<<8) + (x)[0]) 4 5 /* big endian */ 6 #define b4byte(x) (((x)[0]<<24) + ((x)[1]<<16) + ((x)[2]<<8) + (x)[3]) 7 #define b8byte(x) (((vlong)b4byte(x)<<32) | (u32int)b4byte((x)+4)) 8 enum 9 { 10 OPERM = 0x3, /* mask of all permission types in open mode */ 11 Nram = 512, 12 Maxbuf = 8192, /* max buffer size */ 13 }; 14 15 typedef struct Fid Fid; 16 typedef struct Ram Ram; 17 18 struct Fid 19 { 20 short busy; 21 short open; 22 short rclose; 23 int fid; 24 Fid *next; 25 char *user; 26 Ram *ram; 27 }; 28 29 struct Ram 30 { 31 char busy; 32 char open; 33 char replete; 34 Ram *parent; /* parent directory */ 35 Ram *child; /* first member of directory */ 36 Ram *next; /* next member of file's directory */ 37 Qid qid; 38 long perm; 39 char *name; 40 ulong atime; 41 ulong mtime; 42 char *user; 43 char *group; 44 vlong addr; 45 void *data; 46 vlong ndata; 47 }; 48 49 enum 50 { 51 Pexec = 1, 52 Pwrite = 2, 53 Pread = 4, 54 Pother = 1, 55 Pgroup = 8, 56 Powner = 64, 57 }; 58 59 typedef struct idmap { 60 char *name; 61 int id; 62 } Idmap; 63 64 typedef struct fileinf { 65 char *name; 66 vlong addr; 67 void *data; 68 vlong size; 69 int mode; 70 int uid; 71 int gid; 72 long mdate; 73 } Fileinf; 74 75 extern ulong path; /* incremented for each new file */ 76 extern Ram *ram; 77 extern char *user; 78 extern Idmap *uidmap; 79 extern Idmap *gidmap; 80 extern int replete; 81 extern int blocksize; 82 void error(char*); 83 void *erealloc(void*, ulong); 84 void *emalloc(ulong); 85 char *estrdup(char*); 86 void populate(char *); 87 void dotrunc(Ram*); 88 void docreate(Ram*); 89 char *doread(Ram*, vlong, long); 90 void dowrite(Ram*, char*, long, long); 91 int dopermw(Ram*); 92 Idmap *getpass(char*); 93 char *mapid(Idmap*,int); 94 Ram *poppath(Fileinf fi, int new); 95 Ram *popfile(Ram *dir, Fileinf fi); 96 void popdir(Ram*); 97 Ram *lookup(Ram*, char*); 98