aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-02-12 20:36:39 +0100
committerAleksander Morgado <aleksander@aleksander.es>2021-02-16 23:09:55 +0100
commit048cde053b2d2531599e8f34e70dcddcfde17c9a (patch)
treea324fb7dfd9f11a5c3856e5be644c1398de59b7f /src
parentc2046465b12ef4b4702b7e0484e9e329f4b78573 (diff)
libqmi-glib,helpers: import link list operation from QmiNetPortManagerQmiwwan
Diffstat (limited to 'src')
-rw-r--r--src/libqmi-glib/qmi-helpers.c66
-rw-r--r--src/libqmi-glib/qmi-helpers.h8
-rw-r--r--src/libqmi-glib/qmi-net-port-manager-qmiwwan.c100
3 files changed, 95 insertions, 79 deletions
diff --git a/src/libqmi-glib/qmi-helpers.c b/src/libqmi-glib/qmi-helpers.c
index f3abbf4..56296e0 100644
--- a/src/libqmi-glib/qmi-helpers.c
+++ b/src/libqmi-glib/qmi-helpers.c
@@ -32,8 +32,6 @@
#include <pwd.h>
#include <errno.h>
-#include <gio/gio.h>
-
#include "qmi-helpers.h"
#include "qmi-error-types.h"
@@ -629,3 +627,67 @@ qmi_helpers_write_sysfs_file (const gchar *sysfs_path,
fclose (f);
return status;
}
+
+/******************************************************************************/
+
+gboolean
+qmi_helpers_list_links (GFile *sysfs_file,
+ GCancellable *cancellable,
+ GPtrArray *previous_links,
+ GPtrArray **out_links,
+ GError **error)
+{
+ g_autofree gchar *sysfs_path = NULL;
+ g_autoptr(GFileEnumerator) direnum = NULL;
+ g_autoptr(GPtrArray) links = NULL;
+
+ direnum = g_file_enumerate_children (sysfs_file,
+ G_FILE_ATTRIBUTE_STANDARD_NAME,
+ G_FILE_QUERY_INFO_NONE,
+ cancellable,
+ error);
+ if (!direnum)
+ return FALSE;
+
+ sysfs_path = g_file_get_path (sysfs_file);
+ links = g_ptr_array_new_with_free_func (g_free);
+
+ while (TRUE) {
+ GFileInfo *info;
+ g_autofree gchar *filename = NULL;
+ g_autofree gchar *link_path = NULL;
+ g_autofree gchar *real_path = NULL;
+ g_autofree gchar *basename = NULL;
+
+ if (!g_file_enumerator_iterate (direnum, &info, NULL, cancellable, error))
+ return FALSE;
+ if (!info)
+ break;
+
+ filename = g_file_info_get_attribute_as_string (info, G_FILE_ATTRIBUTE_STANDARD_NAME);
+ if (!filename || !g_str_has_prefix (filename, "upper_"))
+ continue;
+
+ link_path = g_strdup_printf ("%s/%s", sysfs_path, filename);
+ real_path = realpath (link_path, NULL);
+ if (!real_path)
+ continue;
+
+ basename = g_path_get_basename (real_path);
+
+ /* skip interface if it was already known */
+ if (previous_links && g_ptr_array_find_with_equal_func (previous_links, basename, g_str_equal, NULL))
+ continue;
+
+ g_ptr_array_add (links, g_steal_pointer (&basename));
+ }
+
+ if (!links || !links->len) {
+ *out_links = NULL;
+ return TRUE;
+ }
+
+ g_ptr_array_sort (links, (GCompareFunc) g_ascii_strcasecmp);
+ *out_links = g_steal_pointer (&links);
+ return TRUE;
+}
diff --git a/src/libqmi-glib/qmi-helpers.h b/src/libqmi-glib/qmi-helpers.h
index 05ef5e7..38bcb4b 100644
--- a/src/libqmi-glib/qmi-helpers.h
+++ b/src/libqmi-glib/qmi-helpers.h
@@ -30,6 +30,7 @@
#define _LIBQMI_GLIB_QMI_HELPERS_H_
#include <glib.h>
+#include <gio/gio.h>
G_BEGIN_DECLS
@@ -82,6 +83,13 @@ gboolean qmi_helpers_write_sysfs_file (const gchar *sysfs_path,
const gchar *value,
GError **error);
+G_GNUC_INTERNAL
+gboolean qmi_helpers_list_links (GFile *sysfs_file,
+ GCancellable *cancellable,
+ GPtrArray *previous_links,
+ GPtrArray **out_links,
+ GError **error);
+
static inline gfloat
QMI_GFLOAT_SWAP_LE_BE (gfloat in)
{
diff --git a/src/libqmi-glib/qmi-net-port-manager-qmiwwan.c b/src/libqmi-glib/qmi-net-port-manager-qmiwwan.c
index a03a715..ea9ce9c 100644
--- a/src/libqmi-glib/qmi-net-port-manager-qmiwwan.c
+++ b/src/libqmi-glib/qmi-net-port-manager-qmiwwan.c
@@ -104,76 +104,6 @@ get_tracked_mux_id (QmiNetPortManagerQmiwwan *self,
/*****************************************************************************/
-static gboolean
-lookup_exact_link (GPtrArray *links,
- const gchar *iface_name)
-{
- if (!links)
- return FALSE;
-
- return g_ptr_array_find_with_equal_func (links, iface_name, g_str_equal, NULL);
-}
-
-static gboolean
-list_links (QmiNetPortManagerQmiwwan *self,
- GCancellable *cancellable,
- GPtrArray *previous_links,
- GPtrArray **out_links,
- GError **error)
-{
- g_autoptr(GFileEnumerator) direnum = NULL;
- g_autoptr(GPtrArray) links = NULL;
-
- direnum = g_file_enumerate_children (self->priv->sysfs_file,
- G_FILE_ATTRIBUTE_STANDARD_NAME,
- G_FILE_QUERY_INFO_NONE,
- cancellable,
- error);
- if (!direnum)
- return FALSE;
-
- links = g_ptr_array_new_with_free_func (g_free);
-
- while (TRUE) {
- GFileInfo *info;
- g_autofree gchar *filename = NULL;
- g_autofree gchar *link_path = NULL;
- g_autofree gchar *real_path = NULL;
- g_autofree gchar *basename = NULL;
-
- if (!g_file_enumerator_iterate (direnum, &info, NULL, cancellable, error))
- return FALSE;
- if (!info)
- break;
-
- filename = g_file_info_get_attribute_as_string (info, G_FILE_ATTRIBUTE_STANDARD_NAME);
- if (!filename || !g_str_has_prefix (filename, "upper_qmimux"))
- continue;
-
- link_path = g_strdup_printf ("%s/%s", self->priv->sysfs_path, filename);
- real_path = realpath (link_path, NULL);
- if (!real_path)
- continue;
-
- basename = g_path_get_basename (real_path);
-
- /* skip interface if it was already known */
- if (lookup_exact_link (previous_links, basename))
- continue;
-
- g_ptr_array_add (links, g_steal_pointer (&basename));
- }
-
- if (!links || !links->len) {
- *out_links = NULL;
- return TRUE;
- }
-
- g_ptr_array_sort (links, (GCompareFunc) g_ascii_strcasecmp);
- *out_links = g_steal_pointer (&links);
- return TRUE;
-}
-
static gchar *
read_link_mux_id (const gchar *link_iface,
GError **error)
@@ -232,7 +162,7 @@ lookup_first_new_link (GPtrArray *links_before,
link_iface = g_ptr_array_index (links_after, i);
- if (!lookup_exact_link (links_before, link_iface))
+ if (!links_before || !g_ptr_array_find_with_equal_func (links_before, link_iface, g_str_equal, NULL))
return g_strdup (link_iface);
}
return NULL;
@@ -454,7 +384,11 @@ add_link_check_timeout (GTask *task)
self = g_task_get_source_object (task);
ctx = g_task_get_task_data (task);
- if (!list_links (self, g_task_get_cancellable (task), ctx->links_before, &links_after, &error)) {
+ if (!qmi_helpers_list_links (self->priv->sysfs_file,
+ g_task_get_cancellable (task),
+ ctx->links_before,
+ &links_after,
+ &error)) {
g_prefix_error (&error, "Couldn't enumerate files in the sysfs directory: ");
g_task_return_error (task, error);
g_object_unref (task);
@@ -509,7 +443,11 @@ run_add_link (GTask *task)
self = g_task_get_source_object (task);
ctx = g_task_get_task_data (task);
- if (!list_links (self, g_task_get_cancellable (task), NULL, &ctx->links_before, &error)) {
+ if (!qmi_helpers_list_links (self->priv->sysfs_file,
+ g_task_get_cancellable (task),
+ NULL,
+ &ctx->links_before,
+ &error)) {
g_prefix_error (&error, "Couldn't enumerate files in the sysfs directory: ");
g_task_return_error (task, error);
g_object_unref (task);
@@ -612,14 +550,18 @@ del_link_check_timeout (GTask *task)
self = g_task_get_source_object (task);
ctx = g_task_get_task_data (task);
- if (!list_links (self, g_task_get_cancellable (task), ctx->links_before, &links_after, &error)) {
+ if (!qmi_helpers_list_links (self->priv->sysfs_file,
+ g_task_get_cancellable (task),
+ ctx->links_before,
+ &links_after,
+ &error)) {
g_prefix_error (&error, "Couldn't enumerate files in the sysfs directory: ");
g_task_return_error (task, error);
g_object_unref (task);
return G_SOURCE_REMOVE;
}
- if (!lookup_exact_link (links_after, ctx->link_iface)) {
+ if (!links_after || !g_ptr_array_find_with_equal_func (links_after, ctx->link_iface, g_str_equal, NULL)) {
if (!untrack_mux_id (self, ctx->link_iface, &error)) {
g_debug ("couldn't untrack mux id: %s", error->message);
g_clear_error (&error);
@@ -653,14 +595,18 @@ run_del_link (GTask *task)
g_debug ("Running del link operation...");
- if (!list_links (self, g_task_get_cancellable (task), NULL, &ctx->links_before, &error)) {
+ if (!qmi_helpers_list_links (self->priv->sysfs_file,
+ g_task_get_cancellable (task),
+ NULL,
+ &ctx->links_before,
+ &error)) {
g_prefix_error (&error, "Couldn't enumerate files in the sysfs directory: ");
g_task_return_error (task, error);
g_object_unref (task);
return;
}
- if (!lookup_exact_link (ctx->links_before, ctx->link_iface)) {
+ if (!ctx->links_before || !g_ptr_array_find_with_equal_func (ctx->links_before, ctx->link_iface, g_str_equal, NULL)) {
g_task_return_new_error (task, QMI_CORE_ERROR, QMI_CORE_ERROR_INVALID_ARGS,
"Cannot delete link '%s': interface not found",
ctx->link_iface);