dir-char-to-void-20021014
[openafs.git] / src / dir / 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 #if     !defined(__AFS_DIR_H)
11
12 #define __AFS_DIR_H
13
14 #define AFS_PAGESIZE 2048       /* bytes per page */
15 #define NHASHENT 128    /* entries in the hash tbl */
16 #define MAXPAGES 128    /* max pages in a dir */
17 #define BIGMAXPAGES 1023   /* new big max pages */
18 #define EPP 64          /* dir entries per page */
19 #define LEPP 6          /* log above */
20 /* When this next field changs, it is crucial to modify MakeDir, since the latter is responsible for marking these entries as allocated.  Also change the salvager. */
21 #define DHE 12          /* entries in a dir header above a pages header alone. */
22
23 #define FFIRST 1
24 #define FNEXT 2
25
26 struct MKFid
27 {                               /* A file identifier. */
28     afs_int32 vnode;            /* file's vnode slot */
29     afs_int32 vunique;          /* the slot incarnation number */
30 };
31
32 struct PageHeader
33 {
34     /* A page header entry. */
35     unsigned short pgcount;     /* number of pages, or 0 if old-style */
36     unsigned short tag;         /* 1234 in network byte order */
37     char freecount;             /* unused, info in dirHeader structure */
38     char freebitmap[EPP/8];
39     char padding[32-(5+EPP/8)];
40 };
41
42 struct DirHeader
43 {
44     /* A directory header object. */
45     struct PageHeader header;
46     char alloMap[MAXPAGES];     /* one byte per 2K page */
47     unsigned short hashTable[NHASHENT];
48 };
49
50 struct DirEntry
51 {
52     /* A directory entry */
53     char flag;
54     char length;                /* currently unused */
55     unsigned short next;
56     struct MKFid fid;
57     char name[16];
58 };
59
60 struct DirXEntry
61 {
62     /* A directory extension entry. */
63     char name[32];
64 };
65
66 struct DirPage0
67 {
68     /* A page in a directory. */
69     struct DirHeader header;
70     struct DirEntry entry[1];
71 };
72
73 struct DirPage1
74 {
75     /* A page in a directory. */
76     struct PageHeader header;
77     struct DirEntry entry[1];
78 };
79
80 /*
81  * Note that this declaration is seen in both the kernel code and the
82  * user space code.  One implementation is in afs/afs_buffer.c; the
83  * other is in dir/buffer.c.
84  */
85 extern int DVOffset(void *ap);
86
87
88
89 /* Prototypes */
90 extern int NameBlobs (char *name);
91 extern int Create (void *dir, char *entry, void *vfid);
92 extern int Length (void *dir);
93 extern int Delete (void *dir, char *entry);
94 extern int FindBlobs (void *dir, int nblobs);
95 extern void AddPage (void *dir, int pageno);
96 extern void FreeBlobs(void *dir, register int firstblob, int nblobs);
97 extern int MakeDir (void *dir, afs_int32 *me, afs_int32 *parent);
98 extern int Lookup (void *dir, char *entry, void *fid);
99 extern int LookupOffset (void *dir, char *entry, void *fid, long *offsetp);
100 extern int EnumerateDir (void *dir, int (*hookproc)(void *dir, char *name, afs_int32 vnode, afs_int32 unique), void *hook);
101 extern int IsEmpty (void *dir);
102 extern struct DirEntry *GetBlob (void *dir, afs_int32 blobno);
103 extern int DirHash (register char *string);
104
105 #ifdef KERNEL
106 extern int afs_dir_NameBlobs (char *name);
107 extern int afs_dir_Create (void *dir, char *entry, void *vfid);
108 extern int afs_dir_Length (void *dir);
109 extern int afs_dir_Delete (void *dir, char *entry);
110 extern int afs_dir_MakeDir (void *dir, afs_int32 *me, afs_int32 *parent);
111 extern int afs_dir_Lookup (void *dir, char *entry, void *fid);
112 extern int afs_dir_LookupOffset (void *dir, char *entry, void *fid, long *offsetp);
113 extern int afs_dir_EnumerateDir (void *dir, int (*hookproc)(void *dir, char *name, afs_int32 vnode, afs_int32 unique), void *hook);
114 extern int afs_dir_IsEmpty (void *dir);
115 extern struct DirEntry *afs_dir_GetBlob (void *dir, afs_int32 blobno);
116 #endif
117
118 #endif /*       !defined(__AFS_DIR_H) */