提交 bf712018 编写于 作者: X Xu He Jie 提交者: Eric Blake

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: NXu He Jie <xuhj@linux.vnet.ibm.com>
Signed-off-by: NEric Blake <eblake@redhat.com>
上级 f0fe28cb
...@@ -192,6 +192,7 @@ Patches have also been contributed by: ...@@ -192,6 +192,7 @@ Patches have also been contributed by:
Tom Vijlbrief <tom.vijlbrief@xs4all.nl> Tom Vijlbrief <tom.vijlbrief@xs4all.nl>
Shradha Shah <sshah@solarflare.com> Shradha Shah <sshah@solarflare.com>
Steve Hodgson <shodgson@solarflare.com> Steve Hodgson <shodgson@solarflare.com>
Xu He Jie <xuhj@linux.vnet.ibm.com>
[....send patches to get your name here....] [....send patches to get your name here....]
......
...@@ -1249,6 +1249,8 @@ int main(int argc, char **argv) { ...@@ -1249,6 +1249,8 @@ int main(int argc, char **argv) {
bool privileged = geteuid() == 0 ? true : false; bool privileged = geteuid() == 0 ? true : false;
bool implicit_conf = false; bool implicit_conf = false;
bool use_polkit_dbus; bool use_polkit_dbus;
char *run_dir = NULL;
mode_t old_umask;
struct option opts[] = { struct option opts[] = {
{ "verbose", no_argument, &verbose, 1}, { "verbose", no_argument, &verbose, 1},
...@@ -1403,22 +1405,31 @@ int main(int argc, char **argv) { ...@@ -1403,22 +1405,31 @@ int main(int argc, char **argv) {
/* Ensure the rundir exists (on tmpfs on some systems) */ /* Ensure the rundir exists (on tmpfs on some systems) */
if (privileged) { if (privileged) {
const char *rundir = LOCALSTATEDIR "/run/libvirt"; run_dir = strdup(LOCALSTATEDIR "/run/libvirt");
mode_t old_umask; } else {
char *user_dir = virGetUserDirectory(geteuid());
old_umask = umask(022);
if (mkdir (rundir, 0755)) { if (!user_dir) {
if (errno != EEXIST) { VIR_ERROR(_("Can't determine user directory"));
char ebuf[1024]; goto cleanup;
VIR_ERROR(_("unable to create rundir %s: %s"), rundir,
virStrerror(errno, ebuf, sizeof(ebuf)));
ret = VIR_DAEMON_ERR_RUNDIR;
umask(old_umask);
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 */ /* Try to claim the pidfile, exiting if we can't */
if ((pid_file_fd = virPidFileAcquirePath(pid_file, getpid())) < 0) { if ((pid_file_fd = virPidFileAcquirePath(pid_file, getpid())) < 0) {
...@@ -1571,6 +1582,8 @@ cleanup: ...@@ -1571,6 +1582,8 @@ cleanup:
VIR_FREE(sock_file_ro); VIR_FREE(sock_file_ro);
VIR_FREE(pid_file); VIR_FREE(pid_file);
VIR_FREE(remote_config_file); VIR_FREE(remote_config_file);
VIR_FREE(run_dir);
daemonConfigFree(config); daemonConfigFree(config);
virLogShutdown(); virLogShutdown();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册