[Spice-devel] [PATCH vdagent-linux] vdagentd: parse argv using GLib
Victor Toso
victortoso at redhat.com
Wed Sep 19 07:36:45 UTC 2018
Hi,
Sorry that I missed this v2
On Tue, Sep 04, 2018 at 03:49:18PM +0200, Jakub Janků wrote:
> All command line options now have long names
> as they are required by GLib.
>
> So the supported command line options now are:
>
> -h, --help
>
> -d, --debug
> -s, --virtio-serial-port-path
> -S, --vdagentd-socket
> -u, --uinput-device
> -f, --fake-uinput
> -x, --foreground
> -o, --one-session
> -X, --disable-session-integration
>
> Change the types of some global variables that hold the options:
> - const char * --> gchar *
> - int --> gboolean
>
> Define DEFAULT_UINPUT_DEVICE as "/dev/uinput",
> since there's already DEFAULT_VIRTIO_PORT_PATH, VDAGENTD_SOCKET.
>
> Signed-off-by: Jakub Janků <jjanku at redhat.com>
> ---
> src/vdagentd/vdagentd.c | 149 ++++++++++++++++++++++------------------
> 1 file changed, 82 insertions(+), 67 deletions(-)
>
> diff --git a/src/vdagentd/vdagentd.c b/src/vdagentd/vdagentd.c
> index 438e9ee..adfaf39 100644
> --- a/src/vdagentd/vdagentd.c
> +++ b/src/vdagentd/vdagentd.c
> @@ -48,6 +48,8 @@
> #include "virtio-port.h"
> #include "session-info.h"
>
> +#define DEFAULT_UINPUT_DEVICE "/dev/uinput"
> +
> struct agent_data {
> char *session;
> int width;
> @@ -58,12 +60,16 @@ struct agent_data {
>
> /* variables */
> static const char *pidfilename = "/var/run/spice-vdagentd/spice-vdagentd.pid";
> -static const char *portdev = DEFAULT_VIRTIO_PORT_PATH;
> -static const char *vdagentd_socket = VDAGENTD_SOCKET;
> -static const char *uinput_device = "/dev/uinput";
> +
> +static gchar *portdev = NULL;
> +static gchar *vdagentd_socket = NULL;
> +static gchar *uinput_device = NULL;
> static int debug = 0;
> -static int uinput_fake = 0;
> -static int only_once = 0;
> +static gboolean uinput_fake = FALSE;
> +static gboolean only_once = FALSE;
> +static gboolean do_daemonize = TRUE;
> +static gboolean want_session_info = TRUE;
> +
> static struct udscs_server *server = NULL;
> static struct vdagent_virtio_port *virtio_port = NULL;
> static GHashTable *active_xfers = NULL;
> @@ -960,29 +966,6 @@ static void agent_read_complete(struct udscs_connection **connp,
>
> /* main */
>
> -static void usage(FILE *fp)
> -{
> - fprintf(fp,
> - "Usage: spice-vdagentd [OPTIONS]\n\n"
> - "Spice guest agent daemon, version %s.\n\n"
> - "Options:\n"
> - " -h print this text\n"
> - " -d log debug messages (use twice for extra info)\n"
> - " -s <port> set virtio serial port [%s]\n"
> - " -S <filename> set vdagent Unix domain socket [%s]\n"
> - " -u <dev> set uinput device [%s]\n"
> - " -f treat uinput device as fake; no ioctls\n"
> - " -x don't daemonize\n"
> - " -o only handle one virtio serial session\n"
> -#ifdef HAVE_CONSOLE_KIT
> - " -X disable console kit integration\n"
> -#endif
> -#ifdef HAVE_LIBSYSTEMD_LOGIN
> - " -X disable systemd-logind integration\n"
> -#endif
> - ,VERSION, portdev, vdagentd_socket, uinput_device);
> -}
> -
> static void daemonize(void)
> {
> int x;
> @@ -1081,52 +1064,80 @@ static void quit_handler(int sig)
> quit = 1;
> }
>
> +static gboolean parse_debug_level_cb(const gchar *option_name,
> + const gchar *value,
> + gpointer data,
> + GError **error)
> +{
> + debug++;
> + return TRUE;
> +}
> +
> +static GOptionEntry cmd_entries[] = {
> + { "debug", 'd', G_OPTION_FLAG_NO_ARG,
> + G_OPTION_ARG_CALLBACK, parse_debug_level_cb,
> + "Log debug messages (use twice for extra info)", NULL },
> +
> + { "virtio-serial-port-path", 's', 0,
> + G_OPTION_ARG_STRING, &portdev,
> + "Set virtio-serial path (" DEFAULT_VIRTIO_PORT_PATH ")", NULL },
^
~~~~~~~ extra space ~~~~~~~~~~~~~ ^
> +
> + { "vdagentd-socket", 'S', 0,
> + G_OPTION_ARG_STRING, &vdagentd_socket,
> + "Set spice-vdagentd socket (" VDAGENTD_SOCKET ")", NULL },
> +
> + { "uinput-device", 'u', 0,
> + G_OPTION_ARG_STRING, &uinput_device,
> + "Set uinput device (" DEFAULT_UINPUT_DEVICE ")", NULL },
> +
> + { "fake-uinput", 'f', 0,
> + G_OPTION_ARG_NONE, &uinput_fake,
> + "Treat uinput device as fake; no ioctls", NULL },
> +
> + { "foreground", 'x', G_OPTION_FLAG_REVERSE,
> + G_OPTION_ARG_NONE, &do_daemonize,
> + "Do not daemonize the agent", NULL},
> +
> + { "one-session", 'o', 0,
> + G_OPTION_ARG_NONE, &only_once,
> + "Only handle one virtio serial session", NULL },
> +
> +#if defined(HAVE_CONSOLE_KIT) || defined (HAVE_LIBSYSTEMD_LOGIN)
> + { "disable-session-integration", 'X', G_OPTION_FLAG_REVERSE,
> + G_OPTION_ARG_NONE, &want_session_info,
> + "Disable console kit and systemd-logind integration", NULL },
> +#endif
> +
> + { NULL }
> +};
> +
> int main(int argc, char *argv[])
> {
> - int c;
> - int do_daemonize = 1;
> - int want_session_info = 1;
> + GOptionContext *context;
> + GError *err = NULL;
> struct sigaction act;
> gboolean own_socket = TRUE;
>
> - for (;;) {
> - if (-1 == (c = getopt(argc, argv, "-dhxXfos:u:S:")))
> - break;
> - switch (c) {
> - case 'd':
> - debug++;
> - break;
> - case 's':
> - portdev = optarg;
> - break;
> - case 'S':
> - vdagentd_socket = optarg;
> - break;
> - case 'u':
> - uinput_device = optarg;
> - break;
> - case 'f':
> - uinput_fake = 1;
> - break;
> - case 'o':
> - only_once = 1;
> - break;
> - case 'x':
> - do_daemonize = 0;
> - break;
> - case 'X':
> - want_session_info = 0;
> - break;
> - case 'h':
> - usage(stdout);
> - return 0;
> - default:
> - fputs("\n", stderr);
> - usage(stderr);
> - return 1;
> - }
> + context = g_option_context_new(NULL);
> + g_option_context_add_main_entries(context, cmd_entries, NULL);
> + g_option_context_set_summary(context,
> + "Spice guest agent daemon, version " VERSION);
> + g_option_context_parse(context, &argc, &argv, &err);
> + g_option_context_free(context);
> +
> + if (err) {
> + g_printerr("Invalid arguments, %s\n", err->message);
> + g_error_free(err);
> + return 1;
> }
>
> + if (portdev == NULL)
> + portdev = g_strdup(DEFAULT_VIRTIO_PORT_PATH);
> + if (vdagentd_socket == NULL)
> + vdagentd_socket = g_strdup(VDAGENTD_SOCKET);
> + if (uinput_device == NULL)
> + uinput_device = g_strdup(DEFAULT_UINPUT_DEVICE);
> +
I've added {} to the new checks above to comply with coding
style and pushed this.
Acked-by: Victor Toso <victortoso at redhat.com>
https://gitlab.freedesktop.org/spice/linux/vd_agent/commit/8df6120b7fa0bfa4129
Thanks,
Victor
> memset(&act, 0, sizeof(act));
> act.sa_flags = SA_RESTART;
> act.sa_handler = quit_handler;
> @@ -1223,5 +1234,9 @@ int main(int argc, char *argv[])
> if (do_daemonize)
> unlink(pidfilename);
>
> + g_free(portdev);
> + g_free(vdagentd_socket);
> + g_free(uinput_device);
> +
> return retval;
> }
> --
> 2.17.1
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20180919/fa50fceb/attachment.sig>
More information about the Spice-devel
mailing list