]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/cnid/tdb/cnid_tdb_open.c
Merge remote-tracking branch 'origin/branch-netatalk-3-1'
[netatalk.git] / libatalk / cnid / tdb / cnid_tdb_open.c
index 0aee5b4df5469ddbb3282c8d23d67f35f3bb3837..7e2558fe3c34fc13592f24e40df6ccd0a78c31e6 100644 (file)
@@ -12,6 +12,8 @@
 
 #include "cnid_tdb.h"
 #include <atalk/logger.h>
+#include <atalk/volume.h>
+
 #include <stdlib.h>
 #define DBHOME       ".AppleDB"
 #define DBHOMELEN    9                  /* strlen(DBHOME) +1 for / */
 #define DBVERSION2       0x00000002U
 #define DBVERSION        DBVERSION2
 
-static struct _cnid_db *cnid_tdb_new(const char *volpath)
+static struct _cnid_db *cnid_tdb_new(struct vol *vol)
 {
     struct _cnid_db *cdb;
-    struct _cnid_tdb_private *priv;
 
     if ((cdb = (struct _cnid_db *) calloc(1, sizeof(struct _cnid_db))) == NULL)
         return NULL;
 
-    if ((cdb->volpath = strdup(volpath)) == NULL) {
-        free(cdb);
-        return NULL;
-    }
+    cdb->cnid_db_vol = vol;
 
-    if ((cdb->_private = calloc(1, sizeof(struct _cnid_tdb_private))) == NULL) {
-        free(cdb->volpath);
+    if ((cdb->cnid_db_private = calloc(1, sizeof(struct _cnid_tdb_private))) == NULL) {
         free(cdb);
         return NULL;
     }
 
-    /* Set up private state */
-    priv = (struct _cnid_tdb_private *) (cdb->_private);
-
     /* Set up standard fields */
-    cdb->flags = CNID_FLAG_PERSISTENT;
+    cdb->cnid_db_flags = CNID_FLAG_PERSISTENT;
 
     cdb->cnid_add = cnid_tdb_add;
     cdb->cnid_delete = cnid_tdb_delete;
@@ -72,31 +66,27 @@ struct _cnid_db *cnid_tdb_open(struct cnid_open_args *args)
     TDB_DATA                  key, data;
     int                      hash_size = 131071;
     int                       tdb_flags = 0;
+    struct vol               *vol = args->cnid_args_vol;
 
-    if (!args->dir) {
-        /* note: dir and path are not used for in memory db */
+    if ((cdb = cnid_tdb_new(vol)) == NULL) {
+        LOG(log_error, logtype_default, "tdb_open: Unable to allocate memory for tdb");
         return NULL;
     }
 
-    if ((len = strlen(args->dir)) > (MAXPATHLEN - DBLEN - 1)) {
-        LOG(log_error, logtype_default, "tdb_open: Pathname too large: %s", args->dir);
-        return NULL;
-    }
-    
-    if ((cdb = cnid_tdb_new(args->dir)) == NULL) {
-        LOG(log_error, logtype_default, "tdb_open: Unable to allocate memory for tdb");
+    if ((len = strlen(vol->v_path)) > (MAXPATHLEN - DBLEN - 1)) {
+        LOG(log_error, logtype_default, "tdb_open: Pathname too large: %s", vol->v_path);
         return NULL;
     }
     
-    strcpy(path, args->dir);
+    strcpy(path, vol->v_path);
     if (path[len - 1] != '/') {
         strcat(path, "/");
         len++;
     }
  
     strcpy(path + len, DBHOME);
-    if (!(args->flags & CNID_FLAG_MEMORY)) {
-        if ((stat(path, &st) < 0) && (ad_mkdir(path, 0777 & ~args->mask) < 0)) {
+    if (!(args->cnid_args_flags & CNID_FLAG_MEMORY)) {
+        if ((stat(path, &st) < 0) && (ad_mkdir(path, 0777 & ~vol->v_umask) < 0)) {
             LOG(log_error, logtype_default, "tdb_open: DBHOME mkdir failed for %s", path);
             goto fail;
         }
@@ -107,12 +97,12 @@ struct _cnid_db *cnid_tdb_open(struct cnid_open_args *args)
     }
     strcat(path, "/");
  
-    db = (struct _cnid_tdb_private *)cdb->_private;
+    db = (struct _cnid_tdb_private *)cdb->cnid_db_private;
 
     path[len + DBHOMELEN] = '\0';
     strcat(path, DBCNID);
 
-    db->tdb_cnid = tdb_open(path, hash_size, tdb_flags , O_RDWR | O_CREAT, 0666 & ~args->mask);
+    db->tdb_cnid = tdb_open(path, hash_size, tdb_flags , O_RDWR | O_CREAT, 0666 & ~vol->v_umask);
     if (!db->tdb_cnid) {
         LOG(log_error, logtype_default, "tdb_open: unable to open tdb", path);
         goto fail;
@@ -146,8 +136,7 @@ struct _cnid_db *cnid_tdb_open(struct cnid_open_args *args)
     return cdb;
 
 fail:
-    free(cdb->_private);
-    free(cdb->volpath);
+    free(cdb->cnid_db_private);
     free(cdb);
     
     return NULL;