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