static DBusMessage *hfp_agent_new_connection(DBusConnection *conn, DBusMessage *msg, void *data) { int fd, err; struct ofono_modem *modem = data; struct hfp_data *hfp_data = ofono_modem_get_data(modem); guint16 version; if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UNIX_FD, &fd, DBUS_TYPE_UINT16, &version, DBUS_TYPE_INVALID)) return __ofono_error_invalid_args(msg); hfp_slc_info_init(&hfp_data->info, version); err = service_level_connection(modem, fd); if (err < 0 && err != -EINPROGRESS) return __ofono_error_failed(msg); hfp_data->slc_msg = msg; dbus_message_ref(msg); return NULL; }
static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *msg, void *user_data) { struct hfp *hfp; struct ofono_modem *modem; struct sockaddr_rc saddr; socklen_t optlen; DBusMessageIter entry; const char *device, *driver; char local[18], remote[18]; uint16_t version = HFP_VERSION_1_5; int fd, err; DBG("Profile handler NewConnection"); if (dbus_message_iter_init(msg, &entry) == FALSE) goto invalid; if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_OBJECT_PATH) goto invalid; dbus_message_iter_get_basic(&entry, &device); dbus_message_iter_next(&entry); if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_UNIX_FD) goto invalid; dbus_message_iter_get_basic(&entry, &fd); if (fd < 0) goto invalid; dbus_message_iter_next(&entry); if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_ARRAY) goto invalid; if (get_version(&entry, &version) < 0) goto invalid; DBG("version: %hd", version); modem = ofono_modem_find(device_path_compare, (void *) device); if (modem == NULL) { close(fd); return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE ".Rejected", "Unknown Bluetooth device"); } err = service_level_connection(modem, fd, version); if (err < 0 && err != -EINPROGRESS) { close(fd); return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE ".Rejected", "Not enough resources"); } memset(&saddr, 0, sizeof(saddr)); optlen = sizeof(saddr); if (getsockname(fd, (struct sockaddr *) &saddr, &optlen) < 0) { err = errno; ofono_error("RFCOMM getsockname(): %s (%d)", strerror(err), err); close(fd); goto invalid; } bt_ba2str(&saddr.rc_bdaddr, local); memset(&saddr, 0, sizeof(saddr)); optlen = sizeof(saddr); if (getpeername(fd, (struct sockaddr *) &saddr, &optlen) < 0) { err = errno; ofono_error("RFCOMM getpeername(): %s (%d)", strerror(err), err); close(fd); goto invalid; } bt_ba2str(&saddr.rc_bdaddr, remote); hfp = ofono_modem_get_data(modem); hfp->msg = dbus_message_ref(msg); driver = NULL; if (version >= HFP_VERSION_1_6) driver = HFP16_HF_DRIVER; hfp->card = ofono_handsfree_card_create(0, driver, hfp); ofono_handsfree_card_set_data(hfp->card, hfp); ofono_handsfree_card_set_local(hfp->card, local); ofono_handsfree_card_set_remote(hfp->card, remote); return NULL; invalid: return g_dbus_create_error(msg, BLUEZ_ERROR_INTERFACE ".Rejected", "Invalid arguments in method call"); }