d53a14a02c7a0cace5a3307294c78341fcfd532f
[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 /* These data structures are derived from src/dir/dir.h and should not 
14  * be changed as they describe AFS3 wire protocol.
15  *
16  */
17
18 #define CM_DIR_PAGESIZE         2048            /* bytes per page */
19 #define CM_DIR_NHASHENT         128             /* entries in the dir hash tbl */
20 #define CM_DIR_MAXPAGES         128             /* max pages in a dir */
21 #define CM_DIR_BIGMAXPAGES      1023            /* new big max pages */
22 #define CM_DIR_EPP              64              /* dir entries per page */
23 #define CM_DIR_LEPP             6               /* log above */
24 #define CM_DIR_CHUNKSIZE        32              /* bytes per dir entry chunk */
25
26 /* When this next field changs, it is crucial to modify MakeDir, since the latter is
27  * responsible for marking these entries as allocated.  Also change
28  * the salvager.
29  */
30 #define CM_DIR_DHE              12              /* entries in a dir header above a pages
31                                                  * header alone.
32                                                  */
33
34 typedef struct cm_dirFid {
35         /* A file identifier. */
36         afs_int32 vnode;        /* file's vnode slot */
37         afs_int32 unique;       /* the slot incarnation number */
38 } cm_dirFid_t;
39
40 typedef struct cm_pageHeader {
41         /* A page header entry. */
42         unsigned short pgcount; /* number of pages, or 0 if old-style */
43         unsigned short tag;             /* '1234' in network byte order */
44         char freeCount; /* unused, info in dirHeader structure */
45         char freeBitmap[CM_DIR_EPP/8];
46         char padding[CM_DIR_CHUNKSIZE-(5+CM_DIR_EPP/8)];/* pad to one 32-byte entry */
47 } cm_pageHeader_t;
48
49 /* a total of 13 32-byte entries, 1 for the header that in all pages, and
50  * 12 more special ones for the entries in a the first page.
51  */
52 typedef struct cm_dirHeader {
53         /* A directory header object. */
54         cm_pageHeader_t header;
55         char alloMap[CM_DIR_MAXPAGES];    /* one byte per 2K page */
56         unsigned short hashTable[CM_DIR_NHASHENT];
57 } cm_dirHeader_t;
58
59 /* this represents a directory entry.  We use strlen to find out how many bytes are
60  * really in the dir entry; it is always a multiple of 32.
61  */
62 typedef struct cm_dirEntry {
63         /* A directory entry */
64         char flag;      /* this must be FFIRST (1) */
65         char length;    /* currently unused */
66         unsigned short next;
67         cm_dirFid_t fid;
68         char name[1];   /* the real length is determined with strlen() */
69 } cm_dirEntry_t;
70
71 #ifdef UNUSED
72 typedef struct cm_dirXEntry {
73         /* A directory extension entry. */
74         char name[32];
75 } cm_dirXEntry_t;
76
77 typedef struct cm_dirPage0 {
78         /* A page in a directory. */
79         cm_dirHeader_t header;
80         cm_dirEntry_t entry[1];
81 } cm_dirPage0_t;
82
83 typedef struct cm_dirPage1 {
84         /* A page in a directory. */
85         cm_pageHeader_t header;
86         cm_dirEntry_t entry[1];
87 } cm_dirPage1_t;
88 #endif /* UNUSED */
89
90 extern long cm_NameEntries(char *namep, long *lenp);
91
92 #endif /*  __CM_DIR_ENV__ */