2 * $Id: cnid_hash_open.c,v 1.2 2005-04-28 20:50:01 bfernhomberg Exp $
4 * Copyright (c) 1999. Adrian Sun (asun@zoology.washington.edu)
5 * All Rights Reserved. See COPYRIGHT.
12 #ifdef CNID_BACKEND_HASH
13 #include <sys/param.h>
15 #include "cnid_hash.h"
16 #include <atalk/logger.h>
18 #define DBHOME ".AppleDB"
19 #define DBNAME "private_tdb.%sX"
23 static struct _cnid_db *cnid_hash_new(const char *volpath)
26 struct _cnid_hash_private *priv;
28 if ((cdb = (struct _cnid_db *) calloc(1, sizeof(struct _cnid_db))) == NULL)
31 if ((cdb->volpath = strdup(volpath)) == NULL) {
36 if ((cdb->_private = calloc(1, sizeof(struct _cnid_hash_private))) == NULL) {
42 /* Set up private state */
43 priv = (struct _cnid_hash_private *) (cdb->_private);
45 /* Set up standard fields */
46 cdb->flags = CNID_FLAG_PERSISTENT;
48 cdb->cnid_add = cnid_hash_add;
49 cdb->cnid_delete = cnid_hash_delete;
50 cdb->cnid_get = cnid_hash_get;
51 cdb->cnid_lookup = cnid_hash_lookup;
52 cdb->cnid_nextid = NULL; /*cnid_hash_nextid;*/
53 cdb->cnid_resolve = cnid_hash_resolve;
54 cdb->cnid_update = cnid_hash_update;
55 cdb->cnid_close = cnid_hash_close;
60 /* ---------------------------- */
61 struct _cnid_db *cnid_hash_open(const char *dir, mode_t mask)
65 struct _cnid_hash_private *db;
67 char path[MAXPATHLEN + 1];
73 if ((len = strlen(dir)) > (MAXPATHLEN - DBLEN - 1)) {
74 LOG(log_error, logtype_default, "cnid_open: Pathname too large: %s", dir);
78 if ((cdb = cnid_hash_new(dir)) == NULL) {
79 LOG(log_error, logtype_default, "cnid_open: Unable to allocate memory for hash");
83 if (path[len - 1] != '/') {
88 strcpy(path + len, DBHOME);
89 if ((stat(path, &st) < 0) && (ad_mkdir(path, 0777 & ~mask) < 0)) {
90 LOG(log_error, logtype_default, "cnid_open: DBHOME mkdir failed for %s", path);
95 path[len + DBHOMELEN] = '\0';
97 db = (struct _cnid_hash_private *)cdb->_private;
98 db->tdb = tdb_open(path, 0, TDB_CLEAR_IF_FIRST | TDB_INTERNAL, O_RDWR | O_CREAT | O_TRUNC, 0600);
100 LOG(log_error, logtype_default, "cnid_open: unable to open tdb", path);
114 struct _cnid_module cnid_hash_module = {
121 #endif /* CNID_BACKEND_HASH */