[libvirt] [PATCH] vbox: use user cache dir when screenshotting.

Dawid Zamirski dzamirski at datto.com
Mon Mar 9 15:07:46 UTC 2015


For VBOX it's most likely that the connection is vbox:///session and it
runs with local non-root account. This caused permission denied when
LOCALSTATEDIR was used to create temp file. This patch makes use of the
virGetUserCacheDirectory to address this problem for non-root users.
---
 src/vbox/vbox_common.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 55d3624..a548252 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -7254,8 +7254,10 @@ vboxDomainScreenshot(virDomainPtr dom,
     IMachine *machine = NULL;
     nsresult rc;
     char *tmp;
+    char *cacheDir;
     int tmp_fd = -1;
     unsigned int max_screen;
+    uid_t uid = geteuid();
     char *ret = NULL;
 
     if (!data->vboxObj)
@@ -7288,8 +7290,18 @@ vboxDomainScreenshot(virDomainPtr dom,
         return NULL;
     }
 
-    if (virAsprintf(&tmp, "%s/cache/libvirt/vbox.screendump.XXXXXX", LOCALSTATEDIR) < 0) {
+    if (uid != 0)
+        cacheDir = virGetUserCacheDirectory();
+    else {
+        if (virAsprintf(&cacheDir, "%s/cache/libvirt", LOCALSTATEDIR) < 0) {
+            VBOX_RELEASE(machine);
+            return NULL;
+        }
+    }
+
+    if (cacheDir && virAsprintf(&tmp, "%s/vbox.screendump.XXXXXX", cacheDir) < 0) {
         VBOX_RELEASE(machine);
+        VIR_FREE(cacheDir);
         return NULL;
     }
 
@@ -7368,6 +7380,7 @@ vboxDomainScreenshot(virDomainPtr dom,
     VIR_FORCE_CLOSE(tmp_fd);
     unlink(tmp);
     VIR_FREE(tmp);
+    VIR_FREE(cacheDir);
     VBOX_RELEASE(machine);
     vboxIIDUnalloc(&iid);
     return ret;
-- 
2.1.0




More information about the libvir-list mailing list