void mm_port_qmi_close (MMPortQmi *self) { GList *l; GError *error = NULL; g_return_if_fail (MM_IS_PORT_QMI (self)); if (!self->priv->qmi_device) return; /* Release all allocated clients */ for (l = self->priv->services; l; l = g_list_next (l)) { ServiceInfo *info = l->data; mm_dbg ("Releasing client for service '%s'...", qmi_service_get_string (info->service)); qmi_device_release_client (self->priv->qmi_device, info->client, QMI_DEVICE_RELEASE_CLIENT_FLAGS_RELEASE_CID, 3, NULL, NULL, NULL); g_clear_object (&info->client); } g_list_free_full (self->priv->services, (GDestroyNotify)g_free); self->priv->services = NULL; /* Close and release the device */ if (!qmi_device_close (self->priv->qmi_device, &error)) { mm_warn ("Couldn't properly close QMI device: %s", error->message); g_error_free (error); } g_clear_object (&self->priv->qmi_device); }
int main(int argc, char **argv) { static struct qmi_dev dev; int ch; while ((ch = getopt_long(argc, argv, "d:k:", uqmi_getopt, NULL)) != -1) { int cmd_opt = CMD_OPT(ch); if (ch < 0 && cmd_opt >= 0 && cmd_opt < __UQMI_COMMAND_LAST) { uqmi_add_command(optarg, cmd_opt); continue; } switch(ch) { case 'r': release_client_id(&dev, optarg); break; case 'k': keep_client_id(&dev, optarg); break; case 'd': device = optarg; break; default: return usage(argv[0]); } } if (!device) { fprintf(stderr, "No device given\n"); return usage(argv[0]); } uloop_init(); signal(SIGINT, handle_exit_signal); signal(SIGTERM, handle_exit_signal); if (qmi_device_open(&dev, device)) { fprintf(stderr, "Failed to open device\n"); uloop_done(); return 2; } uqmi_run_commands(&dev); qmi_device_close(&dev); uloop_done(); return 0; }