diff options
Diffstat (limited to 'src/dbus-service.c')
-rw-r--r-- | src/dbus-service.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/dbus-service.c b/src/dbus-service.c new file mode 100644 index 00000000..a85c3d8a --- /dev/null +++ b/src/dbus-service.c @@ -0,0 +1,157 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2006-2007 Nokia Corporation + * Copyright (C) 2004-2008 Marcel Holtmann <marcel@holtmann.org> + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <errno.h> +#include <unistd.h> +#include <stdlib.h> +#include <dirent.h> +#include <signal.h> +#include <ctype.h> +#include <sys/types.h> +#include <sys/wait.h> + +#include <bluetooth/bluetooth.h> +#include <bluetooth/hci.h> +#include <bluetooth/hci_lib.h> +#include <bluetooth/sdp.h> + +#include <glib.h> +#include <dbus/dbus.h> +#include <gdbus.h> + +#include "hcid.h" +#include "server.h" +#include "dbus-common.h" +#include "error.h" +#include "manager.h" +#include "adapter.h" +#include "agent.h" +#include "device.h" +#include "dbus-service.h" +#include "dbus-hci.h" + +struct service_auth { + service_auth_cb cb; + void *user_data; +}; + +static void agent_auth_cb(struct agent *agent, DBusError *derr, void *user_data) +{ + struct service_auth *auth = user_data; + + auth->cb(derr, auth->user_data); + + g_free(auth); +} + +int service_req_auth(const bdaddr_t *src, const bdaddr_t *dst, + const char *uuid, service_auth_cb cb, void *user_data) +{ + struct service_auth *auth; + struct adapter *adapter; + struct btd_device *device; + struct agent *agent; + char address[18]; + gboolean trusted; + const gchar *dev_path; + + if (src == NULL || dst == NULL) + return -EINVAL; + + adapter = manager_find_adapter(src); + if (!adapter) + return -EPERM; + + /* Device connected? */ + if (!g_slist_find_custom(adapter->active_conn, + dst, active_conn_find_by_bdaddr)) + return -ENOTCONN; + + ba2str(dst, address); + trusted = read_trust(src, address, GLOBAL_TRUST); + + if (trusted) { + cb(NULL, user_data); + return 0; + } + + device = adapter_find_device(adapter, address); + if (!device) + return -EPERM; + + agent = device_get_agent(device); + + if (!agent) + agent = adapter->agent; + + if (!agent) + return -EPERM; + + auth = g_try_new0(struct service_auth, 1); + if (!auth) + return -ENOMEM; + + auth->cb = cb; + auth->user_data = user_data; + + dev_path = device_get_path(device); + + return agent_authorize(agent, dev_path, uuid, agent_auth_cb, auth); +} + +int service_cancel_auth(const bdaddr_t *src, const bdaddr_t *dst) +{ + struct adapter *adapter = manager_find_adapter(src); + struct btd_device *device; + struct agent *agent; + char address[18]; + + if (!adapter) + return -EPERM; + + ba2str(dst, address); + device = adapter_find_device(adapter, address); + if (!device) + return -EPERM; + + /* + * FIXME: Cancel fails if authorization is requested to adapter's + * agent and in the meanwhile CreatePairedDevice is called. + */ + + agent = device_get_agent(device); + + if (!agent) + agent = adapter->agent; + + if (!agent) + return -EPERM; + + return agent_cancel(agent); +} |