summaryrefslogtreecommitdiffstats
path: root/hcid/dbus.c
diff options
context:
space:
mode:
Diffstat (limited to 'hcid/dbus.c')
-rw-r--r--hcid/dbus.c258
1 files changed, 206 insertions, 52 deletions
diff --git a/hcid/dbus.c b/hcid/dbus.c
index 45b101f9..eb2e0578 100644
--- a/hcid/dbus.c
+++ b/hcid/dbus.c
@@ -272,59 +272,33 @@ static DBusMessage* handle_device_up_req(DBusMessage *msg, void *data);
static DBusMessage* handle_device_down_req(DBusMessage *msg, void *data);
static DBusMessage* handle_device_set_propety_req(DBusMessage *msg, void *data);
static DBusMessage* handle_device_get_propety_req(DBusMessage *msg, void *data);
+static DBusMessage* handle_device_set_propety_req_name(DBusMessage *msg, void *data);
+static DBusMessage* handle_device_get_propety_req_name(DBusMessage *msg, void *data);
static const struct service_data device_services[] = {
{ DEV_UP, handle_device_up_req, DEV_UP_SIGNATURE },
{ DEV_DOWN, handle_device_down_req, DEV_DOWN_SIGNATURE },
- { DEV_SET_PROPERTY, handle_device_set_propety_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_SET_PROPERTY, handle_device_set_propety_req, DEV_SET_PROPERTY_SIGNATURE_2 },
- { DEV_SET_PROPERTY, handle_device_set_propety_req, DEV_SET_PROPERTY_SIGNATURE_3 },
+ { DEV_SET_PROPERTY, handle_device_set_propety_req, DEV_SET_PROPERTY_SIGNATURE_BOOL },
+ { DEV_SET_PROPERTY, handle_device_set_propety_req, DEV_SET_PROPERTY_SIGNATURE_STR },
+ { DEV_SET_PROPERTY, handle_device_set_propety_req, DEV_SET_PROPERTY_SIGNATURE_BYTE },
{ DEV_GET_PROPERTY, handle_device_get_propety_req, DEV_GET_PROPERTY_SIGNATURE },
{ NULL, NULL, NULL}
};
static const struct service_data set_property_services[] = {
- { DEV_PROPERTY_AUTH, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_ENCRYPT, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_SECMGR, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_PISCAN, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_PSCAN, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_ISCAN, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_PTYPE, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_LM, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_LP, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_NAME, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_CLASS, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_VOICE, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_IAC, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_INCMODE, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_INCTYPE, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_INCPARMS, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_PAGEPARMS, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_PAGETO, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_AFHMODE, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_ACLMTU, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_SCOMTU, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_PUTKEY, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
- { DEV_PROPERTY_DELKEY, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_1 },
+ { DEV_PROPERTY_AUTH, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_BOOL },
+ { DEV_PROPERTY_ENCRYPT, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_BOOL },
+ { DEV_PROPERTY_PSCAN, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_BOOL },
+ { DEV_PROPERTY_ISCAN, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_BOOL },
+ { DEV_PROPERTY_NAME, handle_device_set_propety_req_name, DEV_SET_PROPERTY_SIGNATURE_STR },
+ { DEV_PROPERTY_INCMODE, handle_not_implemented_req, DEV_SET_PROPERTY_SIGNATURE_BYTE },
{ NULL, NULL, NULL}
};
static const struct service_data get_property_services[] = {
- { DEV_PROPERTY_DEV_INFO, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_PTYPE, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_LM, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_LP, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_NAME, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_CLASS, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_VOICE, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_IAC, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_INCMODE, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_INCTYPE, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_INCPARMS, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_PAGEPARMS, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_PAGETO, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
- { DEV_PROPERTY_AFHMODE, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
+ { DEV_PROPERTY_DEV_INFO, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
+ { DEV_PROPERTY_NAME, handle_device_get_propety_req_name, DEV_GET_PROPERTY_SIGNATURE },
+ { DEV_PROPERTY_INCMODE, handle_not_implemented_req, DEV_GET_PROPERTY_SIGNATURE },
{ NULL, NULL, NULL}
};
@@ -435,8 +409,6 @@ static gboolean register_dbus_path(const char *path, uint16_t path_id, uint16_t
gboolean ret = FALSE;
struct hci_dbus_data *data = NULL;
- syslog(LOG_INFO, "Registering DBUS Path: %s", path);
-
data = malloc(sizeof(struct hci_dbus_data));
if (data == NULL) {
syslog(LOG_ERR, "Failed to alloc memory to DBUS path register data (%s)", path);
@@ -471,9 +443,7 @@ static gboolean unregister_dbus_path(const char *path)
{
void *data;
- syslog(LOG_INFO, "Unregistering DBUS Path: %s", path);
-
- if (dbus_connection_get_object_path_data(connection, path, &data) && data)
+ if (dbus_connection_get_object_path_data(connection, path, &data) && data)
free(data);
if (!dbus_connection_unregister_object_path (connection, path)) {
@@ -1296,9 +1266,6 @@ static DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg,
method = dbus_message_get_member(msg);
signature = dbus_message_get_signature(msg);
- syslog(LOG_INFO, "%s - path:%s, path_id:0x%04x dev_id:0x%04x", __PRETTY_FUNCTION__,
- path, dbus_data->path_id, dbus_data->dev_id);
-
if (dbus_data->path_id == DEVICE_ROOT_ID) {
/* Device is down(path unregistered) or the path is wrong */
ret = DBUS_HANDLER_RESULT_HANDLED;
@@ -1369,8 +1336,6 @@ static DBusHandlerResult msg_func_manager(DBusConnection *conn, DBusMessage *msg
method = dbus_message_get_member(msg);
signature = dbus_message_get_signature(msg);
- syslog (LOG_INFO, "%s - path:%s", __PRETTY_FUNCTION__, path);
-
if (strcmp(iface, MANAGER_INTERFACE) != 0)
return ret;
@@ -1976,7 +1941,7 @@ static DBusMessage* handle_device_set_propety_req(DBusMessage *msg, void *data)
DBusMessage *reply = NULL;
const char *signature;
char *str_name;
- uint32_t error = BLUEZ_EDBUS_UNKNOWN_METHOD;
+ uint32_t error = BLUEZ_EDBUS_WRONG_PARAM;
signature = dbus_message_get_signature(msg);
@@ -2009,7 +1974,7 @@ static DBusMessage* handle_device_get_propety_req(DBusMessage *msg, void *data)
DBusMessageIter iter;
DBusMessage *reply = NULL;
char *str_name;
- uint32_t error = BLUEZ_EDBUS_UNKNOWN_METHOD;
+ uint32_t error = BLUEZ_EDBUS_WRONG_PARAM;
dbus_message_iter_init(msg, &iter);
@@ -2029,6 +1994,195 @@ static DBusMessage* handle_device_get_propety_req(DBusMessage *msg, void *data)
return reply;
}
+static DBusMessage* handle_device_set_propety_req_name(DBusMessage *msg, void *data)
+{
+ struct hci_dbus_data *dbus_data = data;
+ DBusMessageIter iter;
+ DBusMessage *reply = NULL;
+ char *str_name;
+ int dd = -1;
+ uint8_t status;
+ change_local_name_cp cp;
+ struct hci_request rq;
+
+ dbus_message_iter_init(msg, &iter);
+ dbus_message_iter_next(&iter);
+ dbus_message_iter_get_basic(&iter, &str_name);
+
+ if(strlen(str_name) == 0) {
+ syslog(LOG_ERR, "HCI change name failed - Invalid Name!");
+ reply = bluez_new_failure_msg(msg, BLUEZ_EDBUS_WRONG_PARAM);
+ goto failed;
+ }
+
+ dd = hci_open_dev(dbus_data->dev_id);
+ if (dd < 0) {
+ syslog(LOG_ERR, "HCI device open failed: hci%d", dbus_data->dev_id);
+ reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
+ goto failed;
+ }
+
+ memset(&rq, 0, sizeof(rq));
+ strncpy((char *) cp.name, str_name, sizeof(cp.name));
+ rq.ogf = OGF_HOST_CTL;
+ rq.ocf = OCF_CHANGE_LOCAL_NAME;
+ rq.cparam = &cp;
+ rq.clen = CHANGE_LOCAL_NAME_CP_SIZE;
+ rq.rparam = &status;
+ rq.rlen = sizeof(status);
+
+ if (hci_send_req(dd, &rq, 100) < 0) {
+ syslog(LOG_ERR, "Sending change name command failed: %s (%d)",
+ strerror(errno), errno);
+ reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
+ goto failed;
+ }
+
+ if (status) {
+ syslog(LOG_ERR, "Setting name failed with status 0x%02x", status);
+ reply = bluez_new_failure_msg(msg, BLUEZ_EBT_OFFSET + status);
+ goto failed;
+ }
+
+ reply = dbus_message_new_method_return(msg);
+
+failed:
+ if (dd >= 0)
+ close(dd);
+
+ return reply;
+}
+
+void hcid_dbus_setname_complete(bdaddr_t *local)
+{
+ DBusMessage *message = NULL;
+ char path[MAX_PATH_LENGTH];
+ char *local_addr;
+ bdaddr_t tmp;
+ int id;
+ int dd = -1;
+ read_local_name_rp rp;
+ struct hci_request rq;
+ const char *pname = (char*) rp.name;
+ char name[249];
+
+ baswap(&tmp, local); local_addr = batostr(&tmp);
+
+ id = hci_devid(local_addr);
+ if (id < 0) {
+ syslog(LOG_ERR, "No matching device id for %s", local_addr);
+ goto failed;
+ }
+
+ snprintf(path, sizeof(path), "%s/hci%d", DEVICE_PATH, id);
+
+ message = dbus_message_new_signal(path, DEVICE_INTERFACE,
+ BLUEZ_HCI_SET_NAME);
+ if (message == NULL) {
+ syslog(LOG_ERR, "Can't allocate D-BUS inquiry complete message");
+ goto failed;
+ }
+
+ dd = hci_open_dev(id);
+ memset(&rq, 0, sizeof(rq));
+ if (dd < 0) {
+ syslog(LOG_ERR, "HCI device open failed: hci%d", id);
+ } else {
+ rq.ogf = OGF_HOST_CTL;
+ rq.ocf = OCF_READ_LOCAL_NAME;
+ rq.rparam = &rp;
+ rq.rlen = READ_LOCAL_NAME_RP_SIZE;
+ if (hci_send_req(dd, &rq, 100) < 0) {
+ syslog(LOG_ERR,
+ "Sending getting name command failed: %s (%d)",
+ strerror(errno), errno);
+ rp.name[0] = '\0';
+ }
+ if (rp.status) {
+ syslog(LOG_ERR,
+ "Getting name failed with status 0x%02x",
+ rp.status);
+ rp.name[0] = '\0';
+ }
+ }
+
+ strncpy(name,pname,sizeof(name)-1);
+ name[248]='\0';
+ pname = name;
+
+ dbus_message_append_args(message,
+ DBUS_TYPE_STRING, &pname,
+ DBUS_TYPE_INVALID);
+
+ if (dbus_connection_send(connection, message, NULL) == FALSE) {
+ syslog(LOG_ERR, "Can't send D-BUS NameChanged signal");
+ goto failed;
+ }
+ dbus_connection_flush(connection);
+
+failed:
+ if (dd >= 0)
+ close(dd);
+ dbus_message_unref(message);
+ bt_free(local_addr);
+}
+
+static DBusMessage* handle_device_get_propety_req_name(DBusMessage *msg, void *data)
+{
+ struct hci_dbus_data *dbus_data = data;
+ DBusMessage *reply = NULL;
+ int dd = -1;
+ read_local_name_rp rp;
+ struct hci_request rq;
+ const char *pname = (char*) rp.name;
+ char name[249];
+
+ dd = hci_open_dev(dbus_data->dev_id);
+ if (dd < 0) {
+ syslog(LOG_ERR, "HCI device open failed: hci%d", dbus_data->dev_id);
+ reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
+ goto failed;
+ }
+ memset(&rq, 0, sizeof(rq));
+ rq.ogf = OGF_HOST_CTL;
+ rq.ocf = OCF_READ_LOCAL_NAME;
+ rq.rparam = &rp;
+ rq.rlen = READ_LOCAL_NAME_RP_SIZE;
+
+ if (hci_send_req(dd, &rq, 100) < 0) {
+ syslog(LOG_ERR, "Sending getting name command failed: %s (%d)",
+ strerror(errno), errno);
+ reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
+ goto failed;
+ }
+
+ if (rp.status) {
+ syslog(LOG_ERR, "Getting name failed with status 0x%02x", rp.status);
+ reply = bluez_new_failure_msg(msg, BLUEZ_EBT_OFFSET + rp.status);
+ goto failed;
+ }
+
+ reply = dbus_message_new_method_return(msg);
+ if (reply == NULL) {
+ syslog(LOG_ERR, "Out of memory while calling dbus_message_new_method_return");
+ goto failed;
+ }
+
+ strncpy(name,pname,sizeof(name)-1);
+ name[248]='\0';
+ pname = name;
+
+ dbus_message_append_args(reply,
+ DBUS_TYPE_STRING, &pname,
+ DBUS_TYPE_INVALID);
+
+failed:
+ if (dd >= 0)
+ close(dd);
+
+ return reply;
+}
+
static DBusMessage* handle_device_list_req(DBusMessage *msg, void *data)
{
DBusMessageIter iter;