/* * Journal Based Flash Entrysystem. */ enum { // sector header MAGSIZE = 4, MAXHDR = MAGSIZE+3+3, MAGIC0 = 'R', MAGIC1 = 'O', MAGIC2 = 'O', FFSVERS = '0', // transactions FT_create = 'G', FT_FCREATE0 = 'C', FT_FCREATE1 = 'E', FT_DCREATE0 = 'D', FT_DCREATE1 = 'F', FT_chmod = 'H', FT_CHMOD0 = 'M', FT_CHMOD1 = 'O', FT_REMOVE = 'R', FT_WRITE = 'W', FT_AWRITE = 'A', FT_trunc = 'I', FT_TRUNC0 = 'T', FT_TRUNC1 = 'V', FT_SUMMARY = 'S', FT_SUMBEG = 'B', FT_SUMEND = 'Z', MAXFSIZE = 1 << 21, MAXNSIZE = 28, Ncreate = 1+1+3*3+MAXNSIZE+1, Nchmod = 1+1+2*3, Nremove = 1+3, Nwrite = 1+4*3, Ntrunc = 1+1+4*3+MAXNSIZE+1, Nsumbeg = 1+3, Nmax = Ncreate, Nsum = 2*(1+3), Nfree = 3, HBITS = 5, HSIZE = 1 << HBITS, HMASK = HSIZE - 1, NOTIME = 0xFFFFFFFF, WRSIZE = 4*1024, }; typedef struct Extent Extent; typedef struct Exts Exts; typedef struct Entry Entry; typedef struct Dirr Dirr; typedef struct Jrec Jrec; typedef struct Renum Renum; struct Extent { int sect; ulong addr; ulong off; ulong size; Extent* next; Extent* prev; }; struct Exts { Extent* head; Extent* tail; }; struct Entry { int ref; char* name; ulong fnum; ulong mode; ulong mnum; ulong mtime; ulong size; union { struct { Entry** htab; Entry* files; Dirr* readers; }; struct { Exts gen[2]; }; }; Entry* parent; Entry* hnext; Entry* hprev; Entry* fnext; Entry* fprev; }; struct Dirr { Entry* dir; Entry* cur; Dirr* next; Dirr* prev; ulong offset; }; struct Jrec { int type; ulong mode; ulong fnum; ulong mnum; ulong tnum; ulong mtime; ulong parent; ulong size; ulong offset; ulong seq; char name[MAXNSIZE+2]; }; struct Renum { int old; int new; }; extern void initdata(char*, int); extern void clearsect(int); extern void readdata(int, void*, ulong, ulong); extern int writedata(int, int, void*, ulong, ulong); extern int getc3(uchar*, ulong*); extern int putc3(uchar*, ulong); extern ulong get4(uchar*); extern void put4(uchar*, ulong); extern int convM2J(Jrec*, uchar*); extern int convJ2M(Jrec*, uchar*); extern void loadfs(int); extern char* need(int bytes); extern void put(Jrec*, int); extern void putw(Jrec*, int, Extent *x, void*); extern int Jconv(Fmt*); extern ulong now(void); extern void serve(char*); #pragma varargck type "J" Jrec* extern void einit(void); extern void edump(void); extern Entry* elookup(ulong); extern Extent* esum(Entry*, int, ulong, int*); extern void edestroy(Entry*); extern Entry* ecreate(Entry*, char*, ulong, ulong, ulong, char**); extern char* eremove(Entry*); extern Entry* ewalk(Entry*, char*, char**); extern void etrunc(Entry*, ulong, ulong); extern ulong echmod(Entry*, ulong, ulong); extern ulong eread(Entry*, int, void*, ulong, ulong); extern void ewrite(Entry*, Extent *, int, ulong); extern Qid eqid(Entry*); extern void estat(Entry*, Dir*, int); extern Dirr* ediropen(Entry*); extern int edirread(Dirr*, char*, long); extern void edirclose(Dirr*); extern void erenum(Renum*); extern char Edirnotempty[]; extern char Eexists[]; extern char Eisdir[]; extern char Enonexist[]; extern char Enotdir[]; extern char Eperm[]; extern char Erofs[]; extern ulong sectsize; extern ulong nsects; extern uchar* sectbuff; extern Entry *root; extern int readonly; extern ulong delta; extern int eparity; extern uchar magic[]; extern ulong used; extern ulong limit; extern ulong maxwrite;