summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-04-05 15:08:44 +0200
committerHans de Goede <hdegoede@redhat.com>2013-04-09 11:54:25 +0200
commit71cf03fdcc82335c355be766c8765cf2a15e3e68 (patch)
treefeccfc168c88822a78c588a9c9aa9944f31dfb49 /src
parent9ac104389bd8002c269e738e178498f3c1110d30 (diff)
downloadvd_agent-71cf03fdcc82335c355be766c8765cf2a15e3e68.tar.gz
vd_agent-71cf03fdcc82335c355be766c8765cf2a15e3e68.tar.xz
vd_agent-71cf03fdcc82335c355be766c8765cf2a15e3e68.zip
vdagent: Open file xfer save dir on file xfer completion
When not saving to the Desktop we need a way for the user to discover where we've saved the file. This patch makes the session agent call xdg-open on the file xfer save dir when a file xfer has completed in this case. This is configurable from the cmdline by passing "-o 0" or "-o 1" Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/vdagent-file-xfers.c18
-rw-r--r--src/vdagent-file-xfers.h3
-rw-r--r--src/vdagent.c17
3 files changed, 32 insertions, 6 deletions
diff --git a/src/vdagent-file-xfers.c b/src/vdagent-file-xfers.c
index 1396e0a..8242a27 100644
--- a/src/vdagent-file-xfers.c
+++ b/src/vdagent-file-xfers.c
@@ -43,6 +43,7 @@ struct vdagent_file_xfers {
GHashTable *xfers;
struct udscs_connection *vdagentd;
char *save_dir;
+ int open_save_dir;
int debug;
};
@@ -52,6 +53,8 @@ typedef struct AgentFileXferTask {
uint64_t read_bytes;
char *file_name;
uint64_t file_size;
+ int file_xfer_nr;
+ int file_xfer_total;
int debug;
} AgentFileXferTask;
@@ -75,7 +78,8 @@ static void vdagent_file_xfer_task_free(gpointer data)
}
struct vdagent_file_xfers *vdagent_file_xfers_create(
- struct udscs_connection *vdagentd, const char *save_dir, int debug)
+ struct udscs_connection *vdagentd, const char *save_dir,
+ int open_save_dir, int debug)
{
struct vdagent_file_xfers *xfers;
@@ -84,6 +88,7 @@ struct vdagent_file_xfers *vdagent_file_xfers_create(
NULL, vdagent_file_xfer_task_free);
xfers->vdagentd = vdagentd;
xfers->save_dir = g_strdup(save_dir);
+ xfers->open_save_dir = open_save_dir;
xfers->debug = debug;
return xfers;
@@ -141,6 +146,11 @@ static AgentFileXferTask *vdagent_parse_start_msg(
error->message);
goto error;
}
+ /* These are set for xfers which are part of a multi-file xfer */
+ task->file_xfer_nr = g_key_file_get_integer(
+ keyfile, "vdagent-file-xfer", "file-xfer-nr", NULL);
+ task->file_xfer_total = g_key_file_get_integer(
+ keyfile, "vdagent-file-xfer", "file-xfer-total", NULL);
g_key_file_free(keyfile);
return task;
@@ -270,6 +280,12 @@ void vdagent_file_xfers_data(struct vdagent_file_xfers *xfers,
task->id, task->file_name);
close(task->file_fd);
task->file_fd = -1;
+ if (xfers->open_save_dir &&
+ task->file_xfer_nr == task->file_xfer_total) {
+ char buf[PATH_MAX];
+ snprintf(buf, PATH_MAX, "xdg-open '%s'&", xfers->save_dir);
+ status = system(buf);
+ }
status = VD_AGENT_FILE_XFER_STATUS_SUCCESS;
} else {
syslog(LOG_ERR, "file-xfer: error received too much data");
diff --git a/src/vdagent-file-xfers.h b/src/vdagent-file-xfers.h
index 81b7592..20783eb 100644
--- a/src/vdagent-file-xfers.h
+++ b/src/vdagent-file-xfers.h
@@ -27,7 +27,8 @@
struct vdagent_file_xfers;
struct vdagent_file_xfers *vdagent_file_xfers_create(
- struct udscs_connection *vdagentd, const char *save_dir, int debug);
+ struct udscs_connection *vdagentd, const char *save_dir,
+ int open_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 d2ba23e..aca500e 100644
--- a/src/vdagent.c
+++ b/src/vdagent.c
@@ -45,6 +45,7 @@
static const char *portdev = "/dev/virtio-ports/com.redhat.spice.0";
static int debug = 0;
static const char *fx_dir = NULL;
+static int fx_open_dir = -1;
static struct vdagent_x11 *x11 = NULL;
static struct vdagent_file_xfers *vdagent_file_xfers = NULL;
static struct udscs_connection *client = NULL;
@@ -103,7 +104,8 @@ 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, fx_dir, debug);
+ vdagent_file_xfers = vdagent_file_xfers_create(client, fx_dir,
+ fx_open_dir, debug);
break;
default:
syslog(LOG_ERR, "Unknown message from vdagentd type: %d, ignoring",
@@ -135,7 +137,8 @@ static void usage(FILE *fp)
" -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",
+ " -f <dir|xdg-desktop|xdg-download> file xfer save dir\n"
+ " -o <0:1> open dir on file xfer completion\n",
portdev);
}
@@ -179,7 +182,7 @@ int main(int argc, char *argv[])
struct sigaction act;
for (;;) {
- if (-1 == (c = getopt(argc, argv, "-dxhys:f:")))
+ if (-1 == (c = getopt(argc, argv, "-dxhys:f:o:")))
break;
switch (c) {
case 'd':
@@ -200,6 +203,9 @@ int main(int argc, char *argv[])
case 'f':
fx_dir = optarg;
break;
+ case 'o':
+ fx_open_dir = atoi(optarg);
+ break;
default:
usage(stderr);
return 1;
@@ -249,6 +255,8 @@ reconnect:
else
fx_dir = "xdg-download";
}
+ if (fx_open_dir == -1)
+ fx_open_dir = !vdagent_x11_has_icons_on_desktop(x11);
if (!strcmp(fx_dir, "xdg-desktop"))
fx_dir = g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP);
else if (!strcmp(fx_dir, "xdg-download"))
@@ -258,7 +266,8 @@ reconnect:
"warning could not get file xfer save dir, using cwd");
fx_dir = ".";
}
- vdagent_file_xfers = vdagent_file_xfers_create(client, fx_dir, debug);
+ vdagent_file_xfers = vdagent_file_xfers_create(client, fx_dir,
+ fx_open_dir, debug);
while (client && !quit) {
FD_ZERO(&readfds);