summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-04-05 14:42:56 +0200
committerHans de Goede <hdegoede@redhat.com>2013-04-09 11:54:25 +0200
commit9ac104389bd8002c269e738e178498f3c1110d30 (patch)
treedd19027ef5e80216cb1dfbe5e2302ace58cdf0dc
parent92dd6caa9f87a18ed2e985af44419cf9bf9991bb (diff)
downloadvd_agent-9ac104389bd8002c269e738e178498f3c1110d30.tar.gz
vd_agent-9ac104389bd8002c269e738e178498f3c1110d30.tar.xz
vd_agent-9ac104389bd8002c269e738e178498f3c1110d30.zip
vdagent: Add a cmdline option to select where to save file-xfers
The user can pass any arbitrary directory or the special values of "xdg-desktop" or "xdg-download" to select the default xdg Desktop resp xdg Download directories. If no value is specified the default is xdg-desktop when running under a Desktop Environment which has icons on the desktop and xdg-download on other Desktop Environments. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r--src/vdagent-file-xfers.c13
-rw-r--r--src/vdagent-file-xfers.h2
-rw-r--r--src/vdagent.c41
3 files changed, 38 insertions, 18 deletions
diff --git a/src/vdagent-file-xfers.c b/src/vdagent-file-xfers.c
index 2f0f3d3..1396e0a 100644
--- a/src/vdagent-file-xfers.c
+++ b/src/vdagent-file-xfers.c
@@ -42,6 +42,7 @@
struct vdagent_file_xfers {
GHashTable *xfers;
struct udscs_connection *vdagentd;
+ char *save_dir;
int debug;
};
@@ -74,7 +75,7 @@ static void vdagent_file_xfer_task_free(gpointer data)
}
struct vdagent_file_xfers *vdagent_file_xfers_create(
- struct udscs_connection *vdagentd, int debug)
+ struct udscs_connection *vdagentd, const char *save_dir, int debug)
{
struct vdagent_file_xfers *xfers;
@@ -82,6 +83,7 @@ struct vdagent_file_xfers *vdagent_file_xfers_create(
xfers->xfers = g_hash_table_new_full(g_direct_hash, g_direct_equal,
NULL, vdagent_file_xfer_task_free);
xfers->vdagentd = vdagentd;
+ xfers->save_dir = g_strdup(save_dir);
xfers->debug = debug;
return xfers;
@@ -90,6 +92,7 @@ struct vdagent_file_xfers *vdagent_file_xfers_create(
void vdagent_file_xfers_destroy(struct vdagent_file_xfers *xfers)
{
g_hash_table_destroy(xfers->xfers);
+ g_free(xfers->save_dir);
g_free(xfers);
}
@@ -156,7 +159,6 @@ void vdagent_file_xfers_start(struct vdagent_file_xfers *xfers,
{
AgentFileXferTask *task;
char *dir = NULL, *path = NULL, *file_path = NULL;
- const gchar *desktop;
struct stat st;
int i;
@@ -172,11 +174,8 @@ void vdagent_file_xfers_start(struct vdagent_file_xfers *xfers,
}
task->debug = xfers->debug;
- desktop = g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP);
- if (desktop == NULL) {
- goto error;
- }
- file_path = g_build_filename(desktop, task->file_name, NULL);
+
+ file_path = g_build_filename(xfers->save_dir, task->file_name, NULL);
dir = g_path_get_dirname(file_path);
if (g_mkdir_with_parents(dir, S_IRWXU) == -1) {
diff --git a/src/vdagent-file-xfers.h b/src/vdagent-file-xfers.h
index 79ff732..81b7592 100644
--- a/src/vdagent-file-xfers.h
+++ b/src/vdagent-file-xfers.h
@@ -27,7 +27,7 @@
struct vdagent_file_xfers;
struct vdagent_file_xfers *vdagent_file_xfers_create(
- struct udscs_connection *vdagentd, int debug);
+ struct udscs_connection *vdagentd, const char *save_dir, int debug);
void vdagent_file_xfers_destroy(struct vdagent_file_xfers *xfer);
void vdagent_file_xfers_start(struct vdagent_file_xfers *xfers,
diff --git a/src/vdagent.c b/src/vdagent.c
index 6f6b21d..d2ba23e 100644
--- a/src/vdagent.c
+++ b/src/vdagent.c
@@ -34,6 +34,7 @@
#include <sys/select.h>
#include <sys/stat.h>
#include <spice/vd_agent.h>
+#include <glib.h>
#include "udscs.h"
#include "vdagentd-proto.h"
@@ -43,6 +44,7 @@
static const char *portdev = "/dev/virtio-ports/com.redhat.spice.0";
static int debug = 0;
+static const char *fx_dir = NULL;
static struct vdagent_x11 *x11 = NULL;
static struct vdagent_file_xfers *vdagent_file_xfers = NULL;
static struct udscs_connection *client = NULL;
@@ -101,7 +103,7 @@ void daemon_read_complete(struct udscs_connection **connp,
break;
case VDAGENTD_CLIENT_DISCONNECTED:
vdagent_file_xfers_destroy(vdagent_file_xfers);
- vdagent_file_xfers = vdagent_file_xfers_create(client, debug);
+ vdagent_file_xfers = vdagent_file_xfers_create(client, fx_dir, debug);
break;
default:
syslog(LOG_ERR, "Unknown message from vdagentd type: %d, ignoring",
@@ -127,13 +129,14 @@ int client_setup(int reconnect)
static void usage(FILE *fp)
{
fprintf(fp,
- "vdagent -- spice agent xorg client\n"
- "options:\n"
- " -h print this text\n"
- " -d log debug messages\n"
- " -s <port> set virtio serial port [%s]\n"
- " -x don't daemonize\n",
- portdev);
+ "vdagent -- spice agent xorg client\n"
+ "options:\n"
+ " -h print this text\n"
+ " -d log debug messages\n"
+ " -s <port> set virtio serial port [%s]\n"
+ " -x don't daemonize\n"
+ " -f <dir|xdg-desktop|xdg-download> file xfer save dir\n",
+ portdev);
}
static void quit_handler(int sig)
@@ -176,7 +179,7 @@ int main(int argc, char *argv[])
struct sigaction act;
for (;;) {
- if (-1 == (c = getopt(argc, argv, "-dxhys:")))
+ if (-1 == (c = getopt(argc, argv, "-dxhys:f:")))
break;
switch (c) {
case 'd':
@@ -194,6 +197,9 @@ int main(int argc, char *argv[])
case 'h':
usage(stdout);
return 0;
+ case 'f':
+ fx_dir = optarg;
+ break;
default:
usage(stderr);
return 1;
@@ -237,7 +243,22 @@ reconnect:
return 1;
}
- vdagent_file_xfers = vdagent_file_xfers_create(client, debug);
+ if (!fx_dir) {
+ if (vdagent_x11_has_icons_on_desktop(x11))
+ fx_dir = "xdg-desktop";
+ else
+ fx_dir = "xdg-download";
+ }
+ if (!strcmp(fx_dir, "xdg-desktop"))
+ fx_dir = g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP);
+ else if (!strcmp(fx_dir, "xdg-download"))
+ fx_dir = g_get_user_special_dir(G_USER_DIRECTORY_DOWNLOAD);
+ if (!fx_dir) {
+ syslog(LOG_WARNING,
+ "warning could not get file xfer save dir, using cwd");
+ fx_dir = ".";
+ }
+ vdagent_file_xfers = vdagent_file_xfers_create(client, fx_dir, debug);
while (client && !quit) {
FD_ZERO(&readfds);