aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-02-12 23:14:01 +0100
committerAleksander Morgado <aleksander@aleksander.es>2021-02-16 23:09:55 +0100
commit4ad7a9b68f6e16730cfca27edf88e1335b073d5d (patch)
tree08822bfc371e9f8ebdb928e350672dc7e995d6f9 /src
parentde2686d2dbee1aeef63a3c96a86ebc3e99502a88 (diff)
libqmi-glib,device: new method to delete all links
This new method allows the user of the library to delete, at once, all the links found for the given network interface. By default, this method will iterate over all found links calling qmi_device_delete_link() for each, with QMI_DEVICE_MUX_ID_UNBOUND as mux id.
Diffstat (limited to 'src')
-rw-r--r--src/libqmi-glib/qmi-device.c50
-rw-r--r--src/libqmi-glib/qmi-device.h45
-rw-r--r--src/libqmi-glib/qmi-net-port-manager.c114
-rw-r--r--src/libqmi-glib/qmi-net-port-manager.h18
4 files changed, 227 insertions, 0 deletions
diff --git a/src/libqmi-glib/qmi-device.c b/src/libqmi-glib/qmi-device.c
index 6b0154d..03f63f8 100644
--- a/src/libqmi-glib/qmi-device.c
+++ b/src/libqmi-glib/qmi-device.c
@@ -1933,6 +1933,56 @@ qmi_device_delete_link (QmiDevice *self,
/*****************************************************************************/
gboolean
+qmi_device_delete_all_links_finish (QmiDevice *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (res), error);
+}
+
+static void
+device_del_all_links_ready (QmiNetPortManager *net_port_manager,
+ GAsyncResult *res,
+ GTask *task)
+{
+ GError *error = NULL;
+
+ if (!qmi_net_port_manager_del_all_links_finish (net_port_manager, res, &error))
+ g_task_return_error (task, error);
+ else
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+}
+
+void
+qmi_device_delete_all_links (QmiDevice *self,
+ const gchar *base_ifname,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+ GError *error = NULL;
+
+ task = g_task_new (self, cancellable, callback, user_data);
+
+ if (!setup_net_port_manager (self, &error)) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ g_assert (self->priv->net_port_manager);
+ qmi_net_port_manager_del_all_links (self->priv->net_port_manager,
+ base_ifname,
+ cancellable,
+ (GAsyncReadyCallback) device_del_all_links_ready,
+ task);
+}
+
+/*****************************************************************************/
+
+gboolean
qmi_device_list_links (QmiDevice *self,
const gchar *base_ifname,
GPtrArray **out_links,
diff --git a/src/libqmi-glib/qmi-device.h b/src/libqmi-glib/qmi-device.h
index 2c3894f..6f24cd0 100644
--- a/src/libqmi-glib/qmi-device.h
+++ b/src/libqmi-glib/qmi-device.h
@@ -999,6 +999,51 @@ gboolean qmi_device_delete_link_finish (QmiDevice *self,
GError **error);
/**
+ * qmi_device_delete_all_links:
+ * @self: a #QmiDevice.
+ * @base_ifname: the interface where all links are available.
+ * @cancellable: a #GCancellable, or %NULL.
+ * @callback: a #GAsyncReadyCallback to call when the operation is finished.
+ * @user_data: the data to pass to callback function.
+ *
+ * Asynchronously deletes all virtual network interfaces that have been previously
+ * created with qmi_device_add_link() in @base_ifname.
+ *
+ * When the operation is finished @callback will be called. You can then call
+ * qmi_device_delete_link_finish() to get the result of the operation.
+ *
+ * <note><para>
+ * There is no guarantee that other processes haven't created new links by the
+ * time this method returns. This method should be used with caution, or in setups
+ * where only one single process is expected to do QMI network interface link
+ * management.
+ * </para></note>
+ *
+ * Since: 1.28
+ */
+void qmi_device_delete_all_links (QmiDevice *self,
+ const gchar *base_ifname,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+/**
+ * qmi_device_delete_all_links_finish:
+ * @self: a #QmiDevice.
+ * @res: a #GAsyncResult.
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with qmi_device_delete_all_links().
+ *
+ * Returns: %TRUE if successful, %FALSE if @error is set.
+ *
+ * Since: 1.28
+ */
+gboolean qmi_device_delete_all_links_finish (QmiDevice *self,
+ GAsyncResult *res,
+ GError **error);
+
+/**
* qmi_device_list_links:
* @self: a #QmiDevice.
* @base_ifname: the base interface.
diff --git a/src/libqmi-glib/qmi-net-port-manager.c b/src/libqmi-glib/qmi-net-port-manager.c
index 7e01879..70cb052 100644
--- a/src/libqmi-glib/qmi-net-port-manager.c
+++ b/src/libqmi-glib/qmi-net-port-manager.c
@@ -21,6 +21,7 @@
*/
#include "qmi-net-port-manager.h"
+#include "qmi-device.h"
#include "qmi-helpers.h"
G_DEFINE_ABSTRACT_TYPE (QmiNetPortManager, qmi_net_port_manager, G_TYPE_OBJECT)
@@ -82,6 +83,28 @@ qmi_net_port_manager_del_link_finish (QmiNetPortManager *self,
return QMI_NET_PORT_MANAGER_GET_CLASS (self)->del_link_finish (self, res, error);
}
+void
+qmi_net_port_manager_del_all_links (QmiNetPortManager *self,
+ const gchar *base_ifname,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ QMI_NET_PORT_MANAGER_GET_CLASS (self)->del_all_links (self,
+ base_ifname,
+ cancellable,
+ callback,
+ user_data);
+}
+
+gboolean
+qmi_net_port_manager_del_all_links_finish (QmiNetPortManager *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return QMI_NET_PORT_MANAGER_GET_CLASS (self)->del_all_links_finish (self, res, error);
+}
+
gboolean
qmi_net_port_manager_list_links (QmiNetPortManager *self,
const gchar *base_ifname,
@@ -109,6 +132,95 @@ net_port_manager_list_links (QmiNetPortManager *self,
return qmi_helpers_list_links (sysfs_file, NULL, NULL, out_links, error);
}
+typedef struct {
+ GPtrArray *links;
+ guint link_i;
+} DelAllLinksContext;
+
+static void
+del_all_links_context_free (DelAllLinksContext *ctx)
+{
+ g_clear_pointer (&ctx->links, g_ptr_array_unref);
+ g_slice_free (DelAllLinksContext, ctx);
+}
+
+static gboolean
+net_port_manager_del_all_links_finish (QmiNetPortManager *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (res), error);
+}
+
+static void delete_next_link (GTask *task);
+
+static void
+port_manager_del_link_ready (QmiNetPortManager *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ GError *error = NULL;
+
+ if (!qmi_net_port_manager_del_link_finish (self, res, &error)) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ delete_next_link (task);
+}
+
+static void
+delete_next_link (GTask *task)
+{
+ QmiNetPortManager *self;
+ DelAllLinksContext *ctx;
+ g_autofree gchar *link_name = NULL;
+
+ self = g_task_get_source_object (task);
+ ctx = g_task_get_task_data (task);
+
+ if (!ctx->links || ctx->links->len == 0) {
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+ return;
+ }
+
+ link_name = g_ptr_array_steal_index_fast (ctx->links, 0);
+
+ qmi_net_port_manager_del_link (self,
+ link_name,
+ QMI_DEVICE_MUX_ID_UNBOUND,
+ 5,
+ g_task_get_cancellable (task),
+ (GAsyncReadyCallback)port_manager_del_link_ready,
+ task);
+}
+
+static void
+net_port_manager_del_all_links (QmiNetPortManager *self,
+ const gchar *base_ifname,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+ DelAllLinksContext *ctx;
+ GError *error = NULL;
+
+ task = g_task_new (self, cancellable, callback, user_data);
+ ctx = g_slice_new0 (DelAllLinksContext);
+ g_task_set_task_data (task, ctx, (GDestroyNotify)del_all_links_context_free);
+
+ if (!qmi_net_port_manager_list_links (self, base_ifname, &ctx->links, &error)) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ delete_next_link (task);
+}
+
/*****************************************************************************/
static void
@@ -120,4 +232,6 @@ static void
qmi_net_port_manager_class_init (QmiNetPortManagerClass *klass)
{
klass->list_links = net_port_manager_list_links;
+ klass->del_all_links = net_port_manager_del_all_links;
+ klass->del_all_links_finish = net_port_manager_del_all_links_finish;
}
diff --git a/src/libqmi-glib/qmi-net-port-manager.h b/src/libqmi-glib/qmi-net-port-manager.h
index 3783745..c73ebb2 100644
--- a/src/libqmi-glib/qmi-net-port-manager.h
+++ b/src/libqmi-glib/qmi-net-port-manager.h
@@ -73,6 +73,15 @@ struct _QmiNetPortManagerClass {
gboolean (* del_link_finish) (QmiNetPortManager *self,
GAsyncResult *res,
GError **error);
+
+ void (* del_all_links) (QmiNetPortManager *self,
+ const gchar *base_ifname,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+ gboolean (* del_all_links_finish) (QmiNetPortManager *self,
+ GAsyncResult *res,
+ GError **error);
};
GType qmi_net_port_manager_get_type (void);
@@ -107,4 +116,13 @@ gboolean qmi_net_port_manager_del_link_finish (QmiNetPortManager *self,
GAsyncResult *res,
GError **error);
+void qmi_net_port_manager_del_all_links (QmiNetPortManager *self,
+ const gchar *base_ifname,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean qmi_net_port_manager_del_all_links_finish (QmiNetPortManager *self,
+ GAsyncResult *res,
+ GError **error);
+
#endif /* _LIBQMI_GLIB_QMI_NET_PORT_MANAGER_H_ */