[virt-tools-list] [PATCH 1/2] RFC: remote-viewer: learn '-' as URI for standard input connection file
Victor Toso
victortoso at redhat.com
Mon Nov 13 13:41:36 UTC 2017
Hi,
On Fri, Jul 28, 2017 at 08:43:44PM +0200, marcandre.lureau at redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau at redhat.com>
>
> Some users want the ability to set connection details without writing
> to a file or passing command line arguments.
>
> Learn to read the connection file from standard input for such use
> case.
>
> This allows a parent process to set the connection details without
> intermediary file.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
Small comments below but okay with the idea
> ---
> man/remote-viewer.pod | 3 +++
> src/remote-viewer.c | 32 +++++++++++++++++++++++++++-----
> src/virt-viewer-file.c | 31 +++++++++++++++++++++++++------
> src/virt-viewer-file.h | 2 ++
> 4 files changed, 57 insertions(+), 11 deletions(-)
>
> diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod
> index 60ea3a6..8428c80 100644
> --- a/man/remote-viewer.pod
> +++ b/man/remote-viewer.pod
> @@ -18,6 +18,9 @@ entry and a list of previously successfully accessed URI.
> The URI can also point to a connection settings file, see the CONNECTION FILE
> section for a description of the format.
>
> +If URI is '-', then remote-viewer will read the standard input as a
> +connection settings file and attempt to connect using it.
> +
> =head1 OPTIONS
>
> The following options are accepted when running C<remote-viewer>:
> diff --git a/src/remote-viewer.c b/src/remote-viewer.c
> index b132214..39fe9c3 100644
> --- a/src/remote-viewer.c
> +++ b/src/remote-viewer.c
> @@ -1080,6 +1080,18 @@ remote_viewer_session_connected(VirtViewerSession *session,
> g_free(uri);
> }
>
> +static gchar *
> +read_all_stdin(gsize *len)
I would suggest to pass an GError ** as parameter...
> +{
> + GIOChannel *ioc = g_io_channel_unix_new(fileno(stdin));
Docs says we should avoid using this function on Windows but I guess it
should be fine with plain stdin.
> + gchar *content = NULL;
> +
> + g_io_channel_read_to_end(ioc, &content, len, NULL);
Pass the GError here and return NULL if return value is different then
G_IO_STATUS_NORMAL
> + g_io_channel_unref(ioc);
> +
> + return content;
> +}
> +
> static gboolean
> remote_viewer_start(VirtViewerApp *app, GError **err)
> {
> @@ -1134,11 +1146,21 @@ retry_dialog:
>
> g_debug("Opening display to %s", guri);
>
> - file = g_file_new_for_commandline_arg(guri);
> - if (g_file_query_exists(file, NULL)) {
> - gchar *path = g_file_get_path(file);
> - vvfile = virt_viewer_file_new(path, &error);
> - g_free(path);
> + if (!g_strcmp0(guri, "-")) {
> + gsize len = 0;
> + gchar *buf = read_all_stdin(&len);
> + vvfile = virt_viewer_file_new_from_buffer(buf, len, &error);
> + g_free(buf);
I guess that in case of errors reading stdin, we might want to
goto cleanup that could happen below...
> + } else {
> + file = g_file_new_for_commandline_arg(guri);
> + if (g_file_query_exists(file, NULL)) {
> + gchar *path = g_file_get_path(file);
> + vvfile = virt_viewer_file_new(path, &error);
> + g_free(path);
> + }
> + }
> +
> + if (vvfile) {
Before this patch, in case of error we would goto cleanup, maybe its
better to keep it that way.
if (error) {
} else if (vvfile) {
} else if (virt_viewer_util_extract_host(...) < 0 || type == NULL) {
}
> if (error) {
> g_prefix_error(&error, _("Invalid file %s: "), guri);
> g_warning("%s", error->message);
> diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c
> index 9ff2a05..a511f21 100644
> --- a/src/virt-viewer-file.c
> +++ b/src/virt-viewer-file.c
> @@ -139,16 +139,15 @@ enum {
> };
>
> VirtViewerFile*
> -virt_viewer_file_new(const gchar* location, GError** error)
> +virt_viewer_file_new_from_buffer(const gchar* data, gsize len,
> + GError** error)
> {
> GError* inner_error = NULL;
> -
> - g_return_val_if_fail (location != NULL, NULL);
> -
g_return_val_if_fail (data != NULL, NULL);
> VirtViewerFile* self = VIRT_VIEWER_FILE(g_object_new(VIRT_VIEWER_TYPE_FILE, NULL));
> GKeyFile* keyfile = self->priv->keyfile;
>
> - g_key_file_load_from_file(keyfile, location,
> +
> + g_key_file_load_from_data(keyfile, data, len,
> G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS,
> &inner_error);
> if (inner_error != NULL) {
> @@ -166,7 +165,27 @@ virt_viewer_file_new(const gchar* location, GError** error)
> return NULL;
> }
>
> - if (virt_viewer_file_get_delete_this_file(self) &&
> + return self;
> +}
> +
> +VirtViewerFile*
> +virt_viewer_file_new(const gchar* location, GError** error)
> +{
> + VirtViewerFile *self;
> + gchar *buf;
> + gsize len;
> +
> + g_return_val_if_fail (location != NULL, NULL);
> +
> + if (!g_file_get_contents(location, &buf, &len, error)) {
> + return NULL;
> + }
> +
> + self = virt_viewer_file_new_from_buffer(buf, len, error);
> + g_free(buf);
> +
> +
> + if (self && virt_viewer_file_get_delete_this_file(self) &&
> !g_getenv("VIRT_VIEWER_KEEP_FILE")) {
> if (g_unlink(location) != 0)
> g_warning("failed to remove %s", location);
> diff --git a/src/virt-viewer-file.h b/src/virt-viewer-file.h
> index 6b783f9..15c61d0 100644
> --- a/src/virt-viewer-file.h
> +++ b/src/virt-viewer-file.h
> @@ -50,6 +50,8 @@ struct _VirtViewerFileClass
> GType virt_viewer_file_get_type(void);
>
> VirtViewerFile* virt_viewer_file_new(const gchar* path, GError** error);
> +VirtViewerFile* virt_viewer_file_new_from_buffer(const gchar* buf, gsize len,
> + GError** error);
> gboolean virt_viewer_file_is_set(VirtViewerFile* self, const gchar* key);
>
> gchar* virt_viewer_file_get_ca(VirtViewerFile* self);
> --
> 2.14.0.rc0.1.g40ca67566
Reviewed-by: Victor Toso <victortoso at redhat.com>
Cheers,
Victor
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/virt-tools-list/attachments/20171113/f019248d/attachment.sig>
More information about the virt-tools-list
mailing list