[Spice-devel] [PATCH v3 6/6] Allow to specify a filter for record output
Marc-André Lureau
mlureau at redhat.com
Wed Aug 19 02:58:56 PDT 2015
Hi
----- Original Message -----
> This allows compressions using external programs or any type
> of filters.
>
The shell worked well for that already. Why do you need it?
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/red_record_qxl.c | 49
> +++++++++++++++++++++++++++++++++++++++++++++++++
> server/red_record_qxl.h | 2 ++
> server/red_worker.c | 2 +-
> 3 files changed, 52 insertions(+), 1 deletion(-)
>
> diff --git a/server/red_record_qxl.c b/server/red_record_qxl.c
> index d96fb79..d6b837c 100644
> --- a/server/red_record_qxl.c
> +++ b/server/red_record_qxl.c
> @@ -21,6 +21,8 @@
>
> #include <stdbool.h>
> #include <inttypes.h>
> +#include <fcntl.h>
> +#include <glib.h>
> #include "red_worker.h"
> #include "red_common.h"
> #include "red_memslots.h"
> @@ -825,3 +827,50 @@ void red_record_qxl_command(FILE *fd, RedMemSlotInfo
> *slots,
> break;
> }
> }
> +
> +static void out_setup(gpointer user_data)
> +{
> + int fd = GPOINTER_TO_INT(user_data);
> +
> + dup2(fd, 1);
> + close(fd);
> + fcntl(1, F_SETFD, 0);
> +}
> +
> +FILE *red_record_open_file(const char *record_filename)
> +{
> + const char *filter;
> + FILE *f;
> +
> + f = fopen(record_filename, "w+");
> + if (!f)
> + return NULL;
> +
> + filter = getenv("SPICE_WORKER_RECORD_FILTER");
> + if (filter) {
> + gint argc;
> + gchar **argv = NULL;
> + GError *error = NULL;
> + GPid child_pid;
> + gboolean ret;
> + gint fd_in;
> +
> + if (!g_shell_parse_argv(filter, &argc, &argv, &error)) {
> + fclose(f);
> + return NULL;
> + }
> +
> + ret = g_spawn_async_with_pipes(NULL, argv, NULL,
> G_SPAWN_SEARCH_PATH, out_setup,
> + GINT_TO_POINTER(fileno(f)),
> &child_pid,
> + &fd_in, NULL, NULL, &error);
> +
> + g_strfreev(argv);
> + if (!ret) {
> + fclose(f);
> + return NULL;
> + }
> + dup2(fd_in, fileno(f));
> + close(fd_in);
> + }
> + return f;
> +}
> diff --git a/server/red_record_qxl.h b/server/red_record_qxl.h
> index b737db8..0b74dc4 100644
> --- a/server/red_record_qxl.h
> +++ b/server/red_record_qxl.h
> @@ -31,4 +31,6 @@ void red_record_event(FILE *fd, int what, uint32_t type,
> unsigned long ts);
> void red_record_qxl_command(FILE *fd, RedMemSlotInfo *slots,
> QXLCommandExt ext_cmd, unsigned long ts);
>
> +FILE *red_record_open_file(const char *record_filename);
> +
> #endif
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 7d7858e..a80dc93 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -12107,7 +12107,7 @@ static void red_init(RedWorker *worker,
> WorkerInitData *init_data)
> if (record_filename) {
> static const char header[] = "SPICE_REPLAY 1\n";
>
> - worker->record_fd = fopen(record_filename, "w+");
> + worker->record_fd = red_record_open_file(record_filename);
> if (worker->record_fd == NULL) {
> spice_error("failed to open recording file %s\n",
> record_filename);
> }
> --
> 2.4.3
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
More information about the Spice-devel
mailing list