All of lore.kernel.org
 help / color / mirror / Atom feed
* [Bluez 00/13] Fixing memory leak, leaked_handle and use_after
@ 2022-05-30  8:11 Gopal Tiwari
  2022-05-30  8:11 ` [Bluez 01/13] Fixing memory leak issue in gatt.c Gopal Tiwari
                   ` (12 more replies)
  0 siblings, 13 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:11 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

Following fixes are reported by coverity tool.  

Gopal Tiwari (13):
  Fixing memory leak issue in gatt.c
  Fixing memory leakage in appkey.c
  Fixing memroy leak in jlink.c
  Fixing memory leak in sixaxis.c
  Fixing leaked_handle in cltest.c
  Fixing leaked_handle in create-image.c
  Fixing leaked_handle in l2cap-tester.c
  Fixing resource leak in mesh/mesh-db.c
  Fixing leaked_handle in obex-client-tool.c
  Fixing use after free in src/device.c
  Fixing memory leak in pbap.c
  Fixing possible use_after_free in meshctl.c
  Fixing use_after_free in prov-db.c

 client/gatt.c             | 11 ++++++++---
 mesh/appkey.c             |  8 ++++++--
 monitor/jlink.c           |  5 ++++-
 obexd/client/pbap.c       |  5 +++--
 plugins/sixaxis.c         |  9 +++++++--
 src/device.c              |  1 +
 tools/cltest.c            |  1 +
 tools/create-image.c      |  7 +++----
 tools/l2cap-tester.c      |  1 +
 tools/mesh-gatt/prov-db.c |  3 ++-
 tools/mesh/mesh-db.c      |  2 ++
 tools/meshctl.c           |  1 -
 tools/obex-client-tool.c  |  1 +
 13 files changed, 39 insertions(+), 16 deletions(-)

-- 
2.26.2


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

* [Bluez 01/13] Fixing memory leak issue in gatt.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
@ 2022-05-30  8:11 ` Gopal Tiwari
  2022-05-30  8:40   ` Fixing memory leak, leaked_handle and use_after bluez.test.bot
  2022-05-30  8:11 ` [Bluez 02/13] Fixing memory leakage in appkey.c Gopal Tiwari
                   ` (11 subsequent siblings)
  12 siblings, 1 reply; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:11 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

While performing the static tool analysis using coverity tool found following reports

Error: RESOURCE_LEAK (CWE-772):
bluez-5.64/client/gatt.c:1531: leaked_storage: Variable "service" going out of scope leaks the storage it points to.

Error: RESOURCE_LEAK (CWE-772):
bluez-5.64/client/gatt.c:2626: leaked_storage: Variable "chrc" going out of scope leaks the storage it points to.

Error: RESOURCE_LEAK (CWE-772):
bluez-5.64/client/gatt.c:2906: leaked_storage: Variable "desc" going out of scope leaks the storage it points to.

Fixing them.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 client/gatt.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/client/gatt.c b/client/gatt.c
index 13872c794..100a4eb90 100644
--- a/client/gatt.c
+++ b/client/gatt.c
@@ -1527,7 +1527,8 @@ void gatt_register_service(DBusConnection *conn, GDBusProxy *proxy,
 
 	if (argc > 2) {
 		service->handle = parse_handle(argv[2]);
-		if (!service->handle)
+		if (!service->handle) {
+			service_free(service);
 			return bt_shell_noninteractive_quit(EXIT_FAILURE);
 	}
 
@@ -2622,8 +2623,10 @@ void gatt_register_chrc(DBusConnection *conn, GDBusProxy *proxy,
 
 	if (argc > 3) {
 		chrc->handle = parse_handle(argv[3]);
-		if (!chrc->handle)
+		if (!chrc->handle) {
+			chrc_free(chrc);
 			return bt_shell_noninteractive_quit(EXIT_FAILURE);
+		}
 	}
 
 	if (g_dbus_register_interface(conn, chrc->path, CHRC_INTERFACE,
@@ -2902,8 +2905,10 @@ void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy,
 
 	if (argc > 3) {
 		desc->handle = parse_handle(argv[3]);
-		if (!desc->handle)
+		if (!desc->handle) {
+			desc_free(desc);
 			return bt_shell_noninteractive_quit(EXIT_FAILURE);
+		}
 	}
 
 	if (g_dbus_register_interface(conn, desc->path, DESC_INTERFACE,
-- 
2.26.2


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

* [Bluez 02/13] Fixing memory leakage in appkey.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
  2022-05-30  8:11 ` [Bluez 01/13] Fixing memory leak issue in gatt.c Gopal Tiwari
@ 2022-05-30  8:11 ` Gopal Tiwari
  2022-05-30  8:11 ` [Bluez 03/13] Fixing memroy leak in jlink.c Gopal Tiwari
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:11 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

While performing the static analysis using the coverity tool found following memroy leak reports

bluez-5.64/mesh/appkey.c:143: leaked_storage: Variable "key" going out of scope leaks the storage it points to.

Error: RESOURCE_LEAK (CWE-772):
bluez-5.64/mesh/appkey.c:146: leaked_storage: Variable "key" going out of scope leaks the storage it points to.

Fixing them.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 mesh/appkey.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/mesh/appkey.c b/mesh/appkey.c
index 5088a1812..52fed8c31 100644
--- a/mesh/appkey.c
+++ b/mesh/appkey.c
@@ -139,11 +139,15 @@ bool appkey_key_init(struct mesh_net *net, uint16_t net_idx, uint16_t app_idx,
 	key->net_idx = net_idx;
 	key->app_idx = app_idx;
 
-	if (key_value && !set_key(key, app_idx, key_value, false))
+	if (key_value && !set_key(key, app_idx, key_value, false)) {
+		appkey_key_free(key);
 		return false;
+	}
 
-	if (new_key_value && !set_key(key, app_idx, new_key_value, true))
+	if (new_key_value && !set_key(key, app_idx, new_key_value, true)) {
+		appkey_key_free(key);
 		return false;
+	}
 
 	l_queue_push_tail(app_keys, key);
 
-- 
2.26.2


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

* [Bluez 03/13] Fixing memroy leak in jlink.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
  2022-05-30  8:11 ` [Bluez 01/13] Fixing memory leak issue in gatt.c Gopal Tiwari
  2022-05-30  8:11 ` [Bluez 02/13] Fixing memory leakage in appkey.c Gopal Tiwari
@ 2022-05-30  8:11 ` Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 04/13] Fixing memory leak in sixaxis.c Gopal Tiwari
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:11 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

While performing static tool analysis using coverity found following reports for resouse leak

bluez-5.64/monitor/jlink.c:111: leaked_storage: Variable "so" going out of scope leaks the storage it points to.

bluez-5.64/monitor/jlink.c:113: leaked_storage: Variable "so" going out of scope leaks the storage it points to.

Fixing them.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 monitor/jlink.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/monitor/jlink.c b/monitor/jlink.c
index 9aaa4ebd8..672097004 100644
--- a/monitor/jlink.c
+++ b/monitor/jlink.c
@@ -107,9 +107,12 @@ int jlink_init(void)
 			!jlink.tif_select || !jlink.setspeed ||
 			!jlink.connect || !jlink.getsn ||
 			!jlink.emu_getproductname ||
-			!jlink.rtterminal_control || !jlink.rtterminal_read)
+			!jlink.rtterminal_control || !jlink.rtterminal_read) {
+		dlclose(so);
 		return -EIO;
+	}
 
+	dlclose(so)
 	return 0;
 }
 
-- 
2.26.2


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

* [Bluez 04/13] Fixing memory leak in sixaxis.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
                   ` (2 preceding siblings ...)
  2022-05-30  8:11 ` [Bluez 03/13] Fixing memroy leak in jlink.c Gopal Tiwari
@ 2022-05-30  8:12 ` Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 05/13] Fixing leaked_handle in cltest.c Gopal Tiwari
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:12 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

While performing static tool analysis using coverity found following reports for resouse leak

bluez-5.64/plugins/sixaxis.c:425: alloc_arg: "get_pairing_type_for_device" allocates memory that is stored into "sysfs_path".
bluez-5.64/plugins/sixaxis.c:428: leaked_storage: Variable "sysfs_path" going out of scope leaks the storage it points to.

Fixing them.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 plugins/sixaxis.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/plugins/sixaxis.c b/plugins/sixaxis.c
index ddecbcccb..9249c2715 100644
--- a/plugins/sixaxis.c
+++ b/plugins/sixaxis.c
@@ -424,10 +424,15 @@ static void device_added(struct udev_device *udevice)
 
 	cp = get_pairing_type_for_device(udevice, &bus, &sysfs_path);
 	if (!cp || (cp->type != CABLE_PAIRING_SIXAXIS &&
-				cp->type != CABLE_PAIRING_DS4))
+				cp->type != CABLE_PAIRING_DS4)) {
+		g_free(sys_path);
 		return;
-	if (bus != BUS_USB)
+	}
+
+	if (bus != BUS_USB) {
+		g_free(sys_path);
 		return;
+	}
 
 	info("sixaxis: compatible device connected: %s (%04X:%04X %s)",
 				cp->name, cp->vid, cp->pid, sysfs_path);
-- 
2.26.2


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

* [Bluez 05/13] Fixing leaked_handle in cltest.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
                   ` (3 preceding siblings ...)
  2022-05-30  8:12 ` [Bluez 04/13] Fixing memory leak in sixaxis.c Gopal Tiwari
@ 2022-05-30  8:12 ` Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 06/13] Fixing leaked_handle in create-image.c Gopal Tiwari
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:12 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

While performing static tool analysis using coverity found following reports for resouse leak

bluez-5.64/tools/cltest.c:75: leaked_handle: Handle variable "fd" going out of scope leaks the handle.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 tools/cltest.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/cltest.c b/tools/cltest.c
index 2766fcd23..250c93cc7 100644
--- a/tools/cltest.c
+++ b/tools/cltest.c
@@ -72,6 +72,7 @@ static bool send_message(const bdaddr_t *src, const bdaddr_t *dst,
 		return false;
 	}
 
+	close(fd);
 	return true;
 }
 
-- 
2.26.2


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

* [Bluez 06/13] Fixing leaked_handle in create-image.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
                   ` (4 preceding siblings ...)
  2022-05-30  8:12 ` [Bluez 05/13] Fixing leaked_handle in cltest.c Gopal Tiwari
@ 2022-05-30  8:12 ` Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 07/13] Fixing leaked_handle in l2cap-tester.c Gopal Tiwari
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:12 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

While performing static tool analysis using coverity found following reports for resouse leak

bluez-5.64/tools/create-image.c:124: leaked_storage: Variable "map" going out of scope leaks the storage it points to.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 tools/create-image.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/tools/create-image.c b/tools/create-image.c
index aba940da7..90cd87315 100644
--- a/tools/create-image.c
+++ b/tools/create-image.c
@@ -97,12 +97,13 @@ static void write_block(FILE *fp, const char *pathname, unsigned int ino,
 
 	map = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
 	if (!map || map == MAP_FAILED) {
-		close(fd);
-		fd = -1;
 		map = NULL;
 		st.st_size = 0;
         }
 
+	close(fd);
+	fd = -1;
+
 done:
 	fprintf(fp, HDR_FMT, HDR_MAGIC, ino, mode, 0, 0, 1, 0,
 		(uintmax_t) st.st_size, 0, 0, 0, 0, namelen + 1, 0, name);
@@ -117,9 +118,7 @@ done:
 		pad = 3 - ((st.st_size + 3) % 4);
 		for (i = 0; i < pad; i++)
 			fputc(0, fp);
-
 		munmap(map, st.st_size);
-		close(fd);
 	}
 }
 
-- 
2.26.2


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

* [Bluez 07/13] Fixing leaked_handle in l2cap-tester.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
                   ` (5 preceding siblings ...)
  2022-05-30  8:12 ` [Bluez 06/13] Fixing leaked_handle in create-image.c Gopal Tiwari
@ 2022-05-30  8:12 ` Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 08/13] Fixing resource leak in mesh/mesh-db.c Gopal Tiwari
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:12 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

While performing static tool analysis using coverity found following reports for resouse leak

bluez-5.64/tools/l2cap-tester.c:1712: leaked_handle: Handle variable "new_sk" going out of scope leaks the handle.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 tools/l2cap-tester.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/l2cap-tester.c b/tools/l2cap-tester.c
index d78b1e29c..3f0464013 100644
--- a/tools/l2cap-tester.c
+++ b/tools/l2cap-tester.c
@@ -1709,6 +1709,7 @@ static gboolean l2cap_listen_cb(GIOChannel *io, GIOCondition cond,
 
 	if (!check_mtu(data, new_sk)) {
 		tester_test_failed();
+		close(new_sk);
 		return FALSE;
 	}
 
-- 
2.26.2


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

* [Bluez 08/13] Fixing resource leak in mesh/mesh-db.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
                   ` (6 preceding siblings ...)
  2022-05-30  8:12 ` [Bluez 07/13] Fixing leaked_handle in l2cap-tester.c Gopal Tiwari
@ 2022-05-30  8:12 ` Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 09/13] Fixing leaked_handle in obex-client-tool.c Gopal Tiwari
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:12 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

While performing static tool analysis using coverity found following reports for resouse leak

bluez-5.64/tools/mesh/mesh-db.c:2388: leaked_handle: Handle variable "fd" going out of scope leaks the handle.

bluez-5.64/tools/mesh/mesh-db.c:2388: leaked_storage: Variable "str" going out of scope leaks the storage it points to.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 tools/mesh/mesh-db.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tools/mesh/mesh-db.c b/tools/mesh/mesh-db.c
index fa11837df..896ff722c 100644
--- a/tools/mesh/mesh-db.c
+++ b/tools/mesh/mesh-db.c
@@ -2384,6 +2384,8 @@ bool mesh_db_load(const char *fname)
 
 	sz = read(fd, str, st.st_size);
 	if (sz != st.st_size) {
+		close(fd);
+		l_free(str);
 		l_error("Failed to read configuration file %s", fname);
 		return false;
 	}
-- 
2.26.2


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

* [Bluez 09/13] Fixing leaked_handle in obex-client-tool.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
                   ` (7 preceding siblings ...)
  2022-05-30  8:12 ` [Bluez 08/13] Fixing resource leak in mesh/mesh-db.c Gopal Tiwari
@ 2022-05-30  8:12 ` Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 10/13] Fixing use after free in src/device.c Gopal Tiwari
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:12 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

While performing static tool analysis using coverity found following reports for resouse leak

bluez-5.64/tools/obex-client-tool.c:315: leaked_handle: Handle variable "sk" going out of scope leaks the handle.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 tools/obex-client-tool.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/obex-client-tool.c b/tools/obex-client-tool.c
index ab9332896..cb0e41247 100644
--- a/tools/obex-client-tool.c
+++ b/tools/obex-client-tool.c
@@ -312,6 +312,7 @@ static GIOChannel *unix_connect(GObexTransportType transport)
 	if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
 		err = errno;
 		g_printerr("connect: %s (%d)\n", strerror(err), err);
+		close(sk);
 		return NULL;
 	}
 
-- 
2.26.2


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

* [Bluez 10/13] Fixing use after free in src/device.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
                   ` (8 preceding siblings ...)
  2022-05-30  8:12 ` [Bluez 09/13] Fixing leaked_handle in obex-client-tool.c Gopal Tiwari
@ 2022-05-30  8:12 ` Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 11/13] Fixing memory leak in pbap.c Gopal Tiwari
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:12 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

Following traces reported by covirty tool

Error: USE_AFTER_FREE (CWE-416):
bluez-5.64/src/device.c:2962: path: Condition "!dbus_message_get_args(msg, NULL, 0 /* (int)0 */)", taking false branch.
bluez-5.64/src/device.c:2965: path: Condition "device->bonding", taking false branch.
bluez-5.64/src/device.c:2968: path: Condition "device->bredr_state.bonded", taking true branch.
bluez-5.64/src/device.c:2969: path: Falling through to end of if statement.
bluez-5.64/src/device.c:2977: path: Condition "state->bonded", taking false branch.
bluez-5.64/src/device.c:2983: path: Condition "agent", taking true branch.
bluez-5.64/src/device.c:2984: path: Falling through to end of if statement.
bluez-5.64/src/device.c:2990: path: Condition "agent", taking true branch.
bluez-5.64/src/device.c:3005: path: Condition "bdaddr_type != 0", taking true branch.
bluez-5.64/src/device.c:3006: path: Condition "!state->connected", taking true branch.
bluez-5.64/src/device.c:3006: path: Condition "btd_le_connect_before_pairing()", taking true branch.
bluez-5.64/src/device.c:3007: freed_arg: "device_connect_le" frees "device->bonding".
bluez-5.64/src/device.c:3007: path: Falling through to end of if statement.
bluez-5.64/src/device.c:3012: path: Falling through to end of if statement.
bluez-5.64/src/device.c:3017: path: Condition "err < 0", taking true branch.
bluez-5.64/src/device.c:3018: double_free: Calling "bonding_request_free" frees pointer "device->bonding" which has already been freed.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 src/device.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/device.c b/src/device.c
index 8dc12d026..a0e5d40db 100644
--- a/src/device.c
+++ b/src/device.c
@@ -2942,6 +2942,7 @@ static void bonding_request_free(struct bonding_req *bonding)
 		bonding->device->bonding = NULL;
 
 	g_free(bonding);
+	bonding = NULL;
 }
 
 static DBusMessage *pair_device(DBusConnection *conn, DBusMessage *msg,
-- 
2.26.2


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

* [Bluez 11/13] Fixing memory leak in pbap.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
                   ` (9 preceding siblings ...)
  2022-05-30  8:12 ` [Bluez 10/13] Fixing use after free in src/device.c Gopal Tiwari
@ 2022-05-30  8:12 ` Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 12/13] Fixing possible use_after_free in meshctl.c Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 13/13] Fixing use_after_free in prov-db.c Gopal Tiwari
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:12 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

Reported by coverity tool as follows:

bluez-5.64/obexd/client/pbap.c:929: leaked_storage: Variable "apparam" going out of scope leaks the storage it points to.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 obexd/client/pbap.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c
index 1a2bacc9f..98e337ea1 100644
--- a/obexd/client/pbap.c
+++ b/obexd/client/pbap.c
@@ -925,10 +925,11 @@ static DBusMessage *pbap_search(DBusConnection *connection,
 		return g_dbus_create_error(message,
 				ERROR_INTERFACE ".InvalidArguments", NULL);
 
-	if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING)
+	if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_STRING) {
+		g_obex_apparam_free(apparam);	
 		return g_dbus_create_error(message,
 				ERROR_INTERFACE ".InvalidArguments", NULL);
-
+	}
 	dbus_message_iter_get_basic(&args, &value);
 	dbus_message_iter_next(&args);
 
-- 
2.26.2


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

* [Bluez 12/13] Fixing possible use_after_free in meshctl.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
                   ` (10 preceding siblings ...)
  2022-05-30  8:12 ` [Bluez 11/13] Fixing memory leak in pbap.c Gopal Tiwari
@ 2022-05-30  8:12 ` Gopal Tiwari
  2022-05-30  8:12 ` [Bluez 13/13] Fixing use_after_free in prov-db.c Gopal Tiwari
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:12 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

Reported by coverity tool as follows :

bluez-5.64/tools/meshctl.c:1968: freed_arg: "g_free" frees "mesh_dir".
bluez-5.64/tools/meshctl.c:2018: double_free: Calling "g_free" frees pointer "mesh_dir" which has already been freed.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 tools/meshctl.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tools/meshctl.c b/tools/meshctl.c
index 18e20c40d..38ffd35f3 100644
--- a/tools/meshctl.c
+++ b/tools/meshctl.c
@@ -2015,7 +2015,6 @@ int main(int argc, char *argv[])
 
 fail:
 	bt_shell_cleanup();
-	g_free(mesh_dir);
 
 	return EXIT_FAILURE;
 }
-- 
2.26.2


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

* [Bluez 13/13] Fixing use_after_free in prov-db.c
  2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
                   ` (11 preceding siblings ...)
  2022-05-30  8:12 ` [Bluez 12/13] Fixing possible use_after_free in meshctl.c Gopal Tiwari
@ 2022-05-30  8:12 ` Gopal Tiwari
  12 siblings, 0 replies; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-30  8:12 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

Following scenario happens when prov is false and we have double free as
mentioned in the below

bluez-5.64/tools/mesh-gatt/prov-db.c:847: freed_arg: "g_free" frees "in_str".
bluez-5.64/tools/mesh-gatt/prov-db.c:867: double_free: Calling "g_free" frees pointer "in_str" which has already been freed.

Signed-off-by: Gopal Tiwari <gtiwari@redhat.com>
---
 tools/mesh-gatt/prov-db.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/mesh-gatt/prov-db.c b/tools/mesh-gatt/prov-db.c
index 2fb08f799..a5b6997e0 100644
--- a/tools/mesh-gatt/prov-db.c
+++ b/tools/mesh-gatt/prov-db.c
@@ -859,7 +859,8 @@ bool prov_db_local_set_iv_index(uint32_t iv_index, bool update, bool prov)
 
 		set_local_iv_index(jmain, iv_index, update);
 		prov_file_write(jmain, false);
-	}
+	} else
+		return true;
 
 	res = true;
 done:
-- 
2.26.2


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

* RE: Fixing memory leak, leaked_handle and use_after
  2022-05-30  8:11 ` [Bluez 01/13] Fixing memory leak issue in gatt.c Gopal Tiwari
@ 2022-05-30  8:40   ` bluez.test.bot
  0 siblings, 0 replies; 17+ messages in thread
From: bluez.test.bot @ 2022-05-30  8:40 UTC (permalink / raw)
  To: linux-bluetooth, gopalkrishna.tiwari

[-- Attachment #1: Type: text/plain, Size: 253011 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=645911

---Test result---

Test Summary:
CheckPatch                    FAIL      13.57 seconds
GitLint                       FAIL      9.50 seconds
Prep - Setup ELL              PASS      52.38 seconds
Build - Prep                  PASS      0.63 seconds
Build - Configure             PASS      10.32 seconds
Build - Make                  FAIL      3.50 seconds
Make Check                    FAIL      0.66 seconds
Make Check w/Valgrind         FAIL      13.32 seconds
Make Distcheck                FAIL      39.97 seconds
Build w/ext ELL - Configure   PASS      10.35 seconds
Build w/ext ELL - Make        FAIL      3.92 seconds
Incremental Build with patchesFAIL      14.83 seconds

Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script with rule in .checkpatch.conf
Output:
[Bluez,01/13] Fixing memory leak issue in gatt.c
WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#58: 
While performing the static tool analysis using coverity tool found following reports

/github/workspace/src/12864387.patch total: 0 errors, 1 warnings, 31 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12864387.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[Bluez,02/13] Fixing memory leakage in appkey.c
WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#58: 
While performing the static analysis using the coverity tool found following memroy leak reports

WARNING:TYPO_SPELLING: 'memroy' may be misspelled - perhaps 'memory'?
#58: 
While performing the static analysis using the coverity tool found following memroy leak reports
                                                                             ^^^^^^

/github/workspace/src/12864389.patch total: 0 errors, 2 warnings, 17 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12864389.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[Bluez,03/13] Fixing memroy leak in jlink.c
WARNING:TYPO_SPELLING: 'memroy' may be misspelled - perhaps 'memory'?
#45: 
Subject: [Bluez 03/13] Fixing memroy leak in jlink.c
                              ^^^^^^

WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#58: 
While performing static tool analysis using coverity found following reports for resouse leak

/github/workspace/src/12864388.patch total: 0 errors, 2 warnings, 13 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12864388.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[Bluez,04/13] Fixing memory leak in sixaxis.c
WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#58: 
While performing static tool analysis using coverity found following reports for resouse leak

/github/workspace/src/12864390.patch total: 0 errors, 1 warnings, 17 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12864390.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[Bluez,05/13] Fixing leaked_handle in cltest.c
WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#58: 
While performing static tool analysis using coverity found following reports for resouse leak

/github/workspace/src/12864391.patch total: 0 errors, 1 warnings, 7 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12864391.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[Bluez,06/13] Fixing leaked_handle in create-image.c
WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#58: 
While performing static tool analysis using coverity found following reports for resouse leak

/github/workspace/src/12864394.patch total: 0 errors, 1 warnings, 24 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12864394.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[Bluez,07/13] Fixing leaked_handle in l2cap-tester.c
WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#58: 
While performing static tool analysis using coverity found following reports for resouse leak

/github/workspace/src/12864392.patch total: 0 errors, 1 warnings, 7 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12864392.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[Bluez,08/13] Fixing resource leak in mesh/mesh-db.c
WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#58: 
While performing static tool analysis using coverity found following reports for resouse leak

/github/workspace/src/12864393.patch total: 0 errors, 1 warnings, 8 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12864393.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[Bluez,09/13] Fixing leaked_handle in obex-client-tool.c
WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#58: 
While performing static tool analysis using coverity found following reports for resouse leak

/github/workspace/src/12864395.patch total: 0 errors, 1 warnings, 7 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/12864395.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[Bluez,11/13] Fixing memory leak in pbap.c
ERROR:TRAILING_WHITESPACE: trailing whitespace
#77: FILE: obexd/client/pbap.c:929:
+^I^Ig_obex_apparam_free(apparam);^I$

/github/workspace/src/12864398.patch total: 1 errors, 0 warnings, 13 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

NOTE: Whitespace errors detected.
      You may wish to use scripts/cleanpatch or scripts/cleanfile

/github/workspace/src/12864398.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.


##############################
Test: GitLint - FAIL
Desc: Run gitlint with rule in .gitlint
Output:
[Bluez,01/13] Fixing memory leak issue in gatt.c
5: B1 Line exceeds max length (85>80): "While performing the static tool analysis using coverity tool found following reports"
8: B1 Line exceeds max length (116>80): "bluez-5.64/client/gatt.c:1531: leaked_storage: Variable "service" going out of scope leaks the storage it points to."
11: B1 Line exceeds max length (113>80): "bluez-5.64/client/gatt.c:2626: leaked_storage: Variable "chrc" going out of scope leaks the storage it points to."
14: B1 Line exceeds max length (113>80): "bluez-5.64/client/gatt.c:2906: leaked_storage: Variable "desc" going out of scope leaks the storage it points to."

[Bluez,02/13] Fixing memory leakage in appkey.c
5: B1 Line exceeds max length (96>80): "While performing the static analysis using the coverity tool found following memroy leak reports"
7: B1 Line exceeds max length (111>80): "bluez-5.64/mesh/appkey.c:143: leaked_storage: Variable "key" going out of scope leaks the storage it points to."
10: B1 Line exceeds max length (111>80): "bluez-5.64/mesh/appkey.c:146: leaked_storage: Variable "key" going out of scope leaks the storage it points to."

[Bluez,03/13] Fixing memroy leak in jlink.c
5: B1 Line exceeds max length (93>80): "While performing static tool analysis using coverity found following reports for resouse leak"
7: B1 Line exceeds max length (112>80): "bluez-5.64/monitor/jlink.c:111: leaked_storage: Variable "so" going out of scope leaks the storage it points to."
9: B1 Line exceeds max length (112>80): "bluez-5.64/monitor/jlink.c:113: leaked_storage: Variable "so" going out of scope leaks the storage it points to."

[Bluez,04/13] Fixing memory leak in sixaxis.c
5: B1 Line exceeds max length (93>80): "While performing static tool analysis using coverity found following reports for resouse leak"
7: B1 Line exceeds max length (125>80): "bluez-5.64/plugins/sixaxis.c:425: alloc_arg: "get_pairing_type_for_device" allocates memory that is stored into "sysfs_path"."
8: B1 Line exceeds max length (122>80): "bluez-5.64/plugins/sixaxis.c:428: leaked_storage: Variable "sysfs_path" going out of scope leaks the storage it points to."

[Bluez,05/13] Fixing leaked_handle in cltest.c
5: B1 Line exceeds max length (93>80): "While performing static tool analysis using coverity found following reports for resouse leak"
7: B1 Line exceeds max length (102>80): "bluez-5.64/tools/cltest.c:75: leaked_handle: Handle variable "fd" going out of scope leaks the handle."

[Bluez,06/13] Fixing leaked_handle in create-image.c
5: B1 Line exceeds max length (93>80): "While performing static tool analysis using coverity found following reports for resouse leak"
7: B1 Line exceeds max length (118>80): "bluez-5.64/tools/create-image.c:124: leaked_storage: Variable "map" going out of scope leaks the storage it points to."

[Bluez,07/13] Fixing leaked_handle in l2cap-tester.c
5: B1 Line exceeds max length (93>80): "While performing static tool analysis using coverity found following reports for resouse leak"
7: B1 Line exceeds max length (114>80): "bluez-5.64/tools/l2cap-tester.c:1712: leaked_handle: Handle variable "new_sk" going out of scope leaks the handle."

[Bluez,08/13] Fixing resource leak in mesh/mesh-db.c
5: B1 Line exceeds max length (93>80): "While performing static tool analysis using coverity found following reports for resouse leak"
7: B1 Line exceeds max length (110>80): "bluez-5.64/tools/mesh/mesh-db.c:2388: leaked_handle: Handle variable "fd" going out of scope leaks the handle."
9: B1 Line exceeds max length (119>80): "bluez-5.64/tools/mesh/mesh-db.c:2388: leaked_storage: Variable "str" going out of scope leaks the storage it points to."

[Bluez,09/13] Fixing leaked_handle in obex-client-tool.c
5: B1 Line exceeds max length (93>80): "While performing static tool analysis using coverity found following reports for resouse leak"
7: B1 Line exceeds max length (113>80): "bluez-5.64/tools/obex-client-tool.c:315: leaked_handle: Handle variable "sk" going out of scope leaks the handle."

[Bluez,10/13] Fixing use after free in src/device.c
8: B1 Line exceeds max length (119>80): "bluez-5.64/src/device.c:2962: path: Condition "!dbus_message_get_args(msg, NULL, 0 /* (int)0 */)", taking false branch."
9: B1 Line exceeds max length (85>80): "bluez-5.64/src/device.c:2965: path: Condition "device->bonding", taking false branch."
10: B1 Line exceeds max length (95>80): "bluez-5.64/src/device.c:2968: path: Condition "device->bredr_state.bonded", taking true branch."
12: B1 Line exceeds max length (83>80): "bluez-5.64/src/device.c:2977: path: Condition "state->bonded", taking false branch."
16: B1 Line exceeds max length (85>80): "bluez-5.64/src/device.c:3005: path: Condition "bdaddr_type != 0", taking true branch."
17: B1 Line exceeds max length (86>80): "bluez-5.64/src/device.c:3006: path: Condition "!state->connected", taking true branch."
18: B1 Line exceeds max length (100>80): "bluez-5.64/src/device.c:3006: path: Condition "btd_le_connect_before_pairing()", taking true branch."
19: B1 Line exceeds max length (85>80): "bluez-5.64/src/device.c:3007: freed_arg: "device_connect_le" frees "device->bonding"."
23: B1 Line exceeds max length (135>80): "bluez-5.64/src/device.c:3018: double_free: Calling "bonding_request_free" frees pointer "device->bonding" which has already been freed."

[Bluez,11/13] Fixing memory leak in pbap.c
7: B1 Line exceeds max length (121>80): "bluez-5.64/obexd/client/pbap.c:929: leaked_storage: Variable "apparam" going out of scope leaks the storage it points to."

[Bluez,12/13] Fixing possible use_after_free in meshctl.c
8: B1 Line exceeds max length (117>80): "bluez-5.64/tools/meshctl.c:2018: double_free: Calling "g_free" frees pointer "mesh_dir" which has already been freed."

[Bluez,13/13] Fixing use_after_free in prov-db.c
9: B1 Line exceeds max length (124>80): "bluez-5.64/tools/mesh-gatt/prov-db.c:867: double_free: Calling "g_free" frees pointer "in_str" which has already been freed."


##############################
Test: Build - Make - FAIL
Desc: Build the BlueZ source tree
Output:
client/gatt.c: In function ‘gatt_register_service’:
client/gatt.c:1554:24: error: invalid storage class for function ‘service_find’
 1554 | static struct service *service_find(const char *pattern)
      |                        ^~~~~~~~~~~~
client/gatt.c:1554:1: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
 1554 | static struct service *service_find(const char *pattern)
      | ^~~~~~
client/gatt.c:1594:14: error: invalid storage class for function ‘inc_find’
 1594 | static char *inc_find(struct service  *serv, char *path)
      |              ^~~~~~~~
client/gatt.c:1666:17: error: invalid storage class for function ‘chrc_get_handle’
 1666 | static gboolean chrc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
client/gatt.c:1676:13: error: invalid storage class for function ‘chrc_set_handle’
 1676 | static void chrc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
client/gatt.c:1695:17: error: invalid storage class for function ‘chrc_get_uuid’
 1695 | static gboolean chrc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:1705:17: error: invalid storage class for function ‘chrc_get_service’
 1705 | static gboolean chrc_get_service(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~
client/gatt.c:1716:17: error: invalid storage class for function ‘chrc_get_value’
 1716 | static gboolean chrc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:1732:17: error: invalid storage class for function ‘chrc_get_notifying’
 1732 | static gboolean chrc_get_notifying(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~
client/gatt.c:1745:17: error: invalid storage class for function ‘chrc_get_flags’
 1745 | static gboolean chrc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:1763:17: error: invalid storage class for function ‘chrc_get_write_acquired’
 1763 | static gboolean chrc_get_write_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1776:17: error: invalid storage class for function ‘chrc_write_acquired_exists’
 1776 | static gboolean chrc_write_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1793:17: error: invalid storage class for function ‘chrc_get_notify_acquired’
 1793 | static gboolean chrc_get_notify_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1806:17: error: invalid storage class for function ‘chrc_notify_acquired_exists’
 1806 | static gboolean chrc_notify_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1824:19: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
client/gatt.c:1824:19: note: (near initialization for ‘chrc_properties[0].get’)
client/gatt.c:1824:36: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
client/gatt.c:1824:36: note: (near initialization for ‘chrc_properties[0].set’)
client/gatt.c:1825:17: error: initializer element is not constant
 1825 |  { "UUID", "s", chrc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
client/gatt.c:1825:17: note: (near initialization for ‘chrc_properties[1].get’)
client/gatt.c:1826:20: error: initializer element is not constant
 1826 |  { "Service", "o", chrc_get_service, NULL, NULL },
      |                    ^~~~~~~~~~~~~~~~
client/gatt.c:1826:20: note: (near initialization for ‘chrc_properties[2].get’)
client/gatt.c:1827:19: error: initializer element is not constant
 1827 |  { "Value", "ay", chrc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:1827:19: note: (near initialization for ‘chrc_properties[3].get’)
client/gatt.c:1828:22: error: initializer element is not constant
 1828 |  { "Notifying", "b", chrc_get_notifying, NULL, NULL },
      |                      ^~~~~~~~~~~~~~~~~~
client/gatt.c:1828:22: note: (near initialization for ‘chrc_properties[4].get’)
client/gatt.c:1829:19: error: initializer element is not constant
 1829 |  { "Flags", "as", chrc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:1829:19: note: (near initialization for ‘chrc_properties[5].get’)
client/gatt.c:1830:26: error: initializer element is not constant
 1830 |  { "WriteAcquired", "b", chrc_get_write_acquired, NULL,
      |                          ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1830:26: note: (near initialization for ‘chrc_properties[6].get’)
client/gatt.c:1831:6: error: initializer element is not constant
 1831 |      chrc_write_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1831:6: note: (near initialization for ‘chrc_properties[6].exists’)
client/gatt.c:1832:27: error: initializer element is not constant
 1832 |  { "NotifyAcquired", "b", chrc_get_notify_acquired, NULL,
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1832:27: note: (near initialization for ‘chrc_properties[7].get’)
client/gatt.c:1833:6: error: initializer element is not constant
 1833 |      chrc_notify_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1833:6: note: (near initialization for ‘chrc_properties[7].exists’)
client/gatt.c:1837:20: error: invalid storage class for function ‘path_to_address’
 1837 | static const char *path_to_address(const char *path)
      |                    ^~~~~~~~~~~~~~~
client/gatt.c:1851:12: error: invalid storage class for function ‘parse_options’
 1851 | static int parse_options(DBusMessageIter *iter, uint16_t *offset, uint16_t *mtu,
      |            ^~~~~~~~~~~~~
client/gatt.c:1911:21: error: invalid storage class for function ‘read_value’
 1911 | static DBusMessage *read_value(DBusMessage *msg, uint8_t *value,
      |                     ^~~~~~~~~~
client/gatt.c:1934:13: error: invalid storage class for function ‘authorize_read_response’
 1934 | static void authorize_read_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1967:13: error: invalid storage class for function ‘is_device_trusted’
 1967 | static bool is_device_trusted(const char *path)
      |             ^~~~~~~~~~~~~~~~~
client/gatt.c:1986:13: error: invalid storage class for function ‘proxy_read_reply’
 1986 | static void proxy_read_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~
client/gatt.c:2033:13: error: invalid storage class for function ‘proxy_read_setup’
 2033 | static void proxy_read_setup(DBusMessageIter *iter, void *user_data)
      |             ^~~~~~~~~~~~~~~~
client/gatt.c:2051:21: error: invalid storage class for function ‘proxy_read_value’
 2051 | static DBusMessage *proxy_read_value(struct GDBusProxy *proxy, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2070:21: error: invalid storage class for function ‘chrc_read_value’
 2070 | static DBusMessage *chrc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
client/gatt.c:2121:12: error: invalid storage class for function ‘parse_value_arg’
 2121 | static int parse_value_arg(DBusMessageIter *iter, uint8_t **value, int *len)
      |            ^~~~~~~~~~~~~~~
client/gatt.c:2134:12: error: invalid storage class for function ‘write_value’
 2134 | static int write_value(size_t *dst_len, uint8_t **dst_value, uint8_t *src_val,
      |            ^~~~~~~~~~~
client/gatt.c:2150:13: error: invalid storage class for function ‘authorize_write_response’
 2150 | static void authorize_write_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:2221:13: error: invalid storage class for function ‘proxy_write_reply’
 2221 | static void proxy_write_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~
client/gatt.c:2240:21: error: invalid storage class for function ‘proxy_write_value’
 2240 | static DBusMessage *proxy_write_value(struct GDBusProxy *proxy,
      |                     ^~~~~~~~~~~~~~~~~
client/gatt.c:2264:21: error: invalid storage class for function ‘chrc_write_value’
 2264 | static DBusMessage *chrc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2340:21: error: invalid storage class for function ‘create_sock’
 2340 | static DBusMessage *create_sock(struct chrc *chrc, DBusMessage *msg)
      |                     ^~~~~~~~~~~
client/gatt.c:2379:21: error: invalid storage class for function ‘chrc_acquire_write’
 2379 | static DBusMessage *chrc_acquire_write(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~
client/gatt.c:2411:21: error: invalid storage class for function ‘chrc_acquire_notify’
 2411 | static DBusMessage *chrc_acquire_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~~
client/gatt.c:2449:13: error: invalid storage class for function ‘proxy_notify_reply’
 2449 | static void proxy_notify_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~
client/gatt.c:2483:21: error: invalid storage class for function ‘proxy_notify’
 2483 | static DBusMessage *proxy_notify(struct chrc *chrc, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
client/gatt.c:2507:21: error: invalid storage class for function ‘chrc_start_notify’
 2507 | static DBusMessage *chrc_start_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~
client/gatt.c:2527:21: error: invalid storage class for function ‘chrc_stop_notify’
 2527 | static DBusMessage *chrc_stop_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2547:21: error: invalid storage class for function ‘chrc_confirm’
 2547 | static DBusMessage *chrc_confirm(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
In file included from client/gatt.c:33:
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
client/gatt.c:2561:6: error: initializer element is not constant
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2561:6: note: (near initialization for ‘chrc_methods[0].function’)
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
client/gatt.c:2564:12: error: initializer element is not constant
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2564:12: note: (near initialization for ‘chrc_methods[1].function’)
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
client/gatt.c:2566:12: error: initializer element is not constant
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2566:12: note: (near initialization for ‘chrc_methods[2].function’)
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
client/gatt.c:2568:12: error: initializer element is not constant
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2568:12: note: (near initialization for ‘chrc_methods[3].function’)
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2569:50: error: initializer element is not constant
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2569:50: note: (near initialization for ‘chrc_methods[4].function’)
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2570:43: error: initializer element is not constant
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2570:43: note: (near initialization for ‘chrc_methods[5].function’)
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2571:40: error: initializer element is not constant
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2571:40: note: (near initialization for ‘chrc_methods[6].function’)
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2575:13: error: invalid storage class for function ‘chrc_set_value’
 2575 | static void chrc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
client/gatt.c:2591:17: error: invalid storage class for function ‘attr_authorization_flag_exists’
 2591 | static gboolean attr_authorization_flag_exists(char **flags)
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:2649:21: error: invalid storage class for function ‘chrc_find’
 2649 | static struct chrc *chrc_find(const char *pattern)
      |                     ^~~~~~~~~
client/gatt.c:2692:21: error: invalid storage class for function ‘desc_read_value’
 2692 | static DBusMessage *desc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
client/gatt.c:2718:21: error: invalid storage class for function ‘desc_write_value’
 2718 | static DBusMessage *desc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
In file included from client/gatt.c:33:
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
client/gatt.c:2763:6: error: initializer element is not constant
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2763:6: note: (near initialization for ‘desc_methods[0].function’)
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
client/gatt.c:2766:12: error: initializer element is not constant
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2766:12: note: (near initialization for ‘desc_methods[1].function’)
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2770:17: error: invalid storage class for function ‘desc_get_handle’
 2770 | static gboolean desc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
client/gatt.c:2780:13: error: invalid storage class for function ‘desc_set_handle’
 2780 | static void desc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
client/gatt.c:2799:17: error: invalid storage class for function ‘desc_get_uuid’
 2799 | static gboolean desc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:2809:17: error: invalid storage class for function ‘desc_get_chrc’
 2809 | static gboolean desc_get_chrc(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:2820:17: error: invalid storage class for function ‘desc_get_value’
 2820 | static gboolean desc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:2838:17: error: invalid storage class for function ‘desc_get_flags’
 2838 | static gboolean desc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:2857:19: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
client/gatt.c:2857:19: note: (near initialization for ‘desc_properties[0].get’)
client/gatt.c:2857:36: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
client/gatt.c:2857:36: note: (near initialization for ‘desc_properties[0].set’)
client/gatt.c:2858:17: error: initializer element is not constant
 2858 |  { "UUID", "s", desc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
client/gatt.c:2858:17: note: (near initialization for ‘desc_properties[1].get’)
client/gatt.c:2859:27: error: initializer element is not constant
 2859 |  { "Characteristic", "o", desc_get_chrc, NULL, NULL },
      |                           ^~~~~~~~~~~~~
client/gatt.c:2859:27: note: (near initialization for ‘desc_properties[2].get’)
client/gatt.c:2860:19: error: initializer element is not constant
 2860 |  { "Value", "ay", desc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:2860:19: note: (near initialization for ‘desc_properties[3].get’)
client/gatt.c:2861:19: error: initializer element is not constant
 2861 |  { "Flags", "as", desc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:2861:19: note: (near initialization for ‘desc_properties[4].get’)
client/gatt.c:2865:13: error: invalid storage class for function ‘desc_set_value’
 2865 | static void desc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
client/gatt.c:2931:21: error: invalid storage class for function ‘desc_find’
 2931 | static struct desc *desc_find(const char *pattern)
      |                     ^~~~~~~~~
client/gatt.c:2979:20: error: invalid storage class for function ‘select_service’
 2979 | static GDBusProxy *select_service(GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
client/gatt.c:2994:13: error: invalid storage class for function ‘proxy_property_changed’
 2994 | static void proxy_property_changed(GDBusProxy *proxy, const char *name,
      |             ^~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:3020:13: error: invalid storage class for function ‘clone_chrc’
 3020 | static void clone_chrc(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~
client/gatt.c:3073:13: error: invalid storage class for function ‘clone_chrcs’
 3073 | static void clone_chrcs(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~
client/gatt.c:3086:13: error: invalid storage class for function ‘clone_service’
 3086 | static void clone_service(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~~
client/gatt.c:3131:13: error: invalid storage class for function ‘clone_device’
 3131 | static void clone_device(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~
client/gatt.c:3144:13: error: invalid storage class for function ‘service_clone’
 3144 | static void service_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~
client/gatt.c:3160:13: error: invalid storage class for function ‘device_clone’
 3160 | static void device_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~
client/gatt.c:3174:20: error: invalid storage class for function ‘proxy_get_name’
 3174 | static const char *proxy_get_name(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
client/gatt.c:3190:20: error: invalid storage class for function ‘proxy_get_alias’
 3190 | static const char *proxy_get_alias(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~~
client/gatt.c:3232:1: error: expected declaration or statement at end of input
 3232 | }
      | ^
At top level:
client/gatt.c:3203:6: error: ‘gatt_clone_attribute’ defined but not used [-Werror=unused-function]
 3203 | void gatt_clone_attribute(GDBusProxy *proxy, int argc, char *argv[])
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2961:6: error: ‘gatt_unregister_desc’ defined but not used [-Werror=unused-function]
 2961 | void gatt_unregister_desc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2881:6: error: ‘gatt_register_desc’ defined but not used [-Werror=unused-function]
 2881 | void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~
client/gatt.c:2674:6: error: ‘gatt_unregister_chrc’ defined but not used [-Werror=unused-function]
 2674 | void gatt_unregister_chrc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2603:6: error: ‘gatt_register_chrc’ defined but not used [-Werror=unused-function]
 2603 | void gatt_register_chrc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~
client/gatt.c:1638:6: error: ‘gatt_unregister_include’ defined but not used [-Werror=unused-function]
 1638 | void gatt_unregister_include(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1608:6: error: ‘gatt_register_include’ defined but not used [-Werror=unused-function]
 1608 | void gatt_register_include(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1573:6: error: ‘gatt_unregister_service’ defined but not used [-Werror=unused-function]
 1573 | void gatt_unregister_service(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7300: client/gatt.o] Error 1
make: *** [Makefile:4324: all] Error 2


##############################
Test: Make Check - FAIL
Desc: Run 'make check'
Output:
client/gatt.c: In function ‘gatt_register_service’:
client/gatt.c:1554:24: error: invalid storage class for function ‘service_find’
 1554 | static struct service *service_find(const char *pattern)
      |                        ^~~~~~~~~~~~
client/gatt.c:1554:1: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
 1554 | static struct service *service_find(const char *pattern)
      | ^~~~~~
client/gatt.c:1594:14: error: invalid storage class for function ‘inc_find’
 1594 | static char *inc_find(struct service  *serv, char *path)
      |              ^~~~~~~~
client/gatt.c:1666:17: error: invalid storage class for function ‘chrc_get_handle’
 1666 | static gboolean chrc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
client/gatt.c:1676:13: error: invalid storage class for function ‘chrc_set_handle’
 1676 | static void chrc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
client/gatt.c:1695:17: error: invalid storage class for function ‘chrc_get_uuid’
 1695 | static gboolean chrc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:1705:17: error: invalid storage class for function ‘chrc_get_service’
 1705 | static gboolean chrc_get_service(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~
client/gatt.c:1716:17: error: invalid storage class for function ‘chrc_get_value’
 1716 | static gboolean chrc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:1732:17: error: invalid storage class for function ‘chrc_get_notifying’
 1732 | static gboolean chrc_get_notifying(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~
client/gatt.c:1745:17: error: invalid storage class for function ‘chrc_get_flags’
 1745 | static gboolean chrc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:1763:17: error: invalid storage class for function ‘chrc_get_write_acquired’
 1763 | static gboolean chrc_get_write_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1776:17: error: invalid storage class for function ‘chrc_write_acquired_exists’
 1776 | static gboolean chrc_write_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1793:17: error: invalid storage class for function ‘chrc_get_notify_acquired’
 1793 | static gboolean chrc_get_notify_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1806:17: error: invalid storage class for function ‘chrc_notify_acquired_exists’
 1806 | static gboolean chrc_notify_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1824:19: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
client/gatt.c:1824:19: note: (near initialization for ‘chrc_properties[0].get’)
client/gatt.c:1824:36: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
client/gatt.c:1824:36: note: (near initialization for ‘chrc_properties[0].set’)
client/gatt.c:1825:17: error: initializer element is not constant
 1825 |  { "UUID", "s", chrc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
client/gatt.c:1825:17: note: (near initialization for ‘chrc_properties[1].get’)
client/gatt.c:1826:20: error: initializer element is not constant
 1826 |  { "Service", "o", chrc_get_service, NULL, NULL },
      |                    ^~~~~~~~~~~~~~~~
client/gatt.c:1826:20: note: (near initialization for ‘chrc_properties[2].get’)
client/gatt.c:1827:19: error: initializer element is not constant
 1827 |  { "Value", "ay", chrc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:1827:19: note: (near initialization for ‘chrc_properties[3].get’)
client/gatt.c:1828:22: error: initializer element is not constant
 1828 |  { "Notifying", "b", chrc_get_notifying, NULL, NULL },
      |                      ^~~~~~~~~~~~~~~~~~
client/gatt.c:1828:22: note: (near initialization for ‘chrc_properties[4].get’)
client/gatt.c:1829:19: error: initializer element is not constant
 1829 |  { "Flags", "as", chrc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:1829:19: note: (near initialization for ‘chrc_properties[5].get’)
client/gatt.c:1830:26: error: initializer element is not constant
 1830 |  { "WriteAcquired", "b", chrc_get_write_acquired, NULL,
      |                          ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1830:26: note: (near initialization for ‘chrc_properties[6].get’)
client/gatt.c:1831:6: error: initializer element is not constant
 1831 |      chrc_write_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1831:6: note: (near initialization for ‘chrc_properties[6].exists’)
client/gatt.c:1832:27: error: initializer element is not constant
 1832 |  { "NotifyAcquired", "b", chrc_get_notify_acquired, NULL,
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1832:27: note: (near initialization for ‘chrc_properties[7].get’)
client/gatt.c:1833:6: error: initializer element is not constant
 1833 |      chrc_notify_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1833:6: note: (near initialization for ‘chrc_properties[7].exists’)
client/gatt.c:1837:20: error: invalid storage class for function ‘path_to_address’
 1837 | static const char *path_to_address(const char *path)
      |                    ^~~~~~~~~~~~~~~
client/gatt.c:1851:12: error: invalid storage class for function ‘parse_options’
 1851 | static int parse_options(DBusMessageIter *iter, uint16_t *offset, uint16_t *mtu,
      |            ^~~~~~~~~~~~~
client/gatt.c:1911:21: error: invalid storage class for function ‘read_value’
 1911 | static DBusMessage *read_value(DBusMessage *msg, uint8_t *value,
      |                     ^~~~~~~~~~
client/gatt.c:1934:13: error: invalid storage class for function ‘authorize_read_response’
 1934 | static void authorize_read_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1967:13: error: invalid storage class for function ‘is_device_trusted’
 1967 | static bool is_device_trusted(const char *path)
      |             ^~~~~~~~~~~~~~~~~
client/gatt.c:1986:13: error: invalid storage class for function ‘proxy_read_reply’
 1986 | static void proxy_read_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~
client/gatt.c:2033:13: error: invalid storage class for function ‘proxy_read_setup’
 2033 | static void proxy_read_setup(DBusMessageIter *iter, void *user_data)
      |             ^~~~~~~~~~~~~~~~
client/gatt.c:2051:21: error: invalid storage class for function ‘proxy_read_value’
 2051 | static DBusMessage *proxy_read_value(struct GDBusProxy *proxy, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2070:21: error: invalid storage class for function ‘chrc_read_value’
 2070 | static DBusMessage *chrc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
client/gatt.c:2121:12: error: invalid storage class for function ‘parse_value_arg’
 2121 | static int parse_value_arg(DBusMessageIter *iter, uint8_t **value, int *len)
      |            ^~~~~~~~~~~~~~~
client/gatt.c:2134:12: error: invalid storage class for function ‘write_value’
 2134 | static int write_value(size_t *dst_len, uint8_t **dst_value, uint8_t *src_val,
      |            ^~~~~~~~~~~
client/gatt.c:2150:13: error: invalid storage class for function ‘authorize_write_response’
 2150 | static void authorize_write_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:2221:13: error: invalid storage class for function ‘proxy_write_reply’
 2221 | static void proxy_write_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~
client/gatt.c:2240:21: error: invalid storage class for function ‘proxy_write_value’
 2240 | static DBusMessage *proxy_write_value(struct GDBusProxy *proxy,
      |                     ^~~~~~~~~~~~~~~~~
client/gatt.c:2264:21: error: invalid storage class for function ‘chrc_write_value’
 2264 | static DBusMessage *chrc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2340:21: error: invalid storage class for function ‘create_sock’
 2340 | static DBusMessage *create_sock(struct chrc *chrc, DBusMessage *msg)
      |                     ^~~~~~~~~~~
client/gatt.c:2379:21: error: invalid storage class for function ‘chrc_acquire_write’
 2379 | static DBusMessage *chrc_acquire_write(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~
client/gatt.c:2411:21: error: invalid storage class for function ‘chrc_acquire_notify’
 2411 | static DBusMessage *chrc_acquire_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~~
client/gatt.c:2449:13: error: invalid storage class for function ‘proxy_notify_reply’
 2449 | static void proxy_notify_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~
client/gatt.c:2483:21: error: invalid storage class for function ‘proxy_notify’
 2483 | static DBusMessage *proxy_notify(struct chrc *chrc, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
client/gatt.c:2507:21: error: invalid storage class for function ‘chrc_start_notify’
 2507 | static DBusMessage *chrc_start_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~
client/gatt.c:2527:21: error: invalid storage class for function ‘chrc_stop_notify’
 2527 | static DBusMessage *chrc_stop_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2547:21: error: invalid storage class for function ‘chrc_confirm’
 2547 | static DBusMessage *chrc_confirm(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
In file included from client/gatt.c:33:
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
client/gatt.c:2561:6: error: initializer element is not constant
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2561:6: note: (near initialization for ‘chrc_methods[0].function’)
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
client/gatt.c:2564:12: error: initializer element is not constant
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2564:12: note: (near initialization for ‘chrc_methods[1].function’)
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
client/gatt.c:2566:12: error: initializer element is not constant
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2566:12: note: (near initialization for ‘chrc_methods[2].function’)
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
client/gatt.c:2568:12: error: initializer element is not constant
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2568:12: note: (near initialization for ‘chrc_methods[3].function’)
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2569:50: error: initializer element is not constant
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2569:50: note: (near initialization for ‘chrc_methods[4].function’)
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2570:43: error: initializer element is not constant
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2570:43: note: (near initialization for ‘chrc_methods[5].function’)
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2571:40: error: initializer element is not constant
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2571:40: note: (near initialization for ‘chrc_methods[6].function’)
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2575:13: error: invalid storage class for function ‘chrc_set_value’
 2575 | static void chrc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
client/gatt.c:2591:17: error: invalid storage class for function ‘attr_authorization_flag_exists’
 2591 | static gboolean attr_authorization_flag_exists(char **flags)
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:2649:21: error: invalid storage class for function ‘chrc_find’
 2649 | static struct chrc *chrc_find(const char *pattern)
      |                     ^~~~~~~~~
client/gatt.c:2692:21: error: invalid storage class for function ‘desc_read_value’
 2692 | static DBusMessage *desc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
client/gatt.c:2718:21: error: invalid storage class for function ‘desc_write_value’
 2718 | static DBusMessage *desc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
In file included from client/gatt.c:33:
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
client/gatt.c:2763:6: error: initializer element is not constant
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2763:6: note: (near initialization for ‘desc_methods[0].function’)
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
client/gatt.c:2766:12: error: initializer element is not constant
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2766:12: note: (near initialization for ‘desc_methods[1].function’)
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2770:17: error: invalid storage class for function ‘desc_get_handle’
 2770 | static gboolean desc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
client/gatt.c:2780:13: error: invalid storage class for function ‘desc_set_handle’
 2780 | static void desc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
client/gatt.c:2799:17: error: invalid storage class for function ‘desc_get_uuid’
 2799 | static gboolean desc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:2809:17: error: invalid storage class for function ‘desc_get_chrc’
 2809 | static gboolean desc_get_chrc(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:2820:17: error: invalid storage class for function ‘desc_get_value’
 2820 | static gboolean desc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:2838:17: error: invalid storage class for function ‘desc_get_flags’
 2838 | static gboolean desc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:2857:19: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
client/gatt.c:2857:19: note: (near initialization for ‘desc_properties[0].get’)
client/gatt.c:2857:36: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
client/gatt.c:2857:36: note: (near initialization for ‘desc_properties[0].set’)
client/gatt.c:2858:17: error: initializer element is not constant
 2858 |  { "UUID", "s", desc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
client/gatt.c:2858:17: note: (near initialization for ‘desc_properties[1].get’)
client/gatt.c:2859:27: error: initializer element is not constant
 2859 |  { "Characteristic", "o", desc_get_chrc, NULL, NULL },
      |                           ^~~~~~~~~~~~~
client/gatt.c:2859:27: note: (near initialization for ‘desc_properties[2].get’)
client/gatt.c:2860:19: error: initializer element is not constant
 2860 |  { "Value", "ay", desc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:2860:19: note: (near initialization for ‘desc_properties[3].get’)
client/gatt.c:2861:19: error: initializer element is not constant
 2861 |  { "Flags", "as", desc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:2861:19: note: (near initialization for ‘desc_properties[4].get’)
client/gatt.c:2865:13: error: invalid storage class for function ‘desc_set_value’
 2865 | static void desc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
client/gatt.c:2931:21: error: invalid storage class for function ‘desc_find’
 2931 | static struct desc *desc_find(const char *pattern)
      |                     ^~~~~~~~~
client/gatt.c:2979:20: error: invalid storage class for function ‘select_service’
 2979 | static GDBusProxy *select_service(GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
client/gatt.c:2994:13: error: invalid storage class for function ‘proxy_property_changed’
 2994 | static void proxy_property_changed(GDBusProxy *proxy, const char *name,
      |             ^~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:3020:13: error: invalid storage class for function ‘clone_chrc’
 3020 | static void clone_chrc(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~
client/gatt.c:3073:13: error: invalid storage class for function ‘clone_chrcs’
 3073 | static void clone_chrcs(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~
client/gatt.c:3086:13: error: invalid storage class for function ‘clone_service’
 3086 | static void clone_service(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~~
client/gatt.c:3131:13: error: invalid storage class for function ‘clone_device’
 3131 | static void clone_device(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~
client/gatt.c:3144:13: error: invalid storage class for function ‘service_clone’
 3144 | static void service_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~
client/gatt.c:3160:13: error: invalid storage class for function ‘device_clone’
 3160 | static void device_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~
client/gatt.c:3174:20: error: invalid storage class for function ‘proxy_get_name’
 3174 | static const char *proxy_get_name(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
client/gatt.c:3190:20: error: invalid storage class for function ‘proxy_get_alias’
 3190 | static const char *proxy_get_alias(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~~
client/gatt.c:3232:1: error: expected declaration or statement at end of input
 3232 | }
      | ^
At top level:
client/gatt.c:3203:6: error: ‘gatt_clone_attribute’ defined but not used [-Werror=unused-function]
 3203 | void gatt_clone_attribute(GDBusProxy *proxy, int argc, char *argv[])
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2961:6: error: ‘gatt_unregister_desc’ defined but not used [-Werror=unused-function]
 2961 | void gatt_unregister_desc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2881:6: error: ‘gatt_register_desc’ defined but not used [-Werror=unused-function]
 2881 | void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~
client/gatt.c:2674:6: error: ‘gatt_unregister_chrc’ defined but not used [-Werror=unused-function]
 2674 | void gatt_unregister_chrc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2603:6: error: ‘gatt_register_chrc’ defined but not used [-Werror=unused-function]
 2603 | void gatt_register_chrc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~
client/gatt.c:1638:6: error: ‘gatt_unregister_include’ defined but not used [-Werror=unused-function]
 1638 | void gatt_unregister_include(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1608:6: error: ‘gatt_register_include’ defined but not used [-Werror=unused-function]
 1608 | void gatt_register_include(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1573:6: error: ‘gatt_unregister_service’ defined but not used [-Werror=unused-function]
 1573 | void gatt_unregister_service(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7300: client/gatt.o] Error 1
make: *** [Makefile:11320: check] Error 2


##############################
Test: Make Check w/Valgrind - FAIL
Desc: Run 'make check' with Valgrind
Output:
client/gatt.c: In function ‘gatt_register_service’:
client/gatt.c:1554:24: error: invalid storage class for function ‘service_find’
 1554 | static struct service *service_find(const char *pattern)
      |                        ^~~~~~~~~~~~
client/gatt.c:1554:1: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
 1554 | static struct service *service_find(const char *pattern)
      | ^~~~~~
client/gatt.c:1594:14: error: invalid storage class for function ‘inc_find’
 1594 | static char *inc_find(struct service  *serv, char *path)
      |              ^~~~~~~~
client/gatt.c:1666:17: error: invalid storage class for function ‘chrc_get_handle’
 1666 | static gboolean chrc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
client/gatt.c:1676:13: error: invalid storage class for function ‘chrc_set_handle’
 1676 | static void chrc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
client/gatt.c:1695:17: error: invalid storage class for function ‘chrc_get_uuid’
 1695 | static gboolean chrc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:1705:17: error: invalid storage class for function ‘chrc_get_service’
 1705 | static gboolean chrc_get_service(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~
client/gatt.c:1716:17: error: invalid storage class for function ‘chrc_get_value’
 1716 | static gboolean chrc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:1732:17: error: invalid storage class for function ‘chrc_get_notifying’
 1732 | static gboolean chrc_get_notifying(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~
client/gatt.c:1745:17: error: invalid storage class for function ‘chrc_get_flags’
 1745 | static gboolean chrc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:1763:17: error: invalid storage class for function ‘chrc_get_write_acquired’
 1763 | static gboolean chrc_get_write_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1776:17: error: invalid storage class for function ‘chrc_write_acquired_exists’
 1776 | static gboolean chrc_write_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1793:17: error: invalid storage class for function ‘chrc_get_notify_acquired’
 1793 | static gboolean chrc_get_notify_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1806:17: error: invalid storage class for function ‘chrc_notify_acquired_exists’
 1806 | static gboolean chrc_notify_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1824:19: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
client/gatt.c:1824:19: note: (near initialization for ‘chrc_properties[0].get’)
client/gatt.c:1824:36: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
client/gatt.c:1824:36: note: (near initialization for ‘chrc_properties[0].set’)
client/gatt.c:1825:17: error: initializer element is not constant
 1825 |  { "UUID", "s", chrc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
client/gatt.c:1825:17: note: (near initialization for ‘chrc_properties[1].get’)
client/gatt.c:1826:20: error: initializer element is not constant
 1826 |  { "Service", "o", chrc_get_service, NULL, NULL },
      |                    ^~~~~~~~~~~~~~~~
client/gatt.c:1826:20: note: (near initialization for ‘chrc_properties[2].get’)
client/gatt.c:1827:19: error: initializer element is not constant
 1827 |  { "Value", "ay", chrc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:1827:19: note: (near initialization for ‘chrc_properties[3].get’)
client/gatt.c:1828:22: error: initializer element is not constant
 1828 |  { "Notifying", "b", chrc_get_notifying, NULL, NULL },
      |                      ^~~~~~~~~~~~~~~~~~
client/gatt.c:1828:22: note: (near initialization for ‘chrc_properties[4].get’)
client/gatt.c:1829:19: error: initializer element is not constant
 1829 |  { "Flags", "as", chrc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:1829:19: note: (near initialization for ‘chrc_properties[5].get’)
client/gatt.c:1830:26: error: initializer element is not constant
 1830 |  { "WriteAcquired", "b", chrc_get_write_acquired, NULL,
      |                          ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1830:26: note: (near initialization for ‘chrc_properties[6].get’)
client/gatt.c:1831:6: error: initializer element is not constant
 1831 |      chrc_write_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1831:6: note: (near initialization for ‘chrc_properties[6].exists’)
client/gatt.c:1832:27: error: initializer element is not constant
 1832 |  { "NotifyAcquired", "b", chrc_get_notify_acquired, NULL,
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1832:27: note: (near initialization for ‘chrc_properties[7].get’)
client/gatt.c:1833:6: error: initializer element is not constant
 1833 |      chrc_notify_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1833:6: note: (near initialization for ‘chrc_properties[7].exists’)
client/gatt.c:1837:20: error: invalid storage class for function ‘path_to_address’
 1837 | static const char *path_to_address(const char *path)
      |                    ^~~~~~~~~~~~~~~
client/gatt.c:1851:12: error: invalid storage class for function ‘parse_options’
 1851 | static int parse_options(DBusMessageIter *iter, uint16_t *offset, uint16_t *mtu,
      |            ^~~~~~~~~~~~~
client/gatt.c:1911:21: error: invalid storage class for function ‘read_value’
 1911 | static DBusMessage *read_value(DBusMessage *msg, uint8_t *value,
      |                     ^~~~~~~~~~
client/gatt.c:1934:13: error: invalid storage class for function ‘authorize_read_response’
 1934 | static void authorize_read_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1967:13: error: invalid storage class for function ‘is_device_trusted’
 1967 | static bool is_device_trusted(const char *path)
      |             ^~~~~~~~~~~~~~~~~
client/gatt.c:1986:13: error: invalid storage class for function ‘proxy_read_reply’
 1986 | static void proxy_read_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~
client/gatt.c:2033:13: error: invalid storage class for function ‘proxy_read_setup’
 2033 | static void proxy_read_setup(DBusMessageIter *iter, void *user_data)
      |             ^~~~~~~~~~~~~~~~
client/gatt.c:2051:21: error: invalid storage class for function ‘proxy_read_value’
 2051 | static DBusMessage *proxy_read_value(struct GDBusProxy *proxy, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2070:21: error: invalid storage class for function ‘chrc_read_value’
 2070 | static DBusMessage *chrc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
client/gatt.c:2121:12: error: invalid storage class for function ‘parse_value_arg’
 2121 | static int parse_value_arg(DBusMessageIter *iter, uint8_t **value, int *len)
      |            ^~~~~~~~~~~~~~~
client/gatt.c:2134:12: error: invalid storage class for function ‘write_value’
 2134 | static int write_value(size_t *dst_len, uint8_t **dst_value, uint8_t *src_val,
      |            ^~~~~~~~~~~
client/gatt.c:2150:13: error: invalid storage class for function ‘authorize_write_response’
 2150 | static void authorize_write_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:2221:13: error: invalid storage class for function ‘proxy_write_reply’
 2221 | static void proxy_write_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~
client/gatt.c:2240:21: error: invalid storage class for function ‘proxy_write_value’
 2240 | static DBusMessage *proxy_write_value(struct GDBusProxy *proxy,
      |                     ^~~~~~~~~~~~~~~~~
client/gatt.c:2264:21: error: invalid storage class for function ‘chrc_write_value’
 2264 | static DBusMessage *chrc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2340:21: error: invalid storage class for function ‘create_sock’
 2340 | static DBusMessage *create_sock(struct chrc *chrc, DBusMessage *msg)
      |                     ^~~~~~~~~~~
client/gatt.c:2379:21: error: invalid storage class for function ‘chrc_acquire_write’
 2379 | static DBusMessage *chrc_acquire_write(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~
client/gatt.c:2411:21: error: invalid storage class for function ‘chrc_acquire_notify’
 2411 | static DBusMessage *chrc_acquire_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~~
client/gatt.c:2449:13: error: invalid storage class for function ‘proxy_notify_reply’
 2449 | static void proxy_notify_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~
client/gatt.c:2483:21: error: invalid storage class for function ‘proxy_notify’
 2483 | static DBusMessage *proxy_notify(struct chrc *chrc, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
client/gatt.c:2507:21: error: invalid storage class for function ‘chrc_start_notify’
 2507 | static DBusMessage *chrc_start_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~
client/gatt.c:2527:21: error: invalid storage class for function ‘chrc_stop_notify’
 2527 | static DBusMessage *chrc_stop_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2547:21: error: invalid storage class for function ‘chrc_confirm’
 2547 | static DBusMessage *chrc_confirm(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
In file included from client/gatt.c:33:
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
client/gatt.c:2561:6: error: initializer element is not constant
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2561:6: note: (near initialization for ‘chrc_methods[0].function’)
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
client/gatt.c:2564:12: error: initializer element is not constant
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2564:12: note: (near initialization for ‘chrc_methods[1].function’)
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
client/gatt.c:2566:12: error: initializer element is not constant
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2566:12: note: (near initialization for ‘chrc_methods[2].function’)
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
client/gatt.c:2568:12: error: initializer element is not constant
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2568:12: note: (near initialization for ‘chrc_methods[3].function’)
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2569:50: error: initializer element is not constant
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2569:50: note: (near initialization for ‘chrc_methods[4].function’)
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2570:43: error: initializer element is not constant
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2570:43: note: (near initialization for ‘chrc_methods[5].function’)
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2571:40: error: initializer element is not constant
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2571:40: note: (near initialization for ‘chrc_methods[6].function’)
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2575:13: error: invalid storage class for function ‘chrc_set_value’
 2575 | static void chrc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
client/gatt.c:2591:17: error: invalid storage class for function ‘attr_authorization_flag_exists’
 2591 | static gboolean attr_authorization_flag_exists(char **flags)
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:2649:21: error: invalid storage class for function ‘chrc_find’
 2649 | static struct chrc *chrc_find(const char *pattern)
      |                     ^~~~~~~~~
client/gatt.c:2692:21: error: invalid storage class for function ‘desc_read_value’
 2692 | static DBusMessage *desc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
client/gatt.c:2718:21: error: invalid storage class for function ‘desc_write_value’
 2718 | static DBusMessage *desc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
In file included from client/gatt.c:33:
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
client/gatt.c:2763:6: error: initializer element is not constant
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2763:6: note: (near initialization for ‘desc_methods[0].function’)
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
client/gatt.c:2766:12: error: initializer element is not constant
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2766:12: note: (near initialization for ‘desc_methods[1].function’)
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2770:17: error: invalid storage class for function ‘desc_get_handle’
 2770 | static gboolean desc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
client/gatt.c:2780:13: error: invalid storage class for function ‘desc_set_handle’
 2780 | static void desc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
client/gatt.c:2799:17: error: invalid storage class for function ‘desc_get_uuid’
 2799 | static gboolean desc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:2809:17: error: invalid storage class for function ‘desc_get_chrc’
 2809 | static gboolean desc_get_chrc(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:2820:17: error: invalid storage class for function ‘desc_get_value’
 2820 | static gboolean desc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:2838:17: error: invalid storage class for function ‘desc_get_flags’
 2838 | static gboolean desc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:2857:19: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
client/gatt.c:2857:19: note: (near initialization for ‘desc_properties[0].get’)
client/gatt.c:2857:36: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
client/gatt.c:2857:36: note: (near initialization for ‘desc_properties[0].set’)
client/gatt.c:2858:17: error: initializer element is not constant
 2858 |  { "UUID", "s", desc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
client/gatt.c:2858:17: note: (near initialization for ‘desc_properties[1].get’)
client/gatt.c:2859:27: error: initializer element is not constant
 2859 |  { "Characteristic", "o", desc_get_chrc, NULL, NULL },
      |                           ^~~~~~~~~~~~~
client/gatt.c:2859:27: note: (near initialization for ‘desc_properties[2].get’)
client/gatt.c:2860:19: error: initializer element is not constant
 2860 |  { "Value", "ay", desc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:2860:19: note: (near initialization for ‘desc_properties[3].get’)
client/gatt.c:2861:19: error: initializer element is not constant
 2861 |  { "Flags", "as", desc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:2861:19: note: (near initialization for ‘desc_properties[4].get’)
client/gatt.c:2865:13: error: invalid storage class for function ‘desc_set_value’
 2865 | static void desc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
client/gatt.c:2931:21: error: invalid storage class for function ‘desc_find’
 2931 | static struct desc *desc_find(const char *pattern)
      |                     ^~~~~~~~~
client/gatt.c:2979:20: error: invalid storage class for function ‘select_service’
 2979 | static GDBusProxy *select_service(GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
client/gatt.c:2994:13: error: invalid storage class for function ‘proxy_property_changed’
 2994 | static void proxy_property_changed(GDBusProxy *proxy, const char *name,
      |             ^~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:3020:13: error: invalid storage class for function ‘clone_chrc’
 3020 | static void clone_chrc(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~
client/gatt.c:3073:13: error: invalid storage class for function ‘clone_chrcs’
 3073 | static void clone_chrcs(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~
client/gatt.c:3086:13: error: invalid storage class for function ‘clone_service’
 3086 | static void clone_service(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~~
client/gatt.c:3131:13: error: invalid storage class for function ‘clone_device’
 3131 | static void clone_device(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~
client/gatt.c:3144:13: error: invalid storage class for function ‘service_clone’
 3144 | static void service_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~
client/gatt.c:3160:13: error: invalid storage class for function ‘device_clone’
 3160 | static void device_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~
client/gatt.c:3174:20: error: invalid storage class for function ‘proxy_get_name’
 3174 | static const char *proxy_get_name(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
client/gatt.c:3190:20: error: invalid storage class for function ‘proxy_get_alias’
 3190 | static const char *proxy_get_alias(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~~
client/gatt.c:3232:1: error: expected declaration or statement at end of input
 3232 | }
      | ^
At top level:
client/gatt.c:3203:6: error: ‘gatt_clone_attribute’ defined but not used [-Werror=unused-function]
 3203 | void gatt_clone_attribute(GDBusProxy *proxy, int argc, char *argv[])
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2961:6: error: ‘gatt_unregister_desc’ defined but not used [-Werror=unused-function]
 2961 | void gatt_unregister_desc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2881:6: error: ‘gatt_register_desc’ defined but not used [-Werror=unused-function]
 2881 | void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~
client/gatt.c:2674:6: error: ‘gatt_unregister_chrc’ defined but not used [-Werror=unused-function]
 2674 | void gatt_unregister_chrc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2603:6: error: ‘gatt_register_chrc’ defined but not used [-Werror=unused-function]
 2603 | void gatt_register_chrc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~
client/gatt.c:1638:6: error: ‘gatt_unregister_include’ defined but not used [-Werror=unused-function]
 1638 | void gatt_unregister_include(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1608:6: error: ‘gatt_register_include’ defined but not used [-Werror=unused-function]
 1608 | void gatt_register_include(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1573:6: error: ‘gatt_unregister_service’ defined but not used [-Werror=unused-function]
 1573 | void gatt_unregister_service(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7300: client/gatt.o] Error 1
make: *** [Makefile:4324: all] Error 2


##############################
Test: Make Distcheck - FAIL
Desc: Run distcheck to check the distribution
Output:
../../client/gatt.c: In function ‘gatt_register_service’:
../../client/gatt.c:1554:24: error: invalid storage class for function ‘service_find’
 1554 | static struct service *service_find(const char *pattern)
      |                        ^~~~~~~~~~~~
../../client/gatt.c:1594:14: error: invalid storage class for function ‘inc_find’
 1594 | static char *inc_find(struct service  *serv, char *path)
      |              ^~~~~~~~
../../client/gatt.c:1666:17: error: invalid storage class for function ‘chrc_get_handle’
 1666 | static gboolean chrc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
../../client/gatt.c:1676:13: error: invalid storage class for function ‘chrc_set_handle’
 1676 | static void chrc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
../../client/gatt.c:1695:17: error: invalid storage class for function ‘chrc_get_uuid’
 1695 | static gboolean chrc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
../../client/gatt.c:1705:17: error: invalid storage class for function ‘chrc_get_service’
 1705 | static gboolean chrc_get_service(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~
../../client/gatt.c:1716:17: error: invalid storage class for function ‘chrc_get_value’
 1716 | static gboolean chrc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
../../client/gatt.c:1732:17: error: invalid storage class for function ‘chrc_get_notifying’
 1732 | static gboolean chrc_get_notifying(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~
../../client/gatt.c:1745:17: error: invalid storage class for function ‘chrc_get_flags’
 1745 | static gboolean chrc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
../../client/gatt.c:1763:17: error: invalid storage class for function ‘chrc_get_write_acquired’
 1763 | static gboolean chrc_get_write_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:1776:17: error: invalid storage class for function ‘chrc_write_acquired_exists’
 1776 | static gboolean chrc_write_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:1793:17: error: invalid storage class for function ‘chrc_get_notify_acquired’
 1793 | static gboolean chrc_get_notify_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:1806:17: error: invalid storage class for function ‘chrc_notify_acquired_exists’
 1806 | static gboolean chrc_notify_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:1824:19: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
../../client/gatt.c:1824:19: note: (near initialization for ‘chrc_properties[0].get’)
../../client/gatt.c:1824:36: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
../../client/gatt.c:1824:36: note: (near initialization for ‘chrc_properties[0].set’)
../../client/gatt.c:1825:17: error: initializer element is not constant
 1825 |  { "UUID", "s", chrc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
../../client/gatt.c:1825:17: note: (near initialization for ‘chrc_properties[1].get’)
../../client/gatt.c:1826:20: error: initializer element is not constant
 1826 |  { "Service", "o", chrc_get_service, NULL, NULL },
      |                    ^~~~~~~~~~~~~~~~
../../client/gatt.c:1826:20: note: (near initialization for ‘chrc_properties[2].get’)
../../client/gatt.c:1827:19: error: initializer element is not constant
 1827 |  { "Value", "ay", chrc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
../../client/gatt.c:1827:19: note: (near initialization for ‘chrc_properties[3].get’)
../../client/gatt.c:1828:22: error: initializer element is not constant
 1828 |  { "Notifying", "b", chrc_get_notifying, NULL, NULL },
      |                      ^~~~~~~~~~~~~~~~~~
../../client/gatt.c:1828:22: note: (near initialization for ‘chrc_properties[4].get’)
../../client/gatt.c:1829:19: error: initializer element is not constant
 1829 |  { "Flags", "as", chrc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
../../client/gatt.c:1829:19: note: (near initialization for ‘chrc_properties[5].get’)
../../client/gatt.c:1830:26: error: initializer element is not constant
 1830 |  { "WriteAcquired", "b", chrc_get_write_acquired, NULL,
      |                          ^~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:1830:26: note: (near initialization for ‘chrc_properties[6].get’)
../../client/gatt.c:1831:6: error: initializer element is not constant
 1831 |      chrc_write_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:1831:6: note: (near initialization for ‘chrc_properties[6].exists’)
../../client/gatt.c:1832:27: error: initializer element is not constant
 1832 |  { "NotifyAcquired", "b", chrc_get_notify_acquired, NULL,
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:1832:27: note: (near initialization for ‘chrc_properties[7].get’)
../../client/gatt.c:1833:6: error: initializer element is not constant
 1833 |      chrc_notify_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:1833:6: note: (near initialization for ‘chrc_properties[7].exists’)
../../client/gatt.c:1837:20: error: invalid storage class for function ‘path_to_address’
 1837 | static const char *path_to_address(const char *path)
      |                    ^~~~~~~~~~~~~~~
../../client/gatt.c:1851:12: error: invalid storage class for function ‘parse_options’
 1851 | static int parse_options(DBusMessageIter *iter, uint16_t *offset, uint16_t *mtu,
      |            ^~~~~~~~~~~~~
../../client/gatt.c:1911:21: error: invalid storage class for function ‘read_value’
 1911 | static DBusMessage *read_value(DBusMessage *msg, uint8_t *value,
      |                     ^~~~~~~~~~
../../client/gatt.c:1934:13: error: invalid storage class for function ‘authorize_read_response’
 1934 | static void authorize_read_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:1967:13: error: invalid storage class for function ‘is_device_trusted’
 1967 | static bool is_device_trusted(const char *path)
      |             ^~~~~~~~~~~~~~~~~
../../client/gatt.c:1986:13: error: invalid storage class for function ‘proxy_read_reply’
 1986 | static void proxy_read_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~
../../client/gatt.c:2033:13: error: invalid storage class for function ‘proxy_read_setup’
 2033 | static void proxy_read_setup(DBusMessageIter *iter, void *user_data)
      |             ^~~~~~~~~~~~~~~~
../../client/gatt.c:2051:21: error: invalid storage class for function ‘proxy_read_value’
 2051 | static DBusMessage *proxy_read_value(struct GDBusProxy *proxy, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
../../client/gatt.c:2070:21: error: invalid storage class for function ‘chrc_read_value’
 2070 | static DBusMessage *chrc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
../../client/gatt.c:2121:12: error: invalid storage class for function ‘parse_value_arg’
 2121 | static int parse_value_arg(DBusMessageIter *iter, uint8_t **value, int *len)
      |            ^~~~~~~~~~~~~~~
../../client/gatt.c:2134:12: error: invalid storage class for function ‘write_value’
 2134 | static int write_value(size_t *dst_len, uint8_t **dst_value, uint8_t *src_val,
      |            ^~~~~~~~~~~
../../client/gatt.c:2150:13: error: invalid storage class for function ‘authorize_write_response’
 2150 | static void authorize_write_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:2221:13: error: invalid storage class for function ‘proxy_write_reply’
 2221 | static void proxy_write_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~
../../client/gatt.c:2240:21: error: invalid storage class for function ‘proxy_write_value’
 2240 | static DBusMessage *proxy_write_value(struct GDBusProxy *proxy,
      |                     ^~~~~~~~~~~~~~~~~
../../client/gatt.c:2264:21: error: invalid storage class for function ‘chrc_write_value’
 2264 | static DBusMessage *chrc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
../../client/gatt.c:2340:21: error: invalid storage class for function ‘create_sock’
 2340 | static DBusMessage *create_sock(struct chrc *chrc, DBusMessage *msg)
      |                     ^~~~~~~~~~~
../../client/gatt.c:2379:21: error: invalid storage class for function ‘chrc_acquire_write’
 2379 | static DBusMessage *chrc_acquire_write(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~
../../client/gatt.c:2411:21: error: invalid storage class for function ‘chrc_acquire_notify’
 2411 | static DBusMessage *chrc_acquire_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~~
../../client/gatt.c:2449:13: error: invalid storage class for function ‘proxy_notify_reply’
 2449 | static void proxy_notify_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~
../../client/gatt.c:2483:21: error: invalid storage class for function ‘proxy_notify’
 2483 | static DBusMessage *proxy_notify(struct chrc *chrc, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
../../client/gatt.c:2507:21: error: invalid storage class for function ‘chrc_start_notify’
 2507 | static DBusMessage *chrc_start_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~
../../client/gatt.c:2527:21: error: invalid storage class for function ‘chrc_stop_notify’
 2527 | static DBusMessage *chrc_stop_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
../../client/gatt.c:2547:21: error: invalid storage class for function ‘chrc_confirm’
 2547 | static DBusMessage *chrc_confirm(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
In file included from ../../client/gatt.c:33:
../../gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: warning: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Wincompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
../../client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
../../client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
../../client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
../../client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
../../client/gatt.c:2561:6: error: initializer element is not constant
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
../../gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
../../client/gatt.c:2561:6: note: (near initialization for ‘chrc_methods[0].function’)
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
../../gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
../../gdbus/gdbus.h:146:29: warning: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Wincompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
../../client/gatt.c:2564:12: error: initializer element is not constant
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
../../client/gatt.c:2564:12: note: (near initialization for ‘chrc_methods[1].function’)
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
../../gdbus/gdbus.h:146:29: warning: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Wincompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
../../client/gatt.c:2566:12: error: initializer element is not constant
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
../../client/gatt.c:2566:12: note: (near initialization for ‘chrc_methods[2].function’)
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
../../gdbus/gdbus.h:146:29: warning: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Wincompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
../../client/gatt.c:2568:12: error: initializer element is not constant
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
../../client/gatt.c:2568:12: note: (near initialization for ‘chrc_methods[3].function’)
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
../../client/gatt.c:2569:50: error: initializer element is not constant
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
../../client/gatt.c:2569:50: note: (near initialization for ‘chrc_methods[4].function’)
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
../../client/gatt.c:2570:43: error: initializer element is not constant
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
../../client/gatt.c:2570:43: note: (near initialization for ‘chrc_methods[5].function’)
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
../../client/gatt.c:2571:40: error: initializer element is not constant
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
../../gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
../../client/gatt.c:2571:40: note: (near initialization for ‘chrc_methods[6].function’)
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
../../gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
../../client/gatt.c:2575:13: error: invalid storage class for function ‘chrc_set_value’
 2575 | static void chrc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
../../client/gatt.c:2591:17: error: invalid storage class for function ‘attr_authorization_flag_exists’
 2591 | static gboolean attr_authorization_flag_exists(char **flags)
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:2649:21: error: invalid storage class for function ‘chrc_find’
 2649 | static struct chrc *chrc_find(const char *pattern)
      |                     ^~~~~~~~~
../../client/gatt.c:2692:21: error: invalid storage class for function ‘desc_read_value’
 2692 | static DBusMessage *desc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
../../client/gatt.c:2718:21: error: invalid storage class for function ‘desc_write_value’
 2718 | static DBusMessage *desc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
In file included from ../../client/gatt.c:33:
../../gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: warning: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Wincompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
../../client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
../../client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
../../client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
../../client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
../../client/gatt.c:2763:6: error: initializer element is not constant
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
../../gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
../../client/gatt.c:2763:6: note: (near initialization for ‘desc_methods[0].function’)
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
../../gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
../../gdbus/gdbus.h:146:29: warning: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Wincompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
../../gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
../../gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
../../client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
../../client/gatt.c:2766:12: error: initializer element is not constant
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
../../client/gatt.c:2766:12: note: (near initialization for ‘desc_methods[1].function’)
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
../../gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
../../client/gatt.c:2770:17: error: invalid storage class for function ‘desc_get_handle’
 2770 | static gboolean desc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
../../client/gatt.c:2780:13: error: invalid storage class for function ‘desc_set_handle’
 2780 | static void desc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
../../client/gatt.c:2799:17: error: invalid storage class for function ‘desc_get_uuid’
 2799 | static gboolean desc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
../../client/gatt.c:2809:17: error: invalid storage class for function ‘desc_get_chrc’
 2809 | static gboolean desc_get_chrc(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
../../client/gatt.c:2820:17: error: invalid storage class for function ‘desc_get_value’
 2820 | static gboolean desc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
../../client/gatt.c:2838:17: error: invalid storage class for function ‘desc_get_flags’
 2838 | static gboolean desc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
../../client/gatt.c:2857:19: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
../../client/gatt.c:2857:19: note: (near initialization for ‘desc_properties[0].get’)
../../client/gatt.c:2857:36: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
../../client/gatt.c:2857:36: note: (near initialization for ‘desc_properties[0].set’)
../../client/gatt.c:2858:17: error: initializer element is not constant
 2858 |  { "UUID", "s", desc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
../../client/gatt.c:2858:17: note: (near initialization for ‘desc_properties[1].get’)
../../client/gatt.c:2859:27: error: initializer element is not constant
 2859 |  { "Characteristic", "o", desc_get_chrc, NULL, NULL },
      |                           ^~~~~~~~~~~~~
../../client/gatt.c:2859:27: note: (near initialization for ‘desc_properties[2].get’)
../../client/gatt.c:2860:19: error: initializer element is not constant
 2860 |  { "Value", "ay", desc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
../../client/gatt.c:2860:19: note: (near initialization for ‘desc_properties[3].get’)
../../client/gatt.c:2861:19: error: initializer element is not constant
 2861 |  { "Flags", "as", desc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
../../client/gatt.c:2861:19: note: (near initialization for ‘desc_properties[4].get’)
../../client/gatt.c:2865:13: error: invalid storage class for function ‘desc_set_value’
 2865 | static void desc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
../../client/gatt.c:2931:21: error: invalid storage class for function ‘desc_find’
 2931 | static struct desc *desc_find(const char *pattern)
      |                     ^~~~~~~~~
../../client/gatt.c:2979:20: error: invalid storage class for function ‘select_service’
 2979 | static GDBusProxy *select_service(GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
../../client/gatt.c:2994:13: error: invalid storage class for function ‘proxy_property_changed’
 2994 | static void proxy_property_changed(GDBusProxy *proxy, const char *name,
      |             ^~~~~~~~~~~~~~~~~~~~~~
../../client/gatt.c:3020:13: error: invalid storage class for function ‘clone_chrc’
 3020 | static void clone_chrc(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~
../../client/gatt.c:3073:13: error: invalid storage class for function ‘clone_chrcs’
 3073 | static void clone_chrcs(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~
../../client/gatt.c:3086:13: error: invalid storage class for function ‘clone_service’
 3086 | static void clone_service(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~~
../../client/gatt.c:3131:13: error: invalid storage class for function ‘clone_device’
 3131 | static void clone_device(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~
../../client/gatt.c:3144:13: error: invalid storage class for function ‘service_clone’
 3144 | static void service_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~
../../client/gatt.c:3160:13: error: invalid storage class for function ‘device_clone’
 3160 | static void device_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~
../../client/gatt.c:3174:20: error: invalid storage class for function ‘proxy_get_name’
 3174 | static const char *proxy_get_name(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
../../client/gatt.c:3190:20: error: invalid storage class for function ‘proxy_get_alias’
 3190 | static const char *proxy_get_alias(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~~
../../client/gatt.c:3232:1: error: expected declaration or statement at end of input
 3232 | }
      | ^
make[2]: *** [Makefile:7300: client/gatt.o] Error 1
make[1]: *** [Makefile:4324: all] Error 2
make: *** [Makefile:11241: distcheck] Error 1


##############################
Test: Build w/ext ELL - Make - FAIL
Desc: Build BlueZ source with '--enable-external-ell' configuration
Output:
client/gatt.c: In function ‘gatt_register_service’:
client/gatt.c:1554:24: error: invalid storage class for function ‘service_find’
 1554 | static struct service *service_find(const char *pattern)
      |                        ^~~~~~~~~~~~
client/gatt.c:1554:1: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
 1554 | static struct service *service_find(const char *pattern)
      | ^~~~~~
client/gatt.c:1594:14: error: invalid storage class for function ‘inc_find’
 1594 | static char *inc_find(struct service  *serv, char *path)
      |              ^~~~~~~~
client/gatt.c:1666:17: error: invalid storage class for function ‘chrc_get_handle’
 1666 | static gboolean chrc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
client/gatt.c:1676:13: error: invalid storage class for function ‘chrc_set_handle’
 1676 | static void chrc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
client/gatt.c:1695:17: error: invalid storage class for function ‘chrc_get_uuid’
 1695 | static gboolean chrc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:1705:17: error: invalid storage class for function ‘chrc_get_service’
 1705 | static gboolean chrc_get_service(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~
client/gatt.c:1716:17: error: invalid storage class for function ‘chrc_get_value’
 1716 | static gboolean chrc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:1732:17: error: invalid storage class for function ‘chrc_get_notifying’
 1732 | static gboolean chrc_get_notifying(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~
client/gatt.c:1745:17: error: invalid storage class for function ‘chrc_get_flags’
 1745 | static gboolean chrc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:1763:17: error: invalid storage class for function ‘chrc_get_write_acquired’
 1763 | static gboolean chrc_get_write_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1776:17: error: invalid storage class for function ‘chrc_write_acquired_exists’
 1776 | static gboolean chrc_write_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1793:17: error: invalid storage class for function ‘chrc_get_notify_acquired’
 1793 | static gboolean chrc_get_notify_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1806:17: error: invalid storage class for function ‘chrc_notify_acquired_exists’
 1806 | static gboolean chrc_notify_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1824:19: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
client/gatt.c:1824:19: note: (near initialization for ‘chrc_properties[0].get’)
client/gatt.c:1824:36: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
client/gatt.c:1824:36: note: (near initialization for ‘chrc_properties[0].set’)
client/gatt.c:1825:17: error: initializer element is not constant
 1825 |  { "UUID", "s", chrc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
client/gatt.c:1825:17: note: (near initialization for ‘chrc_properties[1].get’)
client/gatt.c:1826:20: error: initializer element is not constant
 1826 |  { "Service", "o", chrc_get_service, NULL, NULL },
      |                    ^~~~~~~~~~~~~~~~
client/gatt.c:1826:20: note: (near initialization for ‘chrc_properties[2].get’)
client/gatt.c:1827:19: error: initializer element is not constant
 1827 |  { "Value", "ay", chrc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:1827:19: note: (near initialization for ‘chrc_properties[3].get’)
client/gatt.c:1828:22: error: initializer element is not constant
 1828 |  { "Notifying", "b", chrc_get_notifying, NULL, NULL },
      |                      ^~~~~~~~~~~~~~~~~~
client/gatt.c:1828:22: note: (near initialization for ‘chrc_properties[4].get’)
client/gatt.c:1829:19: error: initializer element is not constant
 1829 |  { "Flags", "as", chrc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:1829:19: note: (near initialization for ‘chrc_properties[5].get’)
client/gatt.c:1830:26: error: initializer element is not constant
 1830 |  { "WriteAcquired", "b", chrc_get_write_acquired, NULL,
      |                          ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1830:26: note: (near initialization for ‘chrc_properties[6].get’)
client/gatt.c:1831:6: error: initializer element is not constant
 1831 |      chrc_write_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1831:6: note: (near initialization for ‘chrc_properties[6].exists’)
client/gatt.c:1832:27: error: initializer element is not constant
 1832 |  { "NotifyAcquired", "b", chrc_get_notify_acquired, NULL,
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1832:27: note: (near initialization for ‘chrc_properties[7].get’)
client/gatt.c:1833:6: error: initializer element is not constant
 1833 |      chrc_notify_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1833:6: note: (near initialization for ‘chrc_properties[7].exists’)
client/gatt.c:1837:20: error: invalid storage class for function ‘path_to_address’
 1837 | static const char *path_to_address(const char *path)
      |                    ^~~~~~~~~~~~~~~
client/gatt.c:1851:12: error: invalid storage class for function ‘parse_options’
 1851 | static int parse_options(DBusMessageIter *iter, uint16_t *offset, uint16_t *mtu,
      |            ^~~~~~~~~~~~~
client/gatt.c:1911:21: error: invalid storage class for function ‘read_value’
 1911 | static DBusMessage *read_value(DBusMessage *msg, uint8_t *value,
      |                     ^~~~~~~~~~
client/gatt.c:1934:13: error: invalid storage class for function ‘authorize_read_response’
 1934 | static void authorize_read_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1967:13: error: invalid storage class for function ‘is_device_trusted’
 1967 | static bool is_device_trusted(const char *path)
      |             ^~~~~~~~~~~~~~~~~
client/gatt.c:1986:13: error: invalid storage class for function ‘proxy_read_reply’
 1986 | static void proxy_read_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~
client/gatt.c:2033:13: error: invalid storage class for function ‘proxy_read_setup’
 2033 | static void proxy_read_setup(DBusMessageIter *iter, void *user_data)
      |             ^~~~~~~~~~~~~~~~
client/gatt.c:2051:21: error: invalid storage class for function ‘proxy_read_value’
 2051 | static DBusMessage *proxy_read_value(struct GDBusProxy *proxy, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2070:21: error: invalid storage class for function ‘chrc_read_value’
 2070 | static DBusMessage *chrc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
client/gatt.c:2121:12: error: invalid storage class for function ‘parse_value_arg’
 2121 | static int parse_value_arg(DBusMessageIter *iter, uint8_t **value, int *len)
      |            ^~~~~~~~~~~~~~~
client/gatt.c:2134:12: error: invalid storage class for function ‘write_value’
 2134 | static int write_value(size_t *dst_len, uint8_t **dst_value, uint8_t *src_val,
      |            ^~~~~~~~~~~
client/gatt.c:2150:13: error: invalid storage class for function ‘authorize_write_response’
 2150 | static void authorize_write_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:2221:13: error: invalid storage class for function ‘proxy_write_reply’
 2221 | static void proxy_write_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~
client/gatt.c:2240:21: error: invalid storage class for function ‘proxy_write_value’
 2240 | static DBusMessage *proxy_write_value(struct GDBusProxy *proxy,
      |                     ^~~~~~~~~~~~~~~~~
client/gatt.c:2264:21: error: invalid storage class for function ‘chrc_write_value’
 2264 | static DBusMessage *chrc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2340:21: error: invalid storage class for function ‘create_sock’
 2340 | static DBusMessage *create_sock(struct chrc *chrc, DBusMessage *msg)
      |                     ^~~~~~~~~~~
client/gatt.c:2379:21: error: invalid storage class for function ‘chrc_acquire_write’
 2379 | static DBusMessage *chrc_acquire_write(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~
client/gatt.c:2411:21: error: invalid storage class for function ‘chrc_acquire_notify’
 2411 | static DBusMessage *chrc_acquire_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~~
client/gatt.c:2449:13: error: invalid storage class for function ‘proxy_notify_reply’
 2449 | static void proxy_notify_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~
client/gatt.c:2483:21: error: invalid storage class for function ‘proxy_notify’
 2483 | static DBusMessage *proxy_notify(struct chrc *chrc, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
client/gatt.c:2507:21: error: invalid storage class for function ‘chrc_start_notify’
 2507 | static DBusMessage *chrc_start_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~
client/gatt.c:2527:21: error: invalid storage class for function ‘chrc_stop_notify’
 2527 | static DBusMessage *chrc_stop_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2547:21: error: invalid storage class for function ‘chrc_confirm’
 2547 | static DBusMessage *chrc_confirm(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
In file included from client/gatt.c:33:
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
client/gatt.c:2561:6: error: initializer element is not constant
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2561:6: note: (near initialization for ‘chrc_methods[0].function’)
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
client/gatt.c:2564:12: error: initializer element is not constant
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2564:12: note: (near initialization for ‘chrc_methods[1].function’)
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
client/gatt.c:2566:12: error: initializer element is not constant
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2566:12: note: (near initialization for ‘chrc_methods[2].function’)
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
client/gatt.c:2568:12: error: initializer element is not constant
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2568:12: note: (near initialization for ‘chrc_methods[3].function’)
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2569:50: error: initializer element is not constant
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2569:50: note: (near initialization for ‘chrc_methods[4].function’)
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2570:43: error: initializer element is not constant
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2570:43: note: (near initialization for ‘chrc_methods[5].function’)
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2571:40: error: initializer element is not constant
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2571:40: note: (near initialization for ‘chrc_methods[6].function’)
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2575:13: error: invalid storage class for function ‘chrc_set_value’
 2575 | static void chrc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
client/gatt.c:2591:17: error: invalid storage class for function ‘attr_authorization_flag_exists’
 2591 | static gboolean attr_authorization_flag_exists(char **flags)
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:2649:21: error: invalid storage class for function ‘chrc_find’
 2649 | static struct chrc *chrc_find(const char *pattern)
      |                     ^~~~~~~~~
client/gatt.c:2692:21: error: invalid storage class for function ‘desc_read_value’
 2692 | static DBusMessage *desc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
client/gatt.c:2718:21: error: invalid storage class for function ‘desc_write_value’
 2718 | static DBusMessage *desc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
In file included from client/gatt.c:33:
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
client/gatt.c:2763:6: error: initializer element is not constant
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2763:6: note: (near initialization for ‘desc_methods[0].function’)
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
client/gatt.c:2766:12: error: initializer element is not constant
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2766:12: note: (near initialization for ‘desc_methods[1].function’)
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2770:17: error: invalid storage class for function ‘desc_get_handle’
 2770 | static gboolean desc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
client/gatt.c:2780:13: error: invalid storage class for function ‘desc_set_handle’
 2780 | static void desc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
client/gatt.c:2799:17: error: invalid storage class for function ‘desc_get_uuid’
 2799 | static gboolean desc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:2809:17: error: invalid storage class for function ‘desc_get_chrc’
 2809 | static gboolean desc_get_chrc(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:2820:17: error: invalid storage class for function ‘desc_get_value’
 2820 | static gboolean desc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:2838:17: error: invalid storage class for function ‘desc_get_flags’
 2838 | static gboolean desc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:2857:19: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
client/gatt.c:2857:19: note: (near initialization for ‘desc_properties[0].get’)
client/gatt.c:2857:36: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
client/gatt.c:2857:36: note: (near initialization for ‘desc_properties[0].set’)
client/gatt.c:2858:17: error: initializer element is not constant
 2858 |  { "UUID", "s", desc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
client/gatt.c:2858:17: note: (near initialization for ‘desc_properties[1].get’)
client/gatt.c:2859:27: error: initializer element is not constant
 2859 |  { "Characteristic", "o", desc_get_chrc, NULL, NULL },
      |                           ^~~~~~~~~~~~~
client/gatt.c:2859:27: note: (near initialization for ‘desc_properties[2].get’)
client/gatt.c:2860:19: error: initializer element is not constant
 2860 |  { "Value", "ay", desc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:2860:19: note: (near initialization for ‘desc_properties[3].get’)
client/gatt.c:2861:19: error: initializer element is not constant
 2861 |  { "Flags", "as", desc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:2861:19: note: (near initialization for ‘desc_properties[4].get’)
client/gatt.c:2865:13: error: invalid storage class for function ‘desc_set_value’
 2865 | static void desc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
client/gatt.c:2931:21: error: invalid storage class for function ‘desc_find’
 2931 | static struct desc *desc_find(const char *pattern)
      |                     ^~~~~~~~~
client/gatt.c:2979:20: error: invalid storage class for function ‘select_service’
 2979 | static GDBusProxy *select_service(GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
client/gatt.c:2994:13: error: invalid storage class for function ‘proxy_property_changed’
 2994 | static void proxy_property_changed(GDBusProxy *proxy, const char *name,
      |             ^~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:3020:13: error: invalid storage class for function ‘clone_chrc’
 3020 | static void clone_chrc(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~
client/gatt.c:3073:13: error: invalid storage class for function ‘clone_chrcs’
 3073 | static void clone_chrcs(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~
client/gatt.c:3086:13: error: invalid storage class for function ‘clone_service’
 3086 | static void clone_service(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~~
client/gatt.c:3131:13: error: invalid storage class for function ‘clone_device’
 3131 | static void clone_device(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~
client/gatt.c:3144:13: error: invalid storage class for function ‘service_clone’
 3144 | static void service_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~
client/gatt.c:3160:13: error: invalid storage class for function ‘device_clone’
 3160 | static void device_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~
client/gatt.c:3174:20: error: invalid storage class for function ‘proxy_get_name’
 3174 | static const char *proxy_get_name(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
client/gatt.c:3190:20: error: invalid storage class for function ‘proxy_get_alias’
 3190 | static const char *proxy_get_alias(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~~
client/gatt.c:3232:1: error: expected declaration or statement at end of input
 3232 | }
      | ^
At top level:
client/gatt.c:3203:6: error: ‘gatt_clone_attribute’ defined but not used [-Werror=unused-function]
 3203 | void gatt_clone_attribute(GDBusProxy *proxy, int argc, char *argv[])
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2961:6: error: ‘gatt_unregister_desc’ defined but not used [-Werror=unused-function]
 2961 | void gatt_unregister_desc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2881:6: error: ‘gatt_register_desc’ defined but not used [-Werror=unused-function]
 2881 | void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~
client/gatt.c:2674:6: error: ‘gatt_unregister_chrc’ defined but not used [-Werror=unused-function]
 2674 | void gatt_unregister_chrc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2603:6: error: ‘gatt_register_chrc’ defined but not used [-Werror=unused-function]
 2603 | void gatt_register_chrc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~
client/gatt.c:1638:6: error: ‘gatt_unregister_include’ defined but not used [-Werror=unused-function]
 1638 | void gatt_unregister_include(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1608:6: error: ‘gatt_register_include’ defined but not used [-Werror=unused-function]
 1608 | void gatt_register_include(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1573:6: error: ‘gatt_unregister_service’ defined but not used [-Werror=unused-function]
 1573 | void gatt_unregister_service(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7300: client/gatt.o] Error 1
make: *** [Makefile:4324: all] Error 2


##############################
Test: Incremental Build with patches - FAIL
Desc: Incremental build per patch in the series
Output:
client/gatt.c: In function ‘gatt_register_service’:
client/gatt.c:1554:24: error: invalid storage class for function ‘service_find’
 1554 | static struct service *service_find(const char *pattern)
      |                        ^~~~~~~~~~~~
client/gatt.c:1554:1: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
 1554 | static struct service *service_find(const char *pattern)
      | ^~~~~~
client/gatt.c:1594:14: error: invalid storage class for function ‘inc_find’
 1594 | static char *inc_find(struct service  *serv, char *path)
      |              ^~~~~~~~
client/gatt.c:1666:17: error: invalid storage class for function ‘chrc_get_handle’
 1666 | static gboolean chrc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
client/gatt.c:1676:13: error: invalid storage class for function ‘chrc_set_handle’
 1676 | static void chrc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
client/gatt.c:1695:17: error: invalid storage class for function ‘chrc_get_uuid’
 1695 | static gboolean chrc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:1705:17: error: invalid storage class for function ‘chrc_get_service’
 1705 | static gboolean chrc_get_service(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~
client/gatt.c:1716:17: error: invalid storage class for function ‘chrc_get_value’
 1716 | static gboolean chrc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:1732:17: error: invalid storage class for function ‘chrc_get_notifying’
 1732 | static gboolean chrc_get_notifying(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~
client/gatt.c:1745:17: error: invalid storage class for function ‘chrc_get_flags’
 1745 | static gboolean chrc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:1763:17: error: invalid storage class for function ‘chrc_get_write_acquired’
 1763 | static gboolean chrc_get_write_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1776:17: error: invalid storage class for function ‘chrc_write_acquired_exists’
 1776 | static gboolean chrc_write_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1793:17: error: invalid storage class for function ‘chrc_get_notify_acquired’
 1793 | static gboolean chrc_get_notify_acquired(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1806:17: error: invalid storage class for function ‘chrc_notify_acquired_exists’
 1806 | static gboolean chrc_notify_acquired_exists(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1824:19: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
client/gatt.c:1824:19: note: (near initialization for ‘chrc_properties[0].get’)
client/gatt.c:1824:36: error: initializer element is not constant
 1824 |  { "Handle", "q", chrc_get_handle, chrc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
client/gatt.c:1824:36: note: (near initialization for ‘chrc_properties[0].set’)
client/gatt.c:1825:17: error: initializer element is not constant
 1825 |  { "UUID", "s", chrc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
client/gatt.c:1825:17: note: (near initialization for ‘chrc_properties[1].get’)
client/gatt.c:1826:20: error: initializer element is not constant
 1826 |  { "Service", "o", chrc_get_service, NULL, NULL },
      |                    ^~~~~~~~~~~~~~~~
client/gatt.c:1826:20: note: (near initialization for ‘chrc_properties[2].get’)
client/gatt.c:1827:19: error: initializer element is not constant
 1827 |  { "Value", "ay", chrc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:1827:19: note: (near initialization for ‘chrc_properties[3].get’)
client/gatt.c:1828:22: error: initializer element is not constant
 1828 |  { "Notifying", "b", chrc_get_notifying, NULL, NULL },
      |                      ^~~~~~~~~~~~~~~~~~
client/gatt.c:1828:22: note: (near initialization for ‘chrc_properties[4].get’)
client/gatt.c:1829:19: error: initializer element is not constant
 1829 |  { "Flags", "as", chrc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:1829:19: note: (near initialization for ‘chrc_properties[5].get’)
client/gatt.c:1830:26: error: initializer element is not constant
 1830 |  { "WriteAcquired", "b", chrc_get_write_acquired, NULL,
      |                          ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1830:26: note: (near initialization for ‘chrc_properties[6].get’)
client/gatt.c:1831:6: error: initializer element is not constant
 1831 |      chrc_write_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1831:6: note: (near initialization for ‘chrc_properties[6].exists’)
client/gatt.c:1832:27: error: initializer element is not constant
 1832 |  { "NotifyAcquired", "b", chrc_get_notify_acquired, NULL,
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1832:27: note: (near initialization for ‘chrc_properties[7].get’)
client/gatt.c:1833:6: error: initializer element is not constant
 1833 |      chrc_notify_acquired_exists },
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1833:6: note: (near initialization for ‘chrc_properties[7].exists’)
client/gatt.c:1837:20: error: invalid storage class for function ‘path_to_address’
 1837 | static const char *path_to_address(const char *path)
      |                    ^~~~~~~~~~~~~~~
client/gatt.c:1851:12: error: invalid storage class for function ‘parse_options’
 1851 | static int parse_options(DBusMessageIter *iter, uint16_t *offset, uint16_t *mtu,
      |            ^~~~~~~~~~~~~
client/gatt.c:1911:21: error: invalid storage class for function ‘read_value’
 1911 | static DBusMessage *read_value(DBusMessage *msg, uint8_t *value,
      |                     ^~~~~~~~~~
client/gatt.c:1934:13: error: invalid storage class for function ‘authorize_read_response’
 1934 | static void authorize_read_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1967:13: error: invalid storage class for function ‘is_device_trusted’
 1967 | static bool is_device_trusted(const char *path)
      |             ^~~~~~~~~~~~~~~~~
client/gatt.c:1986:13: error: invalid storage class for function ‘proxy_read_reply’
 1986 | static void proxy_read_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~
client/gatt.c:2033:13: error: invalid storage class for function ‘proxy_read_setup’
 2033 | static void proxy_read_setup(DBusMessageIter *iter, void *user_data)
      |             ^~~~~~~~~~~~~~~~
client/gatt.c:2051:21: error: invalid storage class for function ‘proxy_read_value’
 2051 | static DBusMessage *proxy_read_value(struct GDBusProxy *proxy, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2070:21: error: invalid storage class for function ‘chrc_read_value’
 2070 | static DBusMessage *chrc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
client/gatt.c:2121:12: error: invalid storage class for function ‘parse_value_arg’
 2121 | static int parse_value_arg(DBusMessageIter *iter, uint8_t **value, int *len)
      |            ^~~~~~~~~~~~~~~
client/gatt.c:2134:12: error: invalid storage class for function ‘write_value’
 2134 | static int write_value(size_t *dst_len, uint8_t **dst_value, uint8_t *src_val,
      |            ^~~~~~~~~~~
client/gatt.c:2150:13: error: invalid storage class for function ‘authorize_write_response’
 2150 | static void authorize_write_response(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:2221:13: error: invalid storage class for function ‘proxy_write_reply’
 2221 | static void proxy_write_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~
client/gatt.c:2240:21: error: invalid storage class for function ‘proxy_write_value’
 2240 | static DBusMessage *proxy_write_value(struct GDBusProxy *proxy,
      |                     ^~~~~~~~~~~~~~~~~
client/gatt.c:2264:21: error: invalid storage class for function ‘chrc_write_value’
 2264 | static DBusMessage *chrc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2340:21: error: invalid storage class for function ‘create_sock’
 2340 | static DBusMessage *create_sock(struct chrc *chrc, DBusMessage *msg)
      |                     ^~~~~~~~~~~
client/gatt.c:2379:21: error: invalid storage class for function ‘chrc_acquire_write’
 2379 | static DBusMessage *chrc_acquire_write(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~
client/gatt.c:2411:21: error: invalid storage class for function ‘chrc_acquire_notify’
 2411 | static DBusMessage *chrc_acquire_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~~~
client/gatt.c:2449:13: error: invalid storage class for function ‘proxy_notify_reply’
 2449 | static void proxy_notify_reply(DBusMessage *message, void *user_data)
      |             ^~~~~~~~~~~~~~~~~~
client/gatt.c:2483:21: error: invalid storage class for function ‘proxy_notify’
 2483 | static DBusMessage *proxy_notify(struct chrc *chrc, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
client/gatt.c:2507:21: error: invalid storage class for function ‘chrc_start_notify’
 2507 | static DBusMessage *chrc_start_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~~
client/gatt.c:2527:21: error: invalid storage class for function ‘chrc_stop_notify’
 2527 | static DBusMessage *chrc_stop_notify(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
client/gatt.c:2547:21: error: invalid storage class for function ‘chrc_confirm’
 2547 | static DBusMessage *chrc_confirm(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~
In file included from client/gatt.c:33:
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2559:36: note: in expansion of macro ‘GDBUS_ARGS’
 2559 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2560:6: note: in expansion of macro ‘GDBUS_ARGS’
 2560 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
client/gatt.c:2561:6: error: initializer element is not constant
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2561:6: note: (near initialization for ‘chrc_methods[0].function’)
 2561 |      chrc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2562:37: note: in expansion of macro ‘GDBUS_ARGS’
 2562 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
client/gatt.c:2564:12: error: initializer element is not constant
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2564:12: note: (near initialization for ‘chrc_methods[1].function’)
 2564 |      NULL, chrc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[2].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2565:33: note: in expansion of macro ‘GDBUS_ARGS’
 2565 |  { GDBUS_METHOD("AcquireWrite", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                 ^~~~~~~~~~
client/gatt.c:2566:12: error: initializer element is not constant
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2566:12: note: (near initialization for ‘chrc_methods[2].function’)
 2566 |      NULL, chrc_acquire_write) },
      |            ^~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusPropertyTable *’ {aka ‘const struct GDBusPropertyTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘chrc_methods[3].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:150:13: note: in definition of macro ‘GDBUS_METHOD’
  150 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2567:34: note: in expansion of macro ‘GDBUS_ARGS’
 2567 |  { GDBUS_METHOD("AcquireNotify", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                  ^~~~~~~~~~
client/gatt.c:2568:12: error: initializer element is not constant
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2568:12: note: (near initialization for ‘chrc_methods[3].function’)
 2568 |      NULL, chrc_acquire_notify) },
      |            ^~~~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2569:50: error: initializer element is not constant
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2569:50: note: (near initialization for ‘chrc_methods[4].function’)
 2569 |  { GDBUS_ASYNC_METHOD("StartNotify", NULL, NULL, chrc_start_notify) },
      |                                                  ^~~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2570:43: error: initializer element is not constant
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2570:43: note: (near initialization for ‘chrc_methods[5].function’)
 2570 |  { GDBUS_METHOD("StopNotify", NULL, NULL, chrc_stop_notify) },
      |                                           ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2571:40: error: initializer element is not constant
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2571:40: note: (near initialization for ‘chrc_methods[6].function’)
 2571 |  { GDBUS_METHOD("Confirm", NULL, NULL, chrc_confirm) },
      |                                        ^~~~~~~~~~~~
./gdbus/gdbus.h:152:14: note: in definition of macro ‘GDBUS_METHOD’
  152 |  .function = _function
      |              ^~~~~~~~~
client/gatt.c:2575:13: error: invalid storage class for function ‘chrc_set_value’
 2575 | static void chrc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
client/gatt.c:2591:17: error: invalid storage class for function ‘attr_authorization_flag_exists’
 2591 | static gboolean attr_authorization_flag_exists(char **flags)
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:2649:21: error: invalid storage class for function ‘chrc_find’
 2649 | static struct chrc *chrc_find(const char *pattern)
      |                     ^~~~~~~~~
client/gatt.c:2692:21: error: invalid storage class for function ‘desc_read_value’
 2692 | static DBusMessage *desc_read_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~
client/gatt.c:2718:21: error: invalid storage class for function ‘desc_write_value’
 2718 | static DBusMessage *desc_write_value(DBusConnection *conn, DBusMessage *msg,
      |                     ^~~~~~~~~~~~~~~~
In file included from client/gatt.c:33:
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2761:36: note: in expansion of macro ‘GDBUS_ARGS’
 2761 |  { GDBUS_ASYNC_METHOD("ReadValue", GDBUS_ARGS({ "options", "a{sv}" }),
      |                                    ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[0].out_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:157:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  157 |  .out_args = _out_args, \
      |              ^~~~~~~~~
client/gatt.c:2762:6: note: in expansion of macro ‘GDBUS_ARGS’
 2762 |      GDBUS_ARGS({ "value", "ay" }),
      |      ^~~~~~~~~~
client/gatt.c:2763:6: error: initializer element is not constant
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2763:6: note: (near initialization for ‘desc_methods[0].function’)
 2763 |      desc_read_value) },
      |      ^~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
./gdbus/gdbus.h:146:29: error: initialization of ‘const GDBusArgInfo *’ {aka ‘const struct GDBusArgInfo *’} from incompatible pointer type ‘const GDBusMethodTable *’ {aka ‘const struct GDBusMethodTable *’} [-Werror=incompatible-pointer-types]
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: error: initializer element is not constant
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
./gdbus/gdbus.h:146:29: note: (near initialization for ‘desc_methods[1].in_args’)
  146 | #define GDBUS_ARGS(args...) (const GDBusArgInfo[]) { args, { } }
      |                             ^
./gdbus/gdbus.h:156:13: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  156 |  .in_args = _in_args, \
      |             ^~~~~~~~
client/gatt.c:2764:37: note: in expansion of macro ‘GDBUS_ARGS’
 2764 |  { GDBUS_ASYNC_METHOD("WriteValue", GDBUS_ARGS({ "value", "ay" },
      |                                     ^~~~~~~~~~
client/gatt.c:2766:12: error: initializer element is not constant
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2766:12: note: (near initialization for ‘desc_methods[1].function’)
 2766 |      NULL, desc_write_value) },
      |            ^~~~~~~~~~~~~~~~
./gdbus/gdbus.h:158:14: note: in definition of macro ‘GDBUS_ASYNC_METHOD’
  158 |  .function = _function, \
      |              ^~~~~~~~~
client/gatt.c:2770:17: error: invalid storage class for function ‘desc_get_handle’
 2770 | static gboolean desc_get_handle(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~~
client/gatt.c:2780:13: error: invalid storage class for function ‘desc_set_handle’
 2780 | static void desc_set_handle(const GDBusPropertyTable *property,
      |             ^~~~~~~~~~~~~~~
client/gatt.c:2799:17: error: invalid storage class for function ‘desc_get_uuid’
 2799 | static gboolean desc_get_uuid(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:2809:17: error: invalid storage class for function ‘desc_get_chrc’
 2809 | static gboolean desc_get_chrc(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~
client/gatt.c:2820:17: error: invalid storage class for function ‘desc_get_value’
 2820 | static gboolean desc_get_value(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:2838:17: error: invalid storage class for function ‘desc_get_flags’
 2838 | static gboolean desc_get_flags(const GDBusPropertyTable *property,
      |                 ^~~~~~~~~~~~~~
client/gatt.c:2857:19: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                   ^~~~~~~~~~~~~~~
client/gatt.c:2857:19: note: (near initialization for ‘desc_properties[0].get’)
client/gatt.c:2857:36: error: initializer element is not constant
 2857 |  { "Handle", "q", desc_get_handle, desc_set_handle, NULL },
      |                                    ^~~~~~~~~~~~~~~
client/gatt.c:2857:36: note: (near initialization for ‘desc_properties[0].set’)
client/gatt.c:2858:17: error: initializer element is not constant
 2858 |  { "UUID", "s", desc_get_uuid, NULL, NULL },
      |                 ^~~~~~~~~~~~~
client/gatt.c:2858:17: note: (near initialization for ‘desc_properties[1].get’)
client/gatt.c:2859:27: error: initializer element is not constant
 2859 |  { "Characteristic", "o", desc_get_chrc, NULL, NULL },
      |                           ^~~~~~~~~~~~~
client/gatt.c:2859:27: note: (near initialization for ‘desc_properties[2].get’)
client/gatt.c:2860:19: error: initializer element is not constant
 2860 |  { "Value", "ay", desc_get_value, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:2860:19: note: (near initialization for ‘desc_properties[3].get’)
client/gatt.c:2861:19: error: initializer element is not constant
 2861 |  { "Flags", "as", desc_get_flags, NULL, NULL },
      |                   ^~~~~~~~~~~~~~
client/gatt.c:2861:19: note: (near initialization for ‘desc_properties[4].get’)
client/gatt.c:2865:13: error: invalid storage class for function ‘desc_set_value’
 2865 | static void desc_set_value(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~~
client/gatt.c:2931:21: error: invalid storage class for function ‘desc_find’
 2931 | static struct desc *desc_find(const char *pattern)
      |                     ^~~~~~~~~
client/gatt.c:2979:20: error: invalid storage class for function ‘select_service’
 2979 | static GDBusProxy *select_service(GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
client/gatt.c:2994:13: error: invalid storage class for function ‘proxy_property_changed’
 2994 | static void proxy_property_changed(GDBusProxy *proxy, const char *name,
      |             ^~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:3020:13: error: invalid storage class for function ‘clone_chrc’
 3020 | static void clone_chrc(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~
client/gatt.c:3073:13: error: invalid storage class for function ‘clone_chrcs’
 3073 | static void clone_chrcs(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~
client/gatt.c:3086:13: error: invalid storage class for function ‘clone_service’
 3086 | static void clone_service(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~~
client/gatt.c:3131:13: error: invalid storage class for function ‘clone_device’
 3131 | static void clone_device(struct GDBusProxy *proxy)
      |             ^~~~~~~~~~~~
client/gatt.c:3144:13: error: invalid storage class for function ‘service_clone’
 3144 | static void service_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~~
client/gatt.c:3160:13: error: invalid storage class for function ‘device_clone’
 3160 | static void device_clone(const char *input, void *user_data)
      |             ^~~~~~~~~~~~
client/gatt.c:3174:20: error: invalid storage class for function ‘proxy_get_name’
 3174 | static const char *proxy_get_name(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~
client/gatt.c:3190:20: error: invalid storage class for function ‘proxy_get_alias’
 3190 | static const char *proxy_get_alias(struct GDBusProxy *proxy)
      |                    ^~~~~~~~~~~~~~~
client/gatt.c:3232:1: error: expected declaration or statement at end of input
 3232 | }
      | ^
At top level:
client/gatt.c:3203:6: error: ‘gatt_clone_attribute’ defined but not used [-Werror=unused-function]
 3203 | void gatt_clone_attribute(GDBusProxy *proxy, int argc, char *argv[])
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2961:6: error: ‘gatt_unregister_desc’ defined but not used [-Werror=unused-function]
 2961 | void gatt_unregister_desc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2881:6: error: ‘gatt_register_desc’ defined but not used [-Werror=unused-function]
 2881 | void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~
client/gatt.c:2674:6: error: ‘gatt_unregister_chrc’ defined but not used [-Werror=unused-function]
 2674 | void gatt_unregister_chrc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~
client/gatt.c:2603:6: error: ‘gatt_register_chrc’ defined but not used [-Werror=unused-function]
 2603 | void gatt_register_chrc(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~
client/gatt.c:1638:6: error: ‘gatt_unregister_include’ defined but not used [-Werror=unused-function]
 1638 | void gatt_unregister_include(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1608:6: error: ‘gatt_register_include’ defined but not used [-Werror=unused-function]
 1608 | void gatt_register_include(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~
client/gatt.c:1573:6: error: ‘gatt_unregister_service’ defined but not used [-Werror=unused-function]
 1573 | void gatt_unregister_service(DBusConnection *conn, GDBusProxy *proxy,
      |      ^~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7300: client/gatt.o] Error 1
make: *** [Makefile:4324: all] Error 2




---
Regards,
Linux Bluetooth


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

* Re: [Bluez 00/13] Fixing memory leak, leaked_handle and use_after
  2022-05-31  7:41 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
@ 2022-05-31 20:30 ` patchwork-bot+bluetooth
  0 siblings, 0 replies; 17+ messages in thread
From: patchwork-bot+bluetooth @ 2022-05-31 20:30 UTC (permalink / raw)
  To: Gopal Tiwari; +Cc: linux-bluetooth, luiz.dentz, gtiwari

Hello:

This series was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:

On Tue, 31 May 2022 13:11:04 +0530 you wrote:
> From: Gopal Tiwari <gtiwari@redhat.com>
> 
> Following fixes are reported by coverity tool.
> 
> Gopal Tiwari (13):
>   Fixing memory leak issue in gatt.c
>   Fixing memory leakage in appkey.c
>   Fixing memory leak in jlink.c
>   Fixing memory leak in sixaxis.c
>   Fixing leaked_handle in cltest.c
>   Fixing leaked_handle in create-image.c
>   Fixing leaked_handle in l2cap-tester.c
>   Fixing resource leak in mesh/mesh-db.c
>   Fixing leaked_handle in obex-client-tool.c
>   Fixing use after free in src/device.c
>   Fixing memory leak in pbap.c
>   Fixing possible use_after_free in meshctl.c
>   Fixing use_after_free in prov-db.c
> 
> [...]

Here is the summary with links:
  - [Bluez,V2,01/13] Fixing memory leak issue in gatt.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=b4233bca1815
  - [Bluez,V2,02/13] Fixing memory leakage in appkey.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=5eb96b3ec854
  - [Bluez,V2,03/13] Fixing memory leak in jlink.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=6f02010ce004
  - [Bluez,V2,04/13] Fixing memory leak in sixaxis.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=fc57aa92a4f3
  - [Bluez,V2,05/13] Fixing leaked_handle in cltest.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=f4743109f381
  - [Bluez,V2,06/13] Fixing leaked_handle in create-image.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=4ae130455b17
  - [Bluez,V2,07/13] Fixing leaked_handle in l2cap-tester.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=4334be027ae1
  - [Bluez,V2,08/13] Fixing resource leak in mesh/mesh-db.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=35cbfd966094
  - [Bluez,V2,09/13] Fixing leaked_handle in obex-client-tool.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=39b638526d9a
  - [Bluez,V2,10/13] Fixing use after free in src/device.c
    (no matching commit)
  - [Bluez,V2,11/13] Fixing memory leak in pbap.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=06d3c7429ad6
  - [Bluez,V2,12/13] Fixing possible use_after_free in meshctl.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=56bda20ce9e3
  - [Bluez,V2,13/13] Fixing use_after_free in prov-db.c
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=5cdaeaefc350

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



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

* [Bluez 00/13] Fixing memory leak, leaked_handle and use_after
@ 2022-05-31  7:41 Gopal Tiwari
  2022-05-31 20:30 ` patchwork-bot+bluetooth
  0 siblings, 1 reply; 17+ messages in thread
From: Gopal Tiwari @ 2022-05-31  7:41 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, gtiwari

From: Gopal Tiwari <gtiwari@redhat.com>

Following fixes are reported by coverity tool.  

Gopal Tiwari (13):
  Fixing memory leak issue in gatt.c
  Fixing memory leakage in appkey.c
  Fixing memory leak in jlink.c
  Fixing memory leak in sixaxis.c
  Fixing leaked_handle in cltest.c
  Fixing leaked_handle in create-image.c
  Fixing leaked_handle in l2cap-tester.c
  Fixing resource leak in mesh/mesh-db.c
  Fixing leaked_handle in obex-client-tool.c
  Fixing use after free in src/device.c
  Fixing memory leak in pbap.c
  Fixing possible use_after_free in meshctl.c
  Fixing use_after_free in prov-db.c

 client/gatt.c             | 11 ++++++++---
 mesh/appkey.c             |  8 ++++++--
 monitor/jlink.c           |  5 ++++-
 obexd/client/pbap.c       |  5 +++--
 plugins/sixaxis.c         |  9 +++++++--
 src/device.c              |  1 +
 tools/cltest.c            |  1 +
 tools/create-image.c      |  7 +++----
 tools/l2cap-tester.c      |  1 +
 tools/mesh-gatt/prov-db.c |  3 ++-
 tools/mesh/mesh-db.c      |  2 ++
 tools/meshctl.c           |  1 -
 tools/obex-client-tool.c  |  1 +
 13 files changed, 39 insertions(+), 16 deletions(-)

-- 
2.26.2


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

end of thread, other threads:[~2022-05-31 20:30 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-30  8:11 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
2022-05-30  8:11 ` [Bluez 01/13] Fixing memory leak issue in gatt.c Gopal Tiwari
2022-05-30  8:40   ` Fixing memory leak, leaked_handle and use_after bluez.test.bot
2022-05-30  8:11 ` [Bluez 02/13] Fixing memory leakage in appkey.c Gopal Tiwari
2022-05-30  8:11 ` [Bluez 03/13] Fixing memroy leak in jlink.c Gopal Tiwari
2022-05-30  8:12 ` [Bluez 04/13] Fixing memory leak in sixaxis.c Gopal Tiwari
2022-05-30  8:12 ` [Bluez 05/13] Fixing leaked_handle in cltest.c Gopal Tiwari
2022-05-30  8:12 ` [Bluez 06/13] Fixing leaked_handle in create-image.c Gopal Tiwari
2022-05-30  8:12 ` [Bluez 07/13] Fixing leaked_handle in l2cap-tester.c Gopal Tiwari
2022-05-30  8:12 ` [Bluez 08/13] Fixing resource leak in mesh/mesh-db.c Gopal Tiwari
2022-05-30  8:12 ` [Bluez 09/13] Fixing leaked_handle in obex-client-tool.c Gopal Tiwari
2022-05-30  8:12 ` [Bluez 10/13] Fixing use after free in src/device.c Gopal Tiwari
2022-05-30  8:12 ` [Bluez 11/13] Fixing memory leak in pbap.c Gopal Tiwari
2022-05-30  8:12 ` [Bluez 12/13] Fixing possible use_after_free in meshctl.c Gopal Tiwari
2022-05-30  8:12 ` [Bluez 13/13] Fixing use_after_free in prov-db.c Gopal Tiwari
2022-05-31  7:41 [Bluez 00/13] Fixing memory leak, leaked_handle and use_after Gopal Tiwari
2022-05-31 20:30 ` patchwork-bot+bluetooth

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.