static int input_device_connadd(struct input_device *idev, struct input_conn *iconn) { int err; err = input_device_connected(idev, iconn); if (err < 0) goto error; return 0; error: if (iconn->ctrl_io) { g_io_channel_shutdown(iconn->ctrl_io, FALSE, NULL); g_io_channel_unref(iconn->ctrl_io); iconn->ctrl_io = NULL; } if (iconn->intr_io) { g_io_channel_shutdown(iconn->intr_io, FALSE, NULL); g_io_channel_unref(iconn->intr_io); iconn->intr_io = NULL; } return err; }
static void interrupt_connect_cb(GIOChannel *chan, GError *conn_err, gpointer user_data) { struct input_conn *iconn = user_data; struct input_device *idev = iconn->idev; DBusMessage *reply = NULL; int err; const char *err_msg; DBG("idev %p", idev); if (conn_err) { err_msg = conn_err->message; goto failed; } err = input_device_connected(idev, iconn); if (err < 0) { err_msg = strerror(-err); goto failed; } /* Replying to the requestor */ if (iconn->pending_connect) { g_dbus_send_reply(idev->conn, iconn->pending_connect, DBUS_TYPE_INVALID); dbus_message_unref(iconn->pending_connect); iconn->pending_connect = NULL; } return; failed: error("%s", err_msg); if (iconn->pending_connect) { reply = btd_error_failed(iconn->pending_connect, err_msg); g_dbus_send_message(idev->conn, reply); dbus_message_unref(iconn->pending_connect); iconn->pending_connect = NULL; } /* So we guarantee the interrupt channel is closed before the * control channel (if we only do unref GLib will close it only * after returning control to the mainloop */ if (!conn_err) g_io_channel_shutdown(iconn->intr_io, FALSE, NULL); g_io_channel_unref(iconn->intr_io); iconn->intr_io = NULL; if (iconn->ctrl_io) { g_io_channel_unref(iconn->ctrl_io); iconn->ctrl_io = NULL; } }
static void interrupt_connect_cb(GIOChannel *chan, GError *conn_err, gpointer user_data) { struct input_conn *iconn = user_data; struct input_device *idev = iconn->idev; DBusMessage *reply; int err; const char *err_msg; if (conn_err) { err_msg = conn_err->message; g_io_channel_unref(iconn->intr_io); iconn->intr_io = NULL; goto failed; } err = input_device_connected(idev, iconn); if (err < 0) { err_msg = strerror(-err); goto failed; } /* Replying to the requestor */ g_dbus_send_reply(idev->conn, iconn->pending_connect, DBUS_TYPE_INVALID); dbus_message_unref(iconn->pending_connect); iconn->pending_connect = NULL; return; failed: error("%s", err_msg); reply = connection_attempt_failed(iconn->pending_connect, err_msg); g_dbus_send_message(idev->conn, reply); if (iconn->ctrl_io) g_io_channel_shutdown(iconn->ctrl_io, FALSE, NULL); if (iconn->intr_io) { if (!conn_err) g_io_channel_shutdown(iconn->intr_io, FALSE, NULL); g_io_channel_unref(iconn->intr_io); iconn->intr_io = NULL; } }
static void interrupt_connect_cb(GIOChannel *chan, GError *conn_err, gpointer user_data) { struct input_device *idev = user_data; GIOCondition cond = G_IO_HUP | G_IO_ERR | G_IO_NVAL; int err; if (conn_err) { err = -EIO; goto failed; } err = input_device_connected(idev); if (err < 0) goto failed; if (idev->uhid) cond |= G_IO_IN; idev->intr_watch = g_io_add_watch(idev->intr_io, cond, intr_watch_cb, idev); return; failed: btd_service_connecting_complete(idev->service, err); /* So we guarantee the interrupt channel is closed before the * control channel (if we only do unref GLib will close it only * after returning control to the mainloop */ if (!conn_err) g_io_channel_shutdown(idev->intr_io, FALSE, NULL); g_io_channel_unref(idev->intr_io); idev->intr_io = NULL; if (idev->ctrl_io) { g_io_channel_unref(idev->ctrl_io); idev->ctrl_io = NULL; } }
static int input_device_connadd(struct input_device *idev) { int err; err = input_device_connected(idev); if (err == 0) return 0; if (idev->ctrl_io) { g_io_channel_shutdown(idev->ctrl_io, FALSE, NULL); g_io_channel_unref(idev->ctrl_io); idev->ctrl_io = NULL; } if (idev->intr_io) { g_io_channel_shutdown(idev->intr_io, FALSE, NULL); g_io_channel_unref(idev->intr_io); idev->intr_io = NULL; } return err; }