From: Xu He Jie Date: Mon, 29 Aug 2011 02:52:23 +0000 (+0800) Subject: libvirtd: create run dir when running at non-root user X-Git-Tag: v0.9.5-rc1~99 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bf71201865f6403bc0823f83413d9d7befb03631;p=thirdparty%2Flibvirt.git libvirtd: create run dir when running at non-root user 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 Signed-off-by: Eric Blake --- diff --git a/AUTHORS b/AUTHORS index 3dc34e9dc8..faec2182f9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -192,6 +192,7 @@ Patches have also been contributed by: Tom Vijlbrief Shradha Shah Steve Hodgson + Xu He Jie [....send patches to get your name here....] diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c index 423c3d7ea9..7734ffff07 100644 --- a/daemon/libvirtd.c +++ b/daemon/libvirtd.c @@ -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();