2 * Copyright (c) 1999. Adrian Sun (asun@zoology.washington.edu)
3 * All Rights Reserved. See COPYRIGHT.
10 #ifdef CNID_BACKEND_TDB
11 #include <sys/param.h>
14 #include <atalk/logger.h>
15 #include <atalk/volume.h>
18 #define DBHOME ".AppleDB"
19 #define DBHOMELEN 9 /* strlen(DBHOME) +1 for / */
21 #define DBCNID "cnid2.tdb"
23 #define DBVERSION_KEY "\0\0\0\0Version"
24 #define DBVERSION_KEYLEN (sizeof(DBVERSION_KEY))
25 #define DBVERSION2 0x00000002U
26 #define DBVERSION DBVERSION2
28 static struct _cnid_db *cnid_tdb_new(struct vol *vol)
32 if ((cdb = (struct _cnid_db *) calloc(1, sizeof(struct _cnid_db))) == NULL)
35 cdb->cnid_db_vol = vol;
37 if ((cdb->cnid_db_private = calloc(1, sizeof(struct _cnid_tdb_private))) == NULL) {
42 /* Set up standard fields */
43 cdb->cnid_db_flags = CNID_FLAG_PERSISTENT;
45 cdb->cnid_add = cnid_tdb_add;
46 cdb->cnid_delete = cnid_tdb_delete;
47 cdb->cnid_get = cnid_tdb_get;
48 cdb->cnid_lookup = cnid_tdb_lookup;
49 cdb->cnid_nextid = NULL; /*cnid_tdb_nextid;*/
50 cdb->cnid_resolve = cnid_tdb_resolve;
51 cdb->cnid_update = cnid_tdb_update;
52 cdb->cnid_close = cnid_tdb_close;
53 cdb->cnid_wipe = NULL;
58 /* ---------------------------- */
59 struct _cnid_db *cnid_tdb_open(struct cnid_open_args *args)
63 struct _cnid_tdb_private *db;
65 char path[MAXPATHLEN + 1];
67 int hash_size = 131071;
69 struct vol *vol = args->cnid_args_vol;
71 if ((cdb = cnid_tdb_new(vol)) == NULL) {
72 LOG(log_error, logtype_default, "tdb_open: Unable to allocate memory for tdb");
76 if ((len = strlen(vol->v_path)) > (MAXPATHLEN - DBLEN - 1)) {
77 LOG(log_error, logtype_default, "tdb_open: Pathname too large: %s", vol->v_path);
81 strcpy(path, vol->v_path);
82 if (path[len - 1] != '/') {
87 strcpy(path + len, DBHOME);
88 if (!(args->cnid_args_flags & CNID_FLAG_MEMORY)) {
89 if ((stat(path, &st) < 0) && (ad_mkdir(path, 0777 & ~vol->v_umask) < 0)) {
90 LOG(log_error, logtype_default, "tdb_open: DBHOME mkdir failed for %s", path);
96 tdb_flags = TDB_INTERNAL;
100 db = (struct _cnid_tdb_private *)cdb->cnid_db_private;
102 path[len + DBHOMELEN] = '\0';
103 strcat(path, DBCNID);
105 db->tdb_cnid = tdb_open(path, hash_size, tdb_flags , O_RDWR | O_CREAT, 0666 & ~vol->v_umask);
107 LOG(log_error, logtype_default, "tdb_open: unable to open tdb", path);
111 db->tdb_didname = db->tdb_cnid;
112 db->tdb_devino = db->tdb_cnid;
114 /* Check for version. This way we can update the database if we need
115 * to change the format in any way. */
116 memset(&key, 0, sizeof(key));
117 memset(&data, 0, sizeof(data));
118 key.dptr = (unsigned char *)DBVERSION_KEY;
119 key.dsize = DBVERSION_KEYLEN;
121 data = tdb_fetch(db->tdb_didname, key);
123 uint32_t version = htonl(DBVERSION);
125 data.dptr = (unsigned char *)&version;
126 data.dsize = sizeof(version);
127 if (tdb_store(db->tdb_didname, key, data, TDB_REPLACE)) {
128 LOG(log_error, logtype_default, "tdb_open: Error putting new version");
139 free(cdb->cnid_db_private);
145 struct _cnid_module cnid_tdb_module = {
149 CNID_FLAG_SETUID | CNID_FLAG_BLOCK