static DBusMessage *add_service_record(DBusConnection *conn, DBusMessage *msg, void *data) { struct service_adapter *serv_adapter = data; DBusMessage *reply; const char *sender, *record; dbus_uint32_t handle; int err; if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &record, DBUS_TYPE_INVALID) == FALSE) return NULL; sender = dbus_message_get_sender(msg); err = add_xml_record(conn, sender, serv_adapter, record, &handle); if (err < 0) return failed_strerror(msg, err); reply = dbus_message_new_method_return(msg); if (!reply) return NULL; dbus_message_append_args(reply, DBUS_TYPE_UINT32, &handle, DBUS_TYPE_INVALID); return reply; }
static DBusMessage *old_list_adapters(DBusConnection *conn, DBusMessage *msg, void *data) { DBusMessageIter iter; DBusMessageIter array_iter; DBusMessage *reply; struct hci_dev_list_req *dl; struct hci_dev_req *dr; int i, sk; if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) return invalid_args(msg); sk = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); if (sk < 0) return failed_strerror(msg, errno); dl = g_malloc0(HCI_MAX_DEV * sizeof(*dr) + sizeof(*dl)); dl->dev_num = HCI_MAX_DEV; dr = dl->dev_req; if (ioctl(sk, HCIGETDEVLIST, dl) < 0) { int err = errno; close(sk); g_free(dl); return failed_strerror(msg, err); } dr = dl->dev_req; reply = dbus_message_new_method_return(msg); if (!reply) { close(sk); g_free(dl); return NULL; } dbus_message_iter_init_append(reply, &iter); dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &array_iter); for (i = 0; i < dl->dev_num; i++, dr++) { char path[MAX_PATH_LENGTH], *path_ptr = path; struct hci_dev_info di; if (hci_devinfo(dr->dev_id, &di) < 0) continue; if (hci_test_bit(HCI_RAW, &di.flags)) continue; snprintf(path, sizeof(path), "%s/%s", BASE_PATH, di.name); dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &path_ptr); } dbus_message_iter_close_container(&iter, &array_iter); g_free(dl); close(sk); return reply; }