]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
libvirtd: create run dir when running at non-root user
authorXu He Jie <xuhj@linux.vnet.ibm.com>
Mon, 29 Aug 2011 02:52:23 +0000 (10:52 +0800)
committerEric Blake <eblake@redhat.com>
Fri, 2 Sep 2011 02:32:10 +0000 (20:32 -0600)
When libvirtd is running at non-root user, it won't create ${HOME}/.libvirt.

It will show error message:
17:44:16.838: 7035: error : virPidFileAcquirePath:322 : Failed to open pid file

Signed-off-by: Xu He Jie <xuhj@linux.vnet.ibm.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
AUTHORS
daemon/libvirtd.c

diff --git a/AUTHORS b/AUTHORS
index 3dc34e9dc8d4019fe0dcd1ee88d01cc03f4baae7..faec2182f9e71e76a9fcdb97557d7201104c6986 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -192,6 +192,7 @@ Patches have also been contributed by:
   Tom Vijlbrief        <tom.vijlbrief@xs4all.nl>
   Shradha Shah         <sshah@solarflare.com>
   Steve Hodgson        <shodgson@solarflare.com>
+  Xu He Jie            <xuhj@linux.vnet.ibm.com>
 
   [....send patches to get your name here....]
 
index 423c3d7ea9c03ef5eebd9e74ae7225413121e856..7734ffff07f008eb424e0a37f90b8f51236db177 100644 (file)
@@ -1249,6 +1249,8 @@ int main(int argc, char **argv) {
     bool privileged = geteuid() == 0 ? true : false;
     bool implicit_conf = false;
     bool use_polkit_dbus;
+    char *run_dir = NULL;
+    mode_t old_umask;
 
     struct option opts[] = {
         { "verbose", no_argument, &verbose, 1},
@@ -1403,22 +1405,31 @@ int main(int argc, char **argv) {
 
     /* Ensure the rundir exists (on tmpfs on some systems) */
     if (privileged) {
-        const char *rundir = LOCALSTATEDIR "/run/libvirt";
-        mode_t old_umask;
-
-        old_umask = umask(022);
-        if (mkdir (rundir, 0755)) {
-            if (errno != EEXIST) {
-                char ebuf[1024];
-                VIR_ERROR(_("unable to create rundir %s: %s"), rundir,
-                          virStrerror(errno, ebuf, sizeof(ebuf)));
-                ret = VIR_DAEMON_ERR_RUNDIR;
-                umask(old_umask);
-                goto cleanup;
-            }
+        run_dir = strdup(LOCALSTATEDIR "/run/libvirt");
+    } else {
+        char *user_dir = virGetUserDirectory(geteuid());
+
+        if (!user_dir) {
+            VIR_ERROR(_("Can't determine user directory"));
+            goto cleanup;
         }
-        umask(old_umask);
+        ignore_value(virAsprintf(&run_dir, "%s/.libvirt/", user_dir));
+        VIR_FREE(user_dir);
     }
+    if (!run_dir) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    old_umask = umask(022);
+    if (virFileMakePath(run_dir) < 0) {
+        char ebuf[1024];
+        VIR_ERROR(_("unable to create rundir %s: %s"), run_dir,
+                  virStrerror(errno, ebuf, sizeof(ebuf)));
+        ret = VIR_DAEMON_ERR_RUNDIR;
+        goto cleanup;
+    }
+    umask(old_umask);
 
     /* Try to claim the pidfile, exiting if we can't */
     if ((pid_file_fd = virPidFileAcquirePath(pid_file, getpid())) < 0) {
@@ -1571,6 +1582,8 @@ cleanup:
     VIR_FREE(sock_file_ro);
     VIR_FREE(pid_file);
     VIR_FREE(remote_config_file);
+    VIR_FREE(run_dir);
+
     daemonConfigFree(config);
     virLogShutdown();