diff options
author | Hans de Goede <hdegoede@redhat.com> | 2013-04-05 14:42:56 +0200 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2013-04-09 11:54:25 +0200 |
commit | 9ac104389bd8002c269e738e178498f3c1110d30 (patch) | |
tree | dd19027ef5e80216cb1dfbe5e2302ace58cdf0dc | |
parent | 92dd6caa9f87a18ed2e985af44419cf9bf9991bb (diff) | |
download | vd_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.c | 13 | ||||
-rw-r--r-- | src/vdagent-file-xfers.h | 2 | ||||
-rw-r--r-- | src/vdagent.c | 41 |
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); |