]> arthur.barton.de Git - netatalk.git/blobdiff - etc/cnid_dbd/cmd_dbd.c
Merge remote-tracking branch 'origin/branch-netatalk-3-1'
[netatalk.git] / etc / cnid_dbd / cmd_dbd.c
index 266b986ba00da9905c56777b4ac5dff6f50b4625..9e8e008ec0ce86da94d186f57309da9e002ae752 100644 (file)
@@ -25,6 +25,7 @@
 #include <signal.h>
 #include <string.h>
 #include <errno.h>
+#include <pwd.h>
 
 #include <atalk/logger.h>
 #include <atalk/globals.h>
@@ -92,7 +93,7 @@ static void set_signal(void)
 
 static void usage (void)
 {
-    printf("Usage: dbd [-cfFstvV] <path to netatalk volume>\n\n"
+    printf("Usage: dbd [-cfFstuvV] <path to netatalk volume>\n\n"
            "dbd scans all file and directories of AFP volumes, updating the\n"
            "CNID database of the volume. dbd must be run with appropiate\n"
            "permissions i.e. as root.\n\n"
@@ -103,6 +104,7 @@ static void usage (void)
            "   -F location of the afp.conf config file\n"
            "   -f delete and recreate CNID database\n"
            "   -t show statistics while running\n"
+           "   -u username for use with AFP volumes using user variable $u\n"
            "   -v verbose\n"
            "   -V show version info\n\n"
         );
@@ -136,9 +138,9 @@ int main(int argc, char **argv)
     AFPObj obj = { 0 };
     struct vol *vol = NULL;
     const char *volpath = NULL;
-
+    char *username = NULL;
     int c;
-    while ((c = getopt(argc, argv, ":cfF:rstvV")) != -1) {
+    while ((c = getopt(argc, argv, ":cfF:rstu:vV")) != -1) {
         switch(c) {
         case 'c':
             flags |= DBD_FLAGS_V2TOEA;
@@ -159,6 +161,9 @@ int main(int argc, char **argv)
         case 't':
             flags |= DBD_FLAGS_STATS;
             break;
+        case 'u':
+            username = strdup(optarg);
+            break;
         case 'v':
             flags |= DBD_FLAGS_VERBOSE;
             break;
@@ -203,6 +208,7 @@ int main(int argc, char **argv)
         exit(EXIT_FAILURE);
     }
 
+
     /* Initialize CNID subsystem */
     cnid_init();
 
@@ -212,6 +218,18 @@ int main(int argc, char **argv)
     else
         setuplog("default:note", "/dev/tty");
 
+    /* Set username */
+    if (username) {
+        strncpy(obj.username, username, MAXUSERLEN);
+        struct passwd *pwd;
+        pwd = getpwnam(obj.username);
+        if (!pwd) {
+            dbd_log( LOGSTD, "unknown user");
+            exit(EXIT_FAILURE);
+        }
+        obj.uid = pwd->pw_uid;
+    }
+
     if (load_volumes(&obj, lv_all) != 0) {
         dbd_log( LOGSTD, "Couldn't load volumes");
         exit(EXIT_FAILURE);
@@ -232,14 +250,9 @@ int main(int argc, char **argv)
         dbd_log(LOGSTD, "\"%s\" isn't a \"dbd\" CNID volume", vol->v_path);
         exit(EXIT_FAILURE);
     }
-    if ((vol->v_cdb = cnid_open(vol->v_path,
-                                0000,
-                                vol->v_cnidscheme,
-                                vol->v_flags & AFPVOL_NODEV ? CNID_FLAG_NODEV : 0,
-                                vol->v_cnidserver,
-                                vol->v_cnidport,
-                                &obj,
-                                vol->v_uuid)) == NULL) {
+    vol->v_cdb = cnid_open(vol, vol->v_cnidscheme,
+                           vol->v_flags & AFPVOL_NODEV ? CNID_FLAG_NODEV : 0);
+    if (vol->v_cdb == NULL) {
         dbd_log(LOGSTD, "Cant initialize CNID database connection for %s", vol->v_path);
         exit(EXIT_FAILURE);
     }