Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

typedef struct DirEntry DirEntry;
typedef struct MetaBlock MetaBlock;
typedef struct MetaEntry MetaEntry;

enum {
        MetaMagic = 0x5656fc7a,
        MetaHeaderSize = 12,
        MetaIndexSize = 4,
        IndexEntrySize = 8,
        DirMagic = 0x1c4d9072,
};

/*
 * Mode bits
 */
enum {
        ModeOtherExec = (1<<0),
        ModeOtherWrite = (1<<1),
        ModeOtherRead = (1<<2),
        ModeGroupExec = (1<<3),
        ModeGroupWrite = (1<<4),
        ModeGroupRead = (1<<5),
        ModeOwnerExec = (1<<6),
        ModeOwnerWrite = (1<<7),
        ModeOwnerRead = (1<<8),
        ModeSticky = (1<<9),
        ModeSetUid = (1<<10),
        ModeSetGid = (1<<11),
        ModeAppend = (1<<12),           /* append only file */
        ModeExclusive = (1<<13),        /* lock file - plan 9 */
        ModeLink = (1<<14),             /* sym link */
        ModeDir = (1<<15),              /* duplicate of DirEntry */
        ModeHidden = (1<<16),           /* MS-DOS */
        ModeSystem = (1<<17),           /* MS-DOS */
        ModeArchive = (1<<18),          /* MS-DOS */
        ModeTemporary = (1<<19),        /* MS-DOS */
        ModeSnapshot = (1<<20),         /* read only snapshot */
};

/* optional directory entry fields */
enum {
        DePlan9 = 1,    /* not valid in version >= 9 */
        DeNT,           /* not valid in version >= 9 */
        DeQidSpace,
        DeGen,          /* not valid in version >= 9 */
};

struct DirEntry {
        char *elem;             /* path element */
        ulong entry;            /* entry in directory for data */
        ulong gen;              /* generation of data entry */
        ulong mentry;           /* entry in directory for meta */
        ulong mgen;             /* generation of meta entry */
        uvlong size;            /* size of file */
        uvlong qid;             /* unique file id */

        char *uid;              /* owner id */
        char *gid;              /* group id */
        char *mid;              /* last modified by */
        ulong mtime;            /* last modified time */
        ulong mcount;           /* number of modifications: can wrap! */
        ulong ctime;            /* directory entry last changed */
        ulong atime;            /* last time accessed */
        ulong mode;             /* various mode bits */

        /* plan 9 */
        int plan9;
        uvlong p9path;
        ulong p9version;

        /* sub space of qid */
        int qidSpace;
        uvlong qidOffset;       /* qid offset */
        uvlong qidMax;          /* qid maximum */
};

struct MetaEntry {
        uchar *p;
        ushort size;
};

struct MetaBlock {
        int maxsize;            /* size of block */
        int size;               /* size used */
        int free;               /* free space within used size */
        int maxindex;           /* entries allocated for table */
        int nindex;             /* amount of table used */
        int botch;              /* compensate for my stupidity */
        uchar *buf;
};

void    deCleanup(DirEntry*);
void    deCopy(DirEntry*, DirEntry*);
int     deSize(DirEntry*);
void    dePack(DirEntry*, MetaEntry*);
int     deUnpack(DirEntry*, MetaEntry*);

void    mbInit(MetaBlock*, uchar*, int, int);
int     mbUnpack(MetaBlock*, uchar*, int);
void    mbInsert(MetaBlock*, int, MetaEntry*);
void    mbDelete(MetaBlock*, int);
void    mbPack(MetaBlock*);
uchar   *mbAlloc(MetaBlock*, int);
int     mbResize(MetaBlock*, MetaEntry*, int);
int     mbSearch(MetaBlock*, char*, int*, MetaEntry*);

void    meUnpack(MetaEntry*, MetaBlock*, int);