]> arthur.barton.de Git - netatalk.git/blobdiff - etc/cnid_dbd/main.c
Spotlight: SPARQL query optimisations
[netatalk.git] / etc / cnid_dbd / main.c
index edbe60f820ccc48a3d11bf8fc4a07cefc15a89b2..ddcf66743c8812273b16b3ad484466ecfbcfae2b 100644 (file)
 #include <sys/file.h>
 #include <arpa/inet.h>
 
-#include <atalk/cnid_dbd_private.h>
+#include <atalk/cnid_bdb_private.h>
 #include <atalk/logger.h>
 #include <atalk/errchk.h>
 #include <atalk/bstrlib.h>
+#include <atalk/bstradd.h>
 #include <atalk/netatalk_conf.h>
 #include <atalk/util.h>
 
@@ -216,7 +217,7 @@ static int delete_db(void)
 
     EC_ZERO( get_lock(LOCK_FREE, bdata(dbpath)) );
     EC_NEG1( cwd = open(".", O_RDONLY) );
-    chdir(bdata(dbpath));
+    chdir(cfrombstr(dbpath));
     system("rm -f cnid2.db lock log.* __db.*");
 
     if ((db_locked = get_lock(LOCK_EXCL, bdata(dbpath))) != LOCK_EXCL) {
@@ -227,8 +228,10 @@ static int delete_db(void)
     LOG(log_warning, logtype_cnid, "Recreated CNID BerkeleyDB databases of volume \"%s\"", vol->v_localname);
 
 EC_CLEANUP:
-    if (cwd != -1)
+    if (cwd != -1) {
         fchdir(cwd);
+        close(cwd);
+    }
     EC_EXIT;
 }
 
@@ -471,17 +474,27 @@ static void set_signal(void)
     }
 }
 
+static uid_t uid_from_name(const char *name)
+{
+    struct passwd *pwd;
+
+    pwd = getpwnam(name);
+    if (pwd == NULL)
+        return 0;
+    return pwd->pw_uid;
+}
+
 /* ------------------------ */
 int main(int argc, char *argv[])
 {
     EC_INIT;
     int delete_bdb = 0;
     int ctrlfd = -1, clntfd = -1;
-    char *logconfig;
     AFPObj obj = { 0 };
     char *volpath = NULL;
+    char *username = NULL;
 
-    while (( ret = getopt( argc, argv, "dF:l:p:t:vV")) != -1 ) {
+    while (( ret = getopt( argc, argv, ":dF:l:p:t:u:vV")) != -1 ) {
         switch (ret) {
         case 'd':
             /* this is now just ignored, as we do it automatically anyway */
@@ -499,10 +512,15 @@ int main(int argc, char *argv[])
         case 't':
             ctrlfd = atoi(optarg);
             break;
+        case 'u':
+            username = strdup(optarg);
+            break;
         case 'v':
         case 'V':
             printf("cnid_dbd (Netatalk %s)\n", VERSION);
             return -1;
+        case ':':
+            break;
         }
     }
 
@@ -513,7 +531,18 @@ int main(int argc, char *argv[])
 
     EC_ZERO( afp_config_parse(&obj, "cnid_dbd") );
 
-    EC_ZERO( load_volumes(&obj) );
+    if (username) {
+        strlcpy(obj.username, username, MAXUSERLEN);
+        obj.uid = uid_from_name(username);
+        if (!obj.uid) {
+            EC_FAIL_LOG("unknown user: '%s'", username);
+        }
+    }
+
+    LOG(log_debug, logtype_cnid, "user: %s, path %s",
+        username ? username : "-", volpath);
+
+    EC_ZERO( load_volumes(&obj, lv_all) );
     EC_NULL( vol = getvolbypath(&obj, volpath) );
     EC_ZERO( load_charset(vol) );
     pack_setvol(vol);