]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/cnid/cnid.c
allow more values in cnid_open flags parameter
[netatalk.git] / libatalk / cnid / cnid.c
index ead06ac53ae079e4334ad008b2ef210f34ed7979..58aa780c452623ea9487db8902de620b86dab3de 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * $Id: cnid.c,v 1.3 2005-05-03 14:55:12 didg Exp $
+ * $Id: cnid.c,v 1.8 2009-11-24 11:40:11 didg Exp $
  *
  * Copyright (c) 2003 the Netatalk Team
  * Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
@@ -37,7 +37,6 @@ static struct list_head modules = ATALK_LIST_HEAD_INIT(modules);
 
 static sigset_t sigblockset;
 static const struct itimerval none = {{0, 0}, {0, 0}};
-static struct itimerval savetimer;
 
 /* Registers new CNID backend module. */
 
@@ -98,8 +97,8 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla
     struct _cnid_db *db;
     cnid_module *mod = NULL;
     struct list_head *ptr;
-    uid_t uid;  /* uninitialized, OK 310105 */
-    gid_t gid;
+    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)) {
@@ -144,7 +143,7 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla
         return NULL;
     }
     /* FIXME should module know about it ? */
-    if (flags) {
+    if ((flags & CNID_FLAG_NODEV)) {
         db->flags |= CNID_FLAG_NODEV;
     }
     db->flags |= mod->flags;
@@ -154,6 +153,7 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla
         sigaddset(&sigblockset, SIGTERM);
         sigaddset(&sigblockset, SIGHUP);
         sigaddset(&sigblockset, SIGUSR1);
+        sigaddset(&sigblockset, SIGUSR2);
         sigaddset(&sigblockset, SIGALRM);
     }
 
@@ -165,7 +165,6 @@ static void block_signal( u_int32_t flags)
 {
     if ((flags & CNID_FLAG_BLOCK)) {
         sigprocmask(SIG_BLOCK, &sigblockset, NULL);
-        setitimer(ITIMER_REAL, &none, &savetimer);
     }
 }
 
@@ -173,7 +172,6 @@ static void block_signal( u_int32_t flags)
 static void unblock_signal(u_int32_t flags)
 {
     if ((flags & CNID_FLAG_BLOCK)) {
-        setitimer(ITIMER_REAL, &savetimer, NULL);
         sigprocmask(SIG_UNBLOCK, &sigblockset, NULL);
     }
 }
@@ -270,6 +268,10 @@ char *ret;
     block_signal(cdb->flags);
     ret = cdb->cnid_resolve(cdb, id, buffer, len);
     unblock_signal(cdb->flags);
+    if (ret && !strcmp(ret, "..")) {
+        LOG(log_error, logtype_afpd, "cnid_resolve: name is '..', corrupted db? ");
+        ret = NULL;
+    }
     return ret;
 }