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