1/*
2 *
3 *  BlueZ - Bluetooth protocol stack for Linux
4 *
5 *  Copyright (C) 2006-2007  Nokia Corporation
6 *  Copyright (C) 2004-2009  Marcel Holtmann <marcel@holtmann.org>
7 *
8 *
9 *  This program is free software; you can redistribute it and/or modify
10 *  it under the terms of the GNU General Public License as published by
11 *  the Free Software Foundation; either version 2 of the License, or
12 *  (at your option) any later version.
13 *
14 *  This program is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this program; if not, write to the Free Software
21 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
22 *
23 */
24
25#ifdef HAVE_CONFIG_H
26#include <config.h>
27#endif
28
29#define _GNU_SOURCE
30#include <stdio.h>
31#include <errno.h>
32#include <fcntl.h>
33#include <unistd.h>
34#include <stdlib.h>
35#include <sys/ioctl.h>
36
37#include <bluetooth/bluetooth.h>
38#include <bluetooth/hci.h>
39#include <bluetooth/hci_lib.h>
40#include <bluetooth/l2cap.h>
41#include <bluetooth/sdp.h>
42#include <bluetooth/sdp_lib.h>
43
44#include <glib.h>
45#include <dbus/dbus.h>
46#include <gdbus.h>
47
48#include "logging.h"
49#include "textfile.h"
50
51#include "hcid.h"
52#include "sdpd.h"
53#include "sdp-xml.h"
54#include "manager.h"
55#include "adapter.h"
56#include "device.h"
57#include "dbus-common.h"
58#include "dbus-hci.h"
59#include "error.h"
60#include "glib-helper.h"
61#include "agent.h"
62#include "storage.h"
63
64#define NUM_ELEMENTS(table) (sizeof(table)/sizeof(const char *))
65
66#define IO_CAPABILITY_DISPLAYONLY	0x00
67#define IO_CAPABILITY_DISPLAYYESNO	0x01
68#define IO_CAPABILITY_KEYBOARDONLY	0x02
69#define IO_CAPABILITY_NOINPUTNOOUTPUT	0x03
70#define IO_CAPABILITY_INVALID		0xFF
71
72#define check_address(address) bachk(address)
73
74static DBusConnection *connection = NULL;
75static GSList *adapter_drivers = NULL;
76
77const struct btd_adapter_ops *adapter_ops = NULL;
78
79struct session_req {
80	struct btd_adapter	*adapter;
81	DBusConnection		*conn;		/* Connection reference */
82	DBusMessage		*msg;		/* Unreplied message ref */
83	char			*owner;		/* Bus name of the owner */
84	guint			id;		/* Listener id */
85	uint8_t			mode;		/* Requested mode */
86	int			refcount;	/* Session refcount */
87};
88
89struct service_auth {
90	service_auth_cb cb;
91	void *user_data;
92	struct btd_device *device;
93};
94
95struct btd_adapter {
96	uint16_t dev_id;
97	int up;
98	char *path;			/* adapter object path */
99	bdaddr_t bdaddr;		/* adapter Bluetooth Address */
100	guint discov_timeout_id;	/* discoverable timeout id */
101	uint32_t discov_timeout;	/* discoverable time(sec) */
102	guint pairable_timeout_id;	/* pairable timeout id */
103	uint32_t pairable_timeout;	/* pairable time(sec) */
104	uint8_t scan_mode;		/* scan mode: SCAN_DISABLED, SCAN_PAGE,
105					 * SCAN_INQUIRY */
106	uint8_t mode;			/* off, connectable, discoverable,
107					 * limited */
108	uint8_t global_mode;		/* last valid global mode */
109	int state;			/* standard inq, periodic inq, name
110					 * resloving */
111	GSList *found_devices;
112	GSList *oor_devices;		/* out of range device list */
113	DBusMessage *discovery_cancel;	/* discovery cancel message request */
114	GSList *passkey_agents;
115	struct agent *agent;		/* For the new API */
116	GSList *connections;		/* Connected devices */
117	GSList *devices;		/* Devices structure pointers */
118	GSList *mode_sessions;		/* Request Mode sessions */
119	GSList *disc_sessions;		/* Discovery sessions */
120	guint scheduler_id;		/* Scheduler handle */
121
122	struct hci_dev dev;		/* hci info */
123	gboolean pairable;		/* pairable state */
124
125	gboolean initialized;
126	gboolean already_up;		/* adapter was already up on init */
127
128	gboolean off_requested;		/* DEVDOWN ioctl was called */
129
130	uint8_t svc_cache;		/* Service Class cache */
131	gboolean cache_enable;
132
133	gint ref;
134};
135
136static void adapter_set_pairable_timeout(struct btd_adapter *adapter,
137					guint interval);
138
139static inline DBusMessage *invalid_args(DBusMessage *msg)
140{
141	return g_dbus_create_error(msg, ERROR_INTERFACE ".InvalidArguments",
142			"Invalid arguments in method call");
143}
144
145static inline DBusMessage *not_available(DBusMessage *msg)
146{
147	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
148			"Not Available");
149}
150
151static inline DBusMessage *adapter_not_ready(DBusMessage *msg)
152{
153	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotReady",
154			"Adapter is not ready");
155}
156
157static inline DBusMessage *no_such_adapter(DBusMessage *msg)
158{
159	return g_dbus_create_error(msg, ERROR_INTERFACE ".NoSuchAdapter",
160							"No such adapter");
161}
162
163static inline DBusMessage *failed_strerror(DBusMessage *msg, int err)
164{
165	return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
166							strerror(err));
167}
168
169static inline DBusMessage *in_progress(DBusMessage *msg, const char *str)
170{
171	return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress", str);
172}
173
174static inline DBusMessage *not_in_progress(DBusMessage *msg, const char *str)
175{
176	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotInProgress", str);
177}
178
179static inline DBusMessage *not_authorized(DBusMessage *msg)
180{
181	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAuthorized",
182			"Not authorized");
183}
184
185static inline DBusMessage *unsupported_major_class(DBusMessage *msg)
186{
187	return g_dbus_create_error(msg,
188			ERROR_INTERFACE ".UnsupportedMajorClass",
189			"Unsupported Major Class");
190}
191
192static int found_device_cmp(const struct remote_dev_info *d1,
193			const struct remote_dev_info *d2)
194{
195	int ret;
196
197	if (bacmp(&d2->bdaddr, BDADDR_ANY)) {
198		ret = bacmp(&d1->bdaddr, &d2->bdaddr);
199		if (ret)
200			return ret;
201	}
202
203	if (d2->name_status != NAME_ANY) {
204		ret = (d1->name_status - d2->name_status);
205		if (ret)
206			return ret;
207	}
208
209	return 0;
210}
211
212static void dev_info_free(struct remote_dev_info *dev)
213{
214	g_free(dev->name);
215	g_free(dev->alias);
216	g_free(dev);
217}
218
219void clear_found_devices_list(struct btd_adapter *adapter)
220{
221	if (!adapter->found_devices)
222		return;
223
224	g_slist_foreach(adapter->found_devices, (GFunc) dev_info_free, NULL);
225	g_slist_free(adapter->found_devices);
226	adapter->found_devices = NULL;
227}
228
229static int set_service_classes(struct btd_adapter *adapter, uint8_t value)
230{
231	struct hci_dev *dev = &adapter->dev;
232	const uint8_t *cls = dev->class;
233	uint32_t dev_class;
234	int dd, err;
235
236	if (cls[2] == value)
237		return 0; /* Already set */
238
239	dd = hci_open_dev(adapter->dev_id);
240	if (dd < 0) {
241		err = -errno;
242		error("Can't open device hci%d: %s (%d)",
243				adapter->dev_id, strerror(errno), errno);
244		return err;
245	}
246
247	dev_class = (value << 16) | (cls[1] << 8) | cls[0];
248
249	debug("Changing service classes to 0x%06x", dev_class);
250
251	if (hci_write_class_of_dev(dd, dev_class, HCI_REQ_TIMEOUT) < 0) {
252		err = -errno;
253		error("Can't write class of device: %s (%d)",
254						strerror(errno), errno);
255		hci_close_dev(dd);
256		return err;
257	}
258
259	hci_close_dev(dd);
260
261	return 0;
262}
263
264int set_major_and_minor_class(struct btd_adapter *adapter, uint8_t major,
265								uint8_t minor)
266{
267	struct hci_dev *dev = &adapter->dev;
268	const uint8_t *cls = dev->class;
269	uint32_t dev_class;
270	int dd, err;
271
272	dd = hci_open_dev(adapter->dev_id);
273	if (dd < 0) {
274		err = -errno;
275		error("Can't open device hci%d: %s (%d)",
276				adapter->dev_id, strerror(errno), errno);
277		return err;
278	}
279
280	dev_class = (cls[2] << 16) | ((cls[1] & 0x20) << 8) |
281						((major & 0xdf) << 8) | minor;
282
283	debug("Changing major/minor class to 0x%06x", dev_class);
284
285	if (hci_write_class_of_dev(dd, dev_class, HCI_REQ_TIMEOUT) < 0) {
286		int err = -errno;
287		error("Can't write class of device: %s (%d)",
288						strerror(errno), errno);
289		hci_close_dev(dd);
290		return err;
291	}
292
293	hci_close_dev(dd);
294	return 0;
295}
296
297int pending_remote_name_cancel(struct btd_adapter *adapter)
298{
299	struct remote_dev_info *dev, match;
300	int err = 0;
301
302	/* find the pending remote name request */
303	memset(&match, 0, sizeof(struct remote_dev_info));
304	bacpy(&match.bdaddr, BDADDR_ANY);
305	match.name_status = NAME_REQUESTED;
306
307	dev = adapter_search_found_devices(adapter, &match);
308	if (!dev) /* no pending request */
309		return -ENODATA;
310
311	err = adapter_ops->cancel_resolve_name(adapter->dev_id, &dev->bdaddr);
312	if (err < 0)
313		error("Remote name cancel failed: %s(%d)",
314						strerror(errno), errno);
315	return err;
316}
317
318int adapter_resolve_names(struct btd_adapter *adapter)
319{
320	struct remote_dev_info *dev, match;
321	int err;
322
323	memset(&match, 0, sizeof(struct remote_dev_info));
324	bacpy(&match.bdaddr, BDADDR_ANY);
325	match.name_status = NAME_REQUIRED;
326
327	dev = adapter_search_found_devices(adapter, &match);
328	if (!dev)
329		return -ENODATA;
330
331	/* send at least one request or return failed if the list is empty */
332	do {
333		/* flag to indicate the current remote name requested */
334		dev->name_status = NAME_REQUESTED;
335
336		err = adapter_ops->resolve_name(adapter->dev_id, &dev->bdaddr);
337
338		if (!err)
339			break;
340
341		error("Unable to send HCI remote name req: %s (%d)",
342						strerror(errno), errno);
343
344		/* if failed, request the next element */
345		/* remove the element from the list */
346		adapter_remove_found_device(adapter, &dev->bdaddr);
347
348		/* get the next element */
349		dev = adapter_search_found_devices(adapter, &match);
350	} while (dev);
351
352	return err;
353}
354
355static const char *mode2str(uint8_t mode)
356{
357	switch(mode) {
358	case MODE_OFF:
359		return "off";
360	case MODE_CONNECTABLE:
361		return "connectable";
362	case MODE_DISCOVERABLE:
363	case MODE_LIMITED:
364		return "discoverable";
365	default:
366		return "unknown";
367	}
368}
369
370static uint8_t get_mode(const bdaddr_t *bdaddr, const char *mode)
371{
372	if (strcasecmp("off", mode) == 0)
373		return MODE_OFF;
374	else if (strcasecmp("connectable", mode) == 0)
375		return MODE_CONNECTABLE;
376	else if (strcasecmp("discoverable", mode) == 0)
377		return MODE_DISCOVERABLE;
378	else if (strcasecmp("limited", mode) == 0)
379		return MODE_LIMITED;
380	else if (strcasecmp("on", mode) == 0) {
381		char onmode[14], srcaddr[18];
382
383		ba2str(bdaddr, srcaddr);
384		if (read_on_mode(srcaddr, onmode, sizeof(onmode)) < 0)
385			return MODE_CONNECTABLE;
386
387		return get_mode(bdaddr, onmode);
388	} else
389		return MODE_UNKNOWN;
390}
391
392static void adapter_remove_discov_timeout(struct btd_adapter *adapter)
393{
394	if (!adapter)
395		return;
396
397	if(adapter->discov_timeout_id == 0)
398		return;
399
400	g_source_remove(adapter->discov_timeout_id);
401	adapter->discov_timeout_id = 0;
402}
403
404static gboolean discov_timeout_handler(gpointer user_data)
405{
406	struct btd_adapter *adapter = user_data;
407
408	adapter->discov_timeout_id = 0;
409
410	adapter_ops->set_connectable(adapter->dev_id);
411
412	return FALSE;
413}
414
415static void adapter_set_discov_timeout(struct btd_adapter *adapter,
416					guint interval)
417{
418	if (adapter->discov_timeout_id) {
419		g_source_remove(adapter->discov_timeout_id);
420		adapter->discov_timeout_id = 0;
421	}
422
423	if (interval == 0)
424		return;
425
426	adapter->discov_timeout_id = g_timeout_add_seconds(interval,
427							discov_timeout_handler,
428							adapter);
429}
430
431static int set_mode(struct btd_adapter *adapter, uint8_t new_mode)
432{
433	int err;
434	const char *modestr;
435
436	if (!adapter->up && new_mode != MODE_OFF) {
437		err = adapter_ops->set_powered(adapter->dev_id, TRUE);
438		if (err < 0)
439			return err;
440	}
441
442	if (adapter->up && new_mode == MODE_OFF) {
443		err = adapter_ops->set_powered(adapter->dev_id, FALSE);
444		if (err < 0)
445			return err;
446
447		adapter->off_requested = TRUE;
448
449		goto done;
450	}
451
452	if (new_mode == adapter->mode)
453		return 0;
454
455	if (new_mode == MODE_CONNECTABLE)
456		err = adapter_ops->set_connectable(adapter->dev_id);
457	else
458		err = adapter_ops->set_discoverable(adapter->dev_id);
459
460	if (err < 0)
461		return err;
462
463	if (new_mode > MODE_CONNECTABLE) {
464		adapter_remove_discov_timeout(adapter);
465
466		if (adapter->discov_timeout)
467			adapter_set_discov_timeout(adapter,
468						adapter->discov_timeout);
469
470		if (new_mode != MODE_LIMITED && adapter->mode == MODE_LIMITED)
471			adapter_ops->set_limited_discoverable(adapter->dev_id,
472						adapter->dev.class, FALSE);
473	}
474
475done:
476	modestr = mode2str(new_mode);
477
478	write_device_mode(&adapter->bdaddr, modestr);
479
480	adapter->mode = new_mode;
481
482	return 0;
483}
484
485static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg,
486				gboolean powered, void *data)
487{
488	struct btd_adapter *adapter = data;
489	uint8_t mode;
490	int err;
491
492	mode = powered ? get_mode(&adapter->bdaddr, "on") : MODE_OFF;
493
494	if (mode == adapter->mode)
495		return dbus_message_new_method_return(msg);
496
497	err = set_mode(adapter, mode);
498	if (err < 0)
499		return failed_strerror(msg, -err);
500
501	return dbus_message_new_method_return(msg);
502}
503
504static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg,
505				gboolean discoverable, void *data)
506{
507	struct btd_adapter *adapter = data;
508	uint8_t mode;
509	int err;
510
511	mode = discoverable ? MODE_DISCOVERABLE : MODE_CONNECTABLE;
512
513	if (mode == MODE_DISCOVERABLE && adapter->pairable &&
514					adapter->discov_timeout > 0 &&
515					adapter->discov_timeout <= 60)
516		mode = MODE_LIMITED;
517
518	if (mode == adapter->mode)
519		return dbus_message_new_method_return(msg);
520
521	err = set_mode(adapter, mode);
522	if (err < 0)
523		return failed_strerror(msg, -err);
524
525	return dbus_message_new_method_return(msg);
526}
527
528static DBusMessage *set_pairable(DBusConnection *conn, DBusMessage *msg,
529				gboolean pairable, void *data)
530{
531	struct btd_adapter *adapter = data;
532	uint8_t mode;
533	int err;
534
535	if (adapter->scan_mode == SCAN_DISABLED)
536		return adapter_not_ready(msg);
537
538	if (pairable == adapter->pairable)
539		goto done;
540
541	adapter->pairable = pairable;
542
543	write_device_pairable(&adapter->bdaddr, pairable);
544
545	emit_property_changed(connection, adapter->path,
546				ADAPTER_INTERFACE, "Pairable",
547				DBUS_TYPE_BOOLEAN, &pairable);
548
549	if (pairable && adapter->pairable_timeout)
550		adapter_set_pairable_timeout(adapter,
551						adapter->pairable_timeout);
552
553	if (!(adapter->scan_mode & SCAN_INQUIRY))
554		goto done;
555
556	mode = (pairable && adapter->discov_timeout > 0 &&
557				adapter->discov_timeout <= 60) ?
558					MODE_LIMITED : MODE_DISCOVERABLE;
559
560	err = set_mode(adapter, mode);
561	if (err < 0 && msg)
562		return failed_strerror(msg, -err);
563
564done:
565	return msg ? dbus_message_new_method_return(msg) : NULL;
566}
567
568static gboolean pairable_timeout_handler(void *data)
569{
570	set_pairable(NULL, NULL, FALSE, data);
571
572	return FALSE;
573}
574
575static void adapter_set_pairable_timeout(struct btd_adapter *adapter,
576					guint interval)
577{
578	if (adapter->pairable_timeout_id) {
579		g_source_remove(adapter->pairable_timeout_id);
580		adapter->pairable_timeout_id = 0;
581	}
582
583	if (interval == 0)
584		return;
585
586	adapter->pairable_timeout_id = g_timeout_add_seconds(interval,
587						pairable_timeout_handler,
588						adapter);
589}
590
591static struct session_req *find_session(GSList *list, const char *sender)
592{
593	GSList *l;
594
595	for (l = list; l; l = l->next) {
596		struct session_req *req = l->data;
597
598		if (g_str_equal(req->owner, sender))
599			return req;
600	}
601
602	return NULL;
603}
604
605static uint8_t get_needed_mode(struct btd_adapter *adapter, uint8_t mode)
606{
607	GSList *l;
608
609	if (adapter->global_mode > mode)
610		mode = adapter->global_mode;
611
612	for (l = adapter->mode_sessions; l; l = l->next) {
613		struct session_req *req = l->data;
614
615		if (req->mode > mode)
616			mode = req->mode;
617	}
618
619	return mode;
620}
621
622static void session_remove(struct session_req *req)
623{
624	struct btd_adapter *adapter = req->adapter;
625
626	if (req->mode) {
627		uint8_t mode;
628
629		adapter->mode_sessions = g_slist_remove(adapter->mode_sessions,
630							req);
631
632		mode = get_needed_mode(adapter, adapter->global_mode);
633
634		if (mode == adapter->mode)
635			return;
636
637		debug("Switching to '%s' mode", mode2str(mode));
638
639		set_mode(adapter, mode);
640	} else {
641		adapter->disc_sessions = g_slist_remove(adapter->disc_sessions,
642							req);
643
644		if (adapter->disc_sessions)
645			return;
646
647		debug("Stopping discovery");
648
649		pending_remote_name_cancel(adapter);
650
651		clear_found_devices_list(adapter);
652
653		g_slist_free(adapter->oor_devices);
654		adapter->oor_devices = NULL;
655
656		if (adapter->scheduler_id)
657			g_source_remove(adapter->scheduler_id);
658
659		adapter_ops->stop_discovery(adapter->dev_id);
660	}
661}
662
663static void session_free(struct session_req *req)
664{
665	debug("%s session %p with %s deactivated",
666		req->mode ? "Mode" : "Discovery", req, req->owner);
667
668	if (req->id)
669		g_dbus_remove_watch(req->conn, req->id);
670
671	session_remove(req);
672
673	if (req->msg)
674		dbus_message_unref(req->msg);
675	if (req->conn)
676		dbus_connection_unref(req->conn);
677	g_free(req->owner);
678	g_free(req);
679}
680
681static void session_owner_exit(DBusConnection *conn, void *user_data)
682{
683	struct session_req *req = user_data;
684
685	req->id = 0;
686
687	session_free(req);
688}
689
690static struct session_req *session_ref(struct session_req *req)
691{
692	req->refcount++;
693
694	debug("session_ref(%p): ref=%d", req, req->refcount);
695
696	return req;
697}
698
699static void session_unref(struct session_req *req)
700{
701	req->refcount--;
702
703	debug("session_unref(%p): ref=%d", req, req->refcount);
704
705	if (req->refcount)
706		return;
707
708	session_free(req);
709}
710
711static struct session_req *create_session(struct btd_adapter *adapter,
712					DBusConnection *conn, DBusMessage *msg,
713					uint8_t mode, GDBusWatchFunction cb)
714{
715	struct session_req *req;
716	const char *sender = dbus_message_get_sender(msg);
717
718	req = g_new0(struct session_req, 1);
719	req->adapter = adapter;
720	req->conn = dbus_connection_ref(conn);
721	req->msg = dbus_message_ref(msg);
722	req->owner = g_strdup(dbus_message_get_sender(msg));
723	req->mode = mode;
724
725	if (cb)
726		req->id = g_dbus_add_disconnect_watch(conn, sender, cb, req,
727							NULL);
728
729	info("%s session %p with %s activated",
730		req->mode ? "Mode" : "Discovery", req, sender);
731
732	return session_ref(req);
733}
734
735static void confirm_mode_cb(struct agent *agent, DBusError *derr, void *data)
736{
737	struct session_req *req = data;
738	int err;
739	DBusMessage *reply;
740
741	if (derr && dbus_error_is_set(derr)) {
742		reply = dbus_message_new_error(req->msg, derr->name,
743						derr->message);
744		g_dbus_send_message(req->conn, reply);
745		session_unref(req);
746		return;
747	}
748
749	err = set_mode(req->adapter, req->mode);
750	if (err < 0)
751		reply = failed_strerror(req->msg, -err);
752	else
753		reply = dbus_message_new_method_return(req->msg);
754
755	g_dbus_send_message(req->conn, reply);
756
757	dbus_message_unref(req->msg);
758	req->msg = NULL;
759
760	if (!find_session(req->adapter->mode_sessions, req->owner))
761		session_unref(req);
762}
763
764static DBusMessage *set_discoverable_timeout(DBusConnection *conn,
765							DBusMessage *msg,
766							uint32_t timeout,
767							void *data)
768{
769	struct btd_adapter *adapter = data;
770	const char *path;
771
772	if (adapter->discov_timeout == timeout && timeout == 0)
773		return dbus_message_new_method_return(msg);
774
775	if (adapter->scan_mode & SCAN_INQUIRY)
776		adapter_set_discov_timeout(adapter, timeout);
777
778	adapter->discov_timeout = timeout;
779
780	write_discoverable_timeout(&adapter->bdaddr, timeout);
781
782	path = dbus_message_get_path(msg);
783
784	emit_property_changed(conn, path,
785				ADAPTER_INTERFACE, "DiscoverableTimeout",
786				DBUS_TYPE_UINT32, &timeout);
787
788	return dbus_message_new_method_return(msg);
789}
790
791static DBusMessage *set_pairable_timeout(DBusConnection *conn,
792						DBusMessage *msg,
793						uint32_t timeout,
794						void *data)
795{
796	struct btd_adapter *adapter = data;
797	const char *path;
798
799	if (adapter->pairable_timeout == timeout && timeout == 0)
800		return dbus_message_new_method_return(msg);
801
802	if (adapter->pairable)
803		adapter_set_pairable_timeout(adapter, timeout);
804
805	adapter->pairable_timeout = timeout;
806
807	write_pairable_timeout(&adapter->bdaddr, timeout);
808
809	path = dbus_message_get_path(msg);
810
811	emit_property_changed(conn, path,
812				ADAPTER_INTERFACE, "PairableTimeout",
813				DBUS_TYPE_UINT32, &timeout);
814
815	return dbus_message_new_method_return(msg);
816}
817
818static void update_ext_inquiry_response(struct btd_adapter *adapter)
819{
820	uint8_t fec = 0, data[240];
821	struct hci_dev *dev = &adapter->dev;
822	int dd;
823
824	if (!(dev->features[6] & LMP_EXT_INQ))
825		return;
826
827	memset(data, 0, sizeof(data));
828
829	dd = hci_open_dev(adapter->dev_id);
830	if (dd < 0)
831		return;
832
833	if (dev->ssp_mode > 0)
834		create_ext_inquiry_response((char *) dev->name, data);
835
836	if (hci_write_ext_inquiry_response(dd, fec, data,
837						HCI_REQ_TIMEOUT) < 0)
838		error("Can't write extended inquiry response: %s (%d)",
839						strerror(errno), errno);
840
841	hci_close_dev(dd);
842}
843
844void adapter_update_local_name(bdaddr_t *bdaddr, uint8_t status, void *ptr)
845{
846	read_local_name_rp rp;
847	struct hci_dev *dev;
848	struct btd_adapter *adapter;
849	gchar *name;
850
851	if (status)
852		return;
853
854	adapter = manager_find_adapter(bdaddr);
855	if (!adapter) {
856		error("Unable to find matching adapter");
857		return;
858	}
859
860	dev = &adapter->dev;
861
862	memcpy(&rp, ptr, MAX_NAME_LENGTH);
863	if (strncmp((char *) rp.name, (char *) dev->name, MAX_NAME_LENGTH) == 0)
864		return;
865
866	strncpy((char *) dev->name, (char *) rp.name, MAX_NAME_LENGTH);
867
868	write_local_name(bdaddr, (char *) dev->name);
869
870	update_ext_inquiry_response(adapter);
871
872	name = g_strdup((char *) dev->name);
873
874	if (connection)
875		emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE,
876				"Name", DBUS_TYPE_STRING, &name);
877	g_free(name);
878}
879
880void adapter_setname_complete(bdaddr_t *local, uint8_t status)
881{
882	struct btd_adapter *adapter;
883	int err;
884
885	if (status)
886		return;
887
888	adapter = manager_find_adapter(local);
889	if (!adapter) {
890		error("No matching adapter found");
891		return;
892	}
893
894	err = adapter_ops->read_name(adapter->dev_id);
895	if (err < 0)
896		error("Sending getting name command failed: %s (%d)",
897						strerror(errno), errno);
898
899}
900
901static DBusMessage *set_name(DBusConnection *conn, DBusMessage *msg,
902					const char *name, void *data)
903{
904	struct btd_adapter *adapter = data;
905	struct hci_dev *dev = &adapter->dev;
906	int err;
907
908	if (!g_utf8_validate(name, -1, NULL)) {
909		error("Name change failed: supplied name isn't valid UTF-8");
910		return invalid_args(msg);
911	}
912
913	if (strncmp(name, (char *) dev->name, MAX_NAME_LENGTH) == 0)
914		goto done;
915
916	if (!adapter->up)
917		return failed_strerror(msg, -EHOSTDOWN);
918
919	err = adapter_ops->set_name(adapter->dev_id, name);
920	if (err < 0)
921		return failed_strerror(msg, err);
922
923done:
924	return dbus_message_new_method_return(msg);
925}
926
927struct btd_device *adapter_find_device(struct btd_adapter *adapter,
928							const char *dest)
929{
930	struct btd_device *device;
931	GSList *l;
932
933	if (!adapter)
934		return NULL;
935
936	l = g_slist_find_custom(adapter->devices, dest,
937					(GCompareFunc) device_address_cmp);
938	if (!l)
939		return NULL;
940
941	device = l->data;
942
943	return device;
944}
945
946struct btd_device *adapter_find_connection(struct btd_adapter *adapter,
947						uint16_t handle)
948{
949	GSList *l;
950
951	for (l = adapter->connections; l; l = l->next) {
952		struct btd_device *device = l->data;
953
954		if (device_has_connection(device, handle))
955			return device;
956	}
957
958	return NULL;
959}
960
961static void adapter_update_devices(struct btd_adapter *adapter)
962{
963	char **devices;
964	int i;
965	GSList *l;
966
967	/* Devices */
968	devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
969	for (i = 0, l = adapter->devices; l; l = l->next, i++) {
970		struct btd_device *dev = l->data;
971		devices[i] = (char *) device_get_path(dev);
972	}
973
974	emit_array_property_changed(connection, adapter->path,
975					ADAPTER_INTERFACE, "Devices",
976					DBUS_TYPE_OBJECT_PATH, &devices);
977	g_free(devices);
978}
979
980struct btd_device *adapter_create_device(DBusConnection *conn,
981						struct btd_adapter *adapter,
982						const char *address)
983{
984	struct btd_device *device;
985	const char *path;
986
987	debug("adapter_create_device(%s)", address);
988
989	device = device_create(conn, adapter, address);
990	if (!device)
991		return NULL;
992
993	device_set_temporary(device, TRUE);
994
995	adapter->devices = g_slist_append(adapter->devices, device);
996
997	path = device_get_path(device);
998	g_dbus_emit_signal(conn, adapter->path,
999			ADAPTER_INTERFACE, "DeviceCreated",
1000			DBUS_TYPE_OBJECT_PATH, &path,
1001			DBUS_TYPE_INVALID);
1002
1003	adapter_update_devices(adapter);
1004
1005	return device;
1006}
1007
1008void adapter_remove_device(DBusConnection *conn, struct btd_adapter *adapter,
1009				struct btd_device *device)
1010{
1011	const gchar *dev_path = device_get_path(device);
1012	struct agent *agent;
1013
1014	adapter->devices = g_slist_remove(adapter->devices, device);
1015	adapter->connections = g_slist_remove(adapter->connections, device);
1016
1017	adapter_update_devices(adapter);
1018
1019	g_dbus_emit_signal(conn, adapter->path,
1020			ADAPTER_INTERFACE, "DeviceRemoved",
1021			DBUS_TYPE_OBJECT_PATH, &dev_path,
1022			DBUS_TYPE_INVALID);
1023
1024	agent = device_get_agent(device);
1025	if (!agent)
1026		agent = adapter->agent;
1027
1028	if (agent && device_is_authorizing(device))
1029		agent_cancel(agent);
1030
1031	agent = device_get_agent(device);
1032
1033	if (agent) {
1034		agent_destroy(agent, FALSE);
1035		device_set_agent(device, NULL);
1036	}
1037
1038	device_remove(device, conn, TRUE);
1039}
1040
1041struct btd_device *adapter_get_device(DBusConnection *conn,
1042						struct btd_adapter *adapter,
1043						const gchar *address)
1044{
1045	struct btd_device *device;
1046
1047	debug("adapter_get_device(%s)", address);
1048
1049	if (!adapter)
1050		return NULL;
1051
1052	device = adapter_find_device(adapter, address);
1053	if (device)
1054		return device;
1055
1056	return adapter_create_device(conn, adapter, address);
1057}
1058
1059static int adapter_start_inquiry(struct btd_adapter *adapter)
1060{
1061	gboolean periodic = TRUE;
1062
1063	if (main_opts.discov_interval)
1064		periodic = FALSE;
1065
1066	pending_remote_name_cancel(adapter);
1067
1068	return adapter_ops->start_discovery(adapter->dev_id, periodic);
1069}
1070
1071static DBusMessage *adapter_start_discovery(DBusConnection *conn,
1072						DBusMessage *msg, void *data)
1073{
1074	struct session_req *req;
1075	struct btd_adapter *adapter = data;
1076	const char *sender = dbus_message_get_sender(msg);
1077	int err;
1078
1079	if (!adapter->up)
1080		return adapter_not_ready(msg);
1081
1082	req = find_session(adapter->disc_sessions, sender);
1083	if (req) {
1084		session_ref(req);
1085		return dbus_message_new_method_return(msg);
1086	}
1087
1088	if (adapter->disc_sessions)
1089		goto done;
1090
1091	if (main_opts.name_resolv)
1092		adapter->state |= RESOLVE_NAME;
1093
1094	err = adapter_start_inquiry(adapter);
1095	if (err < 0)
1096		return failed_strerror(msg, -err);
1097
1098done:
1099	req = create_session(adapter, conn, msg, 0,
1100				session_owner_exit);
1101
1102	adapter->disc_sessions = g_slist_append(adapter->disc_sessions, req);
1103
1104	return dbus_message_new_method_return(msg);
1105}
1106
1107static DBusMessage *adapter_stop_discovery(DBusConnection *conn,
1108						DBusMessage *msg, void *data)
1109{
1110	struct btd_adapter *adapter = data;
1111	struct session_req *req;
1112	const char *sender = dbus_message_get_sender(msg);
1113
1114	if (!adapter->up)
1115		return adapter_not_ready(msg);
1116
1117	req = find_session(adapter->disc_sessions, sender);
1118	if (!req)
1119		return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
1120				"Invalid discovery session");
1121
1122	session_unref(req);
1123	info("Stopping discovery");
1124	return dbus_message_new_method_return(msg);
1125}
1126
1127struct remote_device_list_t {
1128	GSList *list;
1129	time_t time;
1130};
1131
1132static DBusMessage *get_properties(DBusConnection *conn,
1133					DBusMessage *msg, void *data)
1134{
1135	struct btd_adapter *adapter = data;
1136	const char *property;
1137	DBusMessage *reply;
1138	DBusMessageIter iter;
1139	DBusMessageIter dict;
1140	char str[MAX_NAME_LENGTH + 1], srcaddr[18];
1141	uint32_t class;
1142	gboolean value;
1143	char **devices;
1144	int i;
1145	GSList *l;
1146
1147	ba2str(&adapter->bdaddr, srcaddr);
1148
1149	if (check_address(srcaddr) < 0)
1150		return adapter_not_ready(msg);
1151
1152	reply = dbus_message_new_method_return(msg);
1153	if (!reply)
1154		return NULL;
1155
1156	dbus_message_iter_init_append(reply, &iter);
1157
1158	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1159			DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
1160			DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
1161			DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
1162
1163	/* Address */
1164	property = srcaddr;
1165	dict_append_entry(&dict, "Address", DBUS_TYPE_STRING, &property);
1166
1167	/* Name */
1168	memset(str, 0, sizeof(str));
1169	strncpy(str, (char *) adapter->dev.name, MAX_NAME_LENGTH);
1170	property = str;
1171
1172	dict_append_entry(&dict, "Name", DBUS_TYPE_STRING, &property);
1173
1174	/* Class */
1175	class = adapter->dev.class[0] |
1176			adapter->dev.class[1] << 8 |
1177			adapter->dev.class[2] << 16;
1178	dict_append_entry(&dict, "Class", DBUS_TYPE_UINT32, &class);
1179
1180	/* Powered */
1181	value = (adapter->up && !adapter->off_requested) ? TRUE : FALSE;
1182	dict_append_entry(&dict, "Powered", DBUS_TYPE_BOOLEAN, &value);
1183
1184	/* Discoverable */
1185	value = adapter->scan_mode & SCAN_INQUIRY ? TRUE : FALSE;
1186	dict_append_entry(&dict, "Discoverable", DBUS_TYPE_BOOLEAN, &value);
1187
1188	/* Pairable */
1189	dict_append_entry(&dict, "Pairable", DBUS_TYPE_BOOLEAN,
1190				&adapter->pairable);
1191
1192	/* DiscoverableTimeout */
1193	dict_append_entry(&dict, "DiscoverableTimeout",
1194				DBUS_TYPE_UINT32, &adapter->discov_timeout);
1195
1196	/* PairableTimeout */
1197	dict_append_entry(&dict, "PairableTimeout",
1198				DBUS_TYPE_UINT32, &adapter->pairable_timeout);
1199
1200
1201	if (adapter->state & PERIODIC_INQUIRY || adapter->state & STD_INQUIRY)
1202		value = TRUE;
1203	else
1204		value = FALSE;
1205
1206	/* Discovering */
1207	dict_append_entry(&dict, "Discovering", DBUS_TYPE_BOOLEAN, &value);
1208
1209	/* Devices */
1210	devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
1211	for (i = 0, l = adapter->devices; l; l = l->next, i++) {
1212		struct btd_device *dev = l->data;
1213		devices[i] = (char *) device_get_path(dev);
1214	}
1215	dict_append_array(&dict, "Devices", DBUS_TYPE_OBJECT_PATH,
1216								&devices, i);
1217	g_free(devices);
1218
1219	dbus_message_iter_close_container(&iter, &dict);
1220
1221	return reply;
1222}
1223
1224static DBusMessage *set_property(DBusConnection *conn,
1225					DBusMessage *msg, void *data)
1226{
1227	struct btd_adapter *adapter = data;
1228	DBusMessageIter iter;
1229	DBusMessageIter sub;
1230	const char *property;
1231	char srcaddr[18];
1232
1233	ba2str(&adapter->bdaddr, srcaddr);
1234
1235	if (!dbus_message_iter_init(msg, &iter))
1236		return invalid_args(msg);
1237
1238	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
1239		return invalid_args(msg);
1240
1241	dbus_message_iter_get_basic(&iter, &property);
1242	dbus_message_iter_next(&iter);
1243
1244	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
1245		return invalid_args(msg);
1246	dbus_message_iter_recurse(&iter, &sub);
1247
1248	if (g_str_equal("Name", property)) {
1249		const char *name;
1250
1251		if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING)
1252			return invalid_args(msg);
1253		dbus_message_iter_get_basic(&sub, &name);
1254
1255		return set_name(conn, msg, name, data);
1256	} else if (g_str_equal("Powered", property)) {
1257		gboolean powered;
1258
1259		if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1260			return invalid_args(msg);
1261
1262		dbus_message_iter_get_basic(&sub, &powered);
1263
1264		return set_powered(conn, msg, powered, data);
1265	} else if (g_str_equal("Discoverable", property)) {
1266		gboolean discoverable;
1267
1268		if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1269			return invalid_args(msg);
1270
1271		dbus_message_iter_get_basic(&sub, &discoverable);
1272
1273		return set_discoverable(conn, msg, discoverable, data);
1274	} else if (g_str_equal("DiscoverableTimeout", property)) {
1275		uint32_t timeout;
1276
1277		if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32)
1278			return invalid_args(msg);
1279
1280		dbus_message_iter_get_basic(&sub, &timeout);
1281
1282		return set_discoverable_timeout(conn, msg, timeout, data);
1283	} else if (g_str_equal("Pairable", property)) {
1284		gboolean pairable;
1285
1286		if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1287			return invalid_args(msg);
1288
1289		dbus_message_iter_get_basic(&sub, &pairable);
1290
1291		return set_pairable(conn, msg, pairable, data);
1292	} else if (g_str_equal("PairableTimeout", property)) {
1293		uint32_t timeout;
1294
1295		if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32)
1296			return invalid_args(msg);
1297
1298		dbus_message_iter_get_basic(&sub, &timeout);
1299
1300		return set_pairable_timeout(conn, msg, timeout, data);
1301	}
1302
1303	return invalid_args(msg);
1304}
1305
1306static DBusMessage *request_session(DBusConnection *conn,
1307					DBusMessage *msg, void *data)
1308{
1309	struct btd_adapter *adapter = data;
1310	struct session_req *req;
1311	const char *sender = dbus_message_get_sender(msg);
1312	uint8_t new_mode;
1313	int ret;
1314
1315	if (!adapter->agent)
1316		return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
1317						"No agent registered");
1318
1319	if (!adapter->mode_sessions)
1320		adapter->global_mode = adapter->mode;
1321
1322	new_mode = get_mode(&adapter->bdaddr, "on");
1323
1324	req = find_session(adapter->mode_sessions, sender);
1325	if (req) {
1326		session_ref(req);
1327		return dbus_message_new_method_return(msg);
1328	} else {
1329		req = create_session(adapter, conn, msg, new_mode,
1330					session_owner_exit);
1331		adapter->mode_sessions = g_slist_append(adapter->mode_sessions,
1332							req);
1333	}
1334
1335	/* No need to change mode */
1336	if (adapter->mode >= new_mode)
1337		return dbus_message_new_method_return(msg);
1338
1339	ret = agent_confirm_mode_change(adapter->agent, mode2str(new_mode),
1340					confirm_mode_cb, req, NULL);
1341	if (ret < 0) {
1342		session_unref(req);
1343		return failed_strerror(msg, -ret);
1344	}
1345
1346	return NULL;
1347}
1348
1349static DBusMessage *release_session(DBusConnection *conn,
1350					DBusMessage *msg, void *data)
1351{
1352	struct btd_adapter *adapter = data;
1353	struct session_req *req;
1354	const char *sender = dbus_message_get_sender(msg);
1355
1356	req = find_session(adapter->mode_sessions, sender);
1357	if (!req)
1358		return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
1359				"No Mode to release");
1360
1361	session_unref(req);
1362
1363	return dbus_message_new_method_return(msg);
1364}
1365
1366static DBusMessage *list_devices(DBusConnection *conn,
1367						DBusMessage *msg, void *data)
1368{
1369	struct btd_adapter *adapter = data;
1370	DBusMessage *reply;
1371	GSList *l;
1372	DBusMessageIter iter;
1373	DBusMessageIter array_iter;
1374	const gchar *dev_path;
1375
1376	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))
1377		return invalid_args(msg);
1378
1379	reply = dbus_message_new_method_return(msg);
1380	if (!reply)
1381		return NULL;
1382
1383	dbus_message_iter_init_append(reply, &iter);
1384	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1385				DBUS_TYPE_OBJECT_PATH_AS_STRING, &array_iter);
1386
1387	for (l = adapter->devices; l; l = l->next) {
1388		struct btd_device *device = l->data;
1389
1390		dev_path = device_get_path(device);
1391
1392		dbus_message_iter_append_basic(&array_iter,
1393				DBUS_TYPE_OBJECT_PATH, &dev_path);
1394	}
1395
1396	dbus_message_iter_close_container(&iter, &array_iter);
1397
1398	return reply;
1399}
1400
1401static DBusMessage *cancel_device_creation(DBusConnection *conn,
1402						DBusMessage *msg, void *data)
1403{
1404	struct btd_adapter *adapter = data;
1405	const gchar *address, *sender = dbus_message_get_sender(msg);
1406	struct btd_device *device;
1407
1408	if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1409						DBUS_TYPE_INVALID) == FALSE)
1410		return invalid_args(msg);
1411
1412	if (check_address(address) < 0)
1413		return invalid_args(msg);
1414
1415	device = adapter_find_device(adapter, address);
1416	if (!device || !device_is_creating(device, NULL))
1417		return g_dbus_create_error(msg,
1418				ERROR_INTERFACE ".NotInProgress",
1419				"Device creation not in progress");
1420
1421	if (!device_is_creating(device, sender))
1422		return not_authorized(msg);
1423
1424	device_set_temporary(device, TRUE);
1425
1426	if (device_is_connected(device)) {
1427		device_request_disconnect(device, msg);
1428		return NULL;
1429	}
1430
1431	adapter_remove_device(conn, adapter, device);
1432
1433	return dbus_message_new_method_return(msg);
1434}
1435
1436static DBusMessage *create_device(DBusConnection *conn,
1437					DBusMessage *msg, void *data)
1438{
1439	struct btd_adapter *adapter = data;
1440	struct btd_device *device;
1441	const gchar *address;
1442
1443	if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1444						DBUS_TYPE_INVALID) == FALSE)
1445		return invalid_args(msg);
1446
1447	if (check_address(address) < 0)
1448		return invalid_args(msg);
1449
1450	if (adapter_find_device(adapter, address))
1451		return g_dbus_create_error(msg,
1452				ERROR_INTERFACE ".AlreadyExists",
1453				"Device already exists");
1454
1455	debug("create_device(%s)", address);
1456
1457	device = adapter_create_device(conn, adapter, address);
1458	if (!device)
1459		return NULL;
1460
1461	device_browse(device, conn, msg, NULL, FALSE);
1462
1463	return NULL;
1464}
1465
1466static uint8_t parse_io_capability(const char *capability)
1467{
1468	if (g_str_equal(capability, ""))
1469		return IO_CAPABILITY_DISPLAYYESNO;
1470	if (g_str_equal(capability, "DisplayOnly"))
1471		return IO_CAPABILITY_DISPLAYONLY;
1472	if (g_str_equal(capability, "DisplayYesNo"))
1473		return IO_CAPABILITY_DISPLAYYESNO;
1474	if (g_str_equal(capability, "KeyboardOnly"))
1475		return IO_CAPABILITY_KEYBOARDONLY;
1476	if (g_str_equal(capability, "NoInputNoOutput"))
1477		return IO_CAPABILITY_NOINPUTNOOUTPUT;
1478	return IO_CAPABILITY_INVALID;
1479}
1480
1481static DBusMessage *create_paired_device(DBusConnection *conn,
1482					DBusMessage *msg, void *data)
1483{
1484	struct btd_adapter *adapter = data;
1485	struct btd_device *device;
1486	const gchar *address, *agent_path, *capability, *sender;
1487	uint8_t cap;
1488
1489	if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1490					DBUS_TYPE_OBJECT_PATH, &agent_path,
1491					DBUS_TYPE_STRING, &capability,
1492						DBUS_TYPE_INVALID) == FALSE)
1493		return invalid_args(msg);
1494
1495	if (check_address(address) < 0)
1496		return invalid_args(msg);
1497
1498	sender = dbus_message_get_sender(msg);
1499	if (adapter->agent &&
1500			agent_matches(adapter->agent, sender, agent_path)) {
1501		error("Refusing adapter agent usage as device specific one");
1502		return invalid_args(msg);
1503	}
1504
1505	cap = parse_io_capability(capability);
1506	if (cap == IO_CAPABILITY_INVALID)
1507		return invalid_args(msg);
1508
1509	device = adapter_get_device(conn, adapter, address);
1510	if (!device)
1511		return g_dbus_create_error(msg,
1512				ERROR_INTERFACE ".Failed",
1513				"Unable to create a new device object");
1514
1515	return device_create_bonding(device, conn, msg, agent_path, cap);
1516}
1517
1518static gint device_path_cmp(struct btd_device *device, const gchar *path)
1519{
1520	const gchar *dev_path = device_get_path(device);
1521
1522	return strcasecmp(dev_path, path);
1523}
1524
1525static DBusMessage *remove_device(DBusConnection *conn,
1526						DBusMessage *msg, void *data)
1527{
1528	struct btd_adapter *adapter = data;
1529	struct btd_device *device;
1530	const char *path;
1531	GSList *l;
1532
1533	if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
1534						DBUS_TYPE_INVALID) == FALSE)
1535		return invalid_args(msg);
1536
1537	l = g_slist_find_custom(adapter->devices,
1538			path, (GCompareFunc) device_path_cmp);
1539	if (!l)
1540		return g_dbus_create_error(msg,
1541				ERROR_INTERFACE ".DoesNotExist",
1542				"Device does not exist");
1543	device = l->data;
1544
1545	if (device_is_temporary(device) || device_is_busy(device))
1546		return g_dbus_create_error(msg,
1547				ERROR_INTERFACE ".DoesNotExist",
1548				"Device creation in progress");
1549
1550	device_set_temporary(device, TRUE);
1551
1552	if (!device_is_connected(device)) {
1553		adapter_remove_device(conn, adapter, device);
1554		return dbus_message_new_method_return(msg);
1555	}
1556
1557	device_request_disconnect(device, msg);
1558	return NULL;
1559}
1560
1561static DBusMessage *find_device(DBusConnection *conn,
1562					DBusMessage *msg, void *data)
1563{
1564	struct btd_adapter *adapter = data;
1565	struct btd_device *device;
1566	DBusMessage *reply;
1567	const gchar *address;
1568	GSList *l;
1569	const gchar *dev_path;
1570
1571	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1572						DBUS_TYPE_INVALID))
1573		return invalid_args(msg);
1574
1575	l = g_slist_find_custom(adapter->devices,
1576			address, (GCompareFunc) device_address_cmp);
1577	if (!l)
1578		return g_dbus_create_error(msg,
1579				ERROR_INTERFACE ".DoesNotExist",
1580				"Device does not exist");
1581
1582	device = l->data;
1583
1584	reply = dbus_message_new_method_return(msg);
1585	if (!reply)
1586		return NULL;
1587
1588	dev_path = device_get_path(device);
1589
1590	dbus_message_append_args(reply,
1591				DBUS_TYPE_OBJECT_PATH, &dev_path,
1592				DBUS_TYPE_INVALID);
1593
1594	return reply;
1595}
1596
1597static void agent_removed(struct agent *agent, struct btd_adapter *adapter)
1598{
1599	adapter->agent = NULL;
1600}
1601
1602static DBusMessage *register_agent(DBusConnection *conn,
1603					DBusMessage *msg, void *data)
1604{
1605	const char *path, *name, *capability;
1606	struct agent *agent;
1607	struct btd_adapter *adapter = data;
1608	uint8_t cap;
1609
1610	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
1611			DBUS_TYPE_STRING, &capability, DBUS_TYPE_INVALID))
1612		return NULL;
1613
1614	if (adapter->agent)
1615		return g_dbus_create_error(msg,
1616				ERROR_INTERFACE ".AlreadyExists",
1617				"Agent already exists");
1618
1619	cap = parse_io_capability(capability);
1620	if (cap == IO_CAPABILITY_INVALID)
1621		return invalid_args(msg);
1622
1623	name = dbus_message_get_sender(msg);
1624
1625	agent = agent_create(adapter, name, path, cap,
1626				(agent_remove_cb) agent_removed, adapter);
1627	if (!agent)
1628		return g_dbus_create_error(msg,
1629				ERROR_INTERFACE ".Failed",
1630				"Failed to create a new agent");
1631
1632	adapter->agent = agent;
1633
1634	debug("Agent registered for hci%d at %s:%s", adapter->dev_id, name,
1635			path);
1636
1637	return dbus_message_new_method_return(msg);
1638}
1639
1640static DBusMessage *unregister_agent(DBusConnection *conn,
1641					DBusMessage *msg, void *data)
1642{
1643	const char *path, *name;
1644	struct btd_adapter *adapter = data;
1645
1646	if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
1647						DBUS_TYPE_INVALID))
1648		return NULL;
1649
1650	name = dbus_message_get_sender(msg);
1651
1652	if (!adapter->agent || !agent_matches(adapter->agent, name, path))
1653		return g_dbus_create_error(msg,
1654				ERROR_INTERFACE ".DoesNotExist",
1655				"No such agent");
1656
1657	agent_destroy(adapter->agent, FALSE);
1658	adapter->agent = NULL;
1659
1660	return dbus_message_new_method_return(msg);
1661}
1662
1663static sdp_record_t *create_rfcomm_record(struct btd_adapter *adapter,
1664					const char *name, uuid_t uuid, uint8_t channel)
1665{
1666	uuid_t root_uuid, l2cap_uuid, rfcomm_uuid;
1667	sdp_list_t *svclass, *root, *proto;
1668	sdp_record_t *record;
1669
1670	record = sdp_record_alloc();
1671	if (!record)
1672		return NULL;
1673
1674	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
1675	root = sdp_list_append(NULL, &root_uuid);
1676	sdp_set_browse_groups(record, root);
1677
1678	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
1679	proto = sdp_list_append(NULL, sdp_list_append(NULL, &l2cap_uuid));
1680
1681	sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
1682	proto = sdp_list_append(proto, sdp_list_append(
1683			sdp_list_append(NULL, &rfcomm_uuid),
1684			sdp_data_alloc(SDP_UINT8, &channel)));
1685
1686	sdp_set_access_protos(record, sdp_list_append(NULL, proto));
1687
1688	svclass = sdp_list_append(NULL, &uuid);
1689	sdp_set_service_classes(record, svclass);
1690
1691	sdp_set_info_attr(record, name, NULL, NULL);
1692
1693	return record;
1694}
1695
1696static DBusMessage *add_rfcomm_service_record(DBusConnection *conn,
1697					DBusMessage *msg, void *data)
1698{
1699	uuid_t uuid;
1700	const char *name;
1701	uint8_t channel;
1702	uint32_t *uuid_p;
1703	uint32_t uuid_net[4];   // network order
1704	uint64_t uuid_host[2];  // host
1705	sdp_record_t *record;
1706	struct btd_adapter *adapter = data;
1707
1708	DBusMessage *reply;
1709
1710	if (!dbus_message_get_args(msg, NULL,
1711			DBUS_TYPE_STRING, &name,
1712			DBUS_TYPE_UINT64, &uuid_host[0],
1713			DBUS_TYPE_UINT64, &uuid_host[1],
1714			DBUS_TYPE_UINT16, &channel,
1715			DBUS_TYPE_INVALID))
1716		return invalid_args(msg);
1717
1718	uuid_p = (uint32_t *)uuid_host;
1719	uuid_net[1] = htonl(*uuid_p++);
1720	uuid_net[0] = htonl(*uuid_p++);
1721	uuid_net[3] = htonl(*uuid_p++);
1722	uuid_net[2] = htonl(*uuid_p++);
1723
1724	sdp_uuid128_create(&uuid, (void *)uuid_net);
1725
1726	record = create_rfcomm_record(adapter, name, uuid, channel);
1727
1728	if (!record)
1729		return g_dbus_create_error(msg,
1730				ERROR_INTERFACE ".Failed",
1731				"Failed to create sdp record");
1732
1733	if (add_record_to_server(&adapter->bdaddr, record))
1734		return g_dbus_create_error(msg,
1735				ERROR_INTERFACE ".Failed",
1736				"Failed to register sdp record");
1737
1738	reply = dbus_message_new_method_return(msg);
1739	dbus_message_append_args(reply,
1740			DBUS_TYPE_UINT32, &record->handle,
1741			DBUS_TYPE_INVALID);
1742
1743	return reply;
1744}
1745
1746static DBusMessage *remove_service_record(DBusConnection *conn,
1747					DBusMessage *msg, void *data)
1748{
1749	struct btd_adapter *adapter = data;
1750	dbus_uint32_t handle;
1751
1752	if (!dbus_message_get_args(msg, NULL,
1753			DBUS_TYPE_UINT32, &handle,
1754			DBUS_TYPE_INVALID))
1755		return invalid_args(msg);
1756
1757	if (remove_record_from_server(handle))
1758		return g_dbus_create_error(msg,
1759				ERROR_INTERFACE ".Failed",
1760				"Failed to remove sdp record");
1761
1762	return dbus_message_new_method_return(msg);
1763}
1764
1765static DBusMessage *set_link_timeout(DBusConnection *conn,
1766					DBusMessage *msg, void *data)
1767{
1768	struct btd_adapter *adapter = data;
1769        struct btd_device *device;
1770	const char *path;
1771	GSList *l;
1772	uint32_t num_slots;
1773        int dd, err;
1774
1775	if (!dbus_message_get_args(msg, NULL,
1776			DBUS_TYPE_OBJECT_PATH, &path,
1777			DBUS_TYPE_UINT32, &num_slots,
1778			DBUS_TYPE_INVALID))
1779		return invalid_args(msg);
1780
1781        l = g_slist_find_custom(adapter->devices,
1782                        path, (GCompareFunc) device_path_cmp);
1783        if (!l)
1784                return g_dbus_create_error(msg,
1785                                ERROR_INTERFACE ".DoesNotExist",
1786                                "Device does not exist");
1787	device = l->data;
1788	dd = hci_open_dev(adapter->dev_id);
1789
1790	if (dd < 0) {
1791		err = -errno;
1792		goto fail;
1793	}
1794
1795	err = hci_write_link_supervision_timeout(dd,
1796			htobs(device_get_handle(device)), htobs(num_slots), 1000);
1797	hci_close_dev(dd);
1798
1799	if (err < 0) {
1800		err = -errno;
1801		goto fail;
1802	}
1803	return dbus_message_new_method_return(msg);
1804fail:
1805	return failed_strerror(msg, errno);
1806}
1807
1808static GDBusMethodTable adapter_methods[] = {
1809	{ "GetProperties",	"",	"a{sv}",get_properties		},
1810	{ "SetProperty",	"sv",	"",	set_property,
1811						G_DBUS_METHOD_FLAG_ASYNC},
1812	{ "RequestSession",	"",	"",	request_session,
1813						G_DBUS_METHOD_FLAG_ASYNC},
1814	{ "ReleaseSession",	"",	"",	release_session		},
1815	{ "StartDiscovery",	"",	"",	adapter_start_discovery },
1816	{ "StopDiscovery",	"",	"",	adapter_stop_discovery,
1817						G_DBUS_METHOD_FLAG_ASYNC},
1818	{ "ListDevices",	"",	"ao",	list_devices,
1819						G_DBUS_METHOD_FLAG_DEPRECATED},
1820	{ "CreateDevice",	"s",	"o",	create_device,
1821						G_DBUS_METHOD_FLAG_ASYNC},
1822	{ "CreatePairedDevice",	"sos",	"o",	create_paired_device,
1823						G_DBUS_METHOD_FLAG_ASYNC},
1824	{ "CancelDeviceCreation","s",	"",	cancel_device_creation,
1825						G_DBUS_METHOD_FLAG_ASYNC},
1826	{ "RemoveDevice",	"o",	"",	remove_device,
1827						G_DBUS_METHOD_FLAG_ASYNC},
1828	{ "FindDevice",		"s",	"o",	find_device		},
1829	{ "RegisterAgent",	"os",	"",	register_agent		},
1830	{ "UnregisterAgent",	"o",	"",	unregister_agent	},
1831	{ "AddRfcommServiceRecord",	"sttq",	"u",	add_rfcomm_service_record },
1832	{ "RemoveServiceRecord",	"u",	"",	remove_service_record },
1833	{ "SetLinkTimeout",	"ou",	"",	set_link_timeout	},
1834	{ }
1835};
1836
1837static GDBusSignalTable adapter_signals[] = {
1838	{ "PropertyChanged",		"sv"		},
1839	{ "DeviceCreated",		"o"		},
1840	{ "DeviceRemoved",		"o"		},
1841	{ "DeviceFound",		"sa{sv}"	},
1842	{ "DeviceDisappeared",		"s"		},
1843	{ }
1844};
1845
1846static inline uint8_t get_inquiry_mode(struct hci_dev *dev)
1847{
1848	if (dev->features[6] & LMP_EXT_INQ)
1849		return 2;
1850
1851	if (dev->features[3] & LMP_RSSI_INQ)
1852		return 1;
1853
1854	if (dev->manufacturer == 11 &&
1855			dev->hci_rev == 0x00 && dev->lmp_subver == 0x0757)
1856		return 1;
1857
1858	if (dev->manufacturer == 15) {
1859		if (dev->hci_rev == 0x03 && dev->lmp_subver == 0x6963)
1860			return 1;
1861		if (dev->hci_rev == 0x09 && dev->lmp_subver == 0x6963)
1862			return 1;
1863		if (dev->hci_rev == 0x00 && dev->lmp_subver == 0x6965)
1864			return 1;
1865	}
1866
1867	if (dev->manufacturer == 31 &&
1868			dev->hci_rev == 0x2005 && dev->lmp_subver == 0x1805)
1869		return 1;
1870
1871	return 0;
1872}
1873
1874static int adapter_read_bdaddr(uint16_t dev_id, bdaddr_t *bdaddr)
1875{
1876	int dd, err;
1877
1878	dd = hci_open_dev(dev_id);
1879	if (dd < 0) {
1880		err = -errno;
1881		error("Can't open device hci%d: %s (%d)",
1882					dev_id, strerror(errno), errno);
1883		return err;
1884	}
1885
1886	if (hci_read_bd_addr(dd, bdaddr, HCI_REQ_TIMEOUT) < 0) {
1887		err = -errno;
1888		error("Can't read address for hci%d: %s (%d)",
1889					dev_id, strerror(errno), errno);
1890		hci_close_dev(dd);
1891		return err;
1892	}
1893
1894	hci_close_dev(dd);
1895
1896	return 0;
1897}
1898
1899static int adapter_setup(struct btd_adapter *adapter)
1900{
1901	struct hci_dev *dev = &adapter->dev;
1902	uint8_t events[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00 };
1903	uint8_t inqmode;
1904	int err , dd;
1905	char name[MAX_NAME_LENGTH + 1];
1906
1907	dd = hci_open_dev(adapter->dev_id);
1908	if (dd < 0) {
1909		err = -errno;
1910		error("Can't open device hci%d: %s (%d)", adapter->dev_id,
1911						strerror(errno), errno);
1912		return err;
1913	}
1914
1915	if (dev->lmp_ver > 1) {
1916		if (dev->features[5] & LMP_SNIFF_SUBR)
1917			events[5] |= 0x20;
1918
1919		if (dev->features[5] & LMP_PAUSE_ENC)
1920			events[5] |= 0x80;
1921
1922		if (dev->features[6] & LMP_EXT_INQ)
1923			events[5] |= 0x40;
1924
1925		if (dev->features[6] & LMP_NFLUSH_PKTS)
1926			events[7] |= 0x01;
1927
1928		if (dev->features[7] & LMP_LSTO)
1929			events[6] |= 0x80;
1930
1931		if (dev->features[6] & LMP_SIMPLE_PAIR) {
1932			events[6] |= 0x01;	/* IO Capability Request */
1933			events[6] |= 0x02;	/* IO Capability Response */
1934			events[6] |= 0x04;	/* User Confirmation Request */
1935			events[6] |= 0x08;	/* User Passkey Request */
1936			events[6] |= 0x10;	/* Remote OOB Data Request */
1937			events[6] |= 0x20;	/* Simple Pairing Complete */
1938			events[7] |= 0x04;	/* User Passkey Notification */
1939			events[7] |= 0x08;	/* Keypress Notification */
1940			events[7] |= 0x10;	/* Remote Host Supported
1941						 * Features Notification */
1942		}
1943
1944		hci_send_cmd(dd, OGF_HOST_CTL, OCF_SET_EVENT_MASK,
1945						sizeof(events), events);
1946	}
1947
1948	if (read_local_name(&adapter->bdaddr, name) == 0)
1949		adapter_ops->set_name(adapter->dev_id, name);
1950
1951	inqmode = get_inquiry_mode(dev);
1952	if (inqmode < 1)
1953		goto done;
1954
1955	if (hci_write_inquiry_mode(dd, inqmode, HCI_REQ_TIMEOUT) < 0) {
1956		err = -errno;
1957		error("Can't write inquiry mode for %s: %s (%d)",
1958					adapter->path, strerror(errno), errno);
1959		hci_close_dev(dd);
1960		return err;
1961	}
1962
1963done:
1964	hci_close_dev(dd);
1965	return 0;
1966}
1967
1968static void create_stored_device_from_profiles(char *key, char *value,
1969						void *user_data)
1970{
1971	struct btd_adapter *adapter = user_data;
1972	GSList *uuids = bt_string2list(value);
1973	struct btd_device *device;
1974	bdaddr_t dst;
1975	char srcaddr[18], dstaddr[18];
1976
1977	ba2str(&adapter->bdaddr, srcaddr);
1978
1979	if (g_slist_find_custom(adapter->devices,
1980				key, (GCompareFunc) device_address_cmp))
1981		return;
1982
1983	device = device_create(connection, adapter, key);
1984	if (!device)
1985		return;
1986
1987	device_set_temporary(device, FALSE);
1988	adapter->devices = g_slist_append(adapter->devices, device);
1989
1990	device_get_address(device, &dst);
1991	ba2str(&dst, dstaddr);
1992
1993	device_probe_drivers(device, uuids);
1994
1995	g_slist_foreach(uuids, (GFunc) g_free, NULL);
1996	g_slist_free(uuids);
1997}
1998
1999static void create_stored_device_from_linkkeys(char *key, char *value,
2000						void *user_data)
2001{
2002	struct btd_adapter *adapter = user_data;
2003	struct btd_device *device;
2004
2005	if (g_slist_find_custom(adapter->devices,
2006				key, (GCompareFunc) device_address_cmp))
2007		return;
2008
2009	device = device_create(connection, adapter, key);
2010	if (device) {
2011		device_set_temporary(device, FALSE);
2012		adapter->devices = g_slist_append(adapter->devices, device);
2013	}
2014}
2015
2016static void load_devices(struct btd_adapter *adapter)
2017{
2018	char filename[PATH_MAX + 1];
2019	char srcaddr[18];
2020
2021	ba2str(&adapter->bdaddr, srcaddr);
2022
2023	create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "profiles");
2024	textfile_foreach(filename, create_stored_device_from_profiles,
2025								adapter);
2026
2027	create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "linkkeys");
2028	textfile_foreach(filename, create_stored_device_from_linkkeys,
2029								adapter);
2030}
2031
2032static void probe_driver(gpointer data, gpointer user_data)
2033{
2034	struct btd_adapter *adapter = data;
2035	struct btd_adapter_driver *driver = user_data;
2036	int err;
2037
2038	if (!adapter->up)
2039		return;
2040
2041	err = driver->probe(adapter);
2042	if (err < 0)
2043		error("%s: %s (%d)", driver->name, strerror(-err), -err);
2044}
2045
2046static void load_drivers(struct btd_adapter *adapter)
2047{
2048	GSList *l;
2049
2050	for (l = adapter_drivers; l; l = l->next) {
2051		struct btd_adapter_driver *driver = l->data;
2052
2053		if (driver->probe == NULL)
2054			continue;
2055
2056		probe_driver(adapter, driver);
2057	}
2058}
2059
2060static void load_connections(struct btd_adapter *adapter)
2061{
2062	struct hci_conn_list_req *cl = NULL;
2063	struct hci_conn_info *ci;
2064	int i, dd;
2065
2066	dd = hci_open_dev(adapter->dev_id);
2067	if (dd < 0)
2068		return;
2069
2070	cl = g_malloc0(10 * sizeof(*ci) + sizeof(*cl));
2071
2072	cl->dev_id = adapter->dev_id;
2073	cl->conn_num = 10;
2074	ci = cl->conn_info;
2075
2076	if (ioctl(dd, HCIGETCONNLIST, cl) != 0) {
2077		g_free(cl);
2078		hci_close_dev(dd);
2079		return;
2080	}
2081
2082	for (i = 0; i < cl->conn_num; i++, ci++) {
2083		struct btd_device *device;
2084		char address[18];
2085
2086		ba2str(&ci->bdaddr, address);
2087		device = adapter_get_device(connection, adapter, address);
2088		if (device)
2089			adapter_add_connection(adapter, device, ci->handle);
2090	}
2091
2092	g_free(cl);
2093	hci_close_dev(dd);
2094}
2095
2096static int get_discoverable_timeout(const char *src)
2097{
2098	int timeout;
2099
2100	if (read_discoverable_timeout(src, &timeout) == 0)
2101		return timeout;
2102
2103	return main_opts.discovto;
2104}
2105
2106static int get_pairable_timeout(const char *src)
2107{
2108	int timeout;
2109
2110	if (read_pairable_timeout(src, &timeout) == 0)
2111		return timeout;
2112
2113	return main_opts.pairto;
2114}
2115
2116static int adapter_up(struct btd_adapter *adapter)
2117{
2118	char mode[14], srcaddr[18];
2119	uint8_t scan_mode;
2120	gboolean powered, dev_down = FALSE;
2121	int err;
2122
2123	ba2str(&adapter->bdaddr, srcaddr);
2124
2125	adapter->off_requested = FALSE;
2126	adapter->up = 1;
2127	adapter->discov_timeout = get_discoverable_timeout(srcaddr);
2128	adapter->pairable_timeout = get_pairable_timeout(srcaddr);
2129	adapter->state = DISCOVER_TYPE_NONE;
2130	adapter->mode = MODE_CONNECTABLE;
2131	adapter->cache_enable = TRUE;
2132	scan_mode = SCAN_PAGE;
2133	powered = TRUE;
2134
2135	/* Set pairable mode */
2136	if (read_device_pairable(&adapter->bdaddr, &adapter->pairable) < 0)
2137		adapter->pairable = TRUE;
2138
2139	if (!adapter->initialized && !main_opts.remember_powered) {
2140		if (main_opts.mode == MODE_OFF)
2141			strcpy(mode, "off");
2142		else
2143			strcpy(mode, "connectable");
2144	} else if (read_device_mode(srcaddr, mode, sizeof(mode)) < 0) {
2145		if (!adapter->initialized && main_opts.mode == MODE_OFF)
2146			strcpy(mode, "off");
2147		else
2148			goto proceed;
2149	}
2150
2151	if (g_str_equal(mode, "off")) {
2152		powered = FALSE;
2153
2154		if (!adapter->initialized) {
2155			dev_down = TRUE;
2156			goto proceed;
2157		}
2158
2159		if (read_on_mode(srcaddr, mode, sizeof(mode)) < 0 ||
2160						g_str_equal(mode, "off"))
2161			write_device_mode(&adapter->bdaddr, "connectable");
2162		else
2163			write_device_mode(&adapter->bdaddr, mode);
2164
2165		return adapter_up(adapter);
2166	} else if (!g_str_equal(mode, "connectable") &&
2167			adapter->discov_timeout == 0) {
2168		/* Set discoverable only if timeout is 0 */
2169		adapter->mode = MODE_DISCOVERABLE;
2170		scan_mode = SCAN_PAGE | SCAN_INQUIRY;
2171	}
2172
2173proceed:
2174	if (scan_mode == SCAN_PAGE)
2175		err = adapter_ops->set_connectable(adapter->dev_id);
2176	else
2177		err = adapter_ops->set_discoverable(adapter->dev_id);
2178
2179	if (err < 0)
2180		return err;
2181
2182	if (adapter->initialized == FALSE) {
2183		load_drivers(adapter);
2184		load_devices(adapter);
2185
2186		/* retrieve the active connections: address the scenario where
2187		 * the are active connections before the daemon've started */
2188		load_connections(adapter);
2189
2190		adapter->initialized = TRUE;
2191
2192		manager_add_adapter(adapter->path);
2193
2194	}
2195
2196	if (dev_down) {
2197		adapter_ops->stop(adapter->dev_id);
2198		adapter->off_requested = TRUE;
2199		return 1;
2200	} else
2201		emit_property_changed(connection, adapter->path,
2202					ADAPTER_INTERFACE, "Powered",
2203					DBUS_TYPE_BOOLEAN, &powered);
2204
2205	adapter_disable_svc_cache(adapter);
2206	return 0;
2207}
2208
2209int adapter_start(struct btd_adapter *adapter)
2210{
2211	struct hci_dev *dev = &adapter->dev;
2212	struct hci_dev_info di;
2213	struct hci_version ver;
2214	uint8_t features[8];
2215	int dd, err;
2216
2217	if (hci_devinfo(adapter->dev_id, &di) < 0)
2218		return -errno;
2219
2220	if (hci_test_bit(HCI_RAW, &di.flags)) {
2221		dev->ignore = 1;
2222		return -1;
2223	}
2224
2225	if (!bacmp(&di.bdaddr, BDADDR_ANY)) {
2226		int err;
2227
2228		debug("Adapter %s without an address", adapter->path);
2229
2230		err = adapter_read_bdaddr(adapter->dev_id, &di.bdaddr);
2231		if (err < 0)
2232			return err;
2233	}
2234
2235	bacpy(&adapter->bdaddr, &di.bdaddr);
2236	memcpy(dev->features, di.features, 8);
2237
2238	dd = hci_open_dev(adapter->dev_id);
2239	if (dd < 0) {
2240		err = -errno;
2241		error("Can't open adapter %s: %s (%d)",
2242					adapter->path, strerror(errno), errno);
2243		return err;
2244	}
2245
2246	if (hci_read_local_version(dd, &ver, HCI_REQ_TIMEOUT) < 0) {
2247		err = -errno;
2248		error("Can't read version info for %s: %s (%d)",
2249					adapter->path, strerror(errno), errno);
2250		hci_close_dev(dd);
2251		return err;
2252	}
2253
2254	dev->hci_rev = ver.hci_rev;
2255	dev->lmp_ver = ver.lmp_ver;
2256	dev->lmp_subver = ver.lmp_subver;
2257	dev->manufacturer = ver.manufacturer;
2258
2259	if (hci_read_local_features(dd, features, HCI_REQ_TIMEOUT) < 0) {
2260		err = -errno;
2261		error("Can't read features for %s: %s (%d)",
2262					adapter->path, strerror(errno), errno);
2263		hci_close_dev(dd);
2264		return err;
2265	}
2266
2267	memcpy(dev->features, features, 8);
2268
2269	if (hci_read_class_of_dev(dd, dev->class, HCI_REQ_TIMEOUT) < 0) {
2270		err = -errno;
2271		error("Can't read class of adapter on %s: %s (%d)",
2272					adapter->path, strerror(errno), errno);
2273		hci_close_dev(dd);
2274		return err;
2275	}
2276
2277	adapter_ops->read_name(adapter->dev_id);
2278
2279	if (!(features[6] & LMP_SIMPLE_PAIR))
2280		goto setup;
2281
2282	if (ioctl(dd, HCIGETAUTHINFO, NULL) < 0 && errno != EINVAL)
2283		hci_write_simple_pairing_mode(dd, 0x01, HCI_REQ_TIMEOUT);
2284
2285	if (hci_read_simple_pairing_mode(dd, &dev->ssp_mode,
2286						HCI_REQ_TIMEOUT) < 0) {
2287		err = -errno;
2288		error("Can't read simple pairing mode on %s: %s (%d)",
2289					adapter->path, strerror(errno), errno);
2290		/* Fall through since some chips have broken
2291		 * read_simple_pairing_mode behavior */
2292	}
2293
2294setup:
2295	hci_send_cmd(dd, OGF_LINK_POLICY, OCF_READ_DEFAULT_LINK_POLICY,
2296								0, NULL);
2297	hci_close_dev(dd);
2298
2299	adapter_setup(adapter);
2300
2301	if (!adapter->initialized && adapter->already_up) {
2302		debug("Stopping Inquiry at adapter startup");
2303		adapter_ops->stop_discovery(adapter->dev_id);
2304	}
2305
2306	err = adapter_up(adapter);
2307
2308	info("Adapter %s has been enabled", adapter->path);
2309
2310	return err;
2311}
2312
2313static void reply_pending_requests(struct btd_adapter *adapter)
2314{
2315	GSList *l;
2316
2317	if (!adapter)
2318		return;
2319
2320	/* pending bonding */
2321	for (l = adapter->devices; l; l = l->next) {
2322		struct btd_device *device = l->data;
2323
2324		if (device_is_bonding(device, NULL))
2325			device_cancel_bonding(device,
2326						HCI_OE_USER_ENDED_CONNECTION);
2327	}
2328
2329	if (adapter->state & STD_INQUIRY || adapter->state & PERIODIC_INQUIRY) {
2330		/* Cancel inquiry initiated by D-Bus client */
2331		if (adapter->disc_sessions)
2332			adapter_ops->stop_discovery(adapter->dev_id);
2333	}
2334}
2335
2336static void unload_drivers(struct btd_adapter *adapter)
2337{
2338	GSList *l;
2339
2340	for (l = adapter_drivers; l; l = l->next) {
2341		struct btd_adapter_driver *driver = l->data;
2342
2343		if (driver->remove)
2344			driver->remove(adapter);
2345	}
2346}
2347
2348int adapter_stop(struct btd_adapter *adapter)
2349{
2350	gboolean powered, discoverable, pairable;
2351
2352	/* cancel pending timeout */
2353	if (adapter->discov_timeout_id) {
2354		g_source_remove(adapter->discov_timeout_id);
2355		adapter->discov_timeout_id = 0;
2356	}
2357
2358	/* check pending requests */
2359	reply_pending_requests(adapter);
2360
2361	if (adapter->disc_sessions) {
2362		g_slist_foreach(adapter->disc_sessions, (GFunc) session_free,
2363				NULL);
2364		g_slist_free(adapter->disc_sessions);
2365		adapter->disc_sessions = NULL;
2366	}
2367
2368	clear_found_devices_list(adapter);
2369
2370	if (adapter->oor_devices) {
2371		g_slist_free(adapter->oor_devices);
2372		adapter->oor_devices = NULL;
2373	}
2374
2375	while (adapter->connections) {
2376		struct btd_device *device = adapter->connections->data;
2377		adapter_remove_connection(adapter, device, 0);
2378	}
2379
2380	if (adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY)) {
2381		discoverable = FALSE;
2382		emit_property_changed(connection, adapter->path,
2383					ADAPTER_INTERFACE, "Discoverable",
2384					DBUS_TYPE_BOOLEAN, &discoverable);
2385	}
2386
2387	if ((adapter->scan_mode & SCAN_PAGE) && adapter->pairable == TRUE) {
2388		pairable = FALSE;
2389		emit_property_changed(connection, adapter->path,
2390					ADAPTER_INTERFACE, "Pairable",
2391					DBUS_TYPE_BOOLEAN, &pairable);
2392	}
2393
2394	powered = FALSE;
2395	emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE,
2396				"Powered", DBUS_TYPE_BOOLEAN, &powered);
2397
2398	adapter->up = 0;
2399	adapter->scan_mode = SCAN_DISABLED;
2400	adapter->mode = MODE_OFF;
2401	adapter->state = DISCOVER_TYPE_NONE;
2402	adapter->cache_enable = TRUE;
2403
2404	info("Adapter %s has been disabled", adapter->path);
2405
2406	return 0;
2407}
2408
2409int adapter_update(struct btd_adapter *adapter, uint8_t new_svc)
2410{
2411	struct hci_dev *dev = &adapter->dev;
2412
2413	if (dev->ignore)
2414		return 0;
2415
2416	if (adapter->cache_enable) {
2417		adapter->svc_cache = new_svc;
2418		return 0;
2419	}
2420
2421	set_service_classes(adapter, new_svc);
2422
2423	update_ext_inquiry_response(adapter);
2424
2425	return 0;
2426}
2427
2428void adapter_disable_svc_cache(struct btd_adapter *adapter)
2429{
2430	if (!adapter)
2431		return;
2432
2433	if (!adapter->cache_enable)
2434		return;
2435
2436	/* Disable and flush svc cache. All successive service class updates
2437	   will be written to the device */
2438	adapter->cache_enable = FALSE;
2439
2440	set_service_classes(adapter, adapter->svc_cache);
2441
2442	update_ext_inquiry_response(adapter);
2443}
2444
2445int adapter_get_class(struct btd_adapter *adapter, uint8_t *cls)
2446{
2447	struct hci_dev *dev = &adapter->dev;
2448
2449	memcpy(cls, dev->class, 3);
2450
2451	return 0;
2452}
2453
2454int adapter_set_class(struct btd_adapter *adapter, uint8_t *cls)
2455{
2456	struct hci_dev *dev = &adapter->dev;
2457	uint32_t class;
2458
2459	if (memcmp(dev->class, cls, 3) == 0)
2460		return 0;
2461
2462	memcpy(dev->class, cls, 3);
2463
2464	write_local_class(&adapter->bdaddr, cls);
2465
2466	class = cls[0] | (cls[1] << 8) | (cls[2] << 16);
2467
2468	emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE,
2469				"Class", DBUS_TYPE_UINT32, &class);
2470
2471	return 0;
2472}
2473
2474int adapter_update_ssp_mode(struct btd_adapter *adapter, uint8_t mode)
2475{
2476	struct hci_dev *dev = &adapter->dev;
2477
2478	dev->ssp_mode = mode;
2479
2480	update_ext_inquiry_response(adapter);
2481
2482	return 0;
2483}
2484
2485static void adapter_free(gpointer user_data)
2486{
2487	struct btd_adapter *adapter = user_data;
2488
2489	agent_destroy(adapter->agent, FALSE);
2490	adapter->agent = NULL;
2491
2492	debug("adapter_free(%p)", adapter);
2493
2494	g_free(adapter->path);
2495	g_free(adapter);
2496}
2497
2498struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter)
2499{
2500	adapter->ref++;
2501
2502	debug("btd_adapter_ref(%p): ref=%d", adapter, adapter->ref);
2503
2504	return adapter;
2505}
2506
2507void btd_adapter_unref(struct btd_adapter *adapter)
2508{
2509	gchar *path;
2510
2511	adapter->ref--;
2512
2513	debug("btd_adapter_unref(%p): ref=%d", adapter, adapter->ref);
2514
2515	if (adapter->ref > 0)
2516		return;
2517
2518	path = g_strdup(adapter->path);
2519
2520	g_dbus_unregister_interface(connection, path, ADAPTER_INTERFACE);
2521
2522	g_free(path);
2523}
2524
2525struct btd_adapter *adapter_create(DBusConnection *conn, int id,
2526				gboolean devup)
2527{
2528	char path[MAX_PATH_LENGTH];
2529	struct btd_adapter *adapter;
2530	const char *base_path = manager_get_base_path();
2531
2532	if (!connection)
2533		connection = conn;
2534
2535	snprintf(path, sizeof(path), "%s/hci%d", base_path, id);
2536
2537	adapter = g_try_new0(struct btd_adapter, 1);
2538	if (!adapter) {
2539		error("adapter_create: failed to alloc memory for %s", path);
2540		return NULL;
2541	}
2542
2543	adapter->dev_id = id;
2544	if (main_opts.name_resolv)
2545		adapter->state |= RESOLVE_NAME;
2546	adapter->path = g_strdup(path);
2547	adapter->already_up = devup;
2548
2549	if (!g_dbus_register_interface(conn, path, ADAPTER_INTERFACE,
2550			adapter_methods, adapter_signals, NULL,
2551			adapter, adapter_free)) {
2552		error("Adapter interface init failed on path %s", path);
2553		adapter_free(adapter);
2554		return NULL;
2555	}
2556
2557	return btd_adapter_ref(adapter);
2558}
2559
2560void adapter_remove(struct btd_adapter *adapter)
2561{
2562	GSList *l;
2563
2564	debug("Removing adapter %s", adapter->path);
2565
2566	for (l = adapter->devices; l; l = l->next)
2567		device_remove(l->data, connection, FALSE);
2568	g_slist_free(adapter->devices);
2569
2570	unload_drivers(adapter);
2571
2572	/* Return adapter to down state if it was not up on init */
2573	if (adapter->up && !adapter->already_up)
2574		adapter_ops->stop(adapter->dev_id);
2575
2576	btd_adapter_unref(adapter);
2577}
2578
2579uint16_t adapter_get_dev_id(struct btd_adapter *adapter)
2580{
2581	return adapter->dev_id;
2582}
2583
2584const gchar *adapter_get_path(struct btd_adapter *adapter)
2585{
2586	if (!adapter)
2587		return NULL;
2588
2589	return adapter->path;
2590}
2591
2592void adapter_get_address(struct btd_adapter *adapter, bdaddr_t *bdaddr)
2593{
2594	bacpy(bdaddr, &adapter->bdaddr);
2595}
2596
2597void adapter_set_state(struct btd_adapter *adapter, int state)
2598{
2599	gboolean discov_active = FALSE;
2600	const char *path = adapter->path;
2601
2602	if (adapter->state == state)
2603		return;
2604
2605	if (state & PERIODIC_INQUIRY || state & STD_INQUIRY)
2606		discov_active = TRUE;
2607	else if (adapter->disc_sessions && main_opts.discov_interval)
2608		adapter->scheduler_id = g_timeout_add_seconds(
2609						main_opts.discov_interval,
2610						(GSourceFunc) adapter_start_inquiry,
2611						adapter);
2612
2613	/* Send out of range */
2614	if (!discov_active)
2615		adapter_update_oor_devices(adapter);
2616
2617	emit_property_changed(connection, path,
2618				ADAPTER_INTERFACE, "Discovering",
2619				DBUS_TYPE_BOOLEAN, &discov_active);
2620
2621	adapter->state = state;
2622}
2623
2624int adapter_get_state(struct btd_adapter *adapter)
2625{
2626	return adapter->state;
2627}
2628
2629gboolean adapter_is_ready(struct btd_adapter *adapter)
2630{
2631	return adapter->initialized;
2632}
2633
2634struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter,
2635						struct remote_dev_info *match)
2636{
2637	GSList *l;
2638
2639	l = g_slist_find_custom(adapter->found_devices, match,
2640					(GCompareFunc) found_device_cmp);
2641	if (l)
2642		return l->data;
2643
2644	return NULL;
2645}
2646
2647static int dev_rssi_cmp(struct remote_dev_info *d1, struct remote_dev_info *d2)
2648{
2649	int rssi1, rssi2;
2650
2651	rssi1 = d1->rssi < 0 ? -d1->rssi : d1->rssi;
2652	rssi2 = d2->rssi < 0 ? -d2->rssi : d2->rssi;
2653
2654	return rssi1 - rssi2;
2655}
2656
2657static void append_dict_valist(DBusMessageIter *iter,
2658					const char *first_key,
2659					va_list var_args)
2660{
2661	DBusMessageIter dict;
2662	const char *key;
2663	int type;
2664	void *val;
2665
2666	dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
2667			DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2668			DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
2669			DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
2670
2671	key = first_key;
2672	while (key) {
2673		type = va_arg(var_args, int);
2674		val = va_arg(var_args, void *);
2675		dict_append_entry(&dict, key, type, val);
2676		key = va_arg(var_args, char *);
2677	}
2678
2679	dbus_message_iter_close_container(iter, &dict);
2680}
2681
2682static void emit_device_found(const char *path, const char *address,
2683				const char *first_key, ...)
2684{
2685	DBusMessage *signal;
2686	DBusMessageIter iter;
2687	va_list var_args;
2688
2689	signal = dbus_message_new_signal(path, ADAPTER_INTERFACE,
2690					"DeviceFound");
2691	if (!signal) {
2692		error("Unable to allocate new %s.DeviceFound signal",
2693				ADAPTER_INTERFACE);
2694		return;
2695	}
2696	dbus_message_iter_init_append(signal, &iter);
2697	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &address);
2698
2699	va_start(var_args, first_key);
2700	append_dict_valist(&iter, first_key, var_args);
2701	va_end(var_args);
2702
2703	g_dbus_send_message(connection, signal);
2704}
2705
2706void adapter_emit_device_found(struct btd_adapter *adapter,
2707				struct remote_dev_info *dev)
2708{
2709	struct btd_device *device;
2710	char peer_addr[18], local_addr[18];
2711	const char *icon, *paddr = peer_addr;
2712	dbus_bool_t paired = FALSE;
2713	dbus_int16_t rssi = dev->rssi;
2714	char *alias;
2715
2716	ba2str(&dev->bdaddr, peer_addr);
2717	ba2str(&adapter->bdaddr, local_addr);
2718
2719	device = adapter_find_device(adapter, paddr);
2720	if (device)
2721		paired = device_is_paired(device);
2722
2723	icon = class_to_icon(dev->class);
2724
2725	if (!dev->alias) {
2726		if (!dev->name) {
2727			alias = g_strdup(peer_addr);
2728			g_strdelimit(alias, ":", '-');
2729		} else
2730			alias = g_strdup(dev->name);
2731	} else
2732		alias = g_strdup(dev->alias);
2733
2734	emit_device_found(adapter->path, paddr,
2735			"Address", DBUS_TYPE_STRING, &paddr,
2736			"Class", DBUS_TYPE_UINT32, &dev->class,
2737			"Icon", DBUS_TYPE_STRING, &icon,
2738			"RSSI", DBUS_TYPE_INT16, &rssi,
2739			"Name", DBUS_TYPE_STRING, &dev->name,
2740			"Alias", DBUS_TYPE_STRING, &alias,
2741			"LegacyPairing", DBUS_TYPE_BOOLEAN, &dev->legacy,
2742			"Paired", DBUS_TYPE_BOOLEAN, &paired,
2743			NULL);
2744
2745	g_free(alias);
2746}
2747
2748void adapter_update_found_devices(struct btd_adapter *adapter, bdaddr_t *bdaddr,
2749				int8_t rssi, uint32_t class, const char *name,
2750				const char *alias, gboolean legacy,
2751				name_status_t name_status)
2752{
2753	struct remote_dev_info *dev, match;
2754
2755	memset(&match, 0, sizeof(struct remote_dev_info));
2756	bacpy(&match.bdaddr, bdaddr);
2757	match.name_status = NAME_ANY;
2758
2759	dev = adapter_search_found_devices(adapter, &match);
2760	if (dev) {
2761		if (rssi == dev->rssi)
2762			return;
2763
2764		/* Out of range list update */
2765		adapter->oor_devices = g_slist_remove(adapter->oor_devices,
2766							dev);
2767
2768		goto done;
2769	}
2770
2771	dev = g_new0(struct remote_dev_info, 1);
2772
2773	bacpy(&dev->bdaddr, bdaddr);
2774	dev->class = class;
2775	if (name)
2776		dev->name = g_strdup(name);
2777	if (alias)
2778		dev->alias = g_strdup(alias);
2779	dev->legacy = legacy;
2780	dev->name_status = name_status;
2781
2782	adapter->found_devices = g_slist_prepend(adapter->found_devices, dev);
2783
2784done:
2785	dev->rssi = rssi;
2786
2787	adapter->found_devices = g_slist_sort(adapter->found_devices,
2788						(GCompareFunc) dev_rssi_cmp);
2789
2790	adapter_emit_device_found(adapter, dev);
2791}
2792
2793int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr)
2794{
2795	struct remote_dev_info *dev, match;
2796
2797	memset(&match, 0, sizeof(struct remote_dev_info));
2798	bacpy(&match.bdaddr, bdaddr);
2799
2800	dev = adapter_search_found_devices(adapter, &match);
2801	if (!dev)
2802		return -1;
2803
2804	dev->name_status = NAME_NOT_REQUIRED;
2805
2806	return 0;
2807}
2808
2809void adapter_update_oor_devices(struct btd_adapter *adapter)
2810{
2811	GSList *l;
2812
2813	for (l = adapter->oor_devices; l; l = l->next) {
2814		char address[18];
2815		const char *paddr = address;
2816		struct remote_dev_info *dev = l->data;
2817
2818		ba2str(&dev->bdaddr, address);
2819
2820		g_dbus_emit_signal(connection, adapter->path,
2821				ADAPTER_INTERFACE, "DeviceDisappeared",
2822				DBUS_TYPE_STRING, &paddr,
2823				DBUS_TYPE_INVALID);
2824
2825		adapter->found_devices = g_slist_remove(adapter->found_devices, dev);
2826		dev_info_free(dev);
2827	}
2828
2829	g_slist_free(adapter->oor_devices);
2830	adapter->oor_devices = NULL;
2831
2832	adapter->oor_devices = g_slist_copy(adapter->found_devices);
2833}
2834
2835void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)
2836{
2837	const gchar *path = adapter_get_path(adapter);
2838	gboolean discoverable, pairable;
2839	uint8_t real_class[3];
2840
2841	if (adapter->scan_mode == scan_mode)
2842		return;
2843
2844	adapter_remove_discov_timeout(adapter);
2845
2846	switch (scan_mode) {
2847	case SCAN_DISABLED:
2848		adapter->mode = MODE_OFF;
2849		discoverable = FALSE;
2850		pairable = FALSE;
2851		break;
2852	case SCAN_PAGE:
2853		adapter->mode = MODE_CONNECTABLE;
2854		discoverable = FALSE;
2855		pairable = adapter->pairable;
2856		break;
2857	case (SCAN_PAGE | SCAN_INQUIRY):
2858		adapter->mode = MODE_DISCOVERABLE;
2859		discoverable = TRUE;
2860		pairable = adapter->pairable;
2861		if (adapter->discov_timeout != 0)
2862			adapter_set_discov_timeout(adapter,
2863						adapter->discov_timeout);
2864		break;
2865	case SCAN_INQUIRY:
2866		/* Address the scenario where a low-level application like
2867		 * hciconfig changed the scan mode */
2868		if (adapter->discov_timeout != 0)
2869			adapter_set_discov_timeout(adapter,
2870						adapter->discov_timeout);
2871
2872		/* ignore, this event should not be sent */
2873	default:
2874		/* ignore, reserved */
2875		return;
2876	}
2877
2878	/* If page scanning gets toggled emit the Pairable property */
2879	if ((adapter->scan_mode & SCAN_PAGE) != (scan_mode & SCAN_PAGE))
2880		emit_property_changed(connection, adapter->path,
2881					ADAPTER_INTERFACE, "Pairable",
2882					DBUS_TYPE_BOOLEAN, &pairable);
2883
2884	memcpy(real_class, adapter->dev.class, 3);
2885	if (adapter->svc_cache)
2886		real_class[2] = adapter->svc_cache;
2887
2888	if (discoverable && adapter->pairable && adapter->discov_timeout > 0 &&
2889						adapter->discov_timeout <= 60)
2890		adapter_ops->set_limited_discoverable(adapter->dev_id,
2891							real_class, TRUE);
2892	else if (!discoverable)
2893		adapter_ops->set_limited_discoverable(adapter->dev_id,
2894							real_class, FALSE);
2895
2896	emit_property_changed(connection, path,
2897				ADAPTER_INTERFACE, "Discoverable",
2898				DBUS_TYPE_BOOLEAN, &discoverable);
2899
2900	adapter->scan_mode = scan_mode;
2901}
2902
2903struct agent *adapter_get_agent(struct btd_adapter *adapter)
2904{
2905	if (!adapter || !adapter->agent)
2906		return NULL;
2907
2908	return adapter->agent;
2909}
2910
2911void adapter_add_connection(struct btd_adapter *adapter,
2912				struct btd_device *device, uint16_t handle)
2913{
2914	if (g_slist_find(adapter->connections, device)) {
2915		error("Unable to add connection %d", handle);
2916		return;
2917	}
2918
2919	device_add_connection(device, connection, handle);
2920
2921	adapter->connections = g_slist_append(adapter->connections, device);
2922}
2923
2924void adapter_remove_connection(struct btd_adapter *adapter,
2925				struct btd_device *device, uint16_t handle)
2926{
2927	bdaddr_t bdaddr;
2928
2929	if (!g_slist_find(adapter->connections, device)) {
2930		error("No matching connection for handle %u", handle);
2931		return;
2932	}
2933
2934	device_remove_connection(device, connection, handle);
2935
2936	adapter->connections = g_slist_remove(adapter->connections, device);
2937
2938	/* clean pending HCI cmds */
2939	device_get_address(device, &bdaddr);
2940	hci_req_queue_remove(adapter->dev_id, &bdaddr);
2941
2942	if (device_is_authenticating(device))
2943		device_cancel_authentication(device, TRUE);
2944
2945	if (device_is_temporary(device)) {
2946		const char *path = device_get_path(device);
2947
2948		debug("Removing temporary device %s", path);
2949		adapter_remove_device(connection, adapter, device);
2950	}
2951}
2952
2953gboolean adapter_has_discov_sessions(struct btd_adapter *adapter)
2954{
2955	if (!adapter || !adapter->disc_sessions)
2956		return FALSE;
2957
2958	return TRUE;
2959}
2960
2961int btd_register_adapter_driver(struct btd_adapter_driver *driver)
2962{
2963	GSList *adapters;
2964
2965	adapter_drivers = g_slist_append(adapter_drivers, driver);
2966
2967	if (driver->probe == NULL)
2968		return 0;
2969
2970	adapters = manager_get_adapters();
2971	g_slist_foreach(adapters, probe_driver, driver);
2972
2973	return 0;
2974}
2975
2976void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
2977{
2978	adapter_drivers = g_slist_remove(adapter_drivers, driver);
2979}
2980
2981static void agent_auth_cb(struct agent *agent, DBusError *derr,
2982							void *user_data)
2983{
2984	struct service_auth *auth = user_data;
2985
2986	device_set_authorizing(auth->device, FALSE);
2987
2988	auth->cb(derr, auth->user_data);
2989}
2990
2991static int btd_adapter_authorize(struct btd_adapter *adapter,
2992					const bdaddr_t *dst,
2993					const char *uuid,
2994					service_auth_cb cb, void *user_data)
2995{
2996	struct service_auth *auth;
2997	struct btd_device *device;
2998	struct agent *agent;
2999	char address[18];
3000	gboolean trusted;
3001	const gchar *dev_path;
3002	int err;
3003
3004	ba2str(dst, address);
3005	device = adapter_find_device(adapter, address);
3006	if (!device)
3007		return -EPERM;
3008
3009	/* Device connected? */
3010	if (!g_slist_find(adapter->connections, device))
3011		return -ENOTCONN;
3012
3013	trusted = read_trust(&adapter->bdaddr, address, GLOBAL_TRUST);
3014
3015	if (trusted) {
3016		cb(NULL, user_data);
3017		return 0;
3018	}
3019
3020	device = adapter_find_device(adapter, address);
3021	if (!device)
3022		return -EPERM;
3023
3024	agent = device_get_agent(device);
3025
3026	if (!agent)
3027		agent = adapter->agent;
3028
3029	if (!agent)
3030		return -EPERM;
3031
3032	auth = g_try_new0(struct service_auth, 1);
3033	if (!auth)
3034		return -ENOMEM;
3035
3036	auth->cb = cb;
3037	auth->user_data = user_data;
3038	auth->device = device;
3039
3040	dev_path = device_get_path(device);
3041
3042	err = agent_authorize(agent, dev_path, uuid, agent_auth_cb, auth, g_free);
3043
3044	if (err == 0)
3045		device_set_authorizing(device, TRUE);
3046
3047	return err;
3048}
3049
3050int btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
3051		const char *uuid, service_auth_cb cb, void *user_data)
3052{
3053	struct btd_adapter *adapter;
3054	GSList *adapters;
3055
3056	if (src == NULL || dst == NULL)
3057		return -EINVAL;
3058
3059	if (bacmp(src, BDADDR_ANY) != 0)
3060		goto proceed;
3061
3062	/* Handle request authorization for ANY adapter */
3063	adapters = manager_get_adapters();
3064
3065	for (; adapters; adapters = adapters->next) {
3066		int err;
3067		adapter = adapters->data;
3068
3069		err = btd_adapter_authorize(adapter, dst, uuid, cb, user_data);
3070		if (err == 0)
3071			return 0;
3072	}
3073
3074	return -EPERM;
3075
3076proceed:
3077	adapter = manager_find_adapter(src);
3078	if (!adapter)
3079		return -EPERM;
3080
3081	return btd_adapter_authorize(adapter, dst, uuid, cb, user_data);
3082}
3083
3084int btd_cancel_authorization(const bdaddr_t *src, const bdaddr_t *dst)
3085{
3086	struct btd_adapter *adapter = manager_find_adapter(src);
3087	struct btd_device *device;
3088	struct agent *agent;
3089	char address[18];
3090	int err;
3091
3092	if (!adapter)
3093		return -EPERM;
3094
3095	ba2str(dst, address);
3096	device = adapter_find_device(adapter, address);
3097	if (!device)
3098		return -EPERM;
3099
3100	/*
3101	 * FIXME: Cancel fails if authorization is requested to adapter's
3102	 * agent and in the meanwhile CreatePairedDevice is called.
3103	 */
3104
3105	agent = device_get_agent(device);
3106
3107	if (!agent)
3108		agent = adapter->agent;
3109
3110	if (!agent)
3111		return -EPERM;
3112
3113	err = agent_cancel(agent);
3114
3115	if (err == 0)
3116		device_set_authorizing(device, FALSE);
3117
3118	return err;
3119}
3120
3121static gchar *adapter_any_path = NULL;
3122static int adapter_any_refcount = 0;
3123
3124const char *adapter_any_get_path(void)
3125{
3126	return adapter_any_path;
3127}
3128
3129const char *btd_adapter_any_request_path(void)
3130{
3131	if (adapter_any_refcount > 0)
3132		return adapter_any_path;
3133
3134	adapter_any_path = g_strdup_printf("%s/any", manager_get_base_path());
3135	adapter_any_refcount++;
3136
3137	return adapter_any_path;
3138}
3139
3140void btd_adapter_any_release_path(void)
3141{
3142	adapter_any_refcount--;
3143
3144	if (adapter_any_refcount > 0)
3145		return;
3146
3147	g_free(adapter_any_path);
3148	adapter_any_path = NULL;
3149}
3150
3151gboolean adapter_is_pairable(struct btd_adapter *adapter)
3152{
3153	return adapter->pairable;
3154}
3155
3156gboolean adapter_powering_down(struct btd_adapter *adapter)
3157{
3158	return adapter->off_requested;
3159}
3160
3161int btd_adapter_restore_powered(struct btd_adapter *adapter)
3162{
3163	char mode[14], address[18];
3164
3165	if (!adapter_ops)
3166		return -EINVAL;
3167
3168	if (!main_opts.remember_powered)
3169		return -EINVAL;
3170
3171	if (adapter->up)
3172		return 0;
3173
3174	ba2str(&adapter->bdaddr, address);
3175	if (read_device_mode(address, mode, sizeof(mode)) == 0 &&
3176						g_str_equal(mode, "off"))
3177		return 0;
3178
3179	return adapter_ops->set_powered(adapter->dev_id, TRUE);
3180}
3181
3182int btd_adapter_switch_offline(struct btd_adapter *adapter)
3183{
3184	if (!adapter_ops)
3185		return -EINVAL;
3186
3187	if (!adapter->up)
3188		return 0;
3189
3190	return adapter_ops->set_powered(adapter->dev_id, FALSE);
3191}
3192
3193int btd_register_adapter_ops(struct btd_adapter_ops *btd_adapter_ops)
3194{
3195	/* Already registered */
3196	if (adapter_ops)
3197		return -EALREADY;
3198
3199	if (btd_adapter_ops->setup == NULL)
3200		return -EINVAL;
3201
3202	adapter_ops = btd_adapter_ops;
3203
3204	return 0;
3205}
3206
3207void btd_adapter_cleanup_ops(struct btd_adapter_ops *btd_adapter_ops)
3208{
3209	adapter_ops->cleanup();
3210}
3211
3212int adapter_ops_setup(void)
3213{
3214	if (!adapter_ops)
3215		return -EINVAL;
3216
3217	return adapter_ops->setup();
3218}
3219