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