All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH BlueZ 1/4] shared/util: Rename btd_malloc to util_malloc
@ 2022-01-06 21:03 Luiz Augusto von Dentz
  2022-01-06 21:03 ` [PATCH BlueZ 2/4] attrib: Remove gatt-service.{c,h} and attrib-server.{c,h} Luiz Augusto von Dentz
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2022-01-06 21:03 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

util functions are not limited to daemon only which is normally the case
when using btd prefix.
---
 profiles/audio/avdtp.c | 2 +-
 src/shared/util.c      | 2 +-
 src/shared/util.h      | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
index d3dfbf96d..f2b461330 100644
--- a/profiles/audio/avdtp.c
+++ b/profiles/audio/avdtp.c
@@ -1333,7 +1333,7 @@ static GSList *caps_to_list(uint8_t *data, size_t size,
 			break;
 		}
 
-		cpy = btd_malloc(sizeof(*cpy) + cap->length);
+		cpy = util_malloc(sizeof(*cpy) + cap->length);
 		memcpy(cpy, cap, sizeof(*cap) + cap->length);
 
 		size -= sizeof(*cap) + cap->length;
diff --git a/src/shared/util.c b/src/shared/util.c
index 81b20d86f..93110047b 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -25,7 +25,7 @@
 
 #include "src/shared/util.h"
 
-void *btd_malloc(size_t size)
+void *util_malloc(size_t size)
 {
 	if (__builtin_expect(!!size, 1)) {
 		void *ptr;
diff --git a/src/shared/util.h b/src/shared/util.h
index ac70117ca..11d09979d 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -75,7 +75,7 @@ do {						\
 		size_t __n = (size_t) (count);	\
 		size_t __s = sizeof(type);	\
 		void *__p;			\
-		__p = btd_malloc(__n * __s);	\
+		__p = util_malloc(__n * __s);	\
 		memset(__p, 0, __n * __s);	\
 		__p;				\
 	}))
@@ -86,7 +86,7 @@ do {						\
 char *strdelimit(char *str, char *del, char c);
 int strsuffix(const char *str, const char *suffix);
 
-void *btd_malloc(size_t size);
+void *util_malloc(size_t size);
 
 typedef void (*util_debug_func_t)(const char *str, void *user_data);
 
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH BlueZ 2/4] attrib: Remove gatt-service.{c,h} and attrib-server.{c,h}
  2022-01-06 21:03 [PATCH BlueZ 1/4] shared/util: Rename btd_malloc to util_malloc Luiz Augusto von Dentz
@ 2022-01-06 21:03 ` Luiz Augusto von Dentz
  2022-01-06 21:03 ` [PATCH BlueZ 3/4] shared/util: Add util_memdup Luiz Augusto von Dentz
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2022-01-06 21:03 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

These files are not longer needed since this functionality has been
moved to gatt-db.{c,h}.
---
 Makefile.am           |    4 +-
 attrib/gatt-service.c |  362 ---------
 attrib/gatt-service.h |   44 --
 src/adapter.c         |    5 -
 src/attrib-server.c   | 1656 -----------------------------------------
 src/attrib-server.h   |   29 -
 src/device.c          |    1 -
 7 files changed, 1 insertion(+), 2100 deletions(-)
 delete mode 100644 attrib/gatt-service.c
 delete mode 100644 attrib/gatt-service.h
 delete mode 100644 src/attrib-server.c
 delete mode 100644 src/attrib-server.h

diff --git a/Makefile.am b/Makefile.am
index 308f13c50..a26ba9bc7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -267,8 +267,7 @@ endif
 
 attrib_sources = attrib/att.h attrib/att-database.h attrib/att.c \
 		attrib/gatt.h attrib/gatt.c \
-		attrib/gattrib.h attrib/gattrib.c \
-		attrib/gatt-service.h attrib/gatt-service.c
+		attrib/gattrib.h attrib/gattrib.c
 
 btio_sources = btio/btio.h btio/btio.c
 
@@ -305,7 +304,6 @@ src_bluetoothd_SOURCES = $(builtin_sources) \
 			src/rfkill.c src/btd.h src/sdpd.h \
 			src/sdpd-server.c src/sdpd-request.c \
 			src/sdpd-service.c src/sdpd-database.c \
-			src/attrib-server.h src/attrib-server.c \
 			src/gatt-database.h src/gatt-database.c \
 			src/sdp-xml.h src/sdp-xml.c \
 			src/sdp-client.h src/sdp-client.c \
diff --git a/attrib/gatt-service.c b/attrib/gatt-service.c
deleted file mode 100644
index 741ff1acb..000000000
--- a/attrib/gatt-service.c
+++ /dev/null
@@ -1,362 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2011  Nokia Corporation
- *  Copyright (C) 2011  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <glib.h>
-
-#include "lib/bluetooth.h"
-#include "lib/sdp.h"
-#include "lib/uuid.h"
-
-#include "src/adapter.h"
-#include "src/shared/util.h"
-#include "attrib/gattrib.h"
-#include "attrib/att.h"
-#include "attrib/gatt.h"
-#include "attrib/att-database.h"
-#include "src/attrib-server.h"
-#include "attrib/gatt-service.h"
-#include "src/log.h"
-
-struct gatt_info {
-	bt_uuid_t uuid;
-	uint8_t props;
-	int authentication;
-	int authorization;
-	GSList *callbacks;
-	unsigned int num_attrs;
-	uint16_t *value_handle;
-	uint16_t *ccc_handle;
-};
-
-struct attrib_cb {
-	attrib_event_t event;
-	void *fn;
-	void *user_data;
-};
-
-static inline void put_uuid_le(const bt_uuid_t *src, void *dst)
-{
-	if (src->type == BT_UUID16)
-		put_le16(src->value.u16, dst);
-	else
-		/* Convert from 128-bit BE to LE */
-		bswap_128(&src->value.u128, dst);
-}
-
-static GSList *parse_opts(gatt_option opt1, va_list args)
-{
-	gatt_option opt = opt1;
-	struct gatt_info *info;
-	struct attrib_cb *cb;
-	GSList *l = NULL;
-
-	info = g_new0(struct gatt_info, 1);
-	l = g_slist_append(l, info);
-
-	while (opt != GATT_OPT_INVALID) {
-		switch (opt) {
-		case GATT_OPT_CHR_UUID16:
-			bt_uuid16_create(&info->uuid, va_arg(args, int));
-			/* characteristic declaration and value */
-			info->num_attrs += 2;
-			break;
-		case GATT_OPT_CHR_UUID:
-			memcpy(&info->uuid, va_arg(args, bt_uuid_t *),
-							sizeof(bt_uuid_t));
-			/* characteristic declaration and value */
-			info->num_attrs += 2;
-			break;
-		case GATT_OPT_CHR_PROPS:
-			info->props = va_arg(args, int);
-
-			if (info->props & (GATT_CHR_PROP_NOTIFY |
-						GATT_CHR_PROP_INDICATE))
-				/* client characteristic configuration */
-				info->num_attrs += 1;
-
-			/* TODO: "Extended Properties" property requires a
-			 * descriptor, but it is not supported yet. */
-			break;
-		case GATT_OPT_CHR_VALUE_CB:
-			cb = g_new0(struct attrib_cb, 1);
-			cb->event = va_arg(args, attrib_event_t);
-			cb->fn = va_arg(args, void *);
-			cb->user_data = va_arg(args, void *);
-			info->callbacks = g_slist_append(info->callbacks, cb);
-			break;
-		case GATT_OPT_CHR_VALUE_GET_HANDLE:
-			info->value_handle = va_arg(args, void *);
-			break;
-		case GATT_OPT_CCC_GET_HANDLE:
-			info->ccc_handle = va_arg(args, void *);
-			break;
-		case GATT_OPT_CHR_AUTHENTICATION:
-			info->authentication = va_arg(args, gatt_option);
-			break;
-		case GATT_OPT_CHR_AUTHORIZATION:
-			info->authorization = va_arg(args, gatt_option);
-			break;
-		case GATT_CHR_VALUE_READ:
-		case GATT_CHR_VALUE_WRITE:
-		case GATT_CHR_VALUE_BOTH:
-		case GATT_OPT_INVALID:
-		default:
-			error("Invalid option: %d", opt);
-		}
-
-		opt = va_arg(args, gatt_option);
-		if (opt == GATT_OPT_CHR_UUID16 || opt == GATT_OPT_CHR_UUID) {
-			info = g_new0(struct gatt_info, 1);
-			l = g_slist_append(l, info);
-		}
-	}
-
-	return l;
-}
-
-static struct attribute *add_service_declaration(struct btd_adapter *adapter,
-				uint16_t handle, uint16_t svc, bt_uuid_t *uuid)
-{
-	bt_uuid_t bt_uuid;
-	uint8_t atval[16];
-	int len;
-
-	put_uuid_le(uuid, &atval[0]);
-	len = bt_uuid_len(uuid);
-
-	bt_uuid16_create(&bt_uuid, svc);
-
-	return attrib_db_add(adapter, handle, &bt_uuid, ATT_NONE,
-						ATT_NOT_PERMITTED, atval, len);
-}
-
-static int att_read_req(int authorization, int authentication, uint8_t props)
-{
-	if (authorization == GATT_CHR_VALUE_READ ||
-				authorization == GATT_CHR_VALUE_BOTH)
-		return ATT_AUTHORIZATION;
-	else if (authentication == GATT_CHR_VALUE_READ ||
-				authentication == GATT_CHR_VALUE_BOTH)
-		return ATT_AUTHENTICATION;
-	else if (!(props & GATT_CHR_PROP_READ))
-		return ATT_NOT_PERMITTED;
-
-	return ATT_NONE;
-}
-
-static int att_write_req(int authorization, int authentication, uint8_t props)
-{
-	if (authorization == GATT_CHR_VALUE_WRITE ||
-				authorization == GATT_CHR_VALUE_BOTH)
-		return ATT_AUTHORIZATION;
-	else if (authentication == GATT_CHR_VALUE_WRITE ||
-				authentication == GATT_CHR_VALUE_BOTH)
-		return ATT_AUTHENTICATION;
-	else if (!(props & (GATT_CHR_PROP_WRITE |
-					GATT_CHR_PROP_WRITE_WITHOUT_RESP)))
-		return ATT_NOT_PERMITTED;
-
-	return ATT_NONE;
-}
-
-static int find_callback(gconstpointer a, gconstpointer b)
-{
-	const struct attrib_cb *cb = a;
-	unsigned int event = GPOINTER_TO_UINT(b);
-
-	return cb->event - event;
-}
-
-static gboolean add_characteristic(struct btd_adapter *adapter,
-				uint16_t *handle, struct gatt_info *info)
-{
-	int read_req, write_req;
-	uint16_t h = *handle;
-	struct attribute *a;
-	bt_uuid_t bt_uuid;
-	uint8_t atval[ATT_MAX_VALUE_LEN];
-	GSList *l;
-
-	if ((info->uuid.type != BT_UUID16 && info->uuid.type != BT_UUID128) ||
-								!info->props) {
-		error("Characteristic UUID or properties are missing");
-		return FALSE;
-	}
-
-	read_req = att_read_req(info->authorization, info->authentication,
-								info->props);
-	write_req = att_write_req(info->authorization, info->authentication,
-								info->props);
-
-	/* TODO: static characteristic values are not supported, therefore a
-	 * callback must be always provided if a read/write property is set */
-	if (read_req != ATT_NOT_PERMITTED) {
-		gpointer reqs = GUINT_TO_POINTER(ATTRIB_READ);
-
-		if (!g_slist_find_custom(info->callbacks, reqs,
-							find_callback)) {
-			error("Callback for read required");
-			return FALSE;
-		}
-	}
-
-	if (write_req != ATT_NOT_PERMITTED) {
-		gpointer reqs = GUINT_TO_POINTER(ATTRIB_WRITE);
-
-		if (!g_slist_find_custom(info->callbacks, reqs,
-							find_callback)) {
-			error("Callback for write required");
-			return FALSE;
-		}
-	}
-
-	/* characteristic declaration */
-	bt_uuid16_create(&bt_uuid, GATT_CHARAC_UUID);
-	atval[0] = info->props;
-	put_le16(h + 1, &atval[1]);
-	put_uuid_le(&info->uuid, &atval[3]);
-	if (attrib_db_add(adapter, h++, &bt_uuid, ATT_NONE, ATT_NOT_PERMITTED,
-				atval, 3 + info->uuid.type / 8) == NULL)
-		return FALSE;
-
-	/* characteristic value */
-	a = attrib_db_add(adapter, h++, &info->uuid, read_req, write_req,
-								NULL, 0);
-	if (a == NULL)
-		return FALSE;
-
-	for (l = info->callbacks; l != NULL; l = l->next) {
-		struct attrib_cb *cb = l->data;
-
-		switch (cb->event) {
-		case ATTRIB_READ:
-			a->read_cb = cb->fn;
-			break;
-		case ATTRIB_WRITE:
-			a->write_cb = cb->fn;
-			break;
-		}
-
-		a->cb_user_data = cb->user_data;
-	}
-
-	if (info->value_handle != NULL)
-		*info->value_handle = a->handle;
-
-	/* client characteristic configuration descriptor */
-	if (info->props & (GATT_CHR_PROP_NOTIFY | GATT_CHR_PROP_INDICATE)) {
-		uint8_t cfg_val[2];
-
-		bt_uuid16_create(&bt_uuid, GATT_CLIENT_CHARAC_CFG_UUID);
-		cfg_val[0] = 0x00;
-		cfg_val[1] = 0x00;
-		a = attrib_db_add(adapter, h++, &bt_uuid, ATT_NONE,
-				ATT_AUTHENTICATION, cfg_val, sizeof(cfg_val));
-		if (a == NULL)
-			return FALSE;
-
-		if (info->ccc_handle != NULL)
-			*info->ccc_handle = a->handle;
-	}
-
-	*handle = h;
-
-	return TRUE;
-}
-
-static void free_gatt_info(void *data)
-{
-	struct gatt_info *info = data;
-
-	g_slist_free_full(info->callbacks, g_free);
-	g_free(info);
-}
-
-static void service_attr_del(struct btd_adapter *adapter, uint16_t start_handle,
-							uint16_t end_handle)
-{
-	uint16_t handle;
-
-	/* For a 128-bit category primary service below handle should be checked
-	 * for both non-zero as well as >= 0xffff. As on last iteration the
-	 * handle will turn to 0 from 0xffff and loop will be infinite.
-	 */
-	for (handle = start_handle; (handle != 0 && handle <= end_handle);
-								handle++) {
-		if (attrib_db_del(adapter, handle) < 0)
-			error("Can't delete handle 0x%04x", handle);
-	}
-}
-
-gboolean gatt_service_add(struct btd_adapter *adapter, uint16_t uuid,
-				bt_uuid_t *svc_uuid, gatt_option opt1, ...)
-{
-	char uuidstr[MAX_LEN_UUID_STR];
-	uint16_t start_handle, h;
-	unsigned int size;
-	va_list args;
-	GSList *chrs, *l;
-
-	bt_uuid_to_string(svc_uuid, uuidstr, MAX_LEN_UUID_STR);
-
-	if (svc_uuid->type != BT_UUID16 && svc_uuid->type != BT_UUID128) {
-		error("Invalid service uuid: %s", uuidstr);
-		return FALSE;
-	}
-
-	va_start(args, opt1);
-	chrs = parse_opts(opt1, args);
-	va_end(args);
-
-	/* calculate how many attributes are necessary for this service */
-	for (l = chrs, size = 1; l != NULL; l = l->next) {
-		struct gatt_info *info = l->data;
-		size += info->num_attrs;
-	}
-
-	start_handle = attrib_db_find_avail(adapter, svc_uuid, size);
-	if (start_handle == 0) {
-		error("Not enough free handles to register service");
-		goto fail;
-	}
-
-	DBG("New service: handle 0x%04x, UUID %s, %d attributes",
-						start_handle, uuidstr, size);
-
-	/* service declaration */
-	h = start_handle;
-	if (add_service_declaration(adapter, h++, uuid, svc_uuid) == NULL)
-		goto fail;
-
-	for (l = chrs; l != NULL; l = l->next) {
-		struct gatt_info *info = l->data;
-
-		DBG("New characteristic: handle 0x%04x", h);
-		if (!add_characteristic(adapter, &h, info)) {
-			service_attr_del(adapter, start_handle, h - 1);
-			goto fail;
-		}
-	}
-
-	g_assert(size < USHRT_MAX);
-	g_assert(h == 0 || (h - start_handle == (uint16_t) size));
-	g_slist_free_full(chrs, free_gatt_info);
-
-	return TRUE;
-
-fail:
-	g_slist_free_full(chrs, free_gatt_info);
-	return FALSE;
-}
diff --git a/attrib/gatt-service.h b/attrib/gatt-service.h
deleted file mode 100644
index 17031d466..000000000
--- a/attrib/gatt-service.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2011  Nokia Corporation
- *  Copyright (C) 2011  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- */
-
-typedef enum {
-	GATT_OPT_INVALID = 0,
-
-	/* bt_uuid_t* value */
-	GATT_OPT_CHR_UUID,
-
-	/* a uint16 value */
-	GATT_OPT_CHR_UUID16,
-
-	GATT_OPT_CHR_PROPS,
-	GATT_OPT_CHR_VALUE_CB,
-	GATT_OPT_CHR_AUTHENTICATION,
-	GATT_OPT_CHR_AUTHORIZATION,
-
-	/* Get attribute handle for characteristic value */
-	GATT_OPT_CHR_VALUE_GET_HANDLE,
-
-	/* Get handle for ccc attribute */
-	GATT_OPT_CCC_GET_HANDLE,
-
-	/* arguments for authentication/authorization */
-	GATT_CHR_VALUE_READ,
-	GATT_CHR_VALUE_WRITE,
-	GATT_CHR_VALUE_BOTH,
-} gatt_option;
-
-typedef enum {
-	ATTRIB_READ,
-	ATTRIB_WRITE,
-} attrib_event_t;
-
-gboolean gatt_service_add(struct btd_adapter *adapter, uint16_t uuid,
-					bt_uuid_t *svc_uuid, gatt_option opt1, ...);
diff --git a/src/adapter.c b/src/adapter.c
index c49f42cfb..9772e843a 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -62,7 +62,6 @@
 #include "attrib/gattrib.h"
 #include "attrib/att.h"
 #include "attrib/gatt.h"
-#include "attrib-server.h"
 #include "gatt-database.h"
 #include "advertising.h"
 #include "adv_monitor.h"
@@ -827,10 +826,6 @@ static void local_name_changed_callback(uint16_t index, uint16_t length,
 
 	g_dbus_emit_property_changed(dbus_conn, adapter->path,
 						ADAPTER_INTERFACE, "Alias");
-
-	attrib_gap_set(adapter, GATT_CHARAC_DEVICE_NAME,
-				(const uint8_t *) adapter->current_alias,
-					strlen(adapter->current_alias));
 }
 
 static void set_local_name_complete(uint8_t status, uint16_t length,
diff --git a/src/attrib-server.c b/src/attrib-server.c
deleted file mode 100644
index 0063c9534..000000000
--- a/src/attrib-server.c
+++ /dev/null
@@ -1,1656 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2010  Nokia Corporation
- *  Copyright (C) 2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <errno.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <string.h>
-#include <unistd.h>
-#include <glib.h>
-#include <sys/stat.h>
-
-#include "lib/bluetooth.h"
-#include "lib/sdp.h"
-#include "lib/sdp_lib.h"
-#include "lib/uuid.h"
-
-#include "btio/btio.h"
-#include "log.h"
-#include "backtrace.h"
-#include "adapter.h"
-#include "device.h"
-#include "src/shared/util.h"
-#include "attrib/gattrib.h"
-#include "attrib/att.h"
-#include "attrib/gatt.h"
-#include "attrib/att-database.h"
-#include "textfile.h"
-#include "storage.h"
-
-#include "attrib-server.h"
-
-static GSList *servers = NULL;
-
-struct gatt_server {
-	struct btd_adapter *adapter;
-	GIOChannel *l2cap_io;
-	GIOChannel *le_io;
-	uint32_t gatt_sdp_handle;
-	uint32_t gap_sdp_handle;
-	GList *database;
-	GSList *clients;
-	uint16_t name_handle;
-	uint16_t appearance_handle;
-};
-
-struct gatt_channel {
-	GAttrib *attrib;
-	guint mtu;
-	gboolean le;
-	guint id;
-	gboolean encrypted;
-	struct gatt_server *server;
-	guint cleanup_id;
-	struct btd_device *device;
-};
-
-struct group_elem {
-	uint16_t handle;
-	uint16_t end;
-	uint8_t *data;
-	uint16_t len;
-};
-
-static bt_uuid_t prim_uuid = {
-			.type = BT_UUID16,
-			.value.u16 = GATT_PRIM_SVC_UUID
-};
-static bt_uuid_t snd_uuid = {
-			.type = BT_UUID16,
-			.value.u16 = GATT_SND_SVC_UUID
-};
-static bt_uuid_t ccc_uuid = {
-			.type = BT_UUID16,
-			.value.u16 = GATT_CLIENT_CHARAC_CFG_UUID
-};
-
-static void attrib_free(void *data)
-{
-	struct attribute *a = data;
-
-	g_free(a->data);
-	g_free(a);
-}
-
-static void channel_free(struct gatt_channel *channel)
-{
-
-	if (channel->cleanup_id)
-		g_source_remove(channel->cleanup_id);
-
-	if (channel->device)
-		btd_device_unref(channel->device);
-
-	g_attrib_unref(channel->attrib);
-	g_free(channel);
-}
-
-static void gatt_server_free(struct gatt_server *server)
-{
-	g_list_free_full(server->database, attrib_free);
-
-	if (server->l2cap_io != NULL) {
-		g_io_channel_shutdown(server->l2cap_io, FALSE, NULL);
-		g_io_channel_unref(server->l2cap_io);
-	}
-
-	if (server->le_io != NULL) {
-		g_io_channel_shutdown(server->le_io, FALSE, NULL);
-		g_io_channel_unref(server->le_io);
-	}
-
-	g_slist_free_full(server->clients, (GDestroyNotify) channel_free);
-
-	if (server->gatt_sdp_handle > 0)
-		adapter_service_remove(server->adapter,
-					server->gatt_sdp_handle);
-
-	if (server->gap_sdp_handle > 0)
-		adapter_service_remove(server->adapter, server->gap_sdp_handle);
-
-	if (server->adapter != NULL)
-		btd_adapter_unref(server->adapter);
-
-	g_free(server);
-}
-
-static int adapter_cmp_addr(gconstpointer a, gconstpointer b)
-{
-	const struct gatt_server *server = a;
-	const bdaddr_t *bdaddr = b;
-
-	return bacmp(btd_adapter_get_address(server->adapter), bdaddr);
-}
-
-static int adapter_cmp(gconstpointer a, gconstpointer b)
-{
-	const struct gatt_server *server = a;
-	const struct btd_adapter *adapter = b;
-
-	if (server->adapter == adapter)
-		return 0;
-
-	return -1;
-}
-
-static struct gatt_server *find_gatt_server(const bdaddr_t *bdaddr)
-{
-	GSList *l;
-
-	l = g_slist_find_custom(servers, bdaddr, adapter_cmp_addr);
-	if (l == NULL) {
-		char addr[18];
-
-		ba2str(bdaddr, addr);
-		error("No GATT server found in %s", addr);
-		return NULL;
-	}
-
-	return l->data;
-}
-
-static sdp_record_t *server_record_new(uuid_t *uuid, uint16_t start, uint16_t end)
-{
-	sdp_list_t *svclass_id, *apseq, *proto[2], *root, *aproto;
-	uuid_t root_uuid, proto_uuid, l2cap;
-	sdp_record_t *record;
-	sdp_data_t *psm, *sh, *eh;
-	uint16_t lp = ATT_PSM;
-
-	if (uuid == NULL)
-		return NULL;
-
-	if (start > end)
-		return NULL;
-
-	record = sdp_record_alloc();
-	if (record == NULL)
-		return NULL;
-
-	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
-	root = sdp_list_append(NULL, &root_uuid);
-	sdp_set_browse_groups(record, root);
-	sdp_list_free(root, NULL);
-
-	svclass_id = sdp_list_append(NULL, uuid);
-	sdp_set_service_classes(record, svclass_id);
-	sdp_list_free(svclass_id, NULL);
-
-	sdp_uuid16_create(&l2cap, L2CAP_UUID);
-	proto[0] = sdp_list_append(NULL, &l2cap);
-	psm = sdp_data_alloc(SDP_UINT16, &lp);
-	proto[0] = sdp_list_append(proto[0], psm);
-	apseq = sdp_list_append(NULL, proto[0]);
-
-	sdp_uuid16_create(&proto_uuid, ATT_UUID);
-	proto[1] = sdp_list_append(NULL, &proto_uuid);
-	sh = sdp_data_alloc(SDP_UINT16, &start);
-	proto[1] = sdp_list_append(proto[1], sh);
-	eh = sdp_data_alloc(SDP_UINT16, &end);
-	proto[1] = sdp_list_append(proto[1], eh);
-	apseq = sdp_list_append(apseq, proto[1]);
-
-	aproto = sdp_list_append(NULL, apseq);
-	sdp_set_access_protos(record, aproto);
-
-	sdp_data_free(psm);
-	sdp_data_free(sh);
-	sdp_data_free(eh);
-	sdp_list_free(proto[0], NULL);
-	sdp_list_free(proto[1], NULL);
-	sdp_list_free(apseq, NULL);
-	sdp_list_free(aproto, NULL);
-
-	return record;
-}
-
-static int handle_cmp(gconstpointer a, gconstpointer b)
-{
-	const struct attribute *attrib = a;
-	uint16_t handle = GPOINTER_TO_UINT(b);
-
-	return attrib->handle - handle;
-}
-
-static int attribute_cmp(gconstpointer a1, gconstpointer a2)
-{
-	const struct attribute *attrib1 = a1;
-	const struct attribute *attrib2 = a2;
-
-	return attrib1->handle - attrib2->handle;
-}
-
-static struct attribute *find_svc_range(struct gatt_server *server,
-					uint16_t start, uint16_t *end)
-{
-	struct attribute *attrib;
-	guint h = start;
-	GList *l;
-
-	if (end == NULL)
-		return NULL;
-
-	l = g_list_find_custom(server->database, GUINT_TO_POINTER(h),
-								handle_cmp);
-	if (!l)
-		return NULL;
-
-	attrib = l->data;
-
-	if (bt_uuid_cmp(&attrib->uuid, &prim_uuid) != 0 &&
-			bt_uuid_cmp(&attrib->uuid, &snd_uuid) != 0)
-		return NULL;
-
-	*end = start;
-
-	for (l = l->next; l; l = l->next) {
-		struct attribute *a = l->data;
-
-		if (bt_uuid_cmp(&a->uuid, &prim_uuid) == 0 ||
-				bt_uuid_cmp(&a->uuid, &snd_uuid) == 0)
-			break;
-
-		*end = a->handle;
-	}
-
-	return attrib;
-}
-
-static uint32_t attrib_create_sdp_new(struct gatt_server *server,
-					uint16_t handle, const char *name)
-{
-	sdp_record_t *record;
-	struct attribute *a;
-	uint16_t end = 0;
-	uuid_t svc, gap_uuid;
-
-	a = find_svc_range(server, handle, &end);
-
-	if (a == NULL)
-		return 0;
-
-	if (a->len == 2)
-		sdp_uuid16_create(&svc, get_le16(a->data));
-	else if (a->len == 16) {
-		uint8_t be128[16];
-
-		/* Converting from LE to BE */
-		bswap_128(a->data, be128);
-		sdp_uuid128_create(&svc, be128);
-	} else
-		return 0;
-
-	record = server_record_new(&svc, handle, end);
-	if (record == NULL)
-		return 0;
-
-	if (name != NULL)
-		sdp_set_info_attr(record, name, "BlueZ", NULL);
-
-	sdp_uuid16_create(&gap_uuid, GENERIC_ACCESS_PROFILE_ID);
-	if (sdp_uuid_cmp(&svc, &gap_uuid) == 0) {
-		sdp_set_url_attr(record, "http://www.bluez.org/",
-				"http://www.bluez.org/",
-				"http://www.bluez.org/");
-	}
-
-	if (adapter_service_add(server->adapter, record) == 0)
-		return record->handle;
-
-	sdp_record_free(record);
-	return 0;
-}
-
-static struct attribute *attrib_db_add_new(struct gatt_server *server,
-				uint16_t handle, bt_uuid_t *uuid,
-				int read_req, int write_req,
-				const uint8_t *value, size_t len)
-{
-	struct attribute *a;
-	guint h = handle;
-
-	DBG("handle=0x%04x", handle);
-
-	if (g_list_find_custom(server->database, GUINT_TO_POINTER(h),
-								handle_cmp))
-		return NULL;
-
-	a = g_new0(struct attribute, 1);
-	a->len = len;
-	a->data = g_memdup(value, len);
-	a->handle = handle;
-	a->uuid = *uuid;
-	a->read_req = read_req;
-	a->write_req = write_req;
-
-	server->database = g_list_insert_sorted(server->database, a,
-								attribute_cmp);
-
-	return a;
-}
-
-static bool g_attrib_is_encrypted(GAttrib *attrib)
-{
-	BtIOSecLevel sec_level;
-	GIOChannel *io = g_attrib_get_channel(attrib);
-
-	if (!bt_io_get(io, NULL, BT_IO_OPT_SEC_LEVEL, &sec_level,
-							     BT_IO_OPT_INVALID))
-		return FALSE;
-
-	return sec_level > BT_IO_SEC_LOW;
-}
-
-static uint8_t att_check_reqs(struct gatt_channel *channel, uint8_t opcode,
-								int reqs)
-{
-	/* FIXME: currently, it is assumed an encrypted link is enough for
-	 * authentication. This will allow to enable the SMP negotiation once
-	 * it is on upstream kernel. High security level should be mapped
-	 * to authentication and medium to encryption permission. */
-	if (!channel->encrypted)
-		channel->encrypted = g_attrib_is_encrypted(channel->attrib);
-	if (reqs == ATT_AUTHENTICATION && !channel->encrypted)
-		return ATT_ECODE_AUTHENTICATION;
-	else if (reqs == ATT_AUTHORIZATION)
-		return ATT_ECODE_AUTHORIZATION;
-
-	switch (opcode) {
-	case ATT_OP_READ_BY_GROUP_REQ:
-	case ATT_OP_READ_BY_TYPE_REQ:
-	case ATT_OP_READ_REQ:
-	case ATT_OP_READ_BLOB_REQ:
-	case ATT_OP_READ_MULTI_REQ:
-		if (reqs == ATT_NOT_PERMITTED)
-			return ATT_ECODE_READ_NOT_PERM;
-		break;
-	case ATT_OP_PREP_WRITE_REQ:
-	case ATT_OP_WRITE_REQ:
-	case ATT_OP_WRITE_CMD:
-		if (reqs == ATT_NOT_PERMITTED)
-			return ATT_ECODE_WRITE_NOT_PERM;
-		break;
-	}
-
-	return 0;
-}
-
-static uint16_t read_by_group(struct gatt_channel *channel, uint16_t start,
-						uint16_t end, bt_uuid_t *uuid,
-						uint8_t *pdu, size_t len)
-{
-	struct att_data_list *adl;
-	struct attribute *a;
-	struct group_elem *cur, *old = NULL;
-	GSList *l, *groups;
-	GList *dl, *database;
-	uint16_t length, last_handle, last_size = 0;
-	uint8_t status;
-	int i;
-
-	if (start > end || start == 0x0000)
-		return enc_error_resp(ATT_OP_READ_BY_GROUP_REQ, start,
-					ATT_ECODE_INVALID_HANDLE, pdu, len);
-
-	/*
-	 * Only <<Primary Service>> and <<Secondary Service>> grouping
-	 * types may be used in the Read By Group Type Request.
-	 */
-
-	if (bt_uuid_cmp(uuid, &prim_uuid) != 0 &&
-		bt_uuid_cmp(uuid, &snd_uuid) != 0)
-		return enc_error_resp(ATT_OP_READ_BY_GROUP_REQ, 0x0000,
-					ATT_ECODE_UNSUPP_GRP_TYPE, pdu, len);
-
-	last_handle = end;
-	database = channel->server->database;
-	for (dl = database, groups = NULL, cur = NULL; dl; dl = dl->next) {
-
-		a = dl->data;
-
-		if (a->handle < start)
-			continue;
-
-		if (a->handle >= end)
-			break;
-
-		/* The old group ends when a new one starts */
-		if (old && (bt_uuid_cmp(&a->uuid, &prim_uuid) == 0 ||
-				bt_uuid_cmp(&a->uuid, &snd_uuid) == 0)) {
-			old->end = last_handle;
-			old = NULL;
-		}
-
-		if (bt_uuid_cmp(&a->uuid, uuid) != 0) {
-			/* Still inside a service, update its last handle */
-			if (old)
-				last_handle = a->handle;
-			continue;
-		}
-
-		if (last_size && (last_size != a->len))
-			break;
-
-		status = att_check_reqs(channel, ATT_OP_READ_BY_GROUP_REQ,
-								a->read_req);
-
-		if (status == 0x00 && a->read_cb)
-			status = a->read_cb(a, channel->device,
-							a->cb_user_data);
-
-		if (status) {
-			g_slist_free_full(groups, g_free);
-			return enc_error_resp(ATT_OP_READ_BY_GROUP_REQ,
-						a->handle, status, pdu, len);
-		}
-
-		cur = g_new0(struct group_elem, 1);
-		cur->handle = a->handle;
-		cur->data = a->data;
-		cur->len = a->len;
-
-		/* Attribute Grouping Type found */
-		groups = g_slist_append(groups, cur);
-
-		last_size = a->len;
-		old = cur;
-		last_handle = cur->handle;
-	}
-
-	if (groups == NULL)
-		return enc_error_resp(ATT_OP_READ_BY_GROUP_REQ, start,
-					ATT_ECODE_ATTR_NOT_FOUND, pdu, len);
-
-	if (dl == NULL)
-		cur->end = a->handle;
-	else
-		cur->end = last_handle;
-
-	length = g_slist_length(groups);
-
-	adl = att_data_list_alloc(length, last_size + 4);
-	if (adl == NULL) {
-		g_slist_free_full(groups, g_free);
-		return enc_error_resp(ATT_OP_READ_BY_GROUP_REQ, start,
-					ATT_ECODE_UNLIKELY, pdu, len);
-	}
-
-	for (i = 0, l = groups; l; l = l->next, i++) {
-		uint8_t *value;
-
-		cur = l->data;
-
-		value = (void *) adl->data[i];
-
-		put_le16(cur->handle, value);
-		put_le16(cur->end, &value[2]);
-		/* Attribute Value */
-		memcpy(&value[4], cur->data, cur->len);
-	}
-
-	length = enc_read_by_grp_resp(adl, pdu, len);
-
-	att_data_list_free(adl);
-	g_slist_free_full(groups, g_free);
-
-	return length;
-}
-
-static uint16_t read_by_type(struct gatt_channel *channel, uint16_t start,
-						uint16_t end, bt_uuid_t *uuid,
-						uint8_t *pdu, size_t len)
-{
-	struct att_data_list *adl;
-	GSList *l, *types;
-	GList *dl, *database;
-	struct attribute *a;
-	uint16_t num, length;
-	uint8_t status;
-	int i;
-
-	if (start > end || start == 0x0000)
-		return enc_error_resp(ATT_OP_READ_BY_TYPE_REQ, start,
-					ATT_ECODE_INVALID_HANDLE, pdu, len);
-
-	database = channel->server->database;
-	for (dl = database, length = 0, types = NULL; dl; dl = dl->next) {
-
-		a = dl->data;
-
-		if (a->handle < start)
-			continue;
-
-		if (a->handle > end)
-			break;
-
-		if (bt_uuid_cmp(&a->uuid, uuid)  != 0)
-			continue;
-
-		status = att_check_reqs(channel, ATT_OP_READ_BY_TYPE_REQ,
-								a->read_req);
-
-		if (status == 0x00 && a->read_cb)
-			status = a->read_cb(a, channel->device,
-							a->cb_user_data);
-
-		if (status) {
-			g_slist_free(types);
-			return enc_error_resp(ATT_OP_READ_BY_TYPE_REQ,
-						a->handle, status, pdu, len);
-		}
-
-		/* All elements must have the same length */
-		if (length == 0)
-			length = a->len;
-		else if (a->len != length)
-			break;
-
-		types = g_slist_append(types, a);
-	}
-
-	if (types == NULL)
-		return enc_error_resp(ATT_OP_READ_BY_TYPE_REQ, start,
-					ATT_ECODE_ATTR_NOT_FOUND, pdu, len);
-
-	num = g_slist_length(types);
-
-	/* Handle length plus attribute value length */
-	length += 2;
-
-	adl = att_data_list_alloc(num, length);
-	if (adl == NULL) {
-		g_slist_free(types);
-		return enc_error_resp(ATT_OP_READ_BY_TYPE_REQ, start,
-					ATT_ECODE_UNLIKELY, pdu, len);
-	}
-
-	for (i = 0, l = types; l; i++, l = l->next) {
-		uint8_t *value;
-
-		a = l->data;
-
-		value = (void *) adl->data[i];
-
-		put_le16(a->handle, value);
-
-		/* Attribute Value */
-		memcpy(&value[2], a->data, a->len);
-	}
-
-	length = enc_read_by_type_resp(adl, pdu, len);
-
-	att_data_list_free(adl);
-	g_slist_free(types);
-
-	return length;
-}
-
-static uint16_t find_info(struct gatt_channel *channel, uint16_t start,
-				uint16_t end, uint8_t *pdu, size_t len)
-{
-	struct attribute *a;
-	struct att_data_list *adl;
-	GSList *l, *info;
-	GList *dl, *database;
-	uint8_t format, last_type = BT_UUID_UNSPEC;
-	uint16_t length, num;
-	int i;
-
-	if (start > end || start == 0x0000)
-		return enc_error_resp(ATT_OP_FIND_INFO_REQ, start,
-					ATT_ECODE_INVALID_HANDLE, pdu, len);
-
-	database = channel->server->database;
-	for (dl = database, info = NULL, num = 0; dl; dl = dl->next) {
-		a = dl->data;
-
-		if (a->handle < start)
-			continue;
-
-		if (a->handle > end)
-			break;
-
-		if (last_type == BT_UUID_UNSPEC)
-			last_type = a->uuid.type;
-
-		if (a->uuid.type != last_type)
-			break;
-
-		info = g_slist_append(info, a);
-		num++;
-
-		last_type = a->uuid.type;
-	}
-
-	if (info == NULL)
-		return enc_error_resp(ATT_OP_FIND_INFO_REQ, start,
-					ATT_ECODE_ATTR_NOT_FOUND, pdu, len);
-
-	if (last_type == BT_UUID16) {
-		length = 2;
-		format = 0x01;
-	} else if (last_type == BT_UUID128) {
-		length = 16;
-		format = 0x02;
-	} else {
-		g_slist_free(info);
-		return 0;
-	}
-
-	adl = att_data_list_alloc(num, length + 2);
-	if (adl == NULL) {
-		g_slist_free(info);
-		return enc_error_resp(ATT_OP_FIND_INFO_REQ, start,
-					ATT_ECODE_UNLIKELY, pdu, len);
-	}
-
-	for (i = 0, l = info; l; i++, l = l->next) {
-		uint8_t *value;
-
-		a = l->data;
-
-		value = (void *) adl->data[i];
-
-		put_le16(a->handle, value);
-
-		/* Attribute Value */
-		bt_uuid_to_le(&a->uuid, &value[2]);
-	}
-
-	length = enc_find_info_resp(format, adl, pdu, len);
-
-	att_data_list_free(adl);
-	g_slist_free(info);
-
-	return length;
-}
-
-static uint16_t find_by_type(struct gatt_channel *channel, uint16_t start,
-				uint16_t end, bt_uuid_t *uuid,
-				const uint8_t *value, size_t vlen,
-				uint8_t *opdu, size_t mtu)
-{
-	struct attribute *a;
-	struct att_range *range;
-	GSList *matches;
-	GList *dl, *database;
-	uint16_t len;
-
-	if (start > end || start == 0x0000)
-		return enc_error_resp(ATT_OP_FIND_BY_TYPE_REQ, start,
-					ATT_ECODE_INVALID_HANDLE, opdu, mtu);
-
-	/* Searching first requested handle number */
-	database = channel->server->database;
-	for (dl = database, matches = NULL, range = NULL; dl; dl = dl->next) {
-		a = dl->data;
-
-		if (a->handle < start)
-			continue;
-
-		if (a->handle > end)
-			break;
-
-		/* Primary service? Attribute value matches? */
-		if ((bt_uuid_cmp(&a->uuid, uuid) == 0) && (a->len == vlen) &&
-					(memcmp(a->data, value, vlen) == 0)) {
-
-			range = g_new0(struct att_range, 1);
-			range->start = a->handle;
-			/* It is allowed to have end group handle the same as
-			 * start handle, for groups with only one attribute. */
-			range->end = a->handle;
-
-			matches = g_slist_append(matches, range);
-		} else if (range) {
-			/* Update the last found handle or reset the pointer
-			 * to track that a new group started: Primary or
-			 * Secondary service. */
-			if (bt_uuid_cmp(&a->uuid, &prim_uuid) == 0 ||
-					bt_uuid_cmp(&a->uuid, &snd_uuid) == 0)
-				range = NULL;
-			else
-				range->end = a->handle;
-		}
-	}
-
-	if (matches == NULL)
-		return enc_error_resp(ATT_OP_FIND_BY_TYPE_REQ, start,
-				ATT_ECODE_ATTR_NOT_FOUND, opdu, mtu);
-
-	len = enc_find_by_type_resp(matches, opdu, mtu);
-
-	g_slist_free_full(matches, g_free);
-
-	return len;
-}
-
-static int read_device_ccc(struct btd_device *device, uint16_t handle,
-				uint16_t *value)
-{
-	char *filename;
-	GKeyFile *key_file;
-	GError *gerr = NULL;
-	char group[6];
-	char *str;
-	unsigned int config;
-	int err = 0;
-
-	filename = btd_device_get_storage_path(device, "ccc");
-	if (!filename) {
-		warn("Unable to get ccc storage path for device");
-		return -ENOENT;
-	}
-
-	key_file = g_key_file_new();
-	if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
-		error("Unable to load key file from %s: (%s)", filename,
-								gerr->message);
-		g_error_free(gerr);
-	}
-
-	sprintf(group, "%hu", handle);
-
-	str = g_key_file_get_string(key_file, group, "Value", NULL);
-	if (!str || sscanf(str, "%04X", &config) != 1)
-		err = -ENOENT;
-	else
-		*value = config;
-
-	g_free(str);
-	g_free(filename);
-	g_key_file_free(key_file);
-
-	return err;
-}
-
-static uint16_t read_value(struct gatt_channel *channel, uint16_t handle,
-						uint8_t *pdu, size_t len)
-{
-	struct attribute *a;
-	uint8_t status;
-	GList *l;
-	uint16_t cccval;
-	guint h = handle;
-
-	l = g_list_find_custom(channel->server->database,
-					GUINT_TO_POINTER(h), handle_cmp);
-	if (!l)
-		return enc_error_resp(ATT_OP_READ_REQ, handle,
-					ATT_ECODE_INVALID_HANDLE, pdu, len);
-
-	a = l->data;
-
-	if (bt_uuid_cmp(&ccc_uuid, &a->uuid) == 0 &&
-		read_device_ccc(channel->device, handle, &cccval) == 0) {
-		uint8_t config[2];
-
-		put_le16(cccval, config);
-		return enc_read_resp(config, sizeof(config), pdu, len);
-	}
-
-	status = att_check_reqs(channel, ATT_OP_READ_REQ, a->read_req);
-
-	if (status == 0x00 && a->read_cb)
-		status = a->read_cb(a, channel->device, a->cb_user_data);
-
-	if (status)
-		return enc_error_resp(ATT_OP_READ_REQ, handle, status, pdu,
-									len);
-
-	return enc_read_resp(a->data, a->len, pdu, len);
-}
-
-static uint16_t read_blob(struct gatt_channel *channel, uint16_t handle,
-				uint16_t offset, uint8_t *pdu, size_t len)
-{
-	struct attribute *a;
-	uint8_t status;
-	GList *l;
-	uint16_t cccval;
-	guint h = handle;
-
-	l = g_list_find_custom(channel->server->database,
-					GUINT_TO_POINTER(h), handle_cmp);
-	if (!l)
-		return enc_error_resp(ATT_OP_READ_BLOB_REQ, handle,
-					ATT_ECODE_INVALID_HANDLE, pdu, len);
-
-	a = l->data;
-
-	if (a->len < offset)
-		return enc_error_resp(ATT_OP_READ_BLOB_REQ, handle,
-					ATT_ECODE_INVALID_OFFSET, pdu, len);
-
-	if (bt_uuid_cmp(&ccc_uuid, &a->uuid) == 0 &&
-		read_device_ccc(channel->device, handle, &cccval) == 0) {
-		uint8_t config[2];
-
-		put_le16(cccval, config);
-		return enc_read_blob_resp(config, sizeof(config), offset,
-								pdu, len);
-	}
-
-	status = att_check_reqs(channel, ATT_OP_READ_BLOB_REQ, a->read_req);
-
-	if (status == 0x00 && a->read_cb)
-		status = a->read_cb(a, channel->device, a->cb_user_data);
-
-	if (status)
-		return enc_error_resp(ATT_OP_READ_BLOB_REQ, handle, status,
-								pdu, len);
-
-	return enc_read_blob_resp(a->data, a->len, offset, pdu, len);
-}
-
-static uint16_t write_value(struct gatt_channel *channel, uint16_t handle,
-					const uint8_t *value, size_t vlen,
-					uint8_t *pdu, size_t len)
-{
-	struct attribute *a;
-	uint8_t status;
-	GList *l;
-	GError *gerr = NULL;
-	guint h = handle;
-
-	l = g_list_find_custom(channel->server->database,
-					GUINT_TO_POINTER(h), handle_cmp);
-	if (!l)
-		return enc_error_resp(ATT_OP_WRITE_REQ, handle,
-				ATT_ECODE_INVALID_HANDLE, pdu, len);
-
-	a = l->data;
-
-	status = att_check_reqs(channel, ATT_OP_WRITE_REQ, a->write_req);
-	if (status)
-		return enc_error_resp(ATT_OP_WRITE_REQ, handle, status, pdu,
-									len);
-
-	if (bt_uuid_cmp(&ccc_uuid, &a->uuid) != 0) {
-
-		attrib_db_update(channel->server->adapter, handle, NULL,
-							value, vlen, NULL);
-
-		if (a->write_cb) {
-			status = a->write_cb(a, channel->device,
-							a->cb_user_data);
-			if (status)
-				return enc_error_resp(ATT_OP_WRITE_REQ, handle,
-							status, pdu, len);
-		}
-	} else {
-		uint16_t cccval = get_le16(value);
-		char *filename;
-		GKeyFile *key_file;
-		char group[6], value[5];
-		char *data;
-		gsize length = 0;
-
-		filename = btd_device_get_storage_path(channel->device, "ccc");
-		if (!filename) {
-			warn("Unable to get ccc storage path for device");
-			return enc_error_resp(ATT_OP_WRITE_REQ, handle,
-						ATT_ECODE_WRITE_NOT_PERM,
-						pdu, len);
-		}
-
-		key_file = g_key_file_new();
-		if (!g_key_file_load_from_file(key_file, filename, 0, &gerr)) {
-			error("Unable to load key file from %s: (%s)", filename,
-								gerr->message);
-			g_error_free(gerr);
-		}
-
-		sprintf(group, "%hu", handle);
-		sprintf(value, "%hX", cccval);
-		g_key_file_set_string(key_file, group, "Value", value);
-
-		data = g_key_file_to_data(key_file, &length, NULL);
-		if (length > 0) {
-			create_file(filename, 0600);
-			if (!g_file_set_contents(filename, data, length,
-								&gerr)) {
-				error("Unable set contents for %s: (%s)",
-						filename, gerr->message);
-				g_error_free(gerr);
-			}
-		}
-
-		g_free(data);
-		g_free(filename);
-		g_key_file_free(key_file);
-	}
-
-	return enc_write_resp(pdu);
-}
-
-static uint16_t mtu_exchange(struct gatt_channel *channel, uint16_t mtu,
-						uint8_t *pdu, size_t len)
-{
-	GError *gerr = NULL;
-	GIOChannel *io;
-	uint16_t imtu;
-
-	if (mtu < ATT_DEFAULT_LE_MTU)
-		return enc_error_resp(ATT_OP_MTU_REQ, 0,
-					ATT_ECODE_REQ_NOT_SUPP, pdu, len);
-
-	io = g_attrib_get_channel(channel->attrib);
-
-	bt_io_get(io, &gerr, BT_IO_OPT_IMTU, &imtu, BT_IO_OPT_INVALID);
-	if (gerr) {
-		error("bt_io_get: %s", gerr->message);
-		g_error_free(gerr);
-		return enc_error_resp(ATT_OP_MTU_REQ, 0, ATT_ECODE_UNLIKELY,
-								pdu, len);
-	}
-
-	channel->mtu = MIN(mtu, imtu);
-	g_attrib_set_mtu(channel->attrib, channel->mtu);
-
-	return enc_mtu_resp(imtu, pdu, len);
-}
-
-static void channel_remove(struct gatt_channel *channel)
-{
-	channel->server->clients = g_slist_remove(channel->server->clients,
-								channel);
-	channel_free(channel);
-}
-
-static gboolean channel_watch_cb(GIOChannel *io, GIOCondition cond,
-						gpointer user_data)
-{
-	channel_remove(user_data);
-
-	return FALSE;
-}
-
-static void channel_handler(const uint8_t *ipdu, uint16_t len,
-							gpointer user_data)
-{
-	struct gatt_channel *channel = user_data;
-	uint8_t opdu[channel->mtu];
-	uint16_t length, start, end, mtu, offset;
-	bt_uuid_t uuid;
-	uint8_t status = 0;
-	size_t vlen;
-	uint8_t *value = g_attrib_get_buffer(channel->attrib, &vlen);
-
-	DBG("op 0x%02x", ipdu[0]);
-
-	if (len > vlen) {
-		error("Too much data on ATT socket");
-		status = ATT_ECODE_INVALID_PDU;
-		goto done;
-	}
-
-	switch (ipdu[0]) {
-	case ATT_OP_READ_BY_GROUP_REQ:
-		length = dec_read_by_grp_req(ipdu, len, &start, &end, &uuid);
-		if (length == 0) {
-			status = ATT_ECODE_INVALID_PDU;
-			goto done;
-		}
-
-		length = read_by_group(channel, start, end, &uuid, opdu,
-								channel->mtu);
-		break;
-	case ATT_OP_READ_BY_TYPE_REQ:
-		length = dec_read_by_type_req(ipdu, len, &start, &end, &uuid);
-		if (length == 0) {
-			status = ATT_ECODE_INVALID_PDU;
-			goto done;
-		}
-
-		length = read_by_type(channel, start, end, &uuid, opdu,
-								channel->mtu);
-		break;
-	case ATT_OP_READ_REQ:
-		length = dec_read_req(ipdu, len, &start);
-		if (length == 0) {
-			status = ATT_ECODE_INVALID_PDU;
-			goto done;
-		}
-
-		length = read_value(channel, start, opdu, channel->mtu);
-		break;
-	case ATT_OP_READ_BLOB_REQ:
-		length = dec_read_blob_req(ipdu, len, &start, &offset);
-		if (length == 0) {
-			status = ATT_ECODE_INVALID_PDU;
-			goto done;
-		}
-
-		length = read_blob(channel, start, offset, opdu, channel->mtu);
-		break;
-	case ATT_OP_MTU_REQ:
-		if (!channel->le) {
-			status = ATT_ECODE_REQ_NOT_SUPP;
-			goto done;
-		}
-
-		length = dec_mtu_req(ipdu, len, &mtu);
-		if (length == 0) {
-			status = ATT_ECODE_INVALID_PDU;
-			goto done;
-		}
-
-		length = mtu_exchange(channel, mtu, opdu, channel->mtu);
-		break;
-	case ATT_OP_FIND_INFO_REQ:
-		length = dec_find_info_req(ipdu, len, &start, &end);
-		if (length == 0) {
-			status = ATT_ECODE_INVALID_PDU;
-			goto done;
-		}
-
-		length = find_info(channel, start, end, opdu, channel->mtu);
-		break;
-	case ATT_OP_WRITE_REQ:
-		length = dec_write_req(ipdu, len, &start, value, &vlen);
-		if (length == 0) {
-			status = ATT_ECODE_INVALID_PDU;
-			goto done;
-		}
-
-		length = write_value(channel, start, value, vlen, opdu,
-								channel->mtu);
-		break;
-	case ATT_OP_WRITE_CMD:
-		length = dec_write_cmd(ipdu, len, &start, value, &vlen);
-		if (length > 0)
-			write_value(channel, start, value, vlen, opdu,
-								channel->mtu);
-		return;
-	case ATT_OP_FIND_BY_TYPE_REQ:
-		length = dec_find_by_type_req(ipdu, len, &start, &end,
-							&uuid, value, &vlen);
-		if (length == 0) {
-			status = ATT_ECODE_INVALID_PDU;
-			goto done;
-		}
-
-		length = find_by_type(channel, start, end, &uuid, value, vlen,
-							opdu, channel->mtu);
-		break;
-	case ATT_OP_HANDLE_CNF:
-		return;
-	case ATT_OP_HANDLE_IND:
-	case ATT_OP_HANDLE_NOTIFY:
-		/* The attribute client is already handling these */
-		return;
-	case ATT_OP_READ_MULTI_REQ:
-	case ATT_OP_PREP_WRITE_REQ:
-	case ATT_OP_EXEC_WRITE_REQ:
-	default:
-		DBG("Unsupported request 0x%02x", ipdu[0]);
-		status = ATT_ECODE_REQ_NOT_SUPP;
-		goto done;
-	}
-
-	if (length == 0)
-		status = ATT_ECODE_IO;
-
-done:
-	if (status)
-		length = enc_error_resp(ipdu[0], 0x0000, status, opdu,
-								channel->mtu);
-
-	g_attrib_send(channel->attrib, 0, opdu, length, NULL, NULL, NULL);
-}
-
-GAttrib *attrib_from_device(struct btd_device *device)
-{
-	struct btd_adapter *adapter = device_get_adapter(device);
-	struct gatt_server *server;
-	GSList *l;
-
-	l = g_slist_find_custom(servers, adapter, adapter_cmp);
-	if (!l)
-		return NULL;
-
-	server = l->data;
-
-	for (l = server->clients; l; l = l->next) {
-		struct gatt_channel *channel = l->data;
-
-		if (channel->device == device)
-			return g_attrib_ref(channel->attrib);
-	}
-
-	return NULL;
-}
-
-guint attrib_channel_attach(GAttrib *attrib)
-{
-	struct gatt_server *server;
-	struct btd_device *device;
-	struct gatt_channel *channel;
-	bdaddr_t src, dst;
-	GIOChannel *io;
-	GError *gerr = NULL;
-	uint8_t bdaddr_type;
-	uint16_t cid;
-	guint mtu = 0;
-
-	io = g_attrib_get_channel(attrib);
-
-	bt_io_get(io, &gerr,
-			BT_IO_OPT_SOURCE_BDADDR, &src,
-			BT_IO_OPT_DEST_BDADDR, &dst,
-			BT_IO_OPT_DEST_TYPE, &bdaddr_type,
-			BT_IO_OPT_CID, &cid,
-			BT_IO_OPT_IMTU, &mtu,
-			BT_IO_OPT_INVALID);
-	if (gerr) {
-		error("bt_io_get: %s", gerr->message);
-		g_error_free(gerr);
-		return 0;
-	}
-
-	server = find_gatt_server(&src);
-	if (server == NULL)
-		return 0;
-
-	channel = g_new0(struct gatt_channel, 1);
-	channel->server = server;
-
-	device = btd_adapter_find_device(server->adapter, &dst, bdaddr_type);
-	if (device == NULL) {
-		error("Device object not found for attrib server");
-		g_free(channel);
-		return 0;
-	}
-
-	if (!device_is_bonded(device, bdaddr_type)) {
-		char *filename;
-
-		filename = btd_device_get_storage_path(device, "ccc");
-		if (filename) {
-			unlink(filename);
-			g_free(filename);
-		}
-	}
-
-	if (cid != ATT_CID) {
-		channel->le = FALSE;
-		channel->mtu = mtu;
-	} else {
-		channel->le = TRUE;
-		channel->mtu = ATT_DEFAULT_LE_MTU;
-	}
-
-	channel->attrib = g_attrib_ref(attrib);
-	channel->id = g_attrib_register(channel->attrib, GATTRIB_ALL_REQS,
-			GATTRIB_ALL_HANDLES, channel_handler, channel, NULL);
-
-	channel->cleanup_id = g_io_add_watch(io, G_IO_HUP, channel_watch_cb,
-								channel);
-
-	channel->device = btd_device_ref(device);
-
-	server->clients = g_slist_append(server->clients, channel);
-
-	return channel->id;
-}
-
-static struct gatt_channel *find_channel(guint id)
-{
-	GSList *l;
-
-	for (l = servers; l; l = g_slist_next(l)) {
-		struct gatt_server *server = l->data;
-		GSList *c;
-
-		for (c = server->clients; c; c = g_slist_next(c)) {
-			struct gatt_channel *channel = c->data;
-
-			if (channel->id == id)
-				return channel;
-		}
-	}
-
-	return NULL;
-}
-
-gboolean attrib_channel_detach(GAttrib *attrib, guint id)
-{
-	struct gatt_channel *channel;
-
-	channel = find_channel(id);
-	if (channel == NULL)
-		return FALSE;
-
-	g_attrib_unregister(channel->attrib, channel->id);
-	channel_remove(channel);
-
-	return TRUE;
-}
-
-static void connect_event(GIOChannel *io, GError *gerr, void *user_data)
-{
-	struct btd_adapter *adapter;
-	struct btd_device *device;
-	uint8_t dst_type;
-	bdaddr_t src, dst;
-
-	DBG("");
-
-	if (gerr) {
-		error("%s", gerr->message);
-		return;
-	}
-
-	bt_io_get(io, &gerr,
-			BT_IO_OPT_SOURCE_BDADDR, &src,
-			BT_IO_OPT_DEST_BDADDR, &dst,
-			BT_IO_OPT_DEST_TYPE, &dst_type,
-			BT_IO_OPT_INVALID);
-	if (gerr) {
-		error("bt_io_get: %s", gerr->message);
-		g_error_free(gerr);
-		return;
-	}
-
-	adapter = adapter_find(&src);
-	if (!adapter)
-		return;
-
-	device = btd_adapter_get_device(adapter, &dst, dst_type);
-	if (!device)
-		return;
-
-	device_attach_att(device, io);
-}
-
-static gboolean register_core_services(struct gatt_server *server)
-{
-	uint8_t atval[256];
-	bt_uuid_t uuid;
-	uint16_t appearance = 0x0000;
-
-	/* GAP service: primary service definition */
-	bt_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
-	put_le16(GENERIC_ACCESS_PROFILE_ID, &atval[0]);
-	attrib_db_add_new(server, 0x0001, &uuid, ATT_NONE, ATT_NOT_PERMITTED,
-								atval, 2);
-
-	/* GAP service: device name characteristic */
-	server->name_handle = 0x0006;
-	bt_uuid16_create(&uuid, GATT_CHARAC_UUID);
-	atval[0] = GATT_CHR_PROP_READ;
-	put_le16(server->name_handle, &atval[1]);
-	put_le16(GATT_CHARAC_DEVICE_NAME, &atval[3]);
-	attrib_db_add_new(server, 0x0004, &uuid, ATT_NONE, ATT_NOT_PERMITTED,
-								atval, 5);
-
-	/* GAP service: device name attribute */
-	bt_uuid16_create(&uuid, GATT_CHARAC_DEVICE_NAME);
-	attrib_db_add_new(server, server->name_handle, &uuid, ATT_NONE,
-						ATT_NOT_PERMITTED, NULL, 0);
-
-	/* GAP service: device appearance characteristic */
-	server->appearance_handle = 0x0008;
-	bt_uuid16_create(&uuid, GATT_CHARAC_UUID);
-	atval[0] = GATT_CHR_PROP_READ;
-	put_le16(server->appearance_handle, &atval[1]);
-	put_le16(GATT_CHARAC_APPEARANCE, &atval[3]);
-	attrib_db_add_new(server, 0x0007, &uuid, ATT_NONE, ATT_NOT_PERMITTED,
-								atval, 5);
-
-	/* GAP service: device appearance attribute */
-	bt_uuid16_create(&uuid, GATT_CHARAC_APPEARANCE);
-	put_le16(appearance, &atval[0]);
-	attrib_db_add_new(server, server->appearance_handle, &uuid, ATT_NONE,
-						ATT_NOT_PERMITTED, atval, 2);
-	server->gap_sdp_handle = attrib_create_sdp_new(server, 0x0001,
-						"Generic Access Profile");
-	if (server->gap_sdp_handle == 0) {
-		error("Failed to register GAP service record");
-		return FALSE;
-	}
-
-	/* GATT service: primary service definition */
-	bt_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
-	put_le16(GENERIC_ATTRIB_PROFILE_ID, &atval[0]);
-	attrib_db_add_new(server, 0x0010, &uuid, ATT_NONE, ATT_NOT_PERMITTED,
-								atval, 2);
-
-	server->gatt_sdp_handle = attrib_create_sdp_new(server, 0x0010,
-						"Generic Attribute Profile");
-	if (server->gatt_sdp_handle == 0) {
-		error("Failed to register GATT service record");
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-int btd_adapter_gatt_server_start(struct btd_adapter *adapter)
-{
-	struct gatt_server *server;
-	GError *gerr = NULL;
-	const bdaddr_t *addr;
-
-	DBG("Start GATT server in hci%d", btd_adapter_get_index(adapter));
-
-	server = g_new0(struct gatt_server, 1);
-	server->adapter = btd_adapter_ref(adapter);
-
-	addr = btd_adapter_get_address(server->adapter);
-
-	/* BR/EDR socket */
-	server->l2cap_io = bt_io_listen(connect_event, NULL, NULL, NULL, &gerr,
-					BT_IO_OPT_SOURCE_BDADDR, addr,
-					BT_IO_OPT_PSM, ATT_PSM,
-					BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
-					BT_IO_OPT_INVALID);
-
-	if (server->l2cap_io == NULL) {
-		error("%s", gerr->message);
-		g_error_free(gerr);
-		gatt_server_free(server);
-		return -1;
-	}
-
-	if (!register_core_services(server)) {
-		gatt_server_free(server);
-		return -1;
-	}
-
-	/* LE socket */
-	server->le_io = bt_io_listen(connect_event, NULL,
-					&server->le_io, NULL, &gerr,
-					BT_IO_OPT_SOURCE_BDADDR, addr,
-					BT_IO_OPT_SOURCE_TYPE,
-					btd_adapter_get_address_type(adapter),
-					BT_IO_OPT_CID, ATT_CID,
-					BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
-					BT_IO_OPT_INVALID);
-
-	if (server->le_io == NULL) {
-		error("%s", gerr->message);
-		g_error_free(gerr);
-		/* Doesn't have LE support, continue */
-	}
-
-	servers = g_slist_prepend(servers, server);
-	return 0;
-}
-
-void btd_adapter_gatt_server_stop(struct btd_adapter *adapter)
-{
-	struct gatt_server *server;
-	GSList *l;
-
-	l = g_slist_find_custom(servers, adapter, adapter_cmp);
-	if (l == NULL)
-		return;
-
-	DBG("Stop GATT server in hci%d", btd_adapter_get_index(adapter));
-
-	server = l->data;
-	servers = g_slist_remove(servers, server);
-	gatt_server_free(server);
-}
-
-uint32_t attrib_create_sdp(struct btd_adapter *adapter, uint16_t handle,
-							const char *name)
-{
-	GSList *l;
-
-	l = g_slist_find_custom(servers, adapter, adapter_cmp);
-	if (l == NULL)
-		return 0;
-
-	return attrib_create_sdp_new(l->data, handle, name);
-}
-
-void attrib_free_sdp(struct btd_adapter *adapter, uint32_t sdp_handle)
-{
-	adapter_service_remove(adapter, sdp_handle);
-}
-
-static uint16_t find_uuid16_avail(struct btd_adapter *adapter, uint16_t nitems)
-{
-	struct gatt_server *server;
-	uint16_t handle;
-	GSList *l;
-	GList *dl;
-
-	l = g_slist_find_custom(servers, adapter, adapter_cmp);
-	if (l == NULL)
-		return 0;
-
-	server = l->data;
-	if (server->database == NULL)
-		return 0x0001;
-
-	for (dl = server->database, handle = 0x0001; dl; dl = dl->next) {
-		struct attribute *a = dl->data;
-
-		if ((bt_uuid_cmp(&a->uuid, &prim_uuid) == 0 ||
-				bt_uuid_cmp(&a->uuid, &snd_uuid) == 0) &&
-				a->handle - handle >= nitems)
-			/* Note: the range above excludes the current handle */
-			return handle;
-
-		if (a->len == 16 && (bt_uuid_cmp(&a->uuid, &prim_uuid) == 0 ||
-				bt_uuid_cmp(&a->uuid, &snd_uuid) == 0)) {
-			/* 128 bit UUID service definition */
-			return 0;
-		}
-
-		if (a->handle == 0xffff)
-			return 0;
-
-		handle = a->handle + 1;
-	}
-
-	if (0xffff - handle + 1 >= nitems)
-		return handle;
-
-	return 0;
-}
-
-static uint16_t find_uuid128_avail(struct btd_adapter *adapter, uint16_t nitems)
-{
-	uint16_t handle = 0, end = 0xffff;
-	struct gatt_server *server;
-	GList *dl;
-	GSList *l;
-
-	l = g_slist_find_custom(servers, adapter, adapter_cmp);
-	if (l == NULL)
-		return 0;
-
-	server = l->data;
-	if (server->database == NULL)
-		return 0xffff - nitems + 1;
-
-	for (dl = g_list_last(server->database); dl; dl = dl->prev) {
-		struct attribute *a = dl->data;
-
-		if (handle == 0)
-			handle = a->handle;
-
-		if (bt_uuid_cmp(&a->uuid, &prim_uuid) != 0 &&
-				bt_uuid_cmp(&a->uuid, &snd_uuid) != 0)
-			continue;
-
-		if (end - handle >= nitems)
-			return end - nitems + 1;
-
-		if (a->len == 2) {
-			/* 16 bit UUID service definition */
-			return 0;
-		}
-
-		if (a->handle == 0x0001)
-			return 0;
-
-		end = a->handle - 1;
-		handle = 0;
-	}
-
-	if (end - 0x0001 >= nitems)
-		return end - nitems + 1;
-
-	return 0;
-}
-
-uint16_t attrib_db_find_avail(struct btd_adapter *adapter, bt_uuid_t *svc_uuid,
-								uint16_t nitems)
-{
-	btd_assert(nitems > 0);
-
-	if (svc_uuid->type == BT_UUID16)
-		return find_uuid16_avail(adapter, nitems);
-	else if (svc_uuid->type == BT_UUID128)
-		return find_uuid128_avail(adapter, nitems);
-	else {
-		char uuidstr[MAX_LEN_UUID_STR];
-
-		bt_uuid_to_string(svc_uuid, uuidstr, MAX_LEN_UUID_STR);
-		error("Service uuid: %s is neither a 16-bit nor a 128-bit uuid",
-								uuidstr);
-		return 0;
-	}
-}
-
-struct attribute *attrib_db_add(struct btd_adapter *adapter, uint16_t handle,
-					bt_uuid_t *uuid, int read_req,
-					int write_req, const uint8_t *value,
-					size_t len)
-{
-	GSList *l;
-
-	l = g_slist_find_custom(servers, adapter, adapter_cmp);
-	if (l == NULL)
-		return NULL;
-
-	return attrib_db_add_new(l->data, handle, uuid, read_req, write_req,
-								value, len);
-}
-
-int attrib_db_update(struct btd_adapter *adapter, uint16_t handle,
-					bt_uuid_t *uuid, const uint8_t *value,
-					size_t len, struct attribute **attr)
-{
-	struct gatt_server *server;
-	struct attribute *a;
-	GSList *l;
-	GList *dl;
-	guint h = handle;
-
-	l = g_slist_find_custom(servers, adapter, adapter_cmp);
-	if (l == NULL)
-		return -ENOENT;
-
-	server = l->data;
-
-	DBG("handle=0x%04x", handle);
-
-	dl = g_list_find_custom(server->database, GUINT_TO_POINTER(h),
-								handle_cmp);
-	if (dl == NULL)
-		return -ENOENT;
-
-	a = dl->data;
-
-	a->data = g_try_realloc(a->data, len);
-	if (len && a->data == NULL)
-		return -ENOMEM;
-
-	a->len = len;
-	memcpy(a->data, value, len);
-
-	if (uuid != NULL)
-		a->uuid = *uuid;
-
-	if (attr)
-		*attr = a;
-
-	return 0;
-}
-
-int attrib_db_del(struct btd_adapter *adapter, uint16_t handle)
-{
-	struct gatt_server *server;
-	struct attribute *a;
-	GSList *l;
-	GList *dl;
-	guint h = handle;
-
-	l = g_slist_find_custom(servers, adapter, adapter_cmp);
-	if (l == NULL)
-		return -ENOENT;
-
-	server = l->data;
-
-	DBG("handle=0x%04x", handle);
-
-	dl = g_list_find_custom(server->database, GUINT_TO_POINTER(h),
-								handle_cmp);
-	if (dl == NULL)
-		return -ENOENT;
-
-	a = dl->data;
-	server->database = g_list_remove(server->database, a);
-	g_free(a->data);
-	g_free(a);
-
-	return 0;
-}
-
-int attrib_gap_set(struct btd_adapter *adapter, uint16_t uuid,
-					const uint8_t *value, size_t len)
-{
-	struct gatt_server *server;
-	uint16_t handle;
-	GSList *l;
-
-	l = g_slist_find_custom(servers, adapter, adapter_cmp);
-	if (l == NULL)
-		return -ENOENT;
-
-	server = l->data;
-
-	/* FIXME: Missing Privacy and Reconnection Address */
-
-	switch (uuid) {
-	case GATT_CHARAC_DEVICE_NAME:
-		handle = server->name_handle;
-		break;
-	case GATT_CHARAC_APPEARANCE:
-		handle = server->appearance_handle;
-		break;
-	default:
-		return -ENOSYS;
-	}
-
-	return attrib_db_update(adapter, handle, NULL, value, len, NULL);
-}
diff --git a/src/attrib-server.h b/src/attrib-server.h
deleted file mode 100644
index 7cdbe3b96..000000000
--- a/src/attrib-server.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- *
- *  BlueZ - Bluetooth protocol stack for Linux
- *
- *  Copyright (C) 2010  Nokia Corporation
- *  Copyright (C) 2010  Marcel Holtmann <marcel@holtmann.org>
- *
- *
- */
-
-uint16_t attrib_db_find_avail(struct btd_adapter *adapter, bt_uuid_t *svc_uuid,
-							uint16_t nitems);
-struct attribute *attrib_db_add(struct btd_adapter *adapter, uint16_t handle,
-				bt_uuid_t *uuid, int read_req,
-				int write_req, const uint8_t *value,
-				size_t len);
-int attrib_db_update(struct btd_adapter *adapter, uint16_t handle,
-					bt_uuid_t *uuid, const uint8_t *value,
-					size_t len, struct attribute **attr);
-int attrib_db_del(struct btd_adapter *adapter, uint16_t handle);
-int attrib_gap_set(struct btd_adapter *adapter, uint16_t uuid,
-					const uint8_t *value, size_t len);
-uint32_t attrib_create_sdp(struct btd_adapter *adapter, uint16_t handle,
-							const char *name);
-void attrib_free_sdp(struct btd_adapter *adapter, uint32_t sdp_handle);
-GAttrib *attrib_from_device(struct btd_device *device);
-guint attrib_channel_attach(GAttrib *attrib);
-gboolean attrib_channel_detach(GAttrib *attrib, guint id);
diff --git a/src/device.c b/src/device.c
index 982b7979e..f2447c478 100644
--- a/src/device.c
+++ b/src/device.c
@@ -62,7 +62,6 @@
 #include "agent.h"
 #include "textfile.h"
 #include "storage.h"
-#include "attrib-server.h"
 #include "eir.h"
 
 #define DISCONNECT_TIMER	2
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH BlueZ 3/4] shared/util: Add util_memdup
  2022-01-06 21:03 [PATCH BlueZ 1/4] shared/util: Rename btd_malloc to util_malloc Luiz Augusto von Dentz
  2022-01-06 21:03 ` [PATCH BlueZ 2/4] attrib: Remove gatt-service.{c,h} and attrib-server.{c,h} Luiz Augusto von Dentz
@ 2022-01-06 21:03 ` Luiz Augusto von Dentz
  2022-01-06 21:03 ` [PATCH BlueZ 4/4] build: Replace use of g_memdup with util_memdup Luiz Augusto von Dentz
  2022-01-07  0:16 ` [BlueZ,1/4] shared/util: Rename btd_malloc to util_malloc bluez.test.bot
  3 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2022-01-06 21:03 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds util_memdup which is intended to replace g_memdup since
replacing that with g_memdup2 requires bumping the glib version.
---
 src/shared/util.c | 16 ++++++++++++++++
 src/shared/util.h |  1 +
 2 files changed, 17 insertions(+)

diff --git a/src/shared/util.c b/src/shared/util.c
index 93110047b..6e1c83057 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -41,6 +41,22 @@ void *util_malloc(size_t size)
 	return NULL;
 }
 
+void *util_memdup(const void *src, size_t size)
+{
+	void *cpy;
+
+	if (!src || !size)
+		return NULL;
+
+	cpy = util_malloc(size);
+	if (!cpy)
+		return NULL;
+
+	memcpy(cpy, src, size);
+
+	return cpy;
+}
+
 void util_debug_va(util_debug_func_t function, void *user_data,
 				const char *format, va_list va)
 {
diff --git a/src/shared/util.h b/src/shared/util.h
index 11d09979d..8ef6132c4 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -87,6 +87,7 @@ char *strdelimit(char *str, char *del, char c);
 int strsuffix(const char *str, const char *suffix);
 
 void *util_malloc(size_t size);
+void *util_memdup(const void *src, size_t size);
 
 typedef void (*util_debug_func_t)(const char *str, void *user_data);
 
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH BlueZ 4/4] build: Replace use of g_memdup with util_memdup
  2022-01-06 21:03 [PATCH BlueZ 1/4] shared/util: Rename btd_malloc to util_malloc Luiz Augusto von Dentz
  2022-01-06 21:03 ` [PATCH BlueZ 2/4] attrib: Remove gatt-service.{c,h} and attrib-server.{c,h} Luiz Augusto von Dentz
  2022-01-06 21:03 ` [PATCH BlueZ 3/4] shared/util: Add util_memdup Luiz Augusto von Dentz
@ 2022-01-06 21:03 ` Luiz Augusto von Dentz
  2022-01-07  0:16 ` [BlueZ,1/4] shared/util: Rename btd_malloc to util_malloc bluez.test.bot
  3 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2022-01-06 21:03 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This replaces the uses of g_memdup with util_memdup since the former has
been deprecated:

  warning: ‘g_memdup’ is deprecated: Use 'g_memdup2' instead
  [-Wdeprecated-declarations]

g_memdup2 requires bumping glib version which would likely have its
own problems thus why util_memdup was introduced.
---
 Makefile.am                | 10 ++---
 Makefile.obexd             |  1 +
 Makefile.tools             | 11 ++++--
 android/a2dp.c             |  9 +++--
 android/avctp.c            |  5 ++-
 android/avrcp-lib.c        |  2 +-
 android/gatt.c             |  5 ++-
 android/hidhost.c          |  3 +-
 android/tester-main.c      | 77 +++++++++++++++++++++-----------------
 attrib/gatt.c              | 12 +++---
 client/gatt.c              |  2 +-
 gobex/gobex-header.c       |  7 ++--
 gobex/gobex-packet.c       |  5 ++-
 obexd/src/obex.c           |  5 ++-
 plugins/neard.c            |  9 +++--
 plugins/policy.c           |  7 ++--
 profiles/audio/avctp.c     |  9 +++--
 profiles/audio/avrcp.c     | 10 ++---
 profiles/battery/bas.c     |  4 +-
 profiles/battery/battery.c |  4 +-
 profiles/deviceinfo/dis.c  |  4 +-
 profiles/input/hog-lib.c   | 12 +++---
 profiles/scanparam/scpp.c  |  4 +-
 src/eir.c                  |  8 ++--
 tools/gatt-service.c       | 15 ++++----
 tools/mesh-gatt/gatt.c     |  5 ++-
 unit/test-avctp.c          |  4 +-
 unit/test-avdtp.c          |  6 +--
 unit/test-avrcp.c          | 10 ++---
 unit/test-gatt.c           |  4 +-
 unit/test-hfp.c            | 11 +++---
 unit/test-hog.c            | 26 ++++++-------
 unit/test-sdp.c            | 10 +++--
 unit/test-uhid.c           |  2 +-
 34 files changed, 172 insertions(+), 146 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index a26ba9bc7..e391d7ae8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -506,23 +506,23 @@ unit_tests += unit/test-gobex-header unit/test-gobex-packet unit/test-gobex \
 
 unit_test_gobex_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
 						unit/test-gobex.c
-unit_test_gobex_LDADD = $(GLIB_LIBS)
+unit_test_gobex_LDADD = src/libshared-glib.la $(GLIB_LIBS)
 
 unit_test_gobex_packet_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
 						unit/test-gobex-packet.c
-unit_test_gobex_packet_LDADD = $(GLIB_LIBS)
+unit_test_gobex_packet_LDADD = src/libshared-glib.la $(GLIB_LIBS)
 
 unit_test_gobex_header_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
 						unit/test-gobex-header.c
-unit_test_gobex_header_LDADD = $(GLIB_LIBS)
+unit_test_gobex_header_LDADD = src/libshared-glib.la $(GLIB_LIBS)
 
 unit_test_gobex_transfer_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
 						unit/test-gobex-transfer.c
-unit_test_gobex_transfer_LDADD = $(GLIB_LIBS)
+unit_test_gobex_transfer_LDADD = src/libshared-glib.la $(GLIB_LIBS)
 
 unit_test_gobex_apparam_SOURCES = $(gobex_sources) unit/util.c unit/util.h \
 						unit/test-gobex-apparam.c
-unit_test_gobex_apparam_LDADD = $(GLIB_LIBS)
+unit_test_gobex_apparam_LDADD = src/libshared-glib.la $(GLIB_LIBS)
 endif
 
 unit_tests += unit/test-lib
diff --git a/Makefile.obexd b/Makefile.obexd
index 37a133455..5d1a4ff65 100644
--- a/Makefile.obexd
+++ b/Makefile.obexd
@@ -82,6 +82,7 @@ obexd_src_obexd_SOURCES = $(btio_sources) $(gobex_sources) \
 			obexd/src/map_ap.h
 obexd_src_obexd_LDADD = lib/libbluetooth-internal.la \
 			gdbus/libgdbus-internal.la \
+			src/libshared-glib.la \
 			$(ICAL_LIBS) $(DBUS_LIBS) $(LIBEBOOK_LIBS) \
 			$(LIBEDATASERVER_LIBS) $(GLIB_LIBS) -ldl
 
diff --git a/Makefile.tools b/Makefile.tools
index 0f0331b64..51199b20a 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -302,7 +302,8 @@ tools_mpris_proxy_SOURCES = tools/mpris-proxy.c
 tools_mpris_proxy_LDADD = gdbus/libgdbus-internal.la $(GLIB_LIBS) $(DBUS_LIBS)
 
 tools_gatt_service_SOURCES = tools/gatt-service.c
-tools_gatt_service_LDADD = $(GLIB_LIBS) $(DBUS_LIBS) gdbus/libgdbus-internal.la
+tools_gatt_service_LDADD = gdbus/libgdbus-internal.la \
+			   src/libshared-mainloop.la $(GLIB_LIBS) $(DBUS_LIBS)
 
 profiles_iap_iapd_SOURCES = profiles/iap/main.c
 profiles_iap_iapd_LDADD = gdbus/libgdbus-internal.la $(GLIB_LIBS) $(DBUS_LIBS)
@@ -448,11 +449,12 @@ noinst_PROGRAMS += tools/btmgmt tools/obex-client-tool tools/obex-server-tool \
 tools_obex_client_tool_SOURCES = $(gobex_sources) $(btio_sources) \
 						tools/obex-client-tool.c
 tools_obex_client_tool_LDADD = lib/libbluetooth-internal.la \
-						$(GLIB_LIBS) -lreadline
+			       src/libshared-glib.la $(GLIB_LIBS) -lreadline
 
 tools_obex_server_tool_SOURCES = $(gobex_sources) $(btio_sources) \
 						tools/obex-server-tool.c
-tools_obex_server_tool_LDADD = lib/libbluetooth-internal.la $(GLIB_LIBS)
+tools_obex_server_tool_LDADD = lib/libbluetooth-internal.la \
+			       src/libshared-glib.la $(GLIB_LIBS)
 
 tools_bluetooth_player_SOURCES = tools/bluetooth-player.c
 tools_bluetooth_player_LDADD = gdbus/libgdbus-internal.la \
@@ -461,7 +463,8 @@ tools_bluetooth_player_LDADD = gdbus/libgdbus-internal.la \
 
 tools_obexctl_SOURCES = tools/obexctl.c
 tools_obexctl_LDADD = gdbus/libgdbus-internal.la src/libshared-glib.la \
-				$(GLIB_LIBS) $(DBUS_LIBS) -lreadline
+			src/libshared-glib.la $(GLIB_LIBS) $(DBUS_LIBS) \
+			-lreadline
 
 tools_btmgmt_SOURCES = tools/btmgmt.c src/uuid-helper.c client/display.c
 tools_btmgmt_LDADD = lib/libbluetooth-internal.la src/libshared-mainloop.la \
diff --git a/android/a2dp.c b/android/a2dp.c
index 029107cf5..ee607a32d 100644
--- a/android/a2dp.c
+++ b/android/a2dp.c
@@ -26,6 +26,7 @@
 #include "lib/sdp_lib.h"
 #include "profiles/audio/a2dp-codecs.h"
 #include "src/shared/queue.h"
+#include "src/shared/util.h"
 #include "src/log.h"
 #include "hal-msg.h"
 #include "ipc-common.h"
@@ -428,7 +429,7 @@ static struct a2dp_preset *sbc_select_range(void *caps, uint8_t caps_len,
 
 	p = g_new0(struct a2dp_preset, 1);
 	p->len = conf_len;
-	p->data = g_memdup(conf, p->len);
+	p->data = util_memdup(conf, p->len);
 
 	return p;
 }
@@ -448,7 +449,7 @@ static struct a2dp_preset *aac_select_range(void *caps, uint8_t caps_len,
 
 	p = g_new0(struct a2dp_preset, 1);
 	p->len = conf_len;
-	p->data = g_memdup(conf, p->len);
+	p->data = util_memdup(conf, p->len);
 
 	return p;
 }
@@ -1036,7 +1037,7 @@ static gboolean sep_setconf_ind(struct avdtp *session,
 
 		preset = g_new0(struct a2dp_preset, 1);
 		preset->len = cap->length - sizeof(*codec);
-		preset->data = g_memdup(codec->data, preset->len);
+		preset->data = util_memdup(codec->data, preset->len);
 
 		if (check_config(endpoint, preset) < 0) {
 			preset_free(preset);
@@ -1365,7 +1366,7 @@ static GSList *parse_presets(const struct audio_preset *p, uint8_t count,
 
 		preset = g_new0(struct a2dp_preset, 1);
 		preset->len = p->len;
-		preset->data = g_memdup(p->data, preset->len);
+		preset->data = util_memdup(p->data, preset->len);
 		l = g_slist_append(l, preset);
 
 		len -= preset->len;
diff --git a/android/avctp.c b/android/avctp.c
index 14ebbc391..37b4cec4f 100644
--- a/android/avctp.c
+++ b/android/avctp.c
@@ -31,6 +31,7 @@
 #include <glib.h>
 
 #include "lib/sdp.h"
+#include "src/shared/util.h"
 #include "src/log.h"
 #include "avctp.h"
 
@@ -1177,7 +1178,7 @@ static int avctp_send_req(struct avctp *session, uint8_t code, uint8_t subunit,
 
 	for (i = 0; i < iov_cnt; i++) {
 		pdu[i].iov_len = iov[i].iov_len;
-		pdu[i].iov_base = g_memdup(iov[i].iov_base, iov[i].iov_len);
+		pdu[i].iov_base = util_memdup(iov[i].iov_base, iov[i].iov_len);
 	}
 
 	req = g_new0(struct avctp_control_req, 1);
@@ -1218,7 +1219,7 @@ int avctp_send_browsing_req(struct avctp *session,
 
 	for (i = 0; i < iov_cnt; i++) {
 		pdu[i].iov_len = iov[i].iov_len;
-		pdu[i].iov_base = g_memdup(iov[i].iov_base, iov[i].iov_len);
+		pdu[i].iov_base = util_memdup(iov[i].iov_base, iov[i].iov_len);
 	}
 
 	req = g_new0(struct avctp_browsing_req, 1);
diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c
index 2007d09d2..b342692cb 100644
--- a/android/avrcp-lib.c
+++ b/android/avrcp-lib.c
@@ -2620,7 +2620,7 @@ static char *parse_folder_list(uint8_t *params, uint16_t params_len,
 			return NULL;
 		}
 
-		folders[count] = g_memdup(&params[i], len);
+		folders[count] = util_memdup(&params[i], len);
 		i += len;
 	}
 
diff --git a/android/gatt.c b/android/gatt.c
index a8a0c488b..e8ba5aabb 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -1338,7 +1338,8 @@ static void discover_primary_cb(uint8_t status, GSList *services,
 		}
 
 		bt_uuid_to_uuid128(&uuid, &u128);
-		new_uuid = g_memdup(&u128.value.u128, sizeof(u128.value.u128));
+		new_uuid = util_memdup(&u128.value.u128,
+					sizeof(u128.value.u128));
 
 		uuids = g_slist_prepend(uuids, new_uuid);
 	}
@@ -6633,7 +6634,7 @@ static uint8_t write_prep_request(const uint8_t *cmd, uint16_t cmd_len,
 
 	queue_push_tail(dev->pending_requests, data);
 
-	data->value = g_memdup(value, vlen);
+	data->value = util_memdup(value, vlen);
 	data->length = vlen;
 
 	if (!gatt_db_attribute_write(attrib, offset, value, vlen, cmd[0],
diff --git a/android/hidhost.c b/android/hidhost.c
index 016382e17..b4e5c527f 100644
--- a/android/hidhost.c
+++ b/android/hidhost.c
@@ -689,7 +689,8 @@ static void hid_sdp_search_cb(sdp_list_t *recs, int err, gpointer data)
 				goto fail;
 
 			dev->rd_size = data->unitSize;
-			dev->rd_data = g_memdup(data->val.str, data->unitSize);
+			dev->rd_data = util_memdup(data->val.str,
+							data->unitSize);
 		}
 	}
 
diff --git a/android/tester-main.c b/android/tester-main.c
index ff5ecdf83..317c1de06 100644
--- a/android/tester-main.c
+++ b/android/tester-main.c
@@ -1253,7 +1253,8 @@ static bt_property_t *copy_properties(int num_properties,
 	for (i = 0; i < num_properties; i++) {
 		props[i].type = properties[i].type;
 		props[i].len = properties[i].len;
-		props[i].val = g_memdup(properties[i].val, properties[i].len);
+		props[i].val = util_memdup(properties[i].val,
+						properties[i].len);
 	}
 
 	return props;
@@ -1268,7 +1269,8 @@ static bt_property_t *repack_properties(int num_properties,
 	for (i = 0; i < num_properties; i++) {
 		props[i].type = properties[i]->type;
 		props[i].len = properties[i]->len;
-		props[i].val = g_memdup(properties[i]->val, properties[i]->len);
+		props[i].val = util_memdup(properties[i]->val,
+						properties[i]->len);
 	}
 
 	return props;
@@ -1281,7 +1283,7 @@ static bt_property_t *create_property(bt_property_type_t type, void *val,
 
 	prop->type = type;
 	prop->len = len;
-	prop->val = g_memdup(val, len);
+	prop->val = util_memdup(val, len);
 
 	return prop;
 }
@@ -1615,7 +1617,7 @@ static void gattc_search_result_cb(int conn_id, btgatt_srvc_id_t *srvc_id)
 
 	step->callback = CB_GATTC_SEARCH_RESULT;
 	step->callback_result.conn_id = conn_id;
-	step->callback_result.service = g_memdup(srvc_id, sizeof(*srvc_id));
+	step->callback_result.service = util_memdup(srvc_id, sizeof(*srvc_id));
 
 	schedule_callback_verification(step);
 }
@@ -1639,8 +1641,8 @@ static void gattc_get_characteristic_cb(int conn_id, int status,
 	step->callback = CB_GATTC_GET_CHARACTERISTIC;
 	step->callback_result.status = status;
 	step->callback_result.conn_id = conn_id;
-	step->callback_result.service = g_memdup(srvc_id, sizeof(*srvc_id));
-	step->callback_result.characteristic = g_memdup(char_id,
+	step->callback_result.service = util_memdup(srvc_id, sizeof(*srvc_id));
+	step->callback_result.characteristic = util_memdup(char_id,
 							sizeof(*char_id));
 	step->callback_result.char_prop = char_prop;
 
@@ -1656,10 +1658,10 @@ static void gattc_get_descriptor_cb(int conn_id, int status,
 	step->callback = CB_GATTC_GET_DESCRIPTOR;
 	step->callback_result.status = status;
 	step->callback_result.conn_id = conn_id;
-	step->callback_result.service = g_memdup(srvc_id, sizeof(*srvc_id));
-	step->callback_result.characteristic = g_memdup(char_id,
+	step->callback_result.service = util_memdup(srvc_id, sizeof(*srvc_id));
+	step->callback_result.characteristic = util_memdup(char_id,
 							sizeof(*char_id));
-	step->callback_result.descriptor = g_memdup(descr_id,
+	step->callback_result.descriptor = util_memdup(descr_id,
 							sizeof(*descr_id));
 
 	schedule_callback_verification(step);
@@ -1673,8 +1675,8 @@ static void gattc_get_included_service_cb(int conn_id, int status,
 	step->callback = CB_GATTC_GET_INCLUDED_SERVICE;
 	step->callback_result.status = status;
 	step->callback_result.conn_id = conn_id;
-	step->callback_result.service = g_memdup(srvc_id, sizeof(*srvc_id));
-	step->callback_result.included = g_memdup(incl_srvc_id,
+	step->callback_result.service = util_memdup(srvc_id, sizeof(*srvc_id));
+	step->callback_result.included = util_memdup(incl_srvc_id,
 							sizeof(*srvc_id));
 
 	schedule_callback_verification(step);
@@ -1688,7 +1690,8 @@ static void gattc_read_characteristic_cb(int conn_id, int status,
 	step->callback = CB_GATTC_READ_CHARACTERISTIC;
 	step->callback_result.status = status;
 	step->callback_result.conn_id = conn_id;
-	step->callback_result.read_params = g_memdup(p_data, sizeof(*p_data));
+	step->callback_result.read_params = util_memdup(p_data,
+							sizeof(*p_data));
 
 	schedule_callback_verification(step);
 }
@@ -1701,7 +1704,8 @@ static void gattc_read_descriptor_cb(int conn_id, int status,
 	step->callback = CB_GATTC_READ_DESCRIPTOR;
 	step->callback_result.status = status;
 	step->callback_result.conn_id = conn_id;
-	step->callback_result.read_params = g_memdup(p_data, sizeof(*p_data));
+	step->callback_result.read_params = util_memdup(p_data,
+							sizeof(*p_data));
 
 	schedule_callback_verification(step);
 }
@@ -1714,7 +1718,8 @@ static void gattc_write_characteristic_cb(int conn_id, int status,
 	step->callback = CB_GATTC_WRITE_CHARACTERISTIC;
 	step->callback_result.status = status;
 	step->callback_result.conn_id = conn_id;
-	step->callback_result.write_params = g_memdup(p_data, sizeof(*p_data));
+	step->callback_result.write_params = util_memdup(p_data,
+							sizeof(*p_data));
 
 	schedule_callback_verification(step);
 }
@@ -1727,7 +1732,8 @@ static void gattc_write_descriptor_cb(int conn_id, int status,
 	step->callback = CB_GATTC_WRITE_DESCRIPTOR;
 	step->callback_result.status = status;
 	step->callback_result.conn_id = conn_id;
-	step->callback_result.write_params = g_memdup(p_data, sizeof(*p_data));
+	step->callback_result.write_params = util_memdup(p_data,
+							sizeof(*p_data));
 
 	schedule_callback_verification(step);
 }
@@ -1742,8 +1748,8 @@ static void gattc_register_for_notification_cb(int conn_id, int registered,
 	step->callback = CB_GATTC_REGISTER_FOR_NOTIFICATION;
 	step->callback_result.status = status;
 	step->callback_result.conn_id = conn_id;
-	step->callback_result.service = g_memdup(srvc_id, sizeof(*srvc_id));
-	step->callback_result.characteristic = g_memdup(char_id,
+	step->callback_result.service = util_memdup(srvc_id, sizeof(*srvc_id));
+	step->callback_result.characteristic = util_memdup(char_id,
 							sizeof(*char_id));
 	step->callback_result.notification_registered = registered;
 
@@ -1756,7 +1762,8 @@ static void gattc_notif_cb(int conn_id, btgatt_notify_params_t *p_data)
 
 	step->callback = CB_GATTC_NOTIFY;
 	step->callback_result.conn_id = conn_id;
-	step->callback_result.notify_params = g_memdup(p_data, sizeof(*p_data));
+	step->callback_result.notify_params = util_memdup(p_data,
+							sizeof(*p_data));
 
 	schedule_callback_verification(step);
 }
@@ -1827,8 +1834,8 @@ static void gatts_service_added_cb(int status, int server_if,
 
 	step->callback_result.status = status;
 	step->callback_result.gatt_app_id = server_if;
-	step->callback_result.service = g_memdup(srvc_id, sizeof(*srvc_id));
-	step->callback_result.srvc_handle = g_memdup(&srvc_handle,
+	step->callback_result.service = util_memdup(srvc_id, sizeof(*srvc_id));
+	step->callback_result.srvc_handle = util_memdup(&srvc_handle,
 							sizeof(srvc_handle));
 
 	schedule_callback_verification(step);
@@ -1844,9 +1851,9 @@ static void gatts_included_service_added_cb(int status, int server_if,
 
 	step->callback_result.status = status;
 	step->callback_result.gatt_app_id = server_if;
-	step->callback_result.srvc_handle = g_memdup(&srvc_handle,
+	step->callback_result.srvc_handle = util_memdup(&srvc_handle,
 							sizeof(srvc_handle));
-	step->callback_result.inc_srvc_handle = g_memdup(&inc_srvc_handle,
+	step->callback_result.inc_srvc_handle = util_memdup(&inc_srvc_handle,
 						sizeof(inc_srvc_handle));
 
 	schedule_callback_verification(step);
@@ -1863,10 +1870,10 @@ static void gatts_characteristic_added_cb(int status, int server_if,
 
 	step->callback_result.status = status;
 	step->callback_result.gatt_app_id = server_if;
-	step->callback_result.srvc_handle = g_memdup(&srvc_handle,
+	step->callback_result.srvc_handle = util_memdup(&srvc_handle,
 							sizeof(srvc_handle));
-	step->callback_result.uuid = g_memdup(uuid, sizeof(*uuid));
-	step->callback_result.char_handle = g_memdup(&char_handle,
+	step->callback_result.uuid = util_memdup(uuid, sizeof(*uuid));
+	step->callback_result.char_handle = util_memdup(&char_handle,
 							sizeof(char_handle));
 
 	schedule_callback_verification(step);
@@ -1883,10 +1890,10 @@ static void gatts_descriptor_added_cb(int status, int server_if,
 
 	step->callback_result.status = status;
 	step->callback_result.gatt_app_id = server_if;
-	step->callback_result.srvc_handle = g_memdup(&srvc_handle,
+	step->callback_result.srvc_handle = util_memdup(&srvc_handle,
 							sizeof(srvc_handle));
-	step->callback_result.uuid = g_memdup(uuid, sizeof(*uuid));
-	step->callback_result.desc_handle = g_memdup(&desc_handle,
+	step->callback_result.uuid = util_memdup(uuid, sizeof(*uuid));
+	step->callback_result.desc_handle = util_memdup(&desc_handle,
 							sizeof(desc_handle));
 
 	schedule_callback_verification(step);
@@ -1900,7 +1907,7 @@ static void gatts_service_started_cb(int status, int server_if, int srvc_handle)
 
 	step->callback_result.status = status;
 	step->callback_result.gatt_app_id = server_if;
-	step->callback_result.srvc_handle = g_memdup(&srvc_handle,
+	step->callback_result.srvc_handle = util_memdup(&srvc_handle,
 							sizeof(srvc_handle));
 
 	schedule_callback_verification(step);
@@ -1914,7 +1921,7 @@ static void gatts_service_stopped_cb(int status, int server_if, int srvc_handle)
 
 	step->callback_result.status = status;
 	step->callback_result.gatt_app_id = server_if;
-	step->callback_result.srvc_handle = g_memdup(&srvc_handle,
+	step->callback_result.srvc_handle = util_memdup(&srvc_handle,
 							sizeof(srvc_handle));
 
 	schedule_callback_verification(step);
@@ -1928,7 +1935,7 @@ static void gatts_service_deleted_cb(int status, int server_if, int srvc_handle)
 
 	step->callback_result.status = status;
 	step->callback_result.gatt_app_id = server_if;
-	step->callback_result.srvc_handle = g_memdup(&srvc_handle,
+	step->callback_result.srvc_handle = util_memdup(&srvc_handle,
 							sizeof(srvc_handle));
 
 	schedule_callback_verification(step);
@@ -1945,7 +1952,7 @@ static void gatts_request_read_cb(int conn_id, int trans_id, bt_bdaddr_t *bda,
 
 	step->callback_result.conn_id = conn_id;
 	step->callback_result.trans_id = trans_id;
-	step->callback_result.attr_handle = g_memdup(&attr_handle,
+	step->callback_result.attr_handle = util_memdup(&attr_handle,
 							sizeof(attr_handle));
 	step->callback_result.offset = offset;
 	step->callback_result.is_long = is_long;
@@ -1974,13 +1981,13 @@ static void gatts_request_write_cb(int conn_id, int trans_id, bt_bdaddr_t *bda,
 
 	step->callback_result.conn_id = conn_id;
 	step->callback_result.trans_id = trans_id;
-	step->callback_result.attr_handle = g_memdup(&attr_handle,
+	step->callback_result.attr_handle = util_memdup(&attr_handle,
 							sizeof(attr_handle));
 	step->callback_result.offset = offset;
 	step->callback_result.length = length;
 	step->callback_result.need_rsp = need_rsp;
 	step->callback_result.is_prep = is_prep;
-	step->callback_result.value = g_memdup(&value, length);
+	step->callback_result.value = util_memdup(&value, length);
 
 	/* Utilize property verification mechanism for bdaddr */
 	props[0] = create_property(BT_PROPERTY_BDADDR, bda, sizeof(*bda));
@@ -2169,7 +2176,7 @@ static btmce_mas_instance_t *copy_mas_instances(int num_instances,
 		inst[i].id = instances[i].id;
 		inst[i].scn = instances[i].scn;
 		inst[i].msg_types = instances[i].msg_types;
-		inst[i].p_name = g_memdup(instances[i].p_name,
+		inst[i].p_name = util_memdup(instances[i].p_name,
 						strlen(instances[i].p_name));
 	}
 
diff --git a/attrib/gatt.c b/attrib/gatt.c
index 46b2ca381..b496dd1eb 100644
--- a/attrib/gatt.c
+++ b/attrib/gatt.c
@@ -135,7 +135,7 @@ static void discover_char_unref(void *data)
 
 	g_slist_free_full(dc->characteristics, g_free);
 	g_attrib_unref(dc->attrib);
-	g_free(dc->uuid);
+	free(dc->uuid);
 	g_free(dc);
 }
 
@@ -157,7 +157,7 @@ static void discover_desc_unref(void *data)
 
 	g_slist_free_full(dd->descriptors, g_free);
 	g_attrib_unref(dd->attrib);
-	g_free(dd->uuid);
+	free(dd->uuid);
 	g_free(dd);
 }
 
@@ -696,7 +696,7 @@ guint gatt_discover_char(GAttrib *attrib, uint16_t start, uint16_t end,
 	dc->user_data = user_data;
 	dc->end = end;
 	dc->start = start;
-	dc->uuid = g_memdup(uuid, sizeof(bt_uuid_t));
+	dc->uuid = util_memdup(uuid, sizeof(bt_uuid_t));
 
 	dc->id = g_attrib_send(attrib, 0, buf, plen, char_discovered_cb,
 				discover_char_ref(dc), discover_char_unref);
@@ -905,7 +905,7 @@ static void prepare_write_cb(guint8 status, const guint8 *rpdu, guint16 rlen,
 	if (long_write->offset == long_write->vlen) {
 		execute_write(long_write->attrib, ATT_WRITE_ALL_PREP_WRITES,
 				long_write->func, long_write->user_data);
-		g_free(long_write->value);
+		free(long_write->value);
 		g_free(long_write);
 
 		return;
@@ -964,7 +964,7 @@ guint gatt_write_char(GAttrib *attrib, uint16_t handle, const uint8_t *value,
 	long_write->func = func;
 	long_write->user_data = user_data;
 	long_write->handle = handle;
-	long_write->value = g_memdup(value, vlen);
+	long_write->value = util_memdup(value, vlen);
 	long_write->vlen = vlen;
 
 	return prepare_write(long_write);
@@ -1130,7 +1130,7 @@ guint gatt_discover_desc(GAttrib *attrib, uint16_t start, uint16_t end,
 	dd->user_data = user_data;
 	dd->start = start;
 	dd->end = end;
-	dd->uuid = g_memdup(uuid, sizeof(bt_uuid_t));
+	dd->uuid = util_memdup(uuid, sizeof(bt_uuid_t));
 
 	dd->id = g_attrib_send(attrib, 0, buf, plen, desc_discovered_cb,
 				discover_desc_ref(dd), discover_desc_unref);
diff --git a/client/gatt.c b/client/gatt.c
index 11f70dc4f..13872c794 100644
--- a/client/gatt.c
+++ b/client/gatt.c
@@ -811,7 +811,7 @@ static uint8_t *str2bytearray(char *arg, size_t *val_len)
 
 	*val_len = i;
 
-	return g_memdup(value, i);
+	return util_memdup(value, i);
 }
 
 void gatt_write_attribute(GDBusProxy *proxy, int argc, char *argv[])
diff --git a/gobex/gobex-header.c b/gobex/gobex-header.c
index 011d33d1a..002ba8861 100644
--- a/gobex/gobex-header.c
+++ b/gobex/gobex-header.c
@@ -15,6 +15,7 @@
 
 #include "gobex-header.h"
 #include "gobex-debug.h"
+#include "src/shared/util.h"
 
 /* Header types */
 #define G_OBEX_HDR_ENC_UNICODE	(0 << 6)
@@ -222,7 +223,7 @@ GObexHeader *g_obex_header_decode(const void *data, gsize len,
 
 		switch (data_policy) {
 		case G_OBEX_DATA_COPY:
-			header->v.data = g_memdup(ptr, header->vlen);
+			header->v.data = util_memdup(ptr, header->vlen);
 			break;
 		case G_OBEX_DATA_REF:
 			header->extdata = TRUE;
@@ -282,7 +283,7 @@ void g_obex_header_free(GObexHeader *header)
 		break;
 	case G_OBEX_HDR_ENC_BYTES:
 		if (!header->extdata)
-			g_free(header->v.data);
+			free(header->v.data);
 		break;
 	case G_OBEX_HDR_ENC_UINT8:
 	case G_OBEX_HDR_ENC_UINT32:
@@ -410,7 +411,7 @@ GObexHeader *g_obex_header_new_bytes(guint8 id, const void *data, gsize len)
 	header->id = id;
 	header->vlen = len;
 	header->hlen = len + 3;
-	header->v.data = g_memdup(data, len);
+	header->v.data = util_memdup(data, len);
 
 	return header;
 }
diff --git a/gobex/gobex-packet.c b/gobex/gobex-packet.c
index 11937a5a5..8ae78b0f6 100644
--- a/gobex/gobex-packet.c
+++ b/gobex/gobex-packet.c
@@ -17,6 +17,7 @@
 #include "gobex-defs.h"
 #include "gobex-packet.h"
 #include "gobex-debug.h"
+#include "src/shared/util.h"
 
 #define FINAL_BIT 0x80
 
@@ -201,7 +202,7 @@ gboolean g_obex_packet_set_data(GObexPacket *pkt, const void *data, gsize len,
 
 	switch (data_policy) {
 	case G_OBEX_DATA_COPY:
-		pkt->data.buf = g_memdup(data, len);
+		pkt->data.buf = util_memdup(data, len);
 		break;
 	case G_OBEX_DATA_REF:
 		pkt->data.buf_ref = data;
@@ -259,7 +260,7 @@ void g_obex_packet_free(GObexPacket *pkt)
 	switch (pkt->data_policy) {
 	case G_OBEX_DATA_INHERIT:
 	case G_OBEX_DATA_COPY:
-		g_free(pkt->data.buf);
+		free(pkt->data.buf);
 		break;
 	case G_OBEX_DATA_REF:
 		break;
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index 9f992ec18..3a68fd66c 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
@@ -40,6 +40,7 @@
 #include "mimetype.h"
 #include "service.h"
 #include "transport.h"
+#include "src/shared/util.h"
 
 typedef struct {
 	uint8_t  version;
@@ -145,7 +146,7 @@ static void os_reset_session(struct obex_session *os)
 		os->path = NULL;
 	}
 	if (os->apparam) {
-		g_free(os->apparam);
+		free(os->apparam);
 		os->apparam = NULL;
 		os->apparam_len = 0;
 	}
@@ -594,7 +595,7 @@ static void parse_apparam(struct obex_session *os, GObexPacket *req)
 	if (!g_obex_header_get_bytes(hdr, &apparam, &len))
 		return;
 
-	os->apparam = g_memdup(apparam, len);
+	os->apparam = util_memdup(apparam, len);
 	os->apparam_len = len;
 	DBG("APPARAM");
 }
diff --git a/plugins/neard.c b/plugins/neard.c
index e07b51106..a75527148 100644
--- a/plugins/neard.c
+++ b/plugins/neard.c
@@ -30,6 +30,7 @@
 #include "src/eir.h"
 #include "src/agent.h"
 #include "src/btd.h"
+#include "src/shared/util.h"
 
 #define NEARD_NAME "org.neard"
 #define NEARD_PATH "/"
@@ -71,7 +72,7 @@ static void free_oob_params(struct oob_params *params)
 	g_free(params->name);
 	g_free(params->hash);
 	g_free(params->randomizer);
-	g_free(params->pin);
+	free(params->pin);
 }
 
 static DBusMessage *error_reply(DBusMessage *msg, int error)
@@ -407,10 +408,10 @@ static int process_nokia_long (void *data, size_t size, uint8_t marker,
 		remote->name = g_strndup((char *)n->name, n->name_len);
 
 	if (marker == 0x01) {
-		remote->pin = g_memdup(n->authentication, 4);
+		remote->pin = util_memdup(n->authentication, 4);
 		remote->pin_len = 4;
 	} else if (marker == 0x02) {
-		remote->pin = g_memdup(n->authentication, 16);
+		remote->pin = util_memdup(n->authentication, 16);
 		remote->pin_len = 16;
 	}
 
@@ -439,7 +440,7 @@ static int process_nokia_short (void *data, size_t size,
 	if (n->name_len > 0)
 		remote->name = g_strndup((char *)n->name, n->name_len);
 
-	remote->pin = g_memdup(n->authentication, 4);
+	remote->pin = util_memdup(n->authentication, 4);
 	remote->pin_len = 4;
 
 	return 0;
diff --git a/plugins/policy.c b/plugins/policy.c
index 051db82e1..48f5db7d3 100644
--- a/plugins/policy.c
+++ b/plugins/policy.c
@@ -32,6 +32,7 @@
 #include "src/profile.h"
 #include "src/btd.h"
 #include "src/shared/timeout.h"
+#include "src/shared/util.h"
 
 #define CONTROL_CONNECT_TIMEOUT 2
 #define SOURCE_RETRY_TIMEOUT 2
@@ -855,7 +856,7 @@ static int policy_init(void)
 		reconnect_attempts = default_attempts;
 		reconnect_intervals_len = sizeof(default_intervals) /
 						sizeof(*reconnect_intervals);
-		reconnect_intervals = g_memdup(default_intervals,
+		reconnect_intervals = util_memdup(default_intervals,
 						sizeof(default_intervals));
 		goto done;
 	}
@@ -886,7 +887,7 @@ static int policy_init(void)
 		g_clear_error(&gerr);
 		reconnect_intervals_len = sizeof(default_intervals) /
 						sizeof(*reconnect_intervals);
-		reconnect_intervals = g_memdup(default_intervals,
+		reconnect_intervals = util_memdup(default_intervals,
 						sizeof(default_intervals));
 	}
 
@@ -919,7 +920,7 @@ static void policy_exit(void)
 	if (reconnect_uuids)
 		g_strfreev(reconnect_uuids);
 
-	g_free(reconnect_intervals);
+	free(reconnect_intervals);
 
 	g_slist_free_full(reconnects, reconnect_destroy);
 
diff --git a/profiles/audio/avctp.c b/profiles/audio/avctp.c
index 64d1a8504..6f64f162b 100644
--- a/profiles/audio/avctp.c
+++ b/profiles/audio/avctp.c
@@ -40,6 +40,7 @@
 #include "src/log.h"
 #include "src/error.h"
 #include "src/shared/timeout.h"
+#include "src/shared/util.h"
 
 #include "avctp.h"
 #include "avrcp.h"
@@ -760,7 +761,7 @@ static void control_req_destroy(void *data)
 						NULL, 0, req->user_data);
 
 done:
-	g_free(req->operands);
+	free(req->operands);
 	g_free(req);
 }
 
@@ -776,7 +777,7 @@ static void browsing_req_destroy(void *data)
 	req->func(session, NULL, 0, req->user_data);
 
 done:
-	g_free(req->operands);
+	free(req->operands);
 	g_free(req);
 }
 
@@ -1727,7 +1728,7 @@ static int avctp_send_req(struct avctp *session, uint8_t code,
 	req->subunit = subunit;
 	req->op = opcode;
 	req->func = func;
-	req->operands = g_memdup(operands, operand_count);
+	req->operands = util_memdup(operands, operand_count);
 	req->operand_count = operand_count;
 	req->user_data = user_data;
 
@@ -1765,7 +1766,7 @@ int avctp_send_browsing_req(struct avctp *session,
 
 	req = g_new0(struct avctp_browsing_req, 1);
 	req->func = func;
-	req->operands = g_memdup(operands, operand_count);
+	req->operands = util_memdup(operands, operand_count);
 	req->operand_count = operand_count;
 	req->user_data = user_data;
 
diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index 7c280203c..d4e19ffc0 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -1298,7 +1298,7 @@ static uint8_t avrcp_handle_get_current_player_value(struct avrcp *session,
 	 * Save a copy of requested settings because we can override them
 	 * while responding
 	 */
-	settings = g_memdup(&pdu->params[1], pdu->params[0]);
+	settings = util_memdup(&pdu->params[1], pdu->params[0]);
 	len = 0;
 
 	/*
@@ -1323,7 +1323,7 @@ static uint8_t avrcp_handle_get_current_player_value(struct avrcp *session,
 		pdu->params[++len] = val;
 	}
 
-	g_free(settings);
+	free(settings);
 
 	if (len) {
 		pdu->params[0] = len / 2;
@@ -2801,7 +2801,7 @@ static gboolean avrcp_set_browsed_player_rsp(struct avctp *conn,
 			break;
 		}
 
-		folders[count] = g_memdup(&pdu->params[i], len);
+		folders[count] = util_memdup(&pdu->params[i], len);
 		i += len;
 	}
 
@@ -2888,7 +2888,7 @@ static void avrcp_player_parse_features(struct avrcp_player *player,
 {
 	struct media_player *mp = player->user_data;
 
-	player->features = g_memdup(features, 16);
+	player->features = util_memdup(features, 16);
 
 	if (features[7] & 0x08) {
 		media_player_set_browsable(mp, true);
@@ -3622,7 +3622,7 @@ static void player_destroy(gpointer data)
 	g_slist_free(player->sessions);
 	g_free(player->path);
 	g_free(player->change_path);
-	g_free(player->features);
+	free(player->features);
 	g_free(player);
 }
 
diff --git a/profiles/battery/bas.c b/profiles/battery/bas.c
index 3c6173b61..16ff22e19 100644
--- a/profiles/battery/bas.c
+++ b/profiles/battery/bas.c
@@ -62,7 +62,7 @@ static void bas_free(struct bt_bas *bas)
 {
 	bt_bas_detach(bas);
 
-	g_free(bas->primary);
+	free(bas->primary);
 	queue_destroy(bas->gatt_op, (void *) destroy_gatt_req);
 	free(bas);
 }
@@ -75,7 +75,7 @@ struct bt_bas *bt_bas_new(void *primary)
 	bas->gatt_op = queue_new();
 
 	if (primary)
-		bas->primary = g_memdup(primary, sizeof(*bas->primary));
+		bas->primary = util_memdup(primary, sizeof(*bas->primary));
 
 	return bt_bas_ref(bas);
 }
diff --git a/profiles/battery/battery.c b/profiles/battery/battery.c
index 176d127f6..02d024d92 100644
--- a/profiles/battery/battery.c
+++ b/profiles/battery/battery.c
@@ -66,7 +66,7 @@ static void batt_free(struct batt *batt)
 	gatt_db_unref(batt->db);
 	bt_gatt_client_unref(batt->client);
 	btd_device_unref(batt->device);
-	g_free (batt->initial_value);
+	free(batt->initial_value);
 	if (batt->battery)
 		btd_battery_unregister(batt->battery);
 	g_free(batt);
@@ -159,7 +159,7 @@ static void read_initial_battery_level_cb(bool success,
 	if (!length)
 		return;
 
-	batt->initial_value = g_memdup(value, length);
+	batt->initial_value = util_memdup(value, length);
 
 	/* request notify */
 	batt->batt_level_cb_id =
diff --git a/profiles/deviceinfo/dis.c b/profiles/deviceinfo/dis.c
index 87fa63306..f660179ed 100644
--- a/profiles/deviceinfo/dis.c
+++ b/profiles/deviceinfo/dis.c
@@ -72,7 +72,7 @@ static void dis_free(struct bt_dis *dis)
 {
 	bt_dis_detach(dis);
 
-	g_free(dis->primary);
+	free(dis->primary);
 	queue_destroy(dis->gatt_op, (void *) destroy_gatt_req);
 	g_free(dis);
 }
@@ -143,7 +143,7 @@ struct bt_dis *bt_dis_new_primary(void *primary)
 	dis->gatt_op = queue_new();
 
 	if (primary)
-		dis->primary = g_memdup(primary, sizeof(*dis->primary));
+		dis->primary = util_memdup(primary, sizeof(*dis->primary));
 
 	return bt_dis_ref(dis);
 }
diff --git a/profiles/input/hog-lib.c b/profiles/input/hog-lib.c
index 3bbe42370..d37caa1f1 100644
--- a/profiles/input/hog-lib.c
+++ b/profiles/input/hog-lib.c
@@ -527,9 +527,9 @@ static void report_read_cb(guint8 status, const guint8 *pdu, guint16 len,
 	}
 
 	if (report->value)
-		g_free(report->value);
+		free(report->value);
 
-	report->value = g_memdup(pdu, len);
+	report->value = util_memdup(pdu, len);
 	report->len = len;
 }
 
@@ -1217,7 +1217,7 @@ static void report_free(void *data)
 {
 	struct report *report = data;
 
-	g_free(report->value);
+	free(report->value);
 	g_free(report);
 }
 
@@ -1241,7 +1241,7 @@ static void hog_free(void *data)
 	bt_uhid_unref(hog->uhid);
 	g_slist_free_full(hog->reports, report_free);
 	g_free(hog->name);
-	g_free(hog->primary);
+	free(hog->primary);
 	queue_destroy(hog->gatt_op, (void *) destroy_gatt_req);
 	if (hog->gatt_db)
 		gatt_db_unref(hog->gatt_db);
@@ -1609,7 +1609,7 @@ static void hog_attach_hog(struct bt_hog *hog, struct gatt_primary *primary)
 	struct bt_hog *instance;
 
 	if (!hog->primary) {
-		hog->primary = g_memdup(primary, sizeof(*primary));
+		hog->primary = util_memdup(primary, sizeof(*primary));
 		discover_char(hog, hog->attrib, primary->range.start,
 						primary->range.end, NULL,
 						char_discovered_cb, hog);
@@ -1623,7 +1623,7 @@ static void hog_attach_hog(struct bt_hog *hog, struct gatt_primary *primary)
 	if (!instance)
 		return;
 
-	instance->primary = g_memdup(primary, sizeof(*primary));
+	instance->primary = util_memdup(primary, sizeof(*primary));
 	find_included(instance, hog->attrib, primary->range.start,
 			primary->range.end, find_included_cb, instance);
 
diff --git a/profiles/scanparam/scpp.c b/profiles/scanparam/scpp.c
index da38a6aaa..4be8b26cc 100644
--- a/profiles/scanparam/scpp.c
+++ b/profiles/scanparam/scpp.c
@@ -91,7 +91,7 @@ static void scpp_free(struct bt_scpp *scan)
 {
 	bt_scpp_detach(scan);
 
-	g_free(scan->primary);
+	free(scan->primary);
 	queue_destroy(scan->gatt_op, NULL); /* cleared in bt_scpp_detach */
 	g_free(scan);
 }
@@ -110,7 +110,7 @@ struct bt_scpp *bt_scpp_new(void *primary)
 	scan->gatt_op = queue_new();
 
 	if (primary)
-		scan->primary = g_memdup(primary, sizeof(*scan->primary));
+		scan->primary = util_memdup(primary, sizeof(*scan->primary));
 
 	return bt_scpp_ref(scan);
 }
diff --git a/src/eir.c b/src/eir.c
index 0f5d14fcd..2f9ee036f 100644
--- a/src/eir.c
+++ b/src/eir.c
@@ -53,9 +53,9 @@ void eir_data_free(struct eir_data *eir)
 	eir->services = NULL;
 	g_free(eir->name);
 	eir->name = NULL;
-	g_free(eir->hash);
+	free(eir->hash);
 	eir->hash = NULL;
-	g_free(eir->randomizer);
+	free(eir->randomizer);
 	eir->randomizer = NULL;
 	g_slist_free_full(eir->msd_list, g_free);
 	eir->msd_list = NULL;
@@ -323,13 +323,13 @@ void eir_parse(struct eir_data *eir, const uint8_t *eir_data, uint8_t eir_len)
 		case EIR_SSP_HASH:
 			if (data_len < 16)
 				break;
-			eir->hash = g_memdup(data, 16);
+			eir->hash = util_memdup(data, 16);
 			break;
 
 		case EIR_SSP_RANDOMIZER:
 			if (data_len < 16)
 				break;
-			eir->randomizer = g_memdup(data, 16);
+			eir->randomizer = util_memdup(data, 16);
 			break;
 
 		case EIR_DEVICE_ID:
diff --git a/tools/gatt-service.c b/tools/gatt-service.c
index 631c4f249..ed6b06f1e 100644
--- a/tools/gatt-service.c
+++ b/tools/gatt-service.c
@@ -26,6 +26,7 @@
 #include "gdbus/gdbus.h"
 
 #include "src/error.h"
+#include "src/shared/util.h"
 
 #define GATT_MGR_IFACE			"org.bluez.GattManager1"
 #define GATT_SERVICE_IFACE		"org.bluez.GattService1"
@@ -126,8 +127,8 @@ static gboolean desc_get_value(const GDBusPropertyTable *property,
 
 static void desc_write(struct descriptor *desc, const uint8_t *value, int len)
 {
-	g_free(desc->value);
-	desc->value = g_memdup(value, len);
+	free(desc->value);
+	desc->value = util_memdup(value, len);
 	desc->vlen = len;
 
 	g_dbus_emit_property_changed(connection, desc->path,
@@ -264,8 +265,8 @@ static gboolean chr_get_props(const GDBusPropertyTable *property,
 
 static void chr_write(struct characteristic *chr, const uint8_t *value, int len)
 {
-	g_free(chr->value);
-	chr->value = g_memdup(value, len);
+	free(chr->value);
+	chr->value = util_memdup(value, len);
 	chr->vlen = len;
 
 	g_dbus_emit_property_changed(connection, chr->path, GATT_CHR_IFACE,
@@ -388,7 +389,7 @@ static void chr_iface_destroy(gpointer user_data)
 
 	g_free(chr->uuid);
 	g_free(chr->service);
-	g_free(chr->value);
+	free(chr->value);
 	g_free(chr->path);
 	g_free(chr);
 }
@@ -398,7 +399,7 @@ static void desc_iface_destroy(gpointer user_data)
 	struct descriptor *desc = user_data;
 
 	g_free(desc->uuid);
-	g_free(desc->value);
+	free(desc->value);
 	g_free(desc->path);
 	g_free(desc);
 }
@@ -592,7 +593,7 @@ static gboolean register_characteristic(const char *chr_uuid,
 
 	chr = g_new0(struct characteristic, 1);
 	chr->uuid = g_strdup(chr_uuid);
-	chr->value = g_memdup(value, vlen);
+	chr->value = util_memdup(value, vlen);
 	chr->vlen = vlen;
 	chr->props = props;
 	chr->service = g_strdup(service_path);
diff --git a/tools/mesh-gatt/gatt.c b/tools/mesh-gatt/gatt.c
index c8a8123fb..ab9743cd1 100644
--- a/tools/mesh-gatt/gatt.c
+++ b/tools/mesh-gatt/gatt.c
@@ -24,6 +24,7 @@
 
 #include "src/shared/io.h"
 #include "src/shared/shell.h"
+#include "src/shared/util.h"
 #include "gdbus/gdbus.h"
 #include "lib/bluetooth.h"
 #include "lib/uuid.h"
@@ -86,7 +87,7 @@ static void write_data_free(void *user_data)
 {
 	struct write_data *data = user_data;
 
-	g_free(data->gatt_data);
+	free(data->gatt_data);
 	free(data);
 }
 
@@ -338,7 +339,7 @@ bool mesh_gatt_write(GDBusProxy *proxy, uint8_t *buf, uint16_t len,
 	/* TODO: should keep in queue in case we need to cancel write? */
 
 	data->gatt_len = len;
-	data->gatt_data = g_memdup(buf, len);
+	data->gatt_data = util_memdup(buf, len);
 	data->gatt_data[0] &= GATT_TYPE_MASK;
 	data->iov.iov_base = data->gatt_data;
 	data->iov.iov_len = len;
diff --git a/unit/test-avctp.c b/unit/test-avctp.c
index fa7db59c8..25fd3abc2 100644
--- a/unit/test-avctp.c
+++ b/unit/test-avctp.c
@@ -53,7 +53,7 @@ struct context {
 #define raw_pdu(args...)					\
 	{							\
 		.valid = true,					\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 	}
 
@@ -64,7 +64,7 @@ struct context {
 		};							\
 		static struct test_data data;				\
 		data.test_name = g_strdup(name);			\
-		data.pdu_list = g_memdup(pdus, sizeof(pdus));		\
+		data.pdu_list = util_memdup(pdus, sizeof(pdus));	\
 		tester_add(name, &data, NULL, function, NULL);		\
 	} while (0)
 
diff --git a/unit/test-avdtp.c b/unit/test-avdtp.c
index 4e8a68c6b..2e49def43 100644
--- a/unit/test-avdtp.c
+++ b/unit/test-avdtp.c
@@ -48,7 +48,7 @@ struct test_data {
 #define raw_pdu(args...) \
 	{							\
 		.valid = true,					\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 	}
 
@@ -56,7 +56,7 @@ struct test_data {
 	{							\
 		.valid = true,					\
 		.fragmented = true,				\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 	}
 
@@ -67,7 +67,7 @@ struct test_data {
 		};							\
 		static struct test_data data;				\
 		data.test_name = g_strdup(name);			\
-		data.pdu_list = g_memdup(pdus, sizeof(pdus));		\
+		data.pdu_list = util_memdup(pdus, sizeof(pdus));	\
 		tester_add(name, &data, NULL, function, NULL);	\
 	} while (0)
 
diff --git a/unit/test-avrcp.c b/unit/test-avrcp.c
index 34a70377d..b637a8a1b 100644
--- a/unit/test-avrcp.c
+++ b/unit/test-avrcp.c
@@ -61,7 +61,7 @@ struct context {
 #define raw_pdu(args...)					\
 	{							\
 		.valid = true,					\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 	}
 
@@ -69,7 +69,7 @@ struct context {
 	{							\
 		.valid = true,					\
 		.browse = true,					\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 	}
 
@@ -77,7 +77,7 @@ struct context {
 	{							\
 		.valid = true,					\
 		.fragmented = true,				\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 	}
 
@@ -85,7 +85,7 @@ struct context {
 	{							\
 		.valid = true,					\
 		.continuing = true,				\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 	}
 
@@ -96,7 +96,7 @@ struct context {
 		};							\
 		static struct test_data data;				\
 		data.test_name = g_strdup(name);			\
-		data.pdu_list = g_memdup(pdus, sizeof(pdus));		\
+		data.pdu_list = util_memdup(pdus, sizeof(pdus));	\
 		tester_add(name, &data, NULL, function, NULL);		\
 	} while (0)
 
diff --git a/unit/test-gatt.c b/unit/test-gatt.c
index 6a47268e6..f92d860c4 100644
--- a/unit/test-gatt.c
+++ b/unit/test-gatt.c
@@ -73,7 +73,7 @@ struct context {
 #define raw_pdu(args...)					\
 	{							\
 		.valid = true,					\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 	}
 
@@ -94,7 +94,7 @@ struct context {
 		data.uuid = bt_uuid;					\
 		data.step = test_step;					\
 		data.source_db = db;					\
-		data.pdu_list = g_memdup(pdus, sizeof(pdus));		\
+		data.pdu_list = util_memdup(pdus, sizeof(pdus));	\
 		tester_add(name, &data, NULL, function, NULL);		\
 	} while (0)
 
diff --git a/unit/test-hfp.c b/unit/test-hfp.c
index f504724d7..b4af99d53 100644
--- a/unit/test-hfp.c
+++ b/unit/test-hfp.c
@@ -17,6 +17,7 @@
 #include <glib.h>
 #include "src/shared/hfp.h"
 #include "src/shared/tester.h"
+#include "src/shared/util.h"
 
 struct context {
 	guint watch_id;
@@ -50,7 +51,7 @@ struct test_data {
 #define raw_pdu(args...)					\
 	{							\
 		.valid = true,					\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 	}
 
@@ -62,7 +63,7 @@ struct test_data {
 #define type_pdu(cmd_type, args...)				\
 	{							\
 		.valid = true,					\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 		.type = cmd_type,				\
 	}
@@ -70,7 +71,7 @@ struct test_data {
 #define frg_pdu(args...)					\
 	{							\
 		.valid = true,					\
-		.data = g_memdup(data(args), sizeof(data(args))), \
+		.data = util_memdup(data(args), sizeof(data(args))), \
 		.size = sizeof(data(args)),			\
 		.fragmented = true,				\
 	}
@@ -82,7 +83,7 @@ struct test_data {
 		};							\
 		static struct test_data data;				\
 		data.test_name = g_strdup(name);			\
-		data.pdu_list = g_memdup(pdus, sizeof(pdus));		\
+		data.pdu_list = util_memdup(pdus, sizeof(pdus));	\
 		data.result_func = result_function;			\
 		tester_add(name, &data, NULL, function, NULL);		\
 		data.test_handler = test_handler;			\
@@ -96,7 +97,7 @@ struct test_data {
 		};							\
 		static struct test_data data;				\
 		data.test_name = g_strdup(name);			\
-		data.pdu_list = g_memdup(pdus, sizeof(pdus));		\
+		data.pdu_list = util_memdup(pdus, sizeof(pdus));	\
 		data.hf_result_func = result_func;			\
 		data.response_func = response_function;			\
 		tester_add(name, &data, NULL, function, NULL);		\
diff --git a/unit/test-hog.c b/unit/test-hog.c
index 116a5cb07..067497de4 100644
--- a/unit/test-hog.c
+++ b/unit/test-hog.c
@@ -59,24 +59,24 @@ struct context {
 #define raw_pdu(args...)					\
 {								\
 	.valid = true,						\
-	.data = g_memdup(data(args), sizeof(data(args))),	\
+	.data = util_memdup(data(args), sizeof(data(args))),	\
 	.size = sizeof(data(args)),				\
 }
 
-#define false_pdu()	\
-{						\
-		.valid = false, \
+#define false_pdu()						\
+{								\
+		.valid = false,					\
 }
 
-#define define_test(name, function, args...)      \
-	do {    \
-		const struct test_pdu pdus[] = {			\
-			args, { }					\
-		};		\
-		static struct test_data data;      \
-		data.test_name = g_strdup(name);   \
-		data.pdu_list = g_memdup(pdus, sizeof(pdus));		\
-		tester_add(name, &data, NULL, function, NULL);     \
+#define define_test(name, function, args...)			\
+	do {							\
+		const struct test_pdu pdus[] = {		\
+			args, { }				\
+		};						\
+		static struct test_data data;			\
+		data.test_name = g_strdup(name);		\
+		data.pdu_list = util_memdup(pdus, sizeof(pdus));\
+		tester_add(name, &data, NULL, function, NULL);	\
 	} while (0)
 
 static gboolean context_quit(gpointer user_data)
diff --git a/unit/test-sdp.c b/unit/test-sdp.c
index 8f95fcb71..5c04a71eb 100644
--- a/unit/test-sdp.c
+++ b/unit/test-sdp.c
@@ -47,14 +47,16 @@ struct test_data {
 #define raw_pdu(args...) \
 	{							\
 		.valid = true,					\
-		.raw_data = g_memdup(raw_data(args), sizeof(raw_data(args))), \
+		.raw_data = util_memdup(raw_data(args),		\
+					sizeof(raw_data(args))), \
 		.raw_size = sizeof(raw_data(args)),		\
 	}
 
 #define raw_pdu_cont(cont, args...) \
 	{							\
 		.valid = true,					\
-		.raw_data = g_memdup(raw_data(args), sizeof(raw_data(args))), \
+		.raw_data = util_memdup(raw_data(args),		\
+					sizeof(raw_data(args))), \
 		.raw_size = sizeof(raw_data(args)),		\
 		.cont_len = cont,				\
 	}
@@ -66,7 +68,7 @@ struct test_data {
 		};							\
 		static struct test_data data;				\
 		data.mtu = _mtu;					\
-		data.pdu_list = g_memdup(pdus, sizeof(pdus));		\
+		data.pdu_list = util_memdup(pdus, sizeof(pdus));	\
 		tester_add(name, &data, NULL, test_sdp, NULL);		\
 	} while (0)
 
@@ -92,7 +94,7 @@ struct test_data_de {
 #define define_test_de_attr(name, input, exp) \
 	do {								\
 		static struct test_data_de data;			\
-		data.input_data = g_memdup(input, sizeof(input));	\
+		data.input_data = util_memdup(input, sizeof(input));	\
 		data.input_size = sizeof(input);			\
 		data.expected = exp;					\
 		tester_add("/sdp/DE/ATTR/" name, &data,	NULL,		\
diff --git a/unit/test-uhid.c b/unit/test-uhid.c
index 001d39a3d..8a8eef855 100644
--- a/unit/test-uhid.c
+++ b/unit/test-uhid.c
@@ -61,7 +61,7 @@ struct context {
 		};							\
 		static struct test_data data;				\
 		data.test_name = g_strdup(name);			\
-		data.pdu_list = g_memdup(pdus, sizeof(pdus));		\
+		data.pdu_list = util_memdup(pdus, sizeof(pdus));	\
 		tester_add(name, &data, NULL, function, NULL);		\
 	} while (0)
 
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* RE: [BlueZ,1/4] shared/util: Rename btd_malloc to util_malloc
  2022-01-06 21:03 [PATCH BlueZ 1/4] shared/util: Rename btd_malloc to util_malloc Luiz Augusto von Dentz
                   ` (2 preceding siblings ...)
  2022-01-06 21:03 ` [PATCH BlueZ 4/4] build: Replace use of g_memdup with util_memdup Luiz Augusto von Dentz
@ 2022-01-07  0:16 ` bluez.test.bot
  2022-01-07 22:42   ` Luiz Augusto von Dentz
  3 siblings, 1 reply; 6+ messages in thread
From: bluez.test.bot @ 2022-01-07  0:16 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz

[-- Attachment #1: Type: text/plain, Size: 998 bytes --]

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=603319

---Test result---

Test Summary:
CheckPatch                    PASS      2.96 seconds
GitLint                       PASS      1.42 seconds
Prep - Setup ELL              PASS      44.08 seconds
Build - Prep                  PASS      0.55 seconds
Build - Configure             PASS      9.53 seconds
Build - Make                  PASS      1586.93 seconds
Make Check                    PASS      10.98 seconds
Make Check w/Valgrind         PASS      454.25 seconds
Make Distcheck                PASS      242.18 seconds
Build w/ext ELL - Configure   PASS      9.33 seconds
Build w/ext ELL - Make        PASS      1548.57 seconds
Incremental Build with patchesPASS      6454.71 seconds



---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [BlueZ,1/4] shared/util: Rename btd_malloc to util_malloc
  2022-01-07  0:16 ` [BlueZ,1/4] shared/util: Rename btd_malloc to util_malloc bluez.test.bot
@ 2022-01-07 22:42   ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 6+ messages in thread
From: Luiz Augusto von Dentz @ 2022-01-07 22:42 UTC (permalink / raw)
  To: linux-bluetooth

Hi,

On Thu, Jan 6, 2022 at 4:16 PM <bluez.test.bot@gmail.com> wrote:
>
> This is automated email and please do not reply to this email!
>
> Dear submitter,
>
> Thank you for submitting the patches to the linux bluetooth mailing list.
> This is a CI test results with your patch series:
> PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=603319
>
> ---Test result---
>
> Test Summary:
> CheckPatch                    PASS      2.96 seconds
> GitLint                       PASS      1.42 seconds
> Prep - Setup ELL              PASS      44.08 seconds
> Build - Prep                  PASS      0.55 seconds
> Build - Configure             PASS      9.53 seconds
> Build - Make                  PASS      1586.93 seconds
> Make Check                    PASS      10.98 seconds
> Make Check w/Valgrind         PASS      454.25 seconds
> Make Distcheck                PASS      242.18 seconds
> Build w/ext ELL - Configure   PASS      9.33 seconds
> Build w/ext ELL - Make        PASS      1548.57 seconds
> Incremental Build with patchesPASS      6454.71 seconds
>
>
>
> ---
> Regards,
> Linux Bluetooth

Pushed.

-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-01-07 22:42 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-06 21:03 [PATCH BlueZ 1/4] shared/util: Rename btd_malloc to util_malloc Luiz Augusto von Dentz
2022-01-06 21:03 ` [PATCH BlueZ 2/4] attrib: Remove gatt-service.{c,h} and attrib-server.{c,h} Luiz Augusto von Dentz
2022-01-06 21:03 ` [PATCH BlueZ 3/4] shared/util: Add util_memdup Luiz Augusto von Dentz
2022-01-06 21:03 ` [PATCH BlueZ 4/4] build: Replace use of g_memdup with util_memdup Luiz Augusto von Dentz
2022-01-07  0:16 ` [BlueZ,1/4] shared/util: Rename btd_malloc to util_malloc bluez.test.bot
2022-01-07 22:42   ` Luiz Augusto von Dentz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.