Initial IBM OpenAFS 1.0 tree
[openafs.git] / src / WINNT / afsd / cm_dir.h
1 #ifndef __CM_DIR_ENV__
2 #define __CM_DIR_ENV__ 1
3 /* 
4  * Copyright (C) 1998, 1989 Transarc Corporation - All rights reserved
5  *
6  * (C) COPYRIGHT IBM CORPORATION 1987, 1988
7  * LICENSED MATERIALS - PROPERTY OF IBM
8  *
9  *
10  */
11 /*
12  * (C) COPYRIGHT IBM CORPORATION 1987
13  * LICENSED MATERIALS - PROPERTY OF IBM
14  */
15
16 #define CM_DIR_PAGESIZE         2048            /* bytes per page */
17 #define CM_DIR_NHASHENT         128             /* entries in the hash tbl */
18 #define CM_DIR_MAXPAGES         128             /* max pages in a dir */
19 #define CM_DIR_BIGMAXPAGES      1023            /* new big max pages */
20 #define CM_DIR_EPP              64              /* dir entries per page */
21 #define CM_DIR_LEPP             6               /* log above */
22 #define CM_DIR_CHUNKSIZE        32              /* bytes per dir entry chunk */
23
24 /* When this next field changs, it is crucial to modify MakeDir, since the latter is
25  * responsible for marking these entries as allocated.  Also change
26  * the salvager.
27  */
28 #define CM_DIR_DHE              12              /* entries in a dir header above a pages
29                                                  * header alone.
30                                                  */
31
32 typedef struct cm_dirFid {
33         /* A file identifier. */
34         afs_int32 vnode;        /* file's vnode slot */
35         afs_int32 unique;       /* the slot incarnation number */
36 } cm_dirFid_t;
37
38 typedef struct cm_pageHeader {
39         /* A page header entry. */
40         unsigned short pgcount; /* number of pages, or 0 if old-style */
41         unsigned short tag;             /* 1234 in network byte order */
42         char freeCount; /* unused, info in dirHeader structure */
43         char freeBitmap[CM_DIR_EPP/8];
44         char padding[32-(5+CM_DIR_EPP/8)];      /* pad to one 32-byte entry */
45 } cm_pageHeader_t;
46
47 /* a total of 13 32-byte entries, 1 for the header that in all pages, and
48  * 12 more special ones for the entries in a the first page.
49  */
50 typedef struct cm_dirHeader {
51         /* A directory header object. */
52         cm_pageHeader_t header;
53         char alloMap[CM_DIR_MAXPAGES];    /* one byte per 2K page */
54         unsigned short hashTable[CM_DIR_NHASHENT];
55 } cm_dirHeader_t;
56
57 /* this represents a directory entry.  We use strlen to find out how many bytes are
58  * really in the dir entry; it is always a multiple of 32.
59  */
60 typedef struct cm_dirEntry {
61         /* A directory entry */
62         char flag;
63         char length;    /* currently unused */
64         unsigned short next;
65         cm_dirFid_t fid;
66         char name[16];
67 } cm_dirEntry_t;
68
69 typedef struct cm_dirXEntry {
70         /* A directory extension entry. */
71         char name[32];
72 } cm_dirXEntry_t;
73
74 typedef struct cm_dirPage0 {
75         /* A page in a directory. */
76         cm_dirHeader_t header;
77         cm_dirEntry_t entry[1];
78 } cm_dirPage0_t;
79
80 typedef struct cm_dirPage1 {
81         /* A page in a directory. */
82         cm_pageHeader_t header;
83         cm_dirEntry_t entry[1];
84 } cm_dirPage1_t;
85
86 extern int cm_NameEntries(char *namep, size_t *lenp);
87
88 #endif /*  __CM_DIR_ENV__ */