summaryrefslogtreecommitdiff
path: root/tools/gusb-main.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gusb-main.c')
-rw-r--r--tools/gusb-main.c51
1 files changed, 50 insertions, 1 deletions
diff --git a/tools/gusb-main.c b/tools/gusb-main.c
index a850877..234115c 100644
--- a/tools/gusb-main.c
+++ b/tools/gusb-main.c
@@ -1,6 +1,6 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
- * Copyright (C) 2011-2014 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2011-2016 Richard Hughes <richard@hughsie.com>
*
* Licensed under the GNU General Public License Version 2
*
@@ -356,6 +356,51 @@ gusb_cmd_watch (GUsbCmdPrivate *priv, gchar **values, GError **error)
}
/**
+ * gusb_cmd_replug:
+ **/
+static gboolean
+gusb_cmd_replug (GUsbCmdPrivate *priv, gchar **values, GError **error)
+{
+ GUsbDevice *device;
+ GUsbDevice *device_new;
+ guint16 vid, pid;
+
+ /* check args */
+ if (g_strv_length (values) != 2) {
+ g_set_error_literal (error, 1, 0,
+ "no VID:PID specified");
+ return FALSE;
+ }
+
+ /* get vid:pid */
+ vid = g_ascii_strtoull (values[0], NULL, 16);
+ pid = g_ascii_strtoull (values[1], NULL, 16);
+ device = g_usb_context_find_by_vid_pid (priv->usb_ctx,
+ vid, pid, error);
+ if (device == NULL)
+ return FALSE;
+
+ /* watch for debugging */
+ g_signal_connect (priv->usb_ctx, "device-added",
+ G_CALLBACK (gusb_device_list_added_cb),
+ priv);
+ g_signal_connect (priv->usb_ctx, "device-removed",
+ G_CALLBACK (gusb_device_list_removed_cb),
+ priv);
+
+ /* wait for replug */
+ device_new = g_usb_context_wait_for_replug (priv->usb_ctx,
+ device,
+ 5000,
+ error);
+ if (device_new == NULL)
+ return FALSE;
+
+ g_object_unref (device);
+ return TRUE;
+}
+
+/**
* gusb_cmd_run:
**/
static gboolean
@@ -444,6 +489,10 @@ main (int argc, char *argv[])
"watch",
"Watch devices as they come and go",
gusb_cmd_watch);
+ gusb_cmd_add (priv->cmd_array,
+ "replug",
+ "Watch a device as it reconnects",
+ gusb_cmd_replug);
/* sort by command name */
g_ptr_array_sort (priv->cmd_array,