static DBusMessage *proxy_enable(DBusConnection *conn, DBusMessage *msg, void *data) { struct serial_proxy *prx = data; sdp_record_t *record; GError *err = NULL; DBusMessage *reply; if (prx->io) return failed(msg, "Already enabled"); /* Listen */ prx->io = bt_io_listen(BT_IO_RFCOMM, NULL, confirm_event_cb, prx, NULL, &err, BT_IO_OPT_SOURCE_BDADDR, &prx->src, BT_IO_OPT_INVALID); if (!prx->io) goto failed; bt_io_get(prx->io, BT_IO_RFCOMM, &err, BT_IO_OPT_CHANNEL, &prx->channel, BT_IO_OPT_INVALID); if (err) { g_io_channel_unref(prx->io); prx->io = NULL; goto failed; } debug("Allocated channel %d", prx->channel); g_io_channel_set_close_on_unref(prx->io, TRUE); record = proxy_record_new(prx->uuid128, prx->channel); if (!record) { g_io_channel_unref(prx->io); return failed(msg, "Unable to allocate new service record"); } if (add_record_to_server(&prx->src, record) < 0) { sdp_record_free(record); g_io_channel_unref(prx->io); return failed(msg, "Service registration failed"); } prx->record_id = record->handle; return dbus_message_new_method_return(msg); failed: error("%s", err->message); reply = failed(msg, err->message); g_error_free(err); return reply; }
static int enable_proxy(struct serial_proxy *prx) { sdp_record_t *record; GError *gerr = NULL; int err; if (prx->io) return -EALREADY; /* Listen */ prx->io = bt_io_listen(BT_IO_RFCOMM, NULL, confirm_event_cb, prx, NULL, &gerr, BT_IO_OPT_SOURCE_BDADDR, &prx->src, BT_IO_OPT_INVALID); if (!prx->io) goto failed; bt_io_get(prx->io, BT_IO_RFCOMM, &gerr, BT_IO_OPT_CHANNEL, &prx->channel, BT_IO_OPT_INVALID); if (gerr) { g_io_channel_unref(prx->io); prx->io = NULL; goto failed; } debug("Allocated channel %d", prx->channel); g_io_channel_set_close_on_unref(prx->io, TRUE); record = proxy_record_new(prx->uuid128, prx->channel); if (!record) { g_io_channel_unref(prx->io); return -ENOMEM; } err = add_record_to_server(&prx->src, record); if (err < 0) { sdp_record_free(record); g_io_channel_unref(prx->io); return err; } prx->record_id = record->handle; return 0; failed: error("%s", gerr->message); g_error_free(gerr); return -EIO; }