]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/cnid/cnid.c
Merge branch-2-1
[netatalk.git] / libatalk / cnid / cnid.c
index 86b9594fbed6b59fbb9330ab18605b00034675c3..ca2190e5485ad274c3b8aa45ee76b73b9135baaa 100644 (file)
@@ -1,6 +1,4 @@
 /* 
- * $Id: cnid.c,v 1.10 2009-11-24 15:44:56 didg Exp $
- *
  * Copyright (c) 2003 the Netatalk Team
  * Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
  * 
@@ -92,14 +90,15 @@ static int cnid_dir(const char *dir, mode_t mask)
 }
 
 /* Opens CNID database using particular back-end */
-struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int flags)
+struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int flags,
+                           const char *cnidsrv, const char *cnidport)
 {
     struct _cnid_db *db;
     cnid_module *mod = NULL;
     struct list_head *ptr;
     uid_t uid = -1;  
     gid_t gid = -1;
-    
+
     list_for_each(ptr, &modules) {
         if (0 == strcmp(list_entry(ptr, cnid_module, db_list)->name, type)) {
            mod = list_entry(ptr, cnid_module, db_list);
@@ -128,7 +127,8 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla
         }
     }
 
-    db = mod->cnid_open(volpath, mask, flags);
+    struct cnid_open_args args = {volpath, mask, flags, cnidsrv, cnidport};
+    db = mod->cnid_open(&args);
 
     if ((mod->flags & CNID_FLAG_SETUID) && !(flags & CNID_FLAG_MEMORY)) {
         seteuid(0);
@@ -164,7 +164,7 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla
 static void block_signal( u_int32_t flags)
 {
     if ((flags & CNID_FLAG_BLOCK)) {
-        sigprocmask(SIG_BLOCK, &sigblockset, NULL);
+        pthread_sigmask(SIG_BLOCK, &sigblockset, NULL);
     }
 }
 
@@ -172,8 +172,28 @@ static void block_signal( u_int32_t flags)
 static void unblock_signal(u_int32_t flags)
 {
     if ((flags & CNID_FLAG_BLOCK)) {
-        sigprocmask(SIG_UNBLOCK, &sigblockset, NULL);
+        pthread_sigmask(SIG_UNBLOCK, &sigblockset, NULL);
+    }
+}
+
+/* ------------------- 
+  protect against bogus value from the DB.
+  adddir really doesn't like 2
+*/
+static cnid_t valide(cnid_t id)
+{
+  if (id == CNID_INVALID)
+      return id;
+      
+  if (id < CNID_START) {
+    static int err = 0;
+    if (!err) {
+        err = 1;
+        LOG(log_error, logtype_afpd, "Error: Invalid cnid, corrupted DB?");
     }
+    return CNID_INVALID;
+  }
+  return id;
 }
 
 /* Closes CNID database. Currently it's just a wrapper around db->cnid_close(). */
@@ -194,12 +214,12 @@ u_int32_t flags;
 
 /* --------------- */
 cnid_t cnid_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did, 
-                       char *name, const size_t len, cnid_t hint)
+                const char *name, const size_t len, cnid_t hint)
 {
 cnid_t ret;
 
     block_signal(cdb->flags);
-    ret = cdb->cnid_add(cdb, st, did, name, len, hint);
+    ret = valide(cdb->cnid_add(cdb, st, did, name, len, hint));
     unblock_signal(cdb->flags);
     return ret;
 }
@@ -222,7 +242,7 @@ cnid_t cnid_get(struct _cnid_db *cdb, const cnid_t did, char *name,const size_t
 cnid_t ret;
 
     block_signal(cdb->flags);
-    ret = cdb->cnid_get(cdb, did, name, len);
+    ret = valide(cdb->cnid_get(cdb, did, name, len));
     unblock_signal(cdb->flags);
     return ret;
 }
@@ -255,7 +275,7 @@ cnid_t cnid_lookup(struct _cnid_db *cdb, const struct stat *st, const cnid_t did
 cnid_t ret;
 
     block_signal(cdb->flags);
-    ret = cdb->cnid_lookup(cdb, st, did, name, len);
+    ret = valide(cdb->cnid_lookup(cdb, st, did, name, len));
     unblock_signal(cdb->flags);
     return ret;
 }