]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/cdb/cnid_cdb_private.h
Remove bdb env on exit
[netatalk.git] / libatalk / cnid / cdb / cnid_cdb_private.h
1 /*
2  * $Id: cnid_cdb_private.h,v 1.7 2009-11-20 17:22:11 didg Exp $
3  */
4
5 #ifndef LIBATALK_CDB_PRIVATE_H
6 #define LIBATALK_CDB_PRIVATE_H 1
7
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif /* HAVE_CONFIG_H */
11
12 #include <netatalk/endian.h>
13
14 #ifdef HAVE_UNISTD_H
15 #include <unistd.h>
16 #endif /* HAVE_UNISTD_H */
17 #include <stdlib.h>
18 #include <string.h>
19 #include <errno.h>
20 #ifdef HAVE_FCNTL_H
21 #include <fcntl.h>
22 #endif /* HAVE_FCNTL_H */
23 #include <sys/param.h>
24 #include <sys/stat.h>
25 #ifdef HAVE_SYS_TIME_H
26 #include <sys/time.h>
27 #endif /* HAVE_SYS_TIME_H */
28 #ifdef HAVE_TIME_H
29 #include <time.h>
30 #endif
31 #include <sys/cdefs.h>
32 #include <db.h>
33
34 #include <atalk/logger.h>
35 #include <atalk/adouble.h>
36 #include <atalk/cnid_private.h>
37 #include <atalk/cnid.h>
38 #include <atalk/util.h>
39 #include "cnid_cdb.h"
40
41 /* record structure 
42    cnid                4
43    dev                 8
44    inode               8
45    type/last cnid      4 Not used    
46    did                 4
47    name                strlen(name) +1
48
49 primary key 
50 cnid
51 secondary keys
52 dev/inode
53 did/name   
54
55 */
56
57 typedef struct cnid_record { /* helper for debug don't use */
58   unsigned int  cnid;
59   dev_t    dev;
60   ino_t    inode;
61   unsigned int  type;
62   unsigned int  did;
63   char          name[50];
64 } cnid_record;
65
66 typedef struct CNID_private {
67     u_int32_t magic;
68     DB *db_cnid;
69     DB *db_didname;
70     DB *db_devino;
71     DB_ENV *dbenv;
72     int lockfd, flags;
73     char lock_file[MAXPATHLEN + 1];
74 } CNID_private;
75
76 /* XXX stuff below is outdate */
77 /* on-disk data format (in network byte order where appropriate) --
78  * db_cnid:      (key: cnid)
79  * name          size (in bytes)
80  * dev           4
81  * ino           4
82  * did           4
83  * unix name     strlen(name) + 1 
84  *
85  * db_didname:   (key: did/unix name)
86  * -- this also caches the bits of .AppleDouble used by FPGetFilDirParam
87  *    so that we don't have to open the header file.
88  *    NOTE: FPCatSearch has to search through all of the directories as
89  *          this stuff doesn't get entered until needed.
90  *          if the entire volume is in the database, though, we can use
91  *          cursor operations to make this faster.
92  *
93  *    version number is stored with did/name key of 0/0
94  *
95  * cnid          4
96  * modfiller     4 (dates only use 4 bytes right now, but we leave space 
97  * moddate       4  for 8. moddate is also used to keep this info 
98  * createfiller  4  up-to-date.)
99  * createdate    4
100  * backfiller    4
101  * backupdate    4
102  * accfiller     4 (unused)
103  * accdate       4 (unused)
104  * AFP info      4 (stores a couple permission bits as well)
105  * finder info   32
106  * prodos info   8
107  * rforkfiller   4
108  * rforklen      4
109  * macname       32 (nul-terminated)
110  * shortname     12 (nul-terminated)
111  * longname      longnamelen (nul-terminated)
112  * ---------------
113  *             132 bytes + longnamelen
114  * 
115  * db_devino:    (key: dev/ino) 
116  * -- this is only used for consistency checks and isn't 1-1
117  * cnid          4 
118  *
119  * these correspond to the different path types. longname is for the
120  * 255 unicode character names (path type == ?), macname is for the
121  * 32-character names (path type == 2), and shortname is for the
122  * 8+3-character names (path type == 1).
123  *
124  * db_longname: (key: did/longname)
125  * name          namelen = strlen(name) + 1
126  *
127  * db_macname:   (key: did/macname)
128  * name          namelen = strlen(name) + 1
129  *
130  * db_shortname: (key: did/shortname)
131  * name namelen = strlen(name) + 1 
132  */
133
134 /* construct db_cnid data. NOTE: this is not re-entrant.  */
135 extern unsigned char *make_cnid_data (u_int32_t flags, const struct stat *,const cnid_t ,
136                                        const char *, const size_t );
137
138 #endif /* atalk/cnid/cnid_private.h */