diff --git a/pkgs/qmi-nmea/qmicli.c b/pkgs/qmi-nmea/qmicli.c
deleted file mode 100644
index ea694f9..0000000
--- a/pkgs/qmi-nmea/qmicli.c
+++ /dev/null
@@ -1,1169 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * qmicli -- Command line interface to control QMI devices
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- * Copyright (C) 2012-2023 Aleksander Morgado
- * Copyright (c) 2022 Qualcomm Innovation Center, Inc.
- */
-
-#include "config.h"
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-
-#include
-
-#if QMI_MBIM_QMUX_SUPPORTED
-#include
-#endif
-
-#include "qmicli.h"
-#include "qmicli-helpers.h"
-
-#define PROGRAM_NAME "qmicli"
-#define PROGRAM_VERSION PACKAGE_VERSION
-
-/* Globals */
-static GMainLoop *loop;
-static GCancellable *cancellable;
-static QmiDevice *device;
-static QmiClient *client;
-static QmiService service;
-static gboolean operation_status;
-static gboolean expect_indications;
-#if QMI_QRTR_SUPPORTED
-static QrtrBus *qrtr_bus;
-#endif
-
-/* Main options */
-static gchar *device_str;
-static gboolean get_service_version_info_flag;
-static gchar *device_set_instance_id_str;
-static gboolean device_open_version_info_flag;
-static gboolean device_open_sync_flag;
-static gchar *device_open_net_str;
-static gboolean device_open_proxy_flag;
-#if QMI_MBIM_QMUX_SUPPORTED
-static gboolean device_open_qmi_flag;
-static gboolean device_open_mbim_flag;
-static gboolean device_open_auto_flag;
-#endif
-static gchar *client_cid_str;
-static gboolean client_no_release_cid_flag;
-static gboolean verbose_flag;
-static gboolean verbose_full_flag;
-static gboolean silent_flag;
-static gboolean version_flag;
-
-static GOptionEntry main_entries[] = {
- { "device", 'd', 0, G_OPTION_ARG_STRING, &device_str,
-#if QMI_QRTR_SUPPORTED
- "Specify device path or QRTR URI (e.g. qrtr://0)",
- "[PATH|URI]"
-#else
- "Specify device path",
- "[PATH]"
-#endif
- },
- { "get-service-version-info", 0, 0, G_OPTION_ARG_NONE, &get_service_version_info_flag,
- "Get service version info",
- NULL
- },
- { "device-set-instance-id", 0, 0, G_OPTION_ARG_STRING, &device_set_instance_id_str,
- "Set instance ID",
- "[Instance ID]"
- },
- { "device-open-version-info", 0, 0, G_OPTION_ARG_NONE, &device_open_version_info_flag,
- "Run version info check when opening device",
- NULL
- },
- { "device-open-sync", 0, 0, G_OPTION_ARG_NONE, &device_open_sync_flag,
- "Run sync operation when opening device",
- NULL
- },
- { "device-open-proxy", 'p', 0, G_OPTION_ARG_NONE, &device_open_proxy_flag,
- "Request to use the 'qmi-proxy' proxy",
- NULL
- },
-#if QMI_MBIM_QMUX_SUPPORTED
- { "device-open-qmi", 0, 0, G_OPTION_ARG_NONE, &device_open_qmi_flag,
- "Open a cdc-wdm device explicitly in QMI mode",
- NULL
- },
- { "device-open-mbim", 0, 0, G_OPTION_ARG_NONE, &device_open_mbim_flag,
- "Open a cdc-wdm device explicitly in MBIM mode",
- NULL
- },
- { "device-open-auto", 0, 0, G_OPTION_ARG_NONE, &device_open_auto_flag,
- "Open a cdc-wdm device in either QMI or MBIM mode (default)",
- NULL
- },
-#endif
- { "device-open-net", 0, 0, G_OPTION_ARG_STRING, &device_open_net_str,
- "Open device with specific link protocol and QoS flags",
- "[net-802-3|net-raw-ip|net-qos-header|net-no-qos-header]"
- },
- { "client-cid", 0, 0, G_OPTION_ARG_STRING, &client_cid_str,
- "Use the given CID, don't allocate a new one",
- "[CID]"
- },
- { "client-no-release-cid", 0, 0, G_OPTION_ARG_NONE, &client_no_release_cid_flag,
- "Do not release the CID when exiting",
- NULL
- },
- { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose_flag,
- "Run action with verbose logs, including the debug ones",
- NULL
- },
- { "verbose-full", 0, 0, G_OPTION_ARG_NONE, &verbose_full_flag,
- "Run action with verbose logs, including the debug ones and personal info",
- NULL
- },
- { "silent", 0, 0, G_OPTION_ARG_NONE, &silent_flag,
- "Run action with no logs; not even the error/warning ones",
- NULL
- },
- { "version", 'V', 0, G_OPTION_ARG_NONE, &version_flag,
- "Print version",
- NULL
- },
- { NULL, 0, 0, 0, NULL, NULL, NULL }
-};
-
-static gboolean
-signals_handler (void)
-{
- if (cancellable) {
- /* Ignore consecutive requests of cancellation */
- if (!g_cancellable_is_cancelled (cancellable)) {
- g_printerr ("cancelling the operation...\n");
- g_cancellable_cancel (cancellable);
- /* Re-set the signal handler to allow main loop cancellation on
- * second signal */
- return G_SOURCE_CONTINUE;
- }
- }
-
- if (loop && g_main_loop_is_running (loop)) {
- g_printerr ("cancelling the main loop...\n");
- g_idle_add ((GSourceFunc) g_main_loop_quit, loop);
- }
- return G_SOURCE_REMOVE;
-}
-
-static void
-log_handler (const gchar *log_domain,
- GLogLevelFlags log_level,
- const gchar *message,
- gpointer user_data)
-{
- const gchar *log_level_str;
- time_t now;
- gchar time_str[64];
- struct tm *local_time;
- gboolean err;
-
- /* Nothing to do if we're silent */
- if (silent_flag)
- return;
-
- now = time ((time_t *) NULL);
- local_time = localtime (&now);
- strftime (time_str, 64, "%d %b %Y, %H:%M:%S", local_time);
- err = FALSE;
-
- switch (log_level) {
- case G_LOG_LEVEL_WARNING:
- log_level_str = "-Warning **";
- err = TRUE;
- break;
-
- case G_LOG_LEVEL_CRITICAL:
- case G_LOG_LEVEL_ERROR:
- log_level_str = "-Error **";
- err = TRUE;
- break;
-
- case G_LOG_LEVEL_DEBUG:
- log_level_str = "[Debug]";
- break;
-
- case G_LOG_LEVEL_MESSAGE:
- case G_LOG_LEVEL_INFO:
- log_level_str = "";
- break;
-
- case G_LOG_FLAG_FATAL:
- case G_LOG_LEVEL_MASK:
- case G_LOG_FLAG_RECURSION:
- default:
- g_assert_not_reached ();
- }
-
- if (!verbose_flag && !verbose_full_flag && !err)
- return;
-
- g_fprintf (err ? stderr : stdout,
- "[%s] %s %s\n",
- time_str,
- log_level_str,
- message);
-}
-
-G_GNUC_NORETURN
-static void
-print_version_and_exit (void)
-{
- g_print ("Copyright (C) 2012-2023 Aleksander Morgado, 2024 Daniel Barlow\n"
- "License GPLv2+: GNU GPL version 2 or later \n"
- "This is free software: you are free to change and redistribute it.\n"
- "There is NO WARRANTY, to the extent permitted by law.\n"
- "\n");
- exit (EXIT_SUCCESS);
-}
-
-static gboolean
-generic_options_enabled (void)
-{
- static guint n_actions = 0;
- static gboolean checked = FALSE;
-
- if (checked)
- return !!n_actions;
-
- n_actions = (!!device_set_instance_id_str +
- get_service_version_info_flag);
-
- if (n_actions > 1) {
- g_printerr ("error: too many generic actions requested\n");
- exit (EXIT_FAILURE);
- }
-
- checked = TRUE;
- return !!n_actions;
-}
-
-/*****************************************************************************/
-/* Report that indications are expected */
-
-void
-qmicli_expect_indications (void)
-{
- expect_indications = TRUE;
-}
-
-/*****************************************************************************/
-/* Running asynchronously */
-
-static void
-close_ready (QmiDevice *dev,
- GAsyncResult *res)
-{
- GError *error = NULL;
-
- if (!qmi_device_close_finish (dev, res, &error)) {
- g_printerr ("error: couldn't close: %s\n", error->message);
- g_error_free (error);
- } else
- g_debug ("Closed");
-
- g_main_loop_quit (loop);
-}
-
-static void
-release_client_ready (QmiDevice *dev,
- GAsyncResult *res)
-{
- GError *error = NULL;
-
- if (!qmi_device_release_client_finish (dev, res, &error)) {
- g_printerr ("error: couldn't release client: %s\n", error->message);
- g_error_free (error);
- } else
- g_debug ("Client released");
-
- qmi_device_close_async (dev, 10, NULL, (GAsyncReadyCallback) close_ready, NULL);
-}
-
-void
-qmicli_async_operation_done (gboolean reported_operation_status,
- gboolean skip_cid_release)
-{
- QmiDeviceReleaseClientFlags flags = QMI_DEVICE_RELEASE_CLIENT_FLAGS_NONE;
-
- /* Keep the result of the operation */
- operation_status = reported_operation_status;
-
- /* Cleanup cancellation */
- g_clear_object (&cancellable);
-
- /* If no client was allocated (e.g. generic action), just quit */
- if (!client) {
- g_main_loop_quit (loop);
- return;
- }
-
- if (skip_cid_release)
- g_debug ("Skipped CID release");
- else if (!client_no_release_cid_flag)
- flags |= QMI_DEVICE_RELEASE_CLIENT_FLAGS_RELEASE_CID;
- else
- g_print ("[%s] Client ID not released:\n"
- "\tService: '%s'\n"
- "\t CID: '%u'\n",
- qmi_device_get_path_display (device),
- qmi_service_get_string (service),
- qmi_client_get_cid (client));
-
- qmi_device_release_client (device,
- client,
- flags,
- 10,
- NULL,
- (GAsyncReadyCallback)release_client_ready,
- NULL);
-}
-
-static void
-allocate_client_ready (QmiDevice *dev,
- GAsyncResult *res)
-{
- GError *error = NULL;
-
- client = qmi_device_allocate_client_finish (dev, res, &error);
- if (!client) {
- g_printerr ("error: couldn't create client for the '%s' service: %s\n",
- qmi_service_get_string (service),
- error->message);
- exit (EXIT_FAILURE);
- }
-
- /* Run the service-specific action */
- switch (service) {
- case QMI_SERVICE_DMS:
-#if defined HAVE_QMI_SERVICE_DMS
- qmicli_dms_run (dev, QMI_CLIENT_DMS (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_NAS:
-#if defined HAVE_QMI_SERVICE_NAS
- qmicli_nas_run (dev, QMI_CLIENT_NAS (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_WDS:
-#if defined HAVE_QMI_SERVICE_WDS
- qmicli_wds_run (dev, QMI_CLIENT_WDS (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_PBM:
-#if defined HAVE_QMI_SERVICE_PBM
- qmicli_pbm_run (dev, QMI_CLIENT_PBM (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_PDC:
-#if defined HAVE_QMI_SERVICE_PDC
- qmicli_pdc_run (dev, QMI_CLIENT_PDC (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_UIM:
-#if defined HAVE_QMI_SERVICE_UIM
- qmicli_uim_run (dev, QMI_CLIENT_UIM (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_WMS:
-#if defined HAVE_QMI_SERVICE_WMS
- qmicli_wms_run (dev, QMI_CLIENT_WMS (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_WDA:
-#if defined HAVE_QMI_SERVICE_WDA
- qmicli_wda_run (dev, QMI_CLIENT_WDA (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_VOICE:
-#if defined HAVE_QMI_SERVICE_VOICE
- qmicli_voice_run (dev, QMI_CLIENT_VOICE (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_LOC:
-#if defined HAVE_QMI_SERVICE_LOC
- qmicli_loc_run (dev, QMI_CLIENT_LOC (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_QOS:
-#if defined HAVE_QMI_SERVICE_QOS
- qmicli_qos_run (dev, QMI_CLIENT_QOS (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_GAS:
-#if defined HAVE_QMI_SERVICE_GAS
- qmicli_gas_run (dev, QMI_CLIENT_GAS (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_GMS:
-#if defined HAVE_QMI_SERVICE_GMS
- qmicli_gms_run (dev, QMI_CLIENT_GMS (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_DSD:
-#if defined HAVE_QMI_SERVICE_DSD
- qmicli_dsd_run (dev, QMI_CLIENT_DSD (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_SAR:
-#if defined HAVE_QMI_SERVICE_SAR
- qmicli_sar_run (dev, QMI_CLIENT_SAR (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_DPM:
-#if defined HAVE_QMI_SERVICE_DPM
- qmicli_dpm_run (dev, QMI_CLIENT_DPM (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_FOX:
-#if defined HAVE_QMI_SERVICE_FOX
- qmicli_fox_run (dev, QMI_CLIENT_FOX (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_ATR:
-#if defined HAVE_QMI_SERVICE_ATR
- qmicli_atr_run (dev, QMI_CLIENT_ATR (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_IMSP:
-#if defined HAVE_QMI_SERVICE_IMSP
- qmicli_imsp_run (dev, QMI_CLIENT_IMSP (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_IMSA:
-#if defined HAVE_QMI_SERVICE_IMSA
- qmicli_imsa_run (dev, QMI_CLIENT_IMSA (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_IMS:
-#if defined HAVE_QMI_SERVICE_IMS
- qmicli_ims_run (dev, QMI_CLIENT_IMS (client), cancellable);
- return;
-#else
- break;
-#endif
- case QMI_SERVICE_UNKNOWN:
- case QMI_SERVICE_CTL:
- case QMI_SERVICE_AUTH:
- case QMI_SERVICE_AT:
- case QMI_SERVICE_CAT2:
- case QMI_SERVICE_QCHAT:
- case QMI_SERVICE_RMTFS:
- case QMI_SERVICE_TEST:
- case QMI_SERVICE_ADC:
- case QMI_SERVICE_CSD:
- case QMI_SERVICE_MFS:
- case QMI_SERVICE_TIME:
- case QMI_SERVICE_TS:
- case QMI_SERVICE_TMD:
- case QMI_SERVICE_SAP:
- case QMI_SERVICE_TSYNC:
- case QMI_SERVICE_RFSA:
- case QMI_SERVICE_CSVT:
- case QMI_SERVICE_QCMAP:
- case QMI_SERVICE_IMSVT:
- case QMI_SERVICE_COEX:
- case QMI_SERVICE_STX:
- case QMI_SERVICE_BIT:
- case QMI_SERVICE_IMSRTP:
- case QMI_SERVICE_RFRPE:
- case QMI_SERVICE_SSCTL:
- case QMI_SERVICE_CAT:
- case QMI_SERVICE_RMS:
- case QMI_SERVICE_FOTA:
- case QMI_SERVICE_PDS:
- case QMI_SERVICE_OMA:
- case QMI_SERVICE_SSC:
- default:
- break;
- }
- g_assert_not_reached ();
-}
-
-static void
-device_allocate_client (QmiDevice *dev)
-{
- guint8 cid = QMI_CID_NONE;
-
- if (client_cid_str) {
- guint32 cid32;
-
- cid32 = atoi (client_cid_str);
- if (!cid32 || cid32 > G_MAXUINT8) {
- g_printerr ("error: invalid CID given '%s'\n",
- client_cid_str);
- exit (EXIT_FAILURE);
- }
-
- cid = (guint8)cid32;
- g_debug ("Reusing CID '%u'", cid);
- }
-
- /* As soon as we get the QmiDevice, create a client for the requested
- * service */
- qmi_device_allocate_client (dev,
- service,
- cid,
- 10,
- cancellable,
- (GAsyncReadyCallback)allocate_client_ready,
- NULL);
-}
-
-static void
-set_instance_id_ready (QmiDevice *dev,
- GAsyncResult *res)
-{
- GError *error = NULL;
- guint16 link_id;
-
- if (!qmi_device_set_instance_id_finish (dev, res, &link_id, &error)) {
- g_printerr ("error: couldn't set instance ID: %s\n",
- error->message);
- exit (EXIT_FAILURE);
- }
-
- g_print ("[%s] Instance ID set:\n"
- "\tLink ID: '%" G_GUINT16_FORMAT "'\n",
- qmi_device_get_path_display (dev),
- link_id);
-
- /* We're done now */
- qmicli_async_operation_done (TRUE, FALSE);
-}
-
-static void
-device_set_instance_id (QmiDevice *dev)
-{
- gint instance_id;
-
- if (g_str_equal (device_set_instance_id_str, "0"))
- instance_id = 0;
- else {
- instance_id = atoi (device_set_instance_id_str);
- if (instance_id == 0) {
- g_printerr ("error: invalid instance ID given: '%s'\n", device_set_instance_id_str);
- exit (EXIT_FAILURE);
- } else if (instance_id < 0 || instance_id > G_MAXUINT8) {
- g_printerr ("error: given instance ID is out of range [0,%u]: '%s'\n",
- G_MAXUINT8,
- device_set_instance_id_str);
- exit (EXIT_FAILURE);
- }
- }
-
- g_debug ("Setting instance ID '%d'...", instance_id);
- qmi_device_set_instance_id (dev,
- (guint8)instance_id,
- 10,
- cancellable,
- (GAsyncReadyCallback)set_instance_id_ready,
- NULL);
-}
-
-static void
-get_service_version_info_ready (QmiDevice *dev,
- GAsyncResult *res)
-{
- GError *error = NULL;
- GArray *services;
- guint i;
-
- services = qmi_device_get_service_version_info_finish (dev, res, &error);
- if (!services) {
- g_printerr ("error: couldn't get service version info: %s\n",
- error->message);
- exit (EXIT_FAILURE);
- }
-
- g_print ("[%s] Supported versions:\n",
- qmi_device_get_path_display (dev));
- for (i = 0; i < services->len; i++) {
- QmiDeviceServiceVersionInfo *info;
- const gchar *service_str;
-
- info = &g_array_index (services, QmiDeviceServiceVersionInfo, i);
- service_str = qmi_service_get_string (info->service);
- if (service_str)
- g_print ("\t%s (%u.%u)\n",
- service_str,
- info->major_version,
- info->minor_version);
- else
- g_print ("\tunknown [0x%02x] (%u.%u)\n",
- info->service,
- info->major_version,
- info->minor_version);
- }
- g_array_unref (services);
-
- /* We're done now */
- qmicli_async_operation_done (TRUE, FALSE);
-}
-
-static void
-device_get_service_version_info (QmiDevice *dev)
-{
- g_debug ("Getting service version info...");
- qmi_device_get_service_version_info (dev,
- 10,
- cancellable,
- (GAsyncReadyCallback)get_service_version_info_ready,
- NULL);
-}
-
-static void
-device_open_ready (QmiDevice *dev,
- GAsyncResult *res)
-{
- GError *error = NULL;
-
- if (!qmi_device_open_finish (dev, res, &error)) {
- g_printerr ("error: couldn't open the QmiDevice: %s\n",
- error->message);
- exit (EXIT_FAILURE);
- }
-
- g_debug ("QMI Device at '%s' ready",
- qmi_device_get_path_display (dev));
-
- if (device_set_instance_id_str)
- device_set_instance_id (dev);
- else if (get_service_version_info_flag)
- device_get_service_version_info (dev);
- else if (qmicli_link_management_options_enabled ())
- qmicli_link_management_run (dev, cancellable);
- else if (qmicli_qmiwwan_options_enabled ())
- qmicli_qmiwwan_run (dev, cancellable);
- else
- device_allocate_client (dev);
-}
-
-static void
-device_new_ready (GObject *unused,
- GAsyncResult *res)
-{
- QmiDeviceOpenFlags open_flags = QMI_DEVICE_OPEN_FLAGS_NONE;
- GError *error = NULL;
-
- device = qmi_device_new_finish (res, &error);
- if (!device) {
- g_printerr ("error: couldn't create QmiDevice: %s\n",
- error->message);
- exit (EXIT_FAILURE);
- }
-
-#if QMI_MBIM_QMUX_SUPPORTED
- if (device_open_mbim_flag + device_open_qmi_flag + device_open_auto_flag > 1) {
- g_printerr ("error: cannot specify multiple mode flags to open device\n");
- exit (EXIT_FAILURE);
- }
-#endif
-
- /* Setup device open flags */
- if (device_open_version_info_flag)
- open_flags |= QMI_DEVICE_OPEN_FLAGS_VERSION_INFO;
- if (device_open_sync_flag)
- open_flags |= QMI_DEVICE_OPEN_FLAGS_SYNC;
- if (device_open_proxy_flag)
- open_flags |= QMI_DEVICE_OPEN_FLAGS_PROXY;
-#if QMI_MBIM_QMUX_SUPPORTED
- if (device_open_mbim_flag)
- open_flags |= QMI_DEVICE_OPEN_FLAGS_MBIM;
- if (device_open_auto_flag || (!device_open_qmi_flag && !device_open_mbim_flag))
- open_flags |= QMI_DEVICE_OPEN_FLAGS_AUTO;
-#endif
- if (expect_indications)
- open_flags |= QMI_DEVICE_OPEN_FLAGS_EXPECT_INDICATIONS;
- if (device_open_net_str) {
- if (!qmicli_read_device_open_flags_from_string (device_open_net_str, &open_flags) ||
- !qmicli_validate_device_open_flags (open_flags))
- exit (EXIT_FAILURE);
- }
-
- /* Open the device */
- qmi_device_open (device,
- open_flags,
- 15,
- cancellable,
- (GAsyncReadyCallback)device_open_ready,
- NULL);
-}
-
-#if QMI_QRTR_SUPPORTED
-
-static void
-bus_new_ready (GObject *source,
- GAsyncResult *res,
- gpointer user_data)
-{
- g_autoptr(GError) error = NULL;
- guint node_id;
- QrtrNode *node;
-
- node_id = GPOINTER_TO_UINT (user_data);
-
- qrtr_bus = qrtr_bus_new_finish (res, &error);
- if (!qrtr_bus) {
- g_printerr ("error: couldn't access QRTR bus: %s\n", error->message);
- exit (EXIT_FAILURE);
- }
-
- node = qrtr_bus_peek_node (qrtr_bus, node_id);
- if (!node) {
- g_printerr ("error: node with id %u not found in QRTR bus\n", node_id);
- exit (EXIT_FAILURE);
- }
-
- qmi_device_new_from_node (node,
- cancellable,
- (GAsyncReadyCallback)device_new_ready,
- NULL);
-}
-
-#endif
-
-static gboolean
-make_device (GFile *file)
-{
- g_autofree gchar *id = NULL;
-
- id = g_file_get_path (file);
- if (id) {
- /* Describes a local device file. */
- qmi_device_new (file,
- cancellable,
- (GAsyncReadyCallback)device_new_ready,
- NULL);
- return TRUE;
- }
-
-#if QMI_QRTR_SUPPORTED
- {
- guint32 node_id;
-
- id = g_file_get_uri (file);
- if (qrtr_get_node_for_uri (id, &node_id)) {
- qrtr_bus_new (1000, /* ms */
- cancellable,
- (GAsyncReadyCallback)bus_new_ready,
- GUINT_TO_POINTER (node_id));
- return TRUE;
- }
-
- g_printerr ("error: URI is neither a local file path nor a QRTR node: %s\n", id);
- return FALSE;
- }
-#else
- g_printerr ("error: URI is not a local file path: %s\n", id);
- return FALSE;
-#endif
-}
-
-/*****************************************************************************/
-
-static void
-parse_actions (void)
-{
- guint actions_enabled = 0;
-
- if (generic_options_enabled ()) {
- service = QMI_SERVICE_CTL;
- actions_enabled++;
- }
-
- if (qmicli_link_management_options_enabled ()) {
- service = QMI_SERVICE_UNKNOWN;
- actions_enabled++;
- }
-
- if (qmicli_qmiwwan_options_enabled ()) {
- service = QMI_SERVICE_UNKNOWN;
- actions_enabled++;
- }
-
-#if defined HAVE_QMI_SERVICE_DMS
- if (qmicli_dms_options_enabled ()) {
- service = QMI_SERVICE_DMS;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_NAS
- if (qmicli_nas_options_enabled ()) {
- service = QMI_SERVICE_NAS;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_WDS
- if (qmicli_wds_options_enabled ()) {
- service = QMI_SERVICE_WDS;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_PBM
- if (qmicli_pbm_options_enabled ()) {
- service = QMI_SERVICE_PBM;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_PDC
- if (qmicli_pdc_options_enabled ()) {
- service = QMI_SERVICE_PDC;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_UIM
- if (qmicli_uim_options_enabled ()) {
- service = QMI_SERVICE_UIM;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_SAR
- if (qmicli_sar_options_enabled ()) {
- service = QMI_SERVICE_SAR;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_WMS
- if (qmicli_wms_options_enabled ()) {
- service = QMI_SERVICE_WMS;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_WDA
- if (qmicli_wda_options_enabled ()) {
- service = QMI_SERVICE_WDA;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_VOICE
- if (qmicli_voice_options_enabled ()) {
- service = QMI_SERVICE_VOICE;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_LOC
- if (qmicli_loc_options_enabled ()) {
- service = QMI_SERVICE_LOC;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_QOS
- if (qmicli_qos_options_enabled ()) {
- service = QMI_SERVICE_QOS;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_GAS
- if (qmicli_gas_options_enabled ()) {
- service = QMI_SERVICE_GAS;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_GMS
- if (qmicli_gms_options_enabled ()) {
- service = QMI_SERVICE_GMS;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_DSD
- if (qmicli_dsd_options_enabled ()) {
- service = QMI_SERVICE_DSD;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_DPM
- if (qmicli_dpm_options_enabled ()) {
- service = QMI_SERVICE_DPM;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_FOX
- if (qmicli_fox_options_enabled ()) {
- service = QMI_SERVICE_FOX;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_ATR
- if (qmicli_atr_options_enabled ()) {
- service = QMI_SERVICE_ATR;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_IMSP
- if (qmicli_imsp_options_enabled ()) {
- service = QMI_SERVICE_IMSP;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_IMSA
- if (qmicli_imsa_options_enabled ()) {
- service = QMI_SERVICE_IMSA;
- actions_enabled++;
- }
-#endif
-
-#if defined HAVE_QMI_SERVICE_IMS
- if (qmicli_ims_options_enabled ()) {
- service = QMI_SERVICE_IMS;
- actions_enabled++;
- }
-#endif
-
- /* Cannot mix actions from different services */
- if (actions_enabled > 1) {
- g_printerr ("error: cannot execute multiple actions of different services\n");
- exit (EXIT_FAILURE);
- }
-
- /* No options? */
- if (actions_enabled == 0) {
- g_printerr ("error: no actions specified\n");
- exit (EXIT_FAILURE);
- }
-
- /* Go on! */
-}
-
-int main (int argc, char **argv)
-{
- GError *error = NULL;
- GFile *file;
- GOptionContext *context;
-
- setlocale (LC_ALL, "");
-
- /* Setup option context, process it and destroy it */
- context = g_option_context_new ("- Control QMI devices");
-#if defined HAVE_QMI_SERVICE_DMS
- g_option_context_add_group (context, qmicli_dms_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_NAS
- g_option_context_add_group (context, qmicli_nas_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_WDS
- g_option_context_add_group (context, qmicli_wds_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_PBM
- g_option_context_add_group (context, qmicli_pbm_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_PDC
- g_option_context_add_group (context, qmicli_pdc_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_UIM
- g_option_context_add_group (context, qmicli_uim_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_SAR
- g_option_context_add_group (context, qmicli_sar_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_WMS
- g_option_context_add_group (context, qmicli_wms_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_WDA
- g_option_context_add_group (context, qmicli_wda_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_VOICE
- g_option_context_add_group (context, qmicli_voice_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_LOC
- g_option_context_add_group (context, qmicli_loc_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_QOS
- g_option_context_add_group (context, qmicli_qos_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_GAS
- g_option_context_add_group (context, qmicli_gas_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_GMS
- g_option_context_add_group (context, qmicli_gms_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_DSD
- g_option_context_add_group (context, qmicli_dsd_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_DPM
- g_option_context_add_group (context, qmicli_dpm_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_FOX
- g_option_context_add_group (context, qmicli_fox_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_ATR
- g_option_context_add_group (context, qmicli_atr_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_IMSP
- g_option_context_add_group (context, qmicli_imsp_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_IMSA
- g_option_context_add_group (context, qmicli_imsa_get_option_group ());
-#endif
-#if defined HAVE_QMI_SERVICE_IMS
- g_option_context_add_group (context, qmicli_ims_get_option_group ());
-#endif
- g_option_context_add_group (context, qmicli_link_management_get_option_group ());
- g_option_context_add_group (context, qmicli_qmiwwan_get_option_group ());
- g_option_context_add_main_entries (context, main_entries, NULL);
- if (!g_option_context_parse (context, &argc, &argv, &error)) {
- g_printerr ("error: %s\n",
- error->message);
- exit (EXIT_FAILURE);
- }
- g_option_context_free (context);
-
- if (version_flag)
- print_version_and_exit ();
-
- g_log_set_handler (NULL, G_LOG_LEVEL_MASK, log_handler, NULL);
- g_log_set_handler ("Qmi", G_LOG_LEVEL_MASK, log_handler, NULL);
-
- if (verbose_flag && verbose_full_flag) {
- g_printerr ("error: cannot specify --verbose and --verbose-full at the same time\n");
- exit (EXIT_FAILURE);
- } else if (verbose_flag) {
- qmi_utils_set_traces_enabled (TRUE);
- qmi_utils_set_show_personal_info (FALSE);
- } else if (verbose_full_flag) {
- qmi_utils_set_traces_enabled (TRUE);
- qmi_utils_set_show_personal_info (TRUE);
- }
-
-#if QMI_MBIM_QMUX_SUPPORTED
- /* libmbim logging */
- g_log_set_handler ("Mbim", G_LOG_LEVEL_MASK, log_handler, NULL);
- if (verbose_flag) {
- mbim_utils_set_traces_enabled (TRUE);
-#if MBIM_CHECK_VERSION(1,27,6)
- mbim_utils_set_show_personal_info (FALSE);
-#endif
- } else if (verbose_full_flag) {
- mbim_utils_set_traces_enabled (TRUE);
-#if MBIM_CHECK_VERSION(1,27,6)
- mbim_utils_set_show_personal_info (TRUE);
-#endif
- }
-#endif
-
-#if QMI_QRTR_SUPPORTED
- /* libqrtr-glib logging */
- g_log_set_handler ("Qrtr", G_LOG_LEVEL_MASK, log_handler, NULL);
-#endif
-
- /* No device path given? */
- if (!device_str) {
- g_printerr ("error: no device path specified\n");
- exit (EXIT_FAILURE);
- }
-
- /* Build new GFile from the commandline arg */
- file = g_file_new_for_commandline_arg (device_str);
-
- parse_actions ();
-
- /* Create requirements for async options */
- cancellable = g_cancellable_new ();
- loop = g_main_loop_new (NULL, FALSE);
-
- /* Setup signals */
- g_unix_signal_add (SIGINT, (GSourceFunc) signals_handler, NULL);
- g_unix_signal_add (SIGHUP, (GSourceFunc) signals_handler, NULL);
- g_unix_signal_add (SIGTERM, (GSourceFunc) signals_handler, NULL);
-
- /* Launch QmiDevice creation */
- if (!make_device (file))
- return EXIT_FAILURE;
-
- g_main_loop_run (loop);
-
- if (cancellable)
- g_object_unref (cancellable);
- if (client)
- g_object_unref (client);
- if (device)
- g_object_unref (device);
- g_main_loop_unref (loop);
- g_object_unref (file);
-
- return (operation_status ? EXIT_SUCCESS : EXIT_FAILURE);
-}