[libvirt] [PATCH] libvirtd: create run dir when running at non-root user
Xu He Jie
xuhj at linux.vnet.ibm.com
Wed Aug 31 02:10:40 UTC 2011
Hi, Eric
This patch is second version, but I forgot adding patch version at
mail's title. Should I send this patch with correct title again? :)
And thanks for your patch review and reply.
于 2011年08月29日 10:52, xuhj at linux.vnet.ibm.com 写道:
> From: Xu He Jie <xuhj at linux.vnet.ibm.com>
>
>
> Signed-off-by: Xu He Jie <xuhj at linux.vnet.ibm.com>
>
> 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
>
> ---
> daemon/libvirtd.c | 46 ++++++++++++++++++++++++++++++++--------------
> 1 files changed, 32 insertions(+), 14 deletions(-)
>
> diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
> index 423c3d7..e0004c7 100644
> --- a/daemon/libvirtd.c
> +++ b/daemon/libvirtd.c
> @@ -1249,6 +1249,7 @@ int main(int argc, char **argv) {
> bool privileged = geteuid() == 0 ? true : false;
> bool implicit_conf = false;
> bool use_polkit_dbus;
> + char *run_dir = NULL;
>
> struct option opts[] = {
> { "verbose", no_argument, &verbose, 1},
> @@ -1403,21 +1404,35 @@ 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");
> + if (!run_dir) {
> + VIR_ERROR(_("Can't allocate memory"));
> + goto cleanup;
> + }
> + }
> + else {
> + char *user_dir = NULL;
> +
> + if (!(user_dir = virGetUserDirectory(geteuid()))) {
> + VIR_ERROR(_("Can't determine user directory"));
> + goto cleanup;
> + }
> +
> + if (virAsprintf(&run_dir, "%s/.libvirt/", user_dir) < 0) {
> + VIR_ERROR(_("Can't allocate memory"));
> + VIR_FREE(user_dir);
> + goto cleanup;
> }
> - umask(old_umask);
> +
> + VIR_FREE(user_dir);
> + }
> +
> + 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;
> }
>
> /* Try to claim the pidfile, exiting if we can't */
> @@ -1571,6 +1586,9 @@ cleanup:
> VIR_FREE(sock_file_ro);
> VIR_FREE(pid_file);
> VIR_FREE(remote_config_file);
> + if (run_dir)
> + VIR_FREE(run_dir);
> +
> daemonConfigFree(config);
> virLogShutdown();
>
More information about the libvir-list
mailing list