From patchwork Mon Feb 12 20:02:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via B4 Relay X-Patchwork-Id: 13553940 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F01947774 for ; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; cv=none; b=E5eJLczSuvVlX9FpsXbUyw6XzaF0RuYLt8VudLNHsOxkSE9yne8j41X4tbDvcGnI+k1K4h79wJHRhJzz+9UKHbEL3HOxpNKlGdoqFph39snrdozfo5Hk8SH1eu0qkMy0jmUvU7TI+Ok4vhQLbU6JzIKuGVKawJNPN/mPOYSScUc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; c=relaxed/simple; bh=CAquu6St9+YE/1js7fAfthjtnyafKD0QqkYrZLGZyVk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fXSBgqk0tt+MbXdbk8LwnOQPmUsFneWKX+dVpC+51MmQyXNkLiopimqXGDnBfBwhzey8MkNiLJn/+GIPWcbdjEwp0G/+vrocNUrFFaKmctAVeLos3Po82kXFMNgezyfTPFIoShid/otLBq/b8kFaPAqtQAYV/MTurTXLyaZgZ7Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LMw99xJt; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LMw99xJt" Received: by smtp.kernel.org (Postfix) with ESMTPS id CD0DEC433F1; Mon, 12 Feb 2024 20:02:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707768159; bh=CAquu6St9+YE/1js7fAfthjtnyafKD0QqkYrZLGZyVk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=LMw99xJtzqZTC5ewyNSwUdnLDir28dZ5JKDG69WuSyaFwhwBJmcH5eyfTlLRRsiSZ gpn3V3jdCTDLXU7yhbEfOjUiAcMWZw29tqwbCRlae67nYaUGmcSrFb/dUElImburV0 hTf8e6rD6BX52NGO4VtYVcn8pFr3gmeBLlURwE08sePHajbp4/PG8yY5jTgsqs2Mgd 6iylsRQ7LwghudAgDbMPx1DfSXlEyWeDh4/cLf3nIsW862907FRgq8n5803BHNteas kW7gJocI3/SbzFqRaw/YlZN7N2bT1H57BrK6ztLm7fPzw/Coy2NPsYorWwCAvtqqa0 c0Az9ykjHkHGQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B25C6C4829E; Mon, 12 Feb 2024 20:02:39 +0000 (UTC) From: Emil Velikov via B4 Relay Date: Mon, 12 Feb 2024 20:02:37 +0000 Subject: [PATCH BlueZ v2 01/10] Return at least the title attribute from player_list_metadata() Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240212-disto-patches-v2-1-8bab1bd08f4d@gmail.com> References: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> In-Reply-To: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> To: linux-bluetooth@vger.kernel.org Cc: Sam Lantinga X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707768157; l=669; i=emil.l.velikov@gmail.com; s=20230301; h=from:subject:message-id; bh=bHLjtE0BG3PUYg6Jf5Zv16cafv879d0HdvZOTdHzrz4=; b=lPBdaDdiQpidYd3FrEXZfUvhbbag4qQnneh3NTvUU1h3AliGylEKB+1kEq0S7FyDiuzNgM6Rk P4sznH5RHq2AWWw/dc1KsyovnQo3mHWoaaKai7N4c+mXcd0ukyW6A1L X-Developer-Key: i=emil.l.velikov@gmail.com; a=ed25519; pk=qeUTVTNyI3rcR2CfNNWsloTihgzmtbZo98GdxwZKCkY= X-Endpoint-Received: by B4 Relay for emil.l.velikov@gmail.com/20230301 with auth_id=35 X-Original-From: Emil Velikov Reply-To: From: Sam Lantinga This fixes Bluetooth AVRCP certification test AVRCP/TG/MDI/BV-04-C, which requires a valid response from the get_element_attributes command. --- profiles/audio/avrcp.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c index 439fa27a9..36ce01a14 100644 --- a/profiles/audio/avrcp.c +++ b/profiles/audio/avrcp.c @@ -1210,6 +1210,10 @@ static GList *player_list_metadata(struct avrcp_player *player) GUINT_TO_POINTER(str_to_metadata(key))); } + if (attrs == NULL) + return g_list_prepend(NULL, + GUINT_TO_POINTER(AVRCP_MEDIA_ATTRIBUTE_TITLE)); + return attrs; } From patchwork Mon Feb 12 20:02:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via B4 Relay X-Patchwork-Id: 13553939 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1ED4D47F45 for ; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; cv=none; b=O3rIvvbl+r6up6FvQ280DC0CgmduSNQ141M6xDOrBS+f5Gq4ZFNInr0GPeSrl5gBeWxVhguLSlRGOITzz44DHpeVgiUJt7oMvVRBqBLOfRyo4UXqcQy6GZSIMu0YkHd4Jr/zPm6Z0+zjkYylloHv92Xs7CYLiRHQk0LWaCT+QDI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; c=relaxed/simple; bh=27XdaU5KU3C2bMi40N4HgMXvKSJ93TxqLasPGlGSRXs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=llVAxSpY4hWMwfQu+M0KJuMhUn4nbX/QU2ZChUmbbghUQAg1wTn1wIZ3MgYwiBGQxjtt9tOD+GA/Gt2Ld60BKa45QrdmHRTROnG08oSPAtahveD70BW0QzU+i9LwGGbUFGuVeXbv2awgBuP4MIe14ZPz0tQi9K7BO88lhXbhtuQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=fOh2mfug; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="fOh2mfug" Received: by smtp.kernel.org (Postfix) with ESMTPS id DDD7AC43390; Mon, 12 Feb 2024 20:02:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707768159; bh=27XdaU5KU3C2bMi40N4HgMXvKSJ93TxqLasPGlGSRXs=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=fOh2mfug0XH1efusfa3c5//Pf24v8EwSKgO0byfnrIOVKNzfzvxR4NLw/oAruwLCw yEv02F4jc7rodPbWNlbbfRnRAD3GX2HZGkDy+VD4og18uJO/VkwA612vkg7H223oSK pumD2Q8FKDNZ4TgEAZGezMQJz141FuGbzhgBREAwNbQm6vFqX8uu92UHo91GJWYfUH mTK8uRA30e7q7sAqccjhVHO/SzJ/FMwrRBbI7zuwiOLuhMkRqpN8qDRQCP5aXIWSpj o1D3FdpUkfZ7EurlL/PegBRszPlQut8mEgJp+hDVKzCzs2mG3jUhJnyx1qzjV21NHq DIFNirI/yKRhg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id C1E51C48BC3; Mon, 12 Feb 2024 20:02:39 +0000 (UTC) From: Emil Velikov via B4 Relay Date: Mon, 12 Feb 2024 20:02:38 +0000 Subject: [PATCH BlueZ v2 02/10] adapter: Remove experimental flag for PowerState Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240212-disto-patches-v2-2-8bab1bd08f4d@gmail.com> References: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> In-Reply-To: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> To: linux-bluetooth@vger.kernel.org Cc: Bastien Nocera X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707768157; l=1246; i=emil.l.velikov@gmail.com; s=20230301; h=from:subject:message-id; bh=kBWJv6IuMJzmAjsIKoWIKgJU/uFwFAGgPEAJK3EPyjo=; b=LSHYBrMDViFmJ9LE74zZVT+TFh/TVVCv3IfWPUs/pVGdSerKyT8KDIekdk5AkN2qnf/SMst4S tGIHN5/O+yDCpNkEjeK2KSFdcqA/m5b+pwsSGcZCJD6AHSazBQ4x4/G X-Developer-Key: i=emil.l.velikov@gmail.com; a=ed25519; pk=qeUTVTNyI3rcR2CfNNWsloTihgzmtbZo98GdxwZKCkY= X-Endpoint-Received: by B4 Relay for emil.l.velikov@gmail.com/20230301 with auth_id=35 X-Original-From: Emil Velikov Reply-To: From: Bastien Nocera Now that the feature has been tested, that the API is deemed adequate and the reliability sufficient. [Emil Velikov] The feature has landed in Sept 2022, with inclinations that "we might switch it to stable in the next release", back in Nov 2022. Today - a bit over 1 year later - various distributions (Fedora, Gentoo and by extension their derivatives) are carrying this patch. I think we can say we're reasonably stable and can merge it upstream. --- src/adapter.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 022390f0d..ef1e66e4b 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -3914,8 +3914,7 @@ static const GDBusPropertyTable adapter_properties[] = { { "Alias", "s", property_get_alias, property_set_alias }, { "Class", "u", property_get_class }, { "Powered", "b", property_get_powered, property_set_powered }, - { "PowerState", "s", property_get_power_state, NULL, NULL, - G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, + { "PowerState", "s", property_get_power_state }, { "Discoverable", "b", property_get_discoverable, property_set_discoverable }, { "DiscoverableTimeout", "u", property_get_discoverable_timeout, From patchwork Mon Feb 12 20:02:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via B4 Relay X-Patchwork-Id: 13553942 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 59F8F47A7A for ; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; cv=none; b=oEr13EHzMACQjCBI9zruWLFQvT96Nm1z6mpo14ctJ4QZBafn5+cNkk8dxPEYrWIJWnO7ybeDxEvFWYICtSpmA7fNdDUIvmgTmnQh8sJnOZMpIai356MfXwWigOndvxaAvZTXzgo5FUciOnh2uCz4nf0oYWOJfzSx+HRfk0saPC0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; c=relaxed/simple; bh=1OPZ/5XW++En0wH5bNH3Z2ADx3hGwLDcweiaE+aUSsQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RpOZPV9DYXQ18s4bjNNyM8TndX2AtEbiXtVrPkCHrFra7aFzb2SkESYTle3zizI3KyiH44fvX0LtEdAepp9k/LR8KqAwShT4arpVeBB/TeHNOxdMrQXFpw6c72BwdBQhQqPLXVc0HVKAu8tCYkSWvEeIhf+7dDlE92fKpR0biOI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Satvrb4q; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Satvrb4q" Received: by smtp.kernel.org (Postfix) with ESMTPS id E3630C43394; Mon, 12 Feb 2024 20:02:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707768159; bh=1OPZ/5XW++En0wH5bNH3Z2ADx3hGwLDcweiaE+aUSsQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Satvrb4qeZuqDCWv9TKlyI9V8yy9G43AYLQMxRDOQrtxE8OzW9mjC7fTeo/G5Xbmx osu+ai5zrcx87ruEL4ouOKp/SXnZw+Z2kwZ4G5581N/6AQD6dV5Fl2DgxrQSoXLoy+ mA4Vn4w2dceynSk8f5mgpNU5S13ifSRNlyv5XU7jXxTK0OrotkSa9JqhbWb2BUnvYg cirD3Shn4C1pxMehr6eBCrI8t5QQ7D35PbQW7ux4+z/6P4jQDNgI9jIp/f38Vf4bwm FWkyZ3H7S94EQWHxoWv4LKB06NHCKOtE8YaXa1Rczbgqj7xMOmqF8OJN5J+7i3CMjm RB6QGN2o5cMkg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id CF1C7C48BC1; Mon, 12 Feb 2024 20:02:39 +0000 (UTC) From: Emil Velikov via B4 Relay Date: Mon, 12 Feb 2024 20:02:39 +0000 Subject: [PATCH BlueZ v2 03/10] test: consistently use /usr/bin/env python3 shebang Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240212-disto-patches-v2-3-8bab1bd08f4d@gmail.com> References: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> In-Reply-To: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> To: linux-bluetooth@vger.kernel.org Cc: Emil Velikov , Nobuhiro Iwamatsu X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707768157; l=11465; i=emil.l.velikov@gmail.com; s=20230301; h=from:subject:message-id; bh=+WWRygO/gm5zKypQF1yrIhTAW2dn4f6SmY7sNODBkm4=; b=FRnb+yxWhNF0gUR7wz4at7VzCTwpRqI2fIyju98V++vPxihYK/9YJB55fqzO0QarqCuOVARN5 Vbu3vmeJpOHAllkpo9wUsOHXV0Xl7pniv7ZpREx26yPcJg23cMf5feE X-Developer-Key: i=emil.l.velikov@gmail.com; a=ed25519; pk=qeUTVTNyI3rcR2CfNNWsloTihgzmtbZo98GdxwZKCkY= X-Endpoint-Received: by B4 Relay for emil.l.velikov@gmail.com/20230301 with auth_id=35 X-Original-From: Emil Velikov Reply-To: From: Emil Velikov Currently we have a mix of /usr/bin/python, /usr/bin/python3 and /usr/bin/env python3. Use the latter since is the more common way of handling this, plus it allows people to override the system python (for what ever reason). Inspired by a Debian patch, doing a mass /usr/bin/python{,3} conversion. Cc: Nobuhiro Iwamatsu --- test/agent.py | 2 +- test/example-adv-monitor | 2 +- test/example-advertisement | 2 +- test/example-endpoint | 2 +- test/example-player | 2 +- test/exchange-business-cards | 2 +- test/ftp-client | 2 +- test/get-managed-objects | 2 +- test/get-obex-capabilities | 2 +- test/list-devices | 2 +- test/list-folders | 2 +- test/map-client | 2 +- test/monitor-bluetooth | 2 +- test/opp-client | 2 +- test/pbap-client | 2 +- test/simple-agent | 2 +- test/simple-endpoint | 2 +- test/simple-obex-agent | 2 +- test/simple-player | 2 +- test/test-adapter | 2 +- test/test-device | 2 +- test/test-discovery | 2 +- test/test-gatt-profile | 2 +- test/test-health | 2 +- test/test-health-sink | 2 +- test/test-hfp | 2 +- test/test-manager | 2 +- test/test-nap | 2 +- test/test-network | 2 +- test/test-profile | 2 +- test/test-sap-server | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/test/agent.py b/test/agent.py index 57a74183d..450fb20a3 100755 --- a/test/agent.py +++ b/test/agent.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later import sys diff --git a/test/example-adv-monitor b/test/example-adv-monitor index a405fc7b0..09888a973 100644 --- a/test/example-adv-monitor +++ b/test/example-adv-monitor @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later import argparse diff --git a/test/example-advertisement b/test/example-advertisement index 5f022ee67..910701220 100755 --- a/test/example-advertisement +++ b/test/example-advertisement @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import print_function diff --git a/test/example-endpoint b/test/example-endpoint index 16651c683..cb5ac2ae9 100644 --- a/test/example-endpoint +++ b/test/example-endpoint @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/example-player b/test/example-player index 167460bad..9d56b4a13 100644 --- a/test/example-player +++ b/test/example-player @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import print_function diff --git a/test/exchange-business-cards b/test/exchange-business-cards index 9a3aa29fb..12d513362 100755 --- a/test/exchange-business-cards +++ b/test/exchange-business-cards @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later import sys diff --git a/test/ftp-client b/test/ftp-client index ef756ab2b..e37c027f4 100755 --- a/test/ftp-client +++ b/test/ftp-client @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/get-managed-objects b/test/get-managed-objects index 5125ee524..7ad359db4 100755 --- a/test/get-managed-objects +++ b/test/get-managed-objects @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/get-obex-capabilities b/test/get-obex-capabilities index a7980a442..25a996e18 100755 --- a/test/get-obex-capabilities +++ b/test/get-obex-capabilities @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later import sys diff --git a/test/list-devices b/test/list-devices index 618d2867b..a24c31c7d 100755 --- a/test/list-devices +++ b/test/list-devices @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/list-folders b/test/list-folders index b4e3f100b..414bb367b 100755 --- a/test/list-folders +++ b/test/list-folders @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later import sys diff --git a/test/map-client b/test/map-client index f44f512bd..b7369b068 100755 --- a/test/map-client +++ b/test/map-client @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/monitor-bluetooth b/test/monitor-bluetooth index 99f3c857c..347c91ac3 100755 --- a/test/monitor-bluetooth +++ b/test/monitor-bluetooth @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/opp-client b/test/opp-client index 4f00a41c0..deb02c77c 100755 --- a/test/opp-client +++ b/test/opp-client @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/pbap-client b/test/pbap-client index e6cafdd30..6dada4a11 100755 --- a/test/pbap-client +++ b/test/pbap-client @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/simple-agent b/test/simple-agent index 4fdaff1eb..09437eb22 100755 --- a/test/simple-agent +++ b/test/simple-agent @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/simple-endpoint b/test/simple-endpoint index 463f124d1..eace4286d 100755 --- a/test/simple-endpoint +++ b/test/simple-endpoint @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/simple-obex-agent b/test/simple-obex-agent index 064f6d30b..65807bff3 100755 --- a/test/simple-obex-agent +++ b/test/simple-obex-agent @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/simple-player b/test/simple-player index 7bad3d14f..190e047e2 100755 --- a/test/simple-player +++ b/test/simple-player @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import print_function diff --git a/test/test-adapter b/test/test-adapter index c56ba9577..27aff27b5 100755 --- a/test/test-adapter +++ b/test/test-adapter @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-device b/test/test-device index c840f0565..8b1eb86d1 100755 --- a/test/test-device +++ b/test/test-device @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-discovery b/test/test-discovery index 54fc51403..6959e7be9 100755 --- a/test/test-discovery +++ b/test/test-discovery @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-gatt-profile b/test/test-gatt-profile index a973ae14e..64ff3e5f9 100755 --- a/test/test-gatt-profile +++ b/test/test-gatt-profile @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-health b/test/test-health index 3e16c415d..f26def906 100755 --- a/test/test-health +++ b/test/test-health @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-health-sink b/test/test-health-sink index 13b9a6b04..fcdc58e3d 100755 --- a/test/test-health-sink +++ b/test/test-health-sink @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-hfp b/test/test-hfp index 11e328e54..e1edac0aa 100755 --- a/test/test-hfp +++ b/test/test-hfp @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-manager b/test/test-manager index 3fa7205a0..a93819e27 100755 --- a/test/test-manager +++ b/test/test-manager @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-nap b/test/test-nap index d5c757b79..76cde74d4 100755 --- a/test/test-nap +++ b/test/test-nap @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-network b/test/test-network index acc7dff65..67be86106 100755 --- a/test/test-network +++ b/test/test-network @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-profile b/test/test-profile index af1e23f76..7d92f390e 100755 --- a/test/test-profile +++ b/test/test-profile @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals diff --git a/test/test-sap-server b/test/test-sap-server index ddb1efe9b..161a4bfec 100755 --- a/test/test-sap-server +++ b/test/test-sap-server @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # SPDX-License-Identifier: LGPL-2.1-or-later from __future__ import absolute_import, print_function, unicode_literals From patchwork Mon Feb 12 20:02:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via B4 Relay X-Patchwork-Id: 13553943 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 59F5947A73 for ; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; cv=none; b=XBHooj0cbjYE1ivXgW1l0qm7/df3f7l8tDP66ZQVPoTnMNLnI3Ikg/vUXBbti6AZ2TryjikPAmtfy8WYzA27EbLLVEjw/hbohakLk8jGEAzEohwxXrb40193aN5RKx0agGFoLJ983Awus0dInCkmS+SmgVjE1l1aAXbK85HxO9k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; c=relaxed/simple; bh=VRgZPdA6D+8hoZ3UC+OUGz8Kti/bsHC2kA8oXFsh0lo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dt/NqIdwxcB/nWyfPao5RVVrxdYgW1wTcnC0LTwEZ0qJM+jDBzeHYbK+iFdg4FQEcydFerTVtAYkcTraDHTsdYRgqueQYbiPv04qp/ohBrwFvIIQ5uoiMY3kzXPe1rkwbda9dq/AUzCsBabGcFPT8gVE1gimcEEaFth27eEqINE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RY/keaxP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RY/keaxP" Received: by smtp.kernel.org (Postfix) with ESMTPS id F2574C43399; Mon, 12 Feb 2024 20:02:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707768160; bh=VRgZPdA6D+8hoZ3UC+OUGz8Kti/bsHC2kA8oXFsh0lo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=RY/keaxPxOO1xgdxbT+BAldn1umHmQXb7d+6oIh9hFMj23nOJ/nqJ3X54cmV2RbUP bh5yqTJci8NVZNlVZ090K8HzRuSTaFa/YY56Tek4xajyZViqKFxfDIICdlGgriFifY FdANXmWEqJezvNi1wAqc1krUxB/BAIE48QYxPpi/f1hhvlcG/mIvF9Ak/t1HG1r0VS v0FsOhLHcTDDDo+IuKpAkzgE2knjLM+7WqB1j9zfiiEcgRtYH+qa/WVW231jEvfq6i ltZ6alEsxBghTG+anmGEHs14WEC8dcKqHIfHjhUKn5SaZPauVKZP4AZ4TmSjEiiqN2 0a+/oPyLsRR0g== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id DCEDCC48BC4; Mon, 12 Feb 2024 20:02:39 +0000 (UTC) From: Emil Velikov via B4 Relay Date: Mon, 12 Feb 2024 20:02:40 +0000 Subject: [PATCH BlueZ v2 04/10] profiles: remove unused suspend-dummy.c Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240212-disto-patches-v2-4-8bab1bd08f4d@gmail.com> References: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> In-Reply-To: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> To: linux-bluetooth@vger.kernel.org Cc: Emil Velikov , Nobuhiro Iwamatsu X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707768157; l=4509; i=emil.l.velikov@gmail.com; s=20230301; h=from:subject:message-id; bh=O5urzcyyiP0SFKs5VIgx4wp/q8Y+jAMqWGPzk079OjY=; b=Uru47TI0PMzfQvm0Ttb61J+M5i54qWShbtOynQf7AixSdF6TK/Gs8ZP3KxsTV8XSjdylWK0B2 G4haOgSVxLmBZhC9T3KYvCT8EkUBRsRo2cpdk3YzfDKQx1gHev/MLiQ X-Developer-Key: i=emil.l.velikov@gmail.com; a=ed25519; pk=qeUTVTNyI3rcR2CfNNWsloTihgzmtbZo98GdxwZKCkY= X-Endpoint-Received: by B4 Relay for emil.l.velikov@gmail.com/20230301 with auth_id=35 X-Original-From: Emil Velikov Reply-To: From: Emil Velikov The file has been used for about 8 years now - see commit fb55b7a6ab48c4f782b16030e051029bcfa93e07 ("profiles/hog: Use no suspend support instead of the dummy FIFO"). Inspired by a Debian patch by Nobuhiro Iwamatsu, which was changing the /tmp/hogsuspend socket patch to /run. Looking through the codebase we have a few more sockets that could use a to /run fix, but that will follow-up at another day. Cc: Nobuhiro Iwamatsu --- Makefile.plugins | 2 - profiles/input/suspend-dummy.c | 149 ----------------------------------------- 2 files changed, 151 deletions(-) diff --git a/Makefile.plugins b/Makefile.plugins index 7cf66fd59..e960eedea 100644 --- a/Makefile.plugins +++ b/Makefile.plugins @@ -74,8 +74,6 @@ builtin_sources += profiles/input/hog.c \ profiles/battery/bas.c profiles/battery/bas.h \ profiles/scanparam/scpp.c profiles/scanparam/scpp.h \ profiles/input/suspend.h profiles/input/suspend-none.c - -EXTRA_DIST += profiles/input/suspend-dummy.c endif if HEALTH diff --git a/profiles/input/suspend-dummy.c b/profiles/input/suspend-dummy.c deleted file mode 100644 index ea1835e0f..000000000 --- a/profiles/input/suspend-dummy.c +++ /dev/null @@ -1,149 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2012 Nordic Semiconductor Inc. - * Copyright (C) 2012 Instituto Nokia de Tecnologia - INdT - * - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "src/log.h" -#include "suspend.h" - -#define HOG_SUSPEND_FIFO "/tmp/hogsuspend" - -static suspend_event suspend_cb = NULL; -static resume_event resume_cb = NULL; -static guint watch = 0; - -static int fifo_open(void); - -static gboolean read_fifo(GIOChannel *io, GIOCondition cond, gpointer user_data) -{ - char buffer[12]; - gsize offset, left, bread; - GIOStatus iostatus; - - if (cond & (G_IO_ERR | G_IO_HUP)) { - /* - * Both ends needs to be open simultaneously before proceeding - * any input or output operation. When the remote closes the - * channel, hup signal is received on this end. - */ - fifo_open(); - return FALSE; - } - - offset = 0; - left = sizeof(buffer) - 1; - memset(buffer, 0, sizeof(buffer)); - - do { - iostatus = g_io_channel_read_chars(io, &buffer[offset], left, - &bread, NULL); - - offset += bread; - left -= bread; - if (left == 0) - break; - } while (iostatus == G_IO_STATUS_NORMAL); - - if (g_ascii_strncasecmp("suspend", buffer, 7) == 0) - suspend_cb(); - else if (g_ascii_strncasecmp("resume", buffer, 6) == 0) - resume_cb(); - - return TRUE; -} - -static int fifo_open(void) -{ - GIOCondition condition = G_IO_IN | G_IO_ERR | G_IO_HUP; - GIOChannel *fifoio; - int fd; - - fd = open(HOG_SUSPEND_FIFO, O_RDONLY | O_NONBLOCK); - if (fd < 0) { - int err = -errno; - error("Can't open FIFO (%s): %s(%d)", HOG_SUSPEND_FIFO, - strerror(-err), -err); - return err; - } - - fifoio = g_io_channel_unix_new(fd); - g_io_channel_set_close_on_unref(fifoio, TRUE); - - watch = g_io_add_watch(fifoio, condition, read_fifo, NULL); - - g_io_channel_unref(fifoio); - - return 0; -} - -int suspend_init(suspend_event suspend, resume_event resume) -{ - struct stat st; - int ret; - - DBG(""); - - suspend_cb = suspend; - resume_cb = resume; - - if (stat(HOG_SUSPEND_FIFO, &st) == 0) { - if (!S_ISFIFO(st.st_mode)) { - error("Unexpected non-FIFO %s file", HOG_SUSPEND_FIFO); - return -EIO; - } - - if (unlink(HOG_SUSPEND_FIFO) < 0) { - int err = -errno; - error("Failed to remove FIFO (%s): %s (%d)", - HOG_SUSPEND_FIFO, strerror(-err), -err); - return err; - } - } - - if (mkfifo(HOG_SUSPEND_FIFO, 0600) < 0) { - int err = -errno; - - error("Can't create FIFO (%s): %s (%d)", HOG_SUSPEND_FIFO, - strerror(-err), -err); - return err; - } - - DBG("Created suspend-dummy FIFO on %s", HOG_SUSPEND_FIFO); - - ret = fifo_open(); - if (ret < 0) - unlink(HOG_SUSPEND_FIFO); - - return ret; -} - -void suspend_exit(void) -{ - if (watch > 0) { - g_source_remove(watch); - watch = 0; - } - - unlink(HOG_SUSPEND_FIFO); -} From patchwork Mon Feb 12 20:02:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via B4 Relay X-Patchwork-Id: 13553947 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D6D647F6A for ; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; cv=none; b=DM7SxvSOkBMaYtatiaTDbWa9woJzPwyCuMGv0SopqvBYyTYQS7Q474Pky1rZopDM4ZXrU8wwDMhiwcx8tjG8Kk6utpgch7h8NJ/+Jms8AY7fiCnjcg9bv72J6rwTvsXodTpKjSWNuEMU5GH3kNGZL94DR0PHmfSvN69qcsMDEZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; c=relaxed/simple; bh=Fkl57YFn8lsz3HEw63pTmgFfOYszadNcuW8g0Jd0abE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=itxVqNCJ+PTFfe1+JDrkWD4+fNqzZRY1WVnMsgQqaZZbYds4uBiIULxS/VpFtH5Ma4TScWDcSrjcn6WPubZs8K+ye0B8VoqSK7nDBdiCgpvYA9IfMro1rIWgakPYp6EqsCXZeim2QXMUg87G8mKRdmcrBVY1R0eEpRsY3laYtxM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OYKaeLiM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OYKaeLiM" Received: by smtp.kernel.org (Postfix) with ESMTPS id 08F62C433B1; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707768160; bh=Fkl57YFn8lsz3HEw63pTmgFfOYszadNcuW8g0Jd0abE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=OYKaeLiMG2JTu5nc/EfN23Ix1uaX5P+YtRyyy3d2CpT/hXhx3SUaHZB0EhbuFKp3/ eu6AgZErgoUwg3QdeBahY8iH8Eimf15pnxgcYfNGoJRw4qrD1fztVHel3+gNMLH07U 5hBeU/hWZJZu9PGGzg+GMo1ZOMtiO3iCSJC5NXlbccxJWKE9pxXQIcTXDx0oFDELfZ Q3T84Okvy67kW5UoWDluB5y8nsyfcRv7/i6oHw7OdbZ8N4eWhnna+VVVI7d7vBR7pE 4I2Xpb1aC71bGQxDd8Cr6njk/7nuBql/s/z17SzTya3XJmEzn+R+4Y6WbPMyWgJY5P HvQRF2d/04O0g== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id E959FC48297; Mon, 12 Feb 2024 20:02:39 +0000 (UTC) From: Emil Velikov via B4 Relay Date: Mon, 12 Feb 2024 20:02:41 +0000 Subject: [PATCH BlueZ v2 05/10] obex: remove unused syncevolution plugin Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240212-disto-patches-v2-5-8bab1bd08f4d@gmail.com> References: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> In-Reply-To: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> To: linux-bluetooth@vger.kernel.org Cc: Emil Velikov X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707768157; l=13112; i=emil.l.velikov@gmail.com; s=20230301; h=from:subject:message-id; bh=3jSLi5/GJDSS3GOWoTxgwGDBznwfplAZJG6CthgZjic=; b=zP0KBr6vEzEx2QcOgRH9puORchf6Ndq9VSbO9U+3UlVbnbGeDjyp/TtYd2DJy3/Zscl0B/CGG ZzhFhKcf3cLDIQXGd7nuPd/L62MzY7CPF22gLjyt8V5WyaNSaainOZv X-Developer-Key: i=emil.l.velikov@gmail.com; a=ed25519; pk=qeUTVTNyI3rcR2CfNNWsloTihgzmtbZo98GdxwZKCkY= X-Endpoint-Received: by B4 Relay for emil.l.velikov@gmail.com/20230301 with auth_id=35 X-Original-From: Emil Velikov Reply-To: From: Emil Velikov Based on my git log archaeology, the plugin was never built despite receiving multiple updates across the years. It's possible that the git history is lost when (if?) obexd code was imported. The file isn't in the official tarball, so end users cannot enable if even if they wanted to. So let's remove the dead/unused plugin. There is some existing infra around OBEX_SYNCEVOLUTION which can be checked/removed as follow-up. --- obexd/plugins/syncevolution.c | 470 ------------------------------------------ 1 file changed, 470 deletions(-) diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c deleted file mode 100644 index ae3dc48c4..000000000 --- a/obexd/plugins/syncevolution.c +++ /dev/null @@ -1,470 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * - * OBEX Server - * - * Copyright (C) 2007-2010 Intel Corporation - * Copyright (C) 2007-2010 Marcel Holtmann - * - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include - -#include -#include - -#include "lib/bluetooth.h" - -#include "gdbus/gdbus.h" - -#include "btio/btio.h" -#include "obexd/src/plugin.h" -#include "obexd/src/obex.h" -#include "obexd/src/service.h" -#include "obexd/src/mimetype.h" -#include "obexd/src/log.h" -#include "obexd/src/manager.h" -#include "obexd/src/obexd.h" -#include "filesystem.h" - -#define SYNCML_TARGET_SIZE 11 - -static const uint8_t SYNCML_TARGET[SYNCML_TARGET_SIZE] = { - 0x53, 0x59, 0x4E, 0x43, 0x4D, 0x4C, 0x2D, 0x53, - 0x59, 0x4E, 0x43 }; - -#define SYNCEVOLUTION_CHANNEL 19 - -#define SYNCEVOLUTION_RECORD "\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ -" - -#define SYNCE_BUS_NAME "org.syncevolution" -#define SYNCE_PATH "/org/syncevolution/Server" -#define SYNCE_SERVER_INTERFACE "org.syncevolution.Server" -#define SYNCE_CONN_INTERFACE "org.syncevolution.Connection" - -struct synce_context { - struct obex_session *os; - DBusConnection *dbus_conn; - char *conn_obj; - unsigned int reply_watch; - unsigned int abort_watch; - GString *buffer; - int lasterr; - char *id; -}; - -static void append_dict_entry(DBusMessageIter *dict, const char *key, - int type, void *val) -{ - DBusMessageIter entry; - - dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY, - NULL, &entry); - dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key); - dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val); - dbus_message_iter_close_container(dict, &entry); -} - -static gboolean reply_signal(DBusConnection *conn, DBusMessage *msg, - void *data) -{ - struct synce_context *context = data; - const char *path = dbus_message_get_path(msg); - DBusMessageIter iter, array_iter; - char *value; - int length; - - if (strcmp(context->conn_obj, path) != 0) { - obex_object_set_io_flags(context, G_IO_ERR, -EPERM); - context->lasterr = -EPERM; - return FALSE; - } - - dbus_message_iter_init(msg, &iter); - - dbus_message_iter_recurse(&iter, &array_iter); - dbus_message_iter_get_fixed_array(&array_iter, &value, &length); - - context->buffer = g_string_new_len(value, length); - obex_object_set_io_flags(context, G_IO_IN, 0); - context->lasterr = 0; - - return TRUE; -} - -static gboolean abort_signal(DBusConnection *conn, DBusMessage *msg, - void *data) -{ - struct synce_context *context = data; - - obex_object_set_io_flags(context, G_IO_ERR, -EPERM); - context->lasterr = -EPERM; - - return TRUE; -} - -static void connect_cb(DBusPendingCall *call, void *user_data) -{ - struct synce_context *context = user_data; - DBusConnection *conn; - DBusMessage *reply; - DBusError err; - char *path; - - conn = context->dbus_conn; - - reply = dbus_pending_call_steal_reply(call); - - dbus_error_init(&err); - if (dbus_message_get_args(reply, &err, DBUS_TYPE_OBJECT_PATH, &path, - DBUS_TYPE_INVALID) == FALSE) { - error("%s", err.message); - dbus_error_free(&err); - goto failed; - } - - DBG("Got conn object %s from syncevolution", path); - context->conn_obj = g_strdup(path); - - context->reply_watch = g_dbus_add_signal_watch(conn, NULL, path, - SYNCE_CONN_INTERFACE, "Reply", - reply_signal, context, NULL); - - context->abort_watch = g_dbus_add_signal_watch(conn, NULL, path, - SYNCE_CONN_INTERFACE, "Abort", - abort_signal, context, NULL); - - dbus_message_unref(reply); - - return; - -failed: - obex_object_set_io_flags(context, G_IO_ERR, -EPERM); - context->lasterr = -EPERM; -} - -static void process_cb(DBusPendingCall *call, void *user_data) -{ - struct synce_context *context = user_data; - DBusMessage *reply; - DBusError derr; - - reply = dbus_pending_call_steal_reply(call); - dbus_error_init(&derr); - if (dbus_set_error_from_message(&derr, reply)) { - error("process_cb(): syncevolution replied with an error:" - " %s, %s", derr.name, derr.message); - dbus_error_free(&derr); - - obex_object_set_io_flags(context, G_IO_ERR, -EPERM); - context->lasterr = -EPERM; - goto done; - } - - obex_object_set_io_flags(context, G_IO_OUT, 0); - context->lasterr = 0; - -done: - dbus_message_unref(reply); -} - -static void *synce_connect(struct obex_session *os, int *err) -{ - DBusConnection *conn; - struct synce_context *context; - char *address; - - manager_register_session(os); - - conn = manager_dbus_get_connection(); - if (!conn) - goto failed; - - context = g_new0(struct synce_context, 1); - context->dbus_conn = conn; - context->lasterr = -EAGAIN; - context->os = os; - - if (obex_getpeername(os, &address) == 0) { - context->id = g_strdup_printf("%s+%d", address, - SYNCEVOLUTION_CHANNEL); - g_free(address); - } - - if (err) - *err = 0; - - return context; - -failed: - if (err) - *err = -EPERM; - - return NULL; -} - -static int synce_put(struct obex_session *os, void *user_data) -{ - return 0; -} - -static int synce_get(struct obex_session *os, void *user_data) -{ - return obex_get_stream_start(os, NULL); -} - -static void close_cb(DBusPendingCall *call, void *user_data) -{ - DBusMessage *reply; - DBusError derr; - - reply = dbus_pending_call_steal_reply(call); - dbus_error_init(&derr); - if (dbus_set_error_from_message(&derr, reply)) { - error("close_cb(): syncevolution replied with an error:" - " %s, %s", derr.name, derr.message); - dbus_error_free(&derr); - } - - dbus_message_unref(reply); -} - -static void synce_disconnect(struct obex_session *os, void *user_data) -{ - struct synce_context *context = user_data; - - g_free(context); -} - -static void *synce_open(const char *name, int oflag, mode_t mode, - void *user_data, size_t *size, int *err) -{ - struct synce_context *context = user_data; - - if (err) - *err = context ? 0 : -EFAULT; - - return user_data; -} - -static int synce_close(void *object) -{ - struct synce_context *context = object; - DBusMessage *msg; - const char *error; - gboolean normal; - DBusPendingCall *call; - - if (!context->conn_obj) - goto done; - - msg = dbus_message_new_method_call(SYNCE_BUS_NAME, context->conn_obj, - SYNCE_CONN_INTERFACE, "Close"); - if (!msg) - goto failed; - - normal = TRUE; - error = "none"; - dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &normal, - DBUS_TYPE_STRING, &error, DBUS_TYPE_INVALID); - - g_dbus_send_message_with_reply(context->dbus_conn, msg, &call, -1); - dbus_pending_call_set_notify(call, close_cb, NULL, NULL); - dbus_message_unref(msg); - dbus_pending_call_unref(call); - -failed: - g_dbus_remove_watch(context->dbus_conn, context->reply_watch); - context->reply_watch = 0; - g_dbus_remove_watch(context->dbus_conn, context->abort_watch); - context->abort_watch = 0; - - g_free(context->conn_obj); - context->conn_obj = NULL; - -done: - dbus_connection_unref(context->dbus_conn); - g_free(context); - return 0; -} - -static ssize_t synce_read(void *object, void *buf, size_t count) -{ - struct synce_context *context = object; - DBusConnection *conn; - char transport[36], transport_description[24]; - const char *session; - DBusMessage *msg; - DBusMessageIter iter, dict; - gboolean authenticate; - DBusPendingCall *call; - - if (context->buffer) - return string_read(context->buffer, buf, count); - - conn = manager_dbus_get_connection(); - if (conn == NULL) - return -EPERM; - - msg = dbus_message_new_method_call(SYNCE_BUS_NAME, SYNCE_PATH, - SYNCE_SERVER_INTERFACE, "Connect"); - if (!msg) - return -EPERM; - - dbus_message_iter_init_append(msg, &iter); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, - DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING - DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING - DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); - - append_dict_entry(&dict, "id", DBUS_TYPE_STRING, context->id); - - snprintf(transport, sizeof(transport), "%s.obexd", OBEXD_SERVICE); - append_dict_entry(&dict, "transport", DBUS_TYPE_STRING, transport); - - snprintf(transport_description, sizeof(transport_description), - "version %s", VERSION); - append_dict_entry(&dict, "transport_description", DBUS_TYPE_STRING, - transport_description); - - dbus_message_iter_close_container(&iter, &dict); - - authenticate = FALSE; - session = ""; - dbus_message_append_args(msg, DBUS_TYPE_BOOLEAN, &authenticate, - DBUS_TYPE_STRING, &session, DBUS_TYPE_INVALID); - - if (!g_dbus_send_message_with_reply(conn, msg, &call, -1)) { - error("D-Bus call to %s failed.", SYNCE_SERVER_INTERFACE); - dbus_message_unref(msg); - return -EPERM; - } - - dbus_pending_call_set_notify(call, connect_cb, context, NULL); - - dbus_pending_call_unref(call); - dbus_message_unref(msg); - - return -EAGAIN; -} - -static ssize_t synce_write(void *object, const void *buf, size_t count) -{ - struct synce_context *context = object; - DBusMessage *msg; - DBusMessageIter iter, array_iter; - DBusPendingCall *call; - const char *type = obex_get_type(context->os); - - if (context->lasterr == 0) - return count; - - if (!context->conn_obj) - return -EFAULT; - - msg = dbus_message_new_method_call(SYNCE_BUS_NAME, context->conn_obj, - SYNCE_CONN_INTERFACE, "Process"); - if (!msg) - return -EFAULT; - - dbus_message_iter_init_append(msg, &iter); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, - DBUS_TYPE_BYTE_AS_STRING, &array_iter); - - dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, - &buf, count); - dbus_message_iter_close_container(&iter, &array_iter); - - dbus_message_append_args(msg, DBUS_TYPE_STRING, &type, - DBUS_TYPE_INVALID); - - if (!g_dbus_send_message_with_reply(context->dbus_conn, msg, - &call, -1)) { - error("D-Bus call to %s failed.", SYNCE_CONN_INTERFACE); - dbus_message_unref(msg); - return -EPERM; - } - - dbus_pending_call_set_notify(call, process_cb, context, NULL); - - dbus_message_unref(msg); - dbus_pending_call_unref(call); - - return -EAGAIN; -} - -static const struct obex_mime_type_driver synce_driver = { - .target = SYNCML_TARGET, - .target_size = SYNCML_TARGET_SIZE, - .open = synce_open, - .close = synce_close, - .read = synce_read, - .write = synce_write, -}; - -static const struct obex_service_driver synce = { - .name = "OBEX server for SyncML, using SyncEvolution", - .service = OBEX_SYNCEVOLUTION, - .channel = SYNCEVOLUTION_CHANNEL, - .secure = TRUE, - .record = SYNCEVOLUTION_RECORD, - .target = SYNCML_TARGET, - .target_size = SYNCML_TARGET_SIZE, - .get = synce_get, - .put = synce_put, - .connect = synce_connect, - .disconnect = synce_disconnect, -}; - -static int synce_init(void) -{ - int err; - - err = obex_mime_type_driver_register(&synce_driver); - if (err < 0) - return err; - - return obex_service_driver_register(&synce); -} - -static void synce_exit(void) -{ - obex_service_driver_unregister(&synce); - obex_mime_type_driver_unregister(&synce_driver); -} - -OBEX_PLUGIN_DEFINE(syncevolution, synce_init, synce_exit) From patchwork Mon Feb 12 20:02:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via B4 Relay X-Patchwork-Id: 13553944 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5CB1C47A7D for ; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; cv=none; b=NLT2JAiDy3oOQM+0dQ+0/kNcbE9b2CwiKXzNL5JN4AKjXUyhC5U4ImXl+lcA4AFkmODjVgZq/V6lV3GP3/k6VKbWlQ/jONApHJ6Py+iEocynQUK4Z283yyVBfDNdRZ+vYiATyLTVBNP78NQwAsOUg3I08EViPe21CV3/UbKnmXM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; c=relaxed/simple; bh=egRzPvAAn5fsZb8GyFjjj6XvqI/5ax2IAHO4XlPq0F4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KbC5ffiYJaAgBJUdRn7DzdaYLqS5QU+CKxWQiPKPyD+Bwj2KakuMqxRdUsBD7j49Skr2OL1DQu1a1UGrNl6GQqrnl49Zp70dj2MwfqnQr2myT29T3GwPKcAdyjckjTxfjPZlwVqtcNSsS1M7d1BbsczU/b8H91++CLdsCQ62yuE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=sTmRoYLR; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="sTmRoYLR" Received: by smtp.kernel.org (Postfix) with ESMTPS id 16083C433A6; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707768160; bh=egRzPvAAn5fsZb8GyFjjj6XvqI/5ax2IAHO4XlPq0F4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=sTmRoYLR/ziUVIkPtHeGoWJoaQthf5ul8d3oJgi8tLnpBdxMzbGnmLEFepJIJrwYT S5Pj4BcTGTSQCCQQzCFRpSFCIBfFsy5CWy3ivsaq3mgOYFfzEs3QR8hCEZuoxARAuS IUN/rFFDWi8d99SZXxnlKfveEnOjpPKoAlh6zwkzV2ntQzoNj4zGE1bjaCN6OD2rTa 34BbCNgT5woaEgir+nOTZJ5+pLE6KmpWnqCsLjiiL8pwnXt4Rn6UnasmgmGy1YWXpd Hz+lNElYS+q/md93769/2V3p/Fz87czwAUy+E9GhF8yM39pjGQVPIarpau3I2mnQbG fDlaHQwNgE36g== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 015E7C48BC3; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) From: Emil Velikov via B4 Relay Date: Mon, 12 Feb 2024 20:02:42 +0000 Subject: [PATCH BlueZ v2 06/10] obex: remove unused mas/messages-tracker impl Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240212-disto-patches-v2-6-8bab1bd08f4d@gmail.com> References: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> In-Reply-To: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> To: linux-bluetooth@vger.kernel.org Cc: Emil Velikov X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707768157; l=8063; i=emil.l.velikov@gmail.com; s=20230301; h=from:subject:message-id; bh=jQe/lFTSKdtDkClg+0iy9yWYeYhpYU0PJHv9DcVITWQ=; b=VbaKv+6AZWguoH7BK8zbABAzVz3UT16yRx9lx87/NbVK5OHGK3OxAWUAdOzvmCb/Ts+GeYIoG uv2iRINUukhBXZJ3vitE+rsU7Kk1MBb2HK6NvEzgYqyIQ4rUTIuHkyQ X-Developer-Key: i=emil.l.velikov@gmail.com; a=ed25519; pk=qeUTVTNyI3rcR2CfNNWsloTihgzmtbZo98GdxwZKCkY= X-Endpoint-Received: by B4 Relay for emil.l.velikov@gmail.com/20230301 with auth_id=35 X-Original-From: Emil Velikov Reply-To: From: Emil Velikov Currently we have a "dummy" and a "tracker" implementation. The latter was seemingly never wired into the build... Unless the git history was rewritten and details were lost. Remove the file - it's not shipped in the tarball, so even if anyone want to use it they cannot. --- obexd/plugins/messages-tracker.c | 332 --------------------------------------- 1 file changed, 332 deletions(-) diff --git a/obexd/plugins/messages-tracker.c b/obexd/plugins/messages-tracker.c deleted file mode 100644 index 4ce9f221d..000000000 --- a/obexd/plugins/messages-tracker.c +++ /dev/null @@ -1,332 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * - * OBEX Server - * - * Copyright (C) 2010-2011 Nokia Corporation - * - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include - -#include "messages.h" - -struct message_folder { - char *name; - GSList *subfolders; - char *query; -}; - -struct session { - char *cwd; - struct message_folder *folder; - char *name; - uint16_t max; - uint16_t offset; - void *user_data; - void (*folder_list_cb)(void *session, int err, uint16_t size, - const char *name, void *user_data); -}; - -static struct message_folder *folder_tree = NULL; - -static struct message_folder *get_folder(const char *folder) -{ - GSList *folders = folder_tree->subfolders; - struct message_folder *last = NULL; - char **path; - int i; - - if (g_strcmp0(folder, "/") == 0) - return folder_tree; - - path = g_strsplit(folder, "/", 0); - - for (i = 1; path[i] != NULL; i++) { - gboolean match_found = FALSE; - GSList *l; - - for (l = folders; l != NULL; l = g_slist_next(l)) { - struct message_folder *folder = l->data; - - if (g_strcmp0(folder->name, path[i]) == 0) { - match_found = TRUE; - last = l->data; - folders = folder->subfolders; - break; - } - } - - if (!match_found) { - g_strfreev(path); - return NULL; - } - } - - g_strfreev(path); - - return last; -} - -static struct message_folder *create_folder(const char *name, const char *query) -{ - struct message_folder *folder = g_new0(struct message_folder, 1); - - folder->name = g_strdup(name); - folder->query = g_strdup(query); - - return folder; -} - -static void destroy_folder_tree(void *root) -{ - struct message_folder *folder = root; - GSList *tmp, *next; - - if (folder == NULL) - return; - - g_free(folder->name); - g_free(folder->query); - - tmp = folder->subfolders; - while (tmp != NULL) { - next = g_slist_next(tmp); - destroy_folder_tree(tmp->data); - tmp = next; - } - - g_slist_free(folder->subfolders); - g_free(folder); -} - -static void create_folder_tree(void) -{ - struct message_folder *parent, *child; - - folder_tree = create_folder("/", "FILTER (!BOUND(?msg))"); - - parent = create_folder("telecom", "FILTER (!BOUND(?msg))"); - folder_tree->subfolders = g_slist_append(folder_tree->subfolders, - parent); - - child = create_folder("msg", "FILTER (!BOUND(?msg))"); - parent->subfolders = g_slist_append(parent->subfolders, child); - - parent = child; - - child = create_folder("inbox", "?msg nmo:isSent \"false\" ; " - "nmo:isDeleted \"false\" ; " - "nmo:isDraft \"false\". "); - parent->subfolders = g_slist_append(parent->subfolders, child); - - child = create_folder("sent", "?msg nmo:isDeleted \"false\" ; " - "nmo:isSent \"true\" . "); - parent->subfolders = g_slist_append(parent->subfolders, child); - - child = create_folder("deleted", "?msg nmo:isDeleted \"true\" . "); - parent->subfolders = g_slist_append(parent->subfolders, child); -} - -int messages_init(void) -{ - create_folder_tree(); - - return 0; -} - -void messages_exit(void) -{ - destroy_folder_tree(folder_tree); -} - -int messages_connect(void **s) -{ - struct session *session = g_new0(struct session, 1); - - session->cwd = g_strdup("/"); - session->folder = folder_tree; - - *s = session; - - return 0; -} - -void messages_disconnect(void *s) -{ - struct session *session = s; - - g_free(session->cwd); - g_free(session); -} - -int messages_set_notification_registration(void *session, - void (*send_event)(void *session, - const struct messages_event *event, void *user_data), - void *user_data) -{ - return -ENOSYS; -} - -int messages_set_folder(void *s, const char *name, gboolean cdup) -{ - struct session *session = s; - char *newrel = NULL; - char *newabs; - char *tmp; - - if (name && (strchr(name, '/') || strcmp(name, "..") == 0)) - return -EBADR; - - if (cdup) { - if (session->cwd[0] == 0) - return -ENOENT; - - newrel = g_path_get_dirname(session->cwd); - - /* We use empty string for indication of the root directory */ - if (newrel[0] == '.' && newrel[1] == 0) - newrel[0] = 0; - } - - tmp = newrel; - if (!cdup && (!name || name[0] == 0)) - newrel = g_strdup(""); - else - newrel = g_build_filename(newrel ? newrel : session->cwd, name, - NULL); - g_free(tmp); - - if (newrel[0] != '/') - newabs = g_build_filename("/", newrel, NULL); - else - newabs = g_strdup(newrel); - - session->folder = get_folder(newabs); - if (session->folder == NULL) { - g_free(newrel); - g_free(newabs); - - return -ENOENT; - } - - g_free(newrel); - g_free(session->cwd); - session->cwd = newabs; - - return 0; -} - -static gboolean async_get_folder_listing(void *s) -{ - struct session *session = s; - gboolean count = FALSE; - int folder_count = 0; - char *path = NULL; - struct message_folder *folder; - GSList *dir; - - if (session->name && strchr(session->name, '/') != NULL) - goto done; - - path = g_build_filename(session->cwd, session->name, NULL); - - if (path == NULL || strlen(path) == 0) - goto done; - - folder = get_folder(path); - - if (folder == NULL) - goto done; - - if (session->max == 0) { - session->max = 0xffff; - session->offset = 0; - count = TRUE; - } - - for (dir = folder->subfolders; dir && - (folder_count - session->offset) < session->max; - folder_count++, dir = g_slist_next(dir)) { - struct message_folder *dir_data = dir->data; - - if (count == FALSE && session->offset <= folder_count) - session->folder_list_cb(session, -EAGAIN, 0, - dir_data->name, session->user_data); - } - - done: - session->folder_list_cb(session, 0, folder_count, NULL, - session->user_data); - - g_free(path); - g_free(session->name); - - return FALSE; -} - -int messages_get_folder_listing(void *s, const char *name, - uint16_t max, uint16_t offset, - messages_folder_listing_cb callback, - void *user_data) -{ - struct session *session = s; - session->name = g_strdup(name); - session->max = max; - session->offset = offset; - session->folder_list_cb = callback; - session->user_data = user_data; - - g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, async_get_folder_listing, - session, NULL); - - return 0; -} - -int messages_get_messages_listing(void *session, const char *name, - uint16_t max, uint16_t offset, - uint8_t subject_len, - const struct messages_filter *filter, - messages_get_messages_listing_cb callback, - void *user_data) -{ - return -ENOSYS; -} - -int messages_get_message(void *session, const char *handle, - unsigned long flags, - messages_get_message_cb callback, - void *user_data) -{ - return -ENOSYS; -} - -int messages_update_inbox(void *session, messages_status_cb callback, - void *user_data) -{ - return -ENOSYS; -} - -int messages_set_read(void *session, const char *handle, uint8_t value, - messages_status_cb callback, void *user_data) -{ - return -ENOSYS; -} - -int messages_set_delete(void *session, const char *handle, uint8_t value, - messages_status_cb callback, - void *user_data) -{ - return -ENOSYS; -} - -void messages_abort(void *session) -{ -} From patchwork Mon Feb 12 20:02:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via B4 Relay X-Patchwork-Id: 13553948 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82BDE47F64 for ; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; cv=none; b=Rl2rKYuBvuJly/f6xdO4LvqYkljhQoBt3ik9FOY4INP7YtEg4ZPDkgDhH+SSysvjQCMQb6O9M4jx+rqJ+iL+4Eh5qB4hDzH9JDOMJlxfNd6WiP7bBA5FMNfKYafq2yNC8wg0ffsa0NmoeLXP0BkoFMtL+N+10Hi8iDgSWT3DlF8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; c=relaxed/simple; bh=iP8MRNwAv5TnlQX539b+3OyPDt5YaK44sFmfygYqvi8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Kg1xHgvB214hxuW/8XZC97m1ZSODw5EyY/lLJMK8sRNznjwz2wa+L92SLWEnXyG3o4ff6/3czHl6sTXygqs/7GtbnlOU7QOLmss/OFCr+1RFdAaH4gl2xDm2+Ac5Ydk5fuRIcN/w5S+PPiYIQ8WY66JRklFg33JrHHBfgfs/3FI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=B9JehHme; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="B9JehHme" Received: by smtp.kernel.org (Postfix) with ESMTPS id 201DEC433B2; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707768160; bh=iP8MRNwAv5TnlQX539b+3OyPDt5YaK44sFmfygYqvi8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=B9JehHmeJz9titv/sYRDxDMZ+gR2vOnrJH1asogUvJtKJjJQRq5q825RTvrMR3C/n q15dpp6T8f/bCGvb7XLRVnueE3bUSFsVg1vymVvSjmyLN0KSpSJqMVwXQGsXCScl18 VdxW93fR4PyjDXI/cQMfZ3u0H/3g7Sm4zS960Ygk0xLIMtlMnXkcQu8Pg/bIcqS34p RqmKyU/iMamLw94gqXwnG7odaSlexTGGojMnoiMwV/DtZK3CwUUP9xRbsw8KESessO 6GU0piIunINOQDizLuo1hkoUNPnnVM5Rt1M31TQDmoactZJGmpQUpu+D2aszA5bFGT 5mFsdoE8xV0Yw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0FFEBC4829E; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) From: Emil Velikov via B4 Relay Date: Mon, 12 Feb 2024 20:02:43 +0000 Subject: [PATCH BlueZ v2 07/10] obex: remove phonebook tracker backend Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240212-disto-patches-v2-7-8bab1bd08f4d@gmail.com> References: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> In-Reply-To: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> To: linux-bluetooth@vger.kernel.org Cc: Emil Velikov X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707768157; l=50891; i=emil.l.velikov@gmail.com; s=20230301; h=from:subject:message-id; bh=CwywbdVS/jMY/+HJVXb9evcgRdPZmEHnvV6rEJJPjh4=; b=+M0gWHB/3pT2Y2QNE/pUtsbx2tPdeqM3l09naJHE/vn5f0dUzpyTfSUAIj7WvECehN7wRowUU En5R+GAtPMUDVO+hSspEOk3tWiGswgccgtNDmcpYevgV+lny1zR2ryb X-Developer-Key: i=emil.l.velikov@gmail.com; a=ed25519; pk=qeUTVTNyI3rcR2CfNNWsloTihgzmtbZo98GdxwZKCkY= X-Endpoint-Received: by B4 Relay for emil.l.velikov@gmail.com/20230301 with auth_id=35 X-Original-From: Emil Velikov Reply-To: From: Emil Velikov Similar to the previous commits - the file was seemingly never build, according to git log. Unlike the other cases, here the user can provide the backend name via configure.ac toggle. Although the case of tracker was never properly handled - no pkg-config or probe based checks for includes, link library, etc. Remove the file and enforce the two backend options - dummy and ebook. --- Makefile.obexd | 3 +- configure.ac | 6 +- obexd/plugins/phonebook-tracker.c | 1704 ------------------------------------- 3 files changed, 4 insertions(+), 1709 deletions(-) diff --git a/Makefile.obexd b/Makefile.obexd index 0e50b1fa4..1d37a1bd4 100644 --- a/Makefile.obexd +++ b/Makefile.obexd @@ -48,8 +48,7 @@ obexd_builtin_sources += obexd/plugins/pbap.c \ obexd/plugins/vcard.h obexd/plugins/vcard.c \ obexd/plugins/phonebook.h \ obexd/plugins/phonebook-@PLUGIN_PHONEBOOK@.c -EXTRA_DIST += obexd/plugins/phonebook-dummy.c obexd/plugins/phonebook-ebook.c \ - obexd/plugins/phonebook-tracker.c +EXTRA_DIST += obexd/plugins/phonebook-dummy.c obexd/plugins/phonebook-ebook.c obexd_builtin_modules += mas obexd_builtin_sources += obexd/plugins/mas.c obexd/src/map_ap.h \ diff --git a/configure.ac b/configure.ac index 5eb7ee0e0..387db8c7d 100644 --- a/configure.ac +++ b/configure.ac @@ -443,11 +443,11 @@ AC_ARG_WITH([phonebook], AS_HELP_STRING([--with-phonebook=PLUGIN], [plugin_phonebook=${withval}]) if (test -z "${plugin_phonebook}"); then plugin_phonebook=dummy -fi - -if (test "${plugin_phonebook}" = "ebook"); then +elif (test "${plugin_phonebook}" = "ebook"); then PKG_CHECK_MODULES(LIBEBOOK, libebook-1.2 >= 3.3) PKG_CHECK_MODULES(LIBEDATESERVER, libedataserver-1.2 >= 3.3) +else + AC_MSG_ERROR([Unsupported phonebook backend ${plugin_phonebook}]) fi AC_SUBST(PLUGIN_PHONEBOOK, [${plugin_phonebook}]) diff --git a/obexd/plugins/phonebook-tracker.c b/obexd/plugins/phonebook-tracker.c deleted file mode 100644 index 71a91c1ea..000000000 --- a/obexd/plugins/phonebook-tracker.c +++ /dev/null @@ -1,1704 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * Phonebook access through D-Bus vCard and call history service - * - * Copyright (C) 2010 Nokia Corporation - * - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "obexd/src/log.h" -#include "obexd/src/obex.h" -#include "obexd/src/service.h" -#include "obexd/src/mimetype.h" -#include "phonebook.h" -#include "vcard.h" - -#define TRACKER_SERVICE "org.freedesktop.Tracker1" -#define TRACKER_RESOURCES_PATH "/org/freedesktop/Tracker1/Resources" -#define TRACKER_RESOURCES_INTERFACE "org.freedesktop.Tracker1.Resources" - -#define TRACKER_DEFAULT_CONTACT_ME "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#default-contact-me" -#define AFFILATION_HOME "Home" -#define AFFILATION_WORK "Work" -#define ADDR_FIELD_AMOUNT 7 -#define PULL_QUERY_COL_AMOUNT 23 -#define COUNT_QUERY_COL_AMOUNT 1 - -#define COL_PHONE_AFF 0 /* work/home phone numbers */ -#define COL_FULL_NAME 1 -#define COL_FAMILY_NAME 2 -#define COL_GIVEN_NAME 3 -#define COL_ADDITIONAL_NAME 4 -#define COL_NAME_PREFIX 5 -#define COL_NAME_SUFFIX 6 -#define COL_ADDR_AFF 7 /* addresses from affilation */ -#define COL_BIRTH_DATE 8 -#define COL_NICKNAME 9 -#define COL_URL 10 -#define COL_PHOTO 11 -#define COL_ORG_ROLE 12 -#define COL_UID 13 -#define COL_TITLE 14 -#define COL_AFF_TYPE 15 -#define COL_ORG_NAME 16 -#define COL_ORG_DEPARTMENT 17 -#define COL_EMAIL_AFF 18 /* email's from affilation (work/home) */ -#define COL_DATE 19 -#define COL_SENT 20 -#define COL_ANSWERED 21 -#define CONTACTS_ID_COL 22 -#define CONTACT_ID_PREFIX "urn:uuid:" -#define CALL_ID_PREFIX "message:" - -#define FAX_NUM_TYPE "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#FaxNumber" -#define MOBILE_NUM_TYPE "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#CellPhoneNumber" - -#define MAIN_DELIM "\30" /* Main delimiter between phones, addresses, emails*/ -#define SUB_DELIM "\31" /* Delimiter used in telephone number strings*/ -#define ADDR_DELIM "\37" /* Delimiter used for address data fields */ -#define MAX_FIELDS 100 /* Max amount of fields to be concatenated at once*/ -#define VCARDS_PART_COUNT 50 /* amount of vcards sent at once to PBAP core */ -#define QUERY_OFFSET_FORMAT "%s OFFSET %d" - -#define CONTACTS_QUERY_ALL \ -"SELECT " \ -"(SELECT GROUP_CONCAT(fn:concat(rdf:type(?aff_number)," \ -"\"\31\", nco:phoneNumber(?aff_number)), \"\30\")" \ -"WHERE {" \ -" ?_role nco:hasPhoneNumber ?aff_number" \ -"}) " \ -"nco:fullname(?_contact) " \ -"nco:nameFamily(?_contact) " \ -"nco:nameGiven(?_contact) " \ -"nco:nameAdditional(?_contact) " \ -"nco:nameHonorificPrefix(?_contact) " \ -"nco:nameHonorificSuffix(?_contact) " \ -"(SELECT GROUP_CONCAT(fn:concat(" \ -"tracker:coalesce(nco:pobox(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:extendedAddress(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:streetAddress(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:locality(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:region(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:postalcode(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:country(?aff_addr), \"\"), " \ -"\"\31\", rdfs:label(?_role) ), " \ -"\"\30\") " \ -"WHERE {" \ -"?_role nco:hasPostalAddress ?aff_addr" \ -"}) " \ -"nco:birthDate(?_contact) " \ -"(SELECT " \ -" ?nick " \ -" WHERE { " \ -" { " \ -" ?_contact nco:nickname ?nick " \ -" } UNION { " \ -" ?_contact nco:hasAffiliation ?role . " \ -" ?role nco:hasIMAddress ?im . " \ -" ?im nco:imNickname ?nick " \ -" } " \ -" } " \ -") " \ -"(SELECT GROUP_CONCAT(fn:concat( " \ - "?url_val, \"\31\", tracker:coalesce(rdfs:label(?_role), \"\") "\ - "), \"\30\") " \ - "WHERE {" \ - "?_role nco:url ?url_val . " \ -"})" \ -"nie:url(nco:photo(?_contact)) " \ -"nco:role(?_role) " \ -"nco:contactUID(?_contact) " \ -"nco:title(?_role) " \ -"rdfs:label(?_role) " \ -"nco:fullname(nco:org(?_role))" \ -"nco:department(?_role) " \ -"(SELECT GROUP_CONCAT(fn:concat(?emailaddress,\"\31\"," \ - "tracker:coalesce(rdfs:label(?_role), \"\"))," \ - "\"\30\") " \ - "WHERE { " \ - "?_role nco:hasEmailAddress " \ - " [ nco:emailAddress ?emailaddress ] " \ - "}) " \ -"\"NOTACALL\" \"false\" \"false\" " \ -"?_contact " \ -"WHERE {" \ -" ?_contact a nco:PersonContact ." \ -" OPTIONAL {?_contact nco:hasAffiliation ?_role .}" \ -"}" \ -"ORDER BY tracker:id(?_contact)" - -#define CONTACTS_QUERY_ALL_LIST \ - "SELECT ?c nco:nameFamily(?c) " \ - "nco:nameGiven(?c) nco:nameAdditional(?c) " \ - "nco:nameHonorificPrefix(?c) nco:nameHonorificSuffix(?c) " \ - "(SELECT " \ - "?nick " \ - "WHERE { " \ - "{ " \ - "?c nco:nickname ?nick " \ - "} UNION { " \ - "?c nco:hasAffiliation ?role . " \ - "?role nco:hasIMAddress ?im . " \ - "?im nco:imNickname ?nick " \ - "} " \ - "} " \ - ") " \ - "nco:phoneNumber(?h) " \ - "WHERE { " \ - "?c a nco:PersonContact . " \ - "OPTIONAL { ?c nco:hasPhoneNumber ?h . } " \ - "OPTIONAL { " \ - "?c nco:hasAffiliation ?a . " \ - "?a nco:hasPhoneNumber ?h . " \ - "} " \ - "} GROUP BY ?c" - -#define CALLS_CONSTRAINTS(CONSTRAINT) \ -" WHERE { " \ - "?_call a nmo:Call . " \ - "?_unb_contact a nco:Contact . " \ - "?_unb_contact nco:hasPhoneNumber ?_cpn . " \ -CONSTRAINT \ - "OPTIONAL { " \ - "{ SELECT ?_contact ?_no ?_role ?_number " \ - "count(?_contact) as ?cnt " \ - "WHERE { " \ - "?_contact a nco:PersonContact . " \ - "{ " \ - "?_contact nco:hasAffiliation ?_role . "\ - "?_role nco:hasPhoneNumber ?_number . " \ - "} UNION { " \ - "?_contact nco:hasPhoneNumber ?_number" \ - "} " \ - "?_number maemo:localPhoneNumber ?_no . " \ - "} GROUP BY ?_no } " \ - "FILTER(?cnt = 1) " \ - "?_cpn maemo:localPhoneNumber ?_no . " \ - "} " \ -"} " - -#define CALLS_LIST(CONSTRAINT) \ -"SELECT ?_call nco:nameFamily(?_contact) " \ - "nco:nameGiven(?_contact) nco:nameAdditional(?_contact) " \ - "nco:nameHonorificPrefix(?_contact) " \ - "nco:nameHonorificSuffix(?_contact) " \ - "(SELECT " \ - "?nick " \ - "WHERE { " \ - "{ " \ - "?_contact nco:nickname ?nick " \ - "} UNION { " \ - "?_contact nco:hasAffiliation ?role . " \ - "?role nco:hasIMAddress ?im . " \ - "?im nco:imNickname ?nick " \ - "} " \ - "} " \ - ") " \ - "nco:phoneNumber(?_cpn) " \ -CALLS_CONSTRAINTS(CONSTRAINT) \ -"ORDER BY DESC(nmo:sentDate(?_call)) " - -#define CALLS_QUERY(CONSTRAINT) \ -"SELECT " \ -"(SELECT fn:concat(rdf:type(?role_number)," \ - "\"\31\", nco:phoneNumber(?role_number))" \ - "WHERE {" \ - "{" \ - " ?_role nco:hasPhoneNumber ?role_number " \ - " FILTER (?role_number = ?_number)" \ - "} UNION { " \ - "?_unb_contact nco:hasPhoneNumber ?role_number . " \ - " FILTER (!bound(?_role)) " \ - "}" \ -"} GROUP BY nco:phoneNumber(?role_number) ) " \ - "nco:fullname(?_contact) " \ - "nco:nameFamily(?_contact) " \ - "nco:nameGiven(?_contact) " \ - "nco:nameAdditional(?_contact) " \ - "nco:nameHonorificPrefix(?_contact) " \ - "nco:nameHonorificSuffix(?_contact) " \ -"(SELECT GROUP_CONCAT(fn:concat(" \ - "tracker:coalesce(nco:pobox(?aff_addr), \"\"), \"\37\"," \ - "tracker:coalesce(nco:extendedAddress(?aff_addr), \"\"), \"\37\","\ - "tracker:coalesce(nco:streetAddress(?aff_addr), \"\"), \"\37\","\ - "tracker:coalesce(nco:locality(?aff_addr), \"\"), \"\37\"," \ - "tracker:coalesce(nco:region(?aff_addr), \"\"), \"\37\"," \ - "tracker:coalesce(nco:postalcode(?aff_addr), \"\"), \"\37\"," \ - "tracker:coalesce(nco:country(?aff_addr), \"\"), " \ - "\"\31\", rdfs:label(?c_role) ), " \ - "\"\30\") " \ - "WHERE {" \ - "?_contact nco:hasAffiliation ?c_role . " \ - "?c_role nco:hasPostalAddress ?aff_addr" \ - "}) " \ - "nco:birthDate(?_contact) " \ -"(SELECT " \ - "?nick " \ - "WHERE { " \ - " { " \ - " ?_contact nco:nickname ?nick " \ - " } UNION { " \ - " ?_contact nco:hasAffiliation ?role . " \ - " ?role nco:hasIMAddress ?im . " \ - " ?im nco:imNickname ?nick " \ - " } " \ - " } " \ - ") " \ -"(SELECT GROUP_CONCAT(fn:concat(?url_value, \"\31\", " \ - "tracker:coalesce(rdfs:label(?c_role), \"\")), \"\30\") " \ - "WHERE {" \ - "?_contact nco:hasAffiliation ?c_role . " \ - "?c_role nco:url ?url_value . " \ -"})" \ - "nie:url(nco:photo(?_contact)) " \ - "nco:role(?_role) " \ - "nco:contactUID(?_contact) " \ - "nco:title(?_role) " \ - "rdfs:label(?_role) " \ - "nco:fullname(nco:org(?_role)) " \ - "nco:department(?_role) " \ -"(SELECT GROUP_CONCAT(fn:concat(?emailaddress,\"\31\"," \ - "tracker:coalesce(rdfs:label(?c_role), \"\"))," \ - "\"\30\") " \ - "WHERE { " \ - "?_contact nco:hasAffiliation ?c_role . " \ - "?c_role nco:hasEmailAddress " \ - " [ nco:emailAddress ?emailaddress ] " \ - "}) " \ - "nmo:receivedDate(?_call) " \ - "nmo:isSent(?_call) " \ - "nmo:isAnswered(?_call) " \ - "?_call " \ -CALLS_CONSTRAINTS(CONSTRAINT) \ -"ORDER BY DESC(nmo:sentDate(?_call)) " - -#define MISSED_CONSTRAINT \ -"?_call nmo:from ?_unb_contact . " \ -"?_call nmo:isSent false . " \ -"?_call nmo:isAnswered false . " - -#define INCOMING_CONSTRAINT \ -"?_call nmo:from ?_unb_contact . " \ -"?_call nmo:isSent false . " \ -"?_call nmo:isAnswered true . " - -#define OUTGOING_CONSTRAINT \ -"?_call nmo:to ?_unb_contact . " \ -"?_call nmo:isSent true . " - -#define COMBINED_CONSTRAINT \ -"{ " \ -" ?_call nmo:from ?_unb_contact . " \ -" ?_call nmo:isSent false " \ -"} UNION { " \ -" ?_call nmo:to ?_unb_contact . " \ -" ?_call nmo:isSent true " \ -"} " - -#define CALL_URI_CONSTRAINT \ -COMBINED_CONSTRAINT \ -"FILTER (?_call = <%s>) " - -#define MISSED_CALLS_QUERY CALLS_QUERY(MISSED_CONSTRAINT) -#define MISSED_CALLS_LIST CALLS_LIST(MISSED_CONSTRAINT) -#define INCOMING_CALLS_QUERY CALLS_QUERY(INCOMING_CONSTRAINT) -#define INCOMING_CALLS_LIST CALLS_LIST(INCOMING_CONSTRAINT) -#define OUTGOING_CALLS_QUERY CALLS_QUERY(OUTGOING_CONSTRAINT) -#define OUTGOING_CALLS_LIST CALLS_LIST(OUTGOING_CONSTRAINT) -#define COMBINED_CALLS_QUERY CALLS_QUERY(COMBINED_CONSTRAINT) -#define COMBINED_CALLS_LIST CALLS_LIST(COMBINED_CONSTRAINT) -#define CONTACT_FROM_CALL_QUERY CALLS_QUERY(CALL_URI_CONSTRAINT) - -#define CONTACTS_QUERY_FROM_URI \ -"SELECT " \ -"(SELECT GROUP_CONCAT(fn:concat(rdf:type(?aff_number)," \ -"\"\31\", nco:phoneNumber(?aff_number)), \"\30\")" \ -"WHERE {" \ -" ?_role nco:hasPhoneNumber ?aff_number" \ -"}) " \ -"nco:fullname(<%s>) " \ -"nco:nameFamily(<%s>) " \ -"nco:nameGiven(<%s>) " \ -"nco:nameAdditional(<%s>) " \ -"nco:nameHonorificPrefix(<%s>) " \ -"nco:nameHonorificSuffix(<%s>) " \ -"(SELECT GROUP_CONCAT(fn:concat(" \ -"tracker:coalesce(nco:pobox(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:extendedAddress(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:streetAddress(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:locality(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:region(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:postalcode(?aff_addr), \"\"), \"\37\"," \ -"tracker:coalesce(nco:country(?aff_addr), \"\"), " \ -"\"\31\", rdfs:label(?_role) ), " \ -"\"\30\") " \ -"WHERE {" \ -"?_role nco:hasPostalAddress ?aff_addr" \ -"}) " \ -"nco:birthDate(<%s>) " \ -"(SELECT " \ -" ?nick " \ -" WHERE { " \ -" { " \ -" ?_contact nco:nickname ?nick " \ -" } UNION { " \ -" ?_contact nco:hasAffiliation ?role . " \ -" ?role nco:hasIMAddress ?im . " \ -" ?im nco:imNickname ?nick " \ -" } " \ -" FILTER (?_contact = <%s>)" \ -" } " \ -") " \ -"(SELECT GROUP_CONCAT(fn:concat( " \ - "?url_val, \"\31\", tracker:coalesce(rdfs:label(?_role), \"\") "\ - "), \"\30\") " \ - "WHERE {" \ - "?_role nco:url ?url_val . " \ -"})" \ -"nie:url(nco:photo(<%s>)) " \ -"nco:role(?_role) " \ -"nco:contactUID(<%s>) " \ -"nco:title(?_role) " \ -"rdfs:label(?_role) " \ -"nco:fullname(nco:org(?_role))" \ -"nco:department(?_role) " \ -"(SELECT GROUP_CONCAT(fn:concat(?emailaddress,\"\31\"," \ - "tracker:coalesce(rdfs:label(?_role), \"\"))," \ - "\"\30\") " \ - "WHERE { " \ - "?_role nco:hasEmailAddress " \ - " [ nco:emailAddress ?emailaddress ] " \ - "}) " \ -"\"NOTACALL\" \"false\" \"false\" " \ -"<%s> " \ -"WHERE {" \ -" <%s> a nco:PersonContact ." \ -" OPTIONAL {<%s> nco:hasAffiliation ?_role .}" \ -"}" - -#define CONTACTS_OTHER_QUERY_FROM_URI \ - "SELECT fn:concat(\"TYPE_OTHER\", \"\31\", nco:phoneNumber(?t))"\ - "\"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" " \ - "\"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" " \ - " \"NOTACALL\" \"false\" \"false\" <%s> " \ - "WHERE { " \ - "<%s> a nco:Contact . " \ - "OPTIONAL { <%s> nco:hasPhoneNumber ?t . } " \ - "} " - -#define CONTACTS_COUNT_QUERY \ - "SELECT COUNT(?c) " \ - "WHERE {" \ - "?c a nco:PersonContact ." \ - "}" - -#define MISSED_CALLS_COUNT_QUERY \ - "SELECT COUNT(?call) WHERE {" \ - "?c a nco:Contact ;" \ - "nco:hasPhoneNumber ?h ." \ - "?call a nmo:Call ;" \ - "nmo:isSent false ;" \ - "nmo:from ?c ;" \ - "nmo:isAnswered false ." \ - "}" - -#define INCOMING_CALLS_COUNT_QUERY \ - "SELECT COUNT(?call) WHERE {" \ - "?c a nco:Contact ;" \ - "nco:hasPhoneNumber ?h ." \ - "?call a nmo:Call ;" \ - "nmo:isSent false ;" \ - "nmo:from ?c ;" \ - "nmo:isAnswered true ." \ - "}" - -#define OUTGOING_CALLS_COUNT_QUERY \ - "SELECT COUNT(?call) WHERE {" \ - "?c a nco:Contact ;" \ - "nco:hasPhoneNumber ?h ." \ - "?call a nmo:Call ;" \ - "nmo:isSent true ;" \ - "nmo:to ?c ." \ - "}" - -#define COMBINED_CALLS_COUNT_QUERY \ - "SELECT COUNT(?call) WHERE {" \ - "{" \ - "?c a nco:Contact ;" \ - "nco:hasPhoneNumber ?h ." \ - "?call a nmo:Call ;" \ - "nmo:isSent true ;" \ - "nmo:to ?c ." \ - "}UNION {" \ - "?c a nco:Contact ;" \ - "nco:hasPhoneNumber ?h ." \ - "?call a nmo:Call ;" \ - "nmo:from ?c ." \ - "}" \ - "}" - -#define NEW_MISSED_CALLS_COUNT_QUERY \ - "SELECT COUNT(?call) WHERE {" \ - "?c a nco:Contact ;" \ - "nco:hasPhoneNumber ?h ." \ - "?call a nmo:Call ;" \ - "nmo:isSent false ;" \ - "nmo:from ?c ;" \ - "nmo:isAnswered false ;" \ - "nmo:isRead false ." \ - "}" - -typedef int (*reply_list_foreach_t) (const char **reply, int num_fields, - void *user_data); - -typedef void (*add_field_t) (struct phonebook_contact *contact, - const char *value, int type); - -struct pending_reply { - reply_list_foreach_t callback; - void *user_data; - int num_fields; -}; - -struct contact_data { - char *id; - struct phonebook_contact *contact; -}; - -struct phonebook_data { - phonebook_cb cb; - void *user_data; - int index; - gboolean vcardentry; - const struct apparam_field *params; - GSList *contacts; - phonebook_cache_ready_cb ready_cb; - phonebook_entry_cb entry_cb; - int newmissedcalls; - GCancellable *query_canc; - char *req_name; - int vcard_part_count; - int tracker_index; -}; - -struct phonebook_index { - GArray *phonebook; - int index; -}; - -static TrackerSparqlConnection *connection = NULL; - -static const char *name2query(const char *name) -{ - if (g_str_equal(name, PB_CONTACTS)) - return CONTACTS_QUERY_ALL; - else if (g_str_equal(name, PB_CALLS_INCOMING)) - return INCOMING_CALLS_QUERY; - else if (g_str_equal(name, PB_CALLS_OUTGOING)) - return OUTGOING_CALLS_QUERY; - else if (g_str_equal(name, PB_CALLS_MISSED)) - return MISSED_CALLS_QUERY; - else if (g_str_equal(name, PB_CALLS_COMBINED)) - return COMBINED_CALLS_QUERY; - - return NULL; -} - -static const char *name2count_query(const char *name) -{ - if (g_str_equal(name, PB_CONTACTS)) - return CONTACTS_COUNT_QUERY; - else if (g_str_equal(name, PB_CALLS_INCOMING)) - return INCOMING_CALLS_COUNT_QUERY; - else if (g_str_equal(name, PB_CALLS_OUTGOING)) - return OUTGOING_CALLS_COUNT_QUERY; - else if (g_str_equal(name, PB_CALLS_MISSED)) - return MISSED_CALLS_COUNT_QUERY; - else if (g_str_equal(name, PB_CALLS_COMBINED)) - return COMBINED_CALLS_COUNT_QUERY; - - return NULL; -} - -static gboolean folder_is_valid(const char *folder) -{ - if (folder == NULL) - return FALSE; - - if (g_str_equal(folder, "/")) - return TRUE; - else if (g_str_equal(folder, PB_TELECOM_FOLDER)) - return TRUE; - else if (g_str_equal(folder, PB_CONTACTS_FOLDER)) - return TRUE; - else if (g_str_equal(folder, PB_CALLS_INCOMING_FOLDER)) - return TRUE; - else if (g_str_equal(folder, PB_CALLS_OUTGOING_FOLDER)) - return TRUE; - else if (g_str_equal(folder, PB_CALLS_MISSED_FOLDER)) - return TRUE; - else if (g_str_equal(folder, PB_CALLS_COMBINED_FOLDER)) - return TRUE; - - return FALSE; -} - -static const char *folder2query(const char *folder) -{ - if (g_str_equal(folder, PB_CONTACTS_FOLDER)) - return CONTACTS_QUERY_ALL_LIST; - else if (g_str_equal(folder, PB_CALLS_INCOMING_FOLDER)) - return INCOMING_CALLS_LIST; - else if (g_str_equal(folder, PB_CALLS_OUTGOING_FOLDER)) - return OUTGOING_CALLS_LIST; - else if (g_str_equal(folder, PB_CALLS_MISSED_FOLDER)) - return MISSED_CALLS_LIST; - else if (g_str_equal(folder, PB_CALLS_COMBINED_FOLDER)) - return COMBINED_CALLS_LIST; - - return NULL; -} - -static const char **string_array_from_cursor(TrackerSparqlCursor *cursor, - int array_len) -{ - const char **result; - int i; - - result = g_new0(const char *, array_len); - - for (i = 0; i < array_len; ++i) { - TrackerSparqlValueType type; - - type = tracker_sparql_cursor_get_value_type(cursor, i); - - if (type == TRACKER_SPARQL_VALUE_TYPE_BLANK_NODE || - type == TRACKER_SPARQL_VALUE_TYPE_UNBOUND) - /* For null/unbound type filling result part with ""*/ - result[i] = ""; - else - /* Filling with string representation of content*/ - result[i] = tracker_sparql_cursor_get_string(cursor, i, - NULL); - } - - return result; -} - -static void update_cancellable(struct phonebook_data *pdata, - GCancellable *canc) -{ - if (pdata->query_canc) - g_object_unref(pdata->query_canc); - - pdata->query_canc = canc; -} - -static void async_query_cursor_next_cb(GObject *source, GAsyncResult *result, - gpointer user_data) -{ - struct pending_reply *pending = user_data; - TrackerSparqlCursor *cursor = TRACKER_SPARQL_CURSOR(source); - GCancellable *cancellable; - GError *error = NULL; - gboolean success; - const char **node; - int err; - - success = tracker_sparql_cursor_next_finish( - TRACKER_SPARQL_CURSOR(source), - result, &error); - - if (!success) { - if (error) { - DBG("cursor_next error: %s", error->message); - g_error_free(error); - } else - /* When tracker_sparql_cursor_next_finish ends with - * failure and no error is set, that means end of - * results returned by query */ - pending->callback(NULL, 0, pending->user_data); - - goto failed; - } - - node = string_array_from_cursor(cursor, pending->num_fields); - err = pending->callback(node, pending->num_fields, pending->user_data); - g_free(node); - - /* Fetch next result only if processing current chunk ended with - * success. Sometimes during processing data, we are able to determine - * if there is no need to get more data from tracker - by example - * stored amount of data parts is big enough for sending and we might - * want to suspend processing or just some error occurred. */ - if (!err) { - cancellable = g_cancellable_new(); - update_cancellable(pending->user_data, cancellable); - tracker_sparql_cursor_next_async(cursor, cancellable, - async_query_cursor_next_cb, - pending); - return; - } - -failed: - g_object_unref(cursor); - g_free(pending); -} - -static int query_tracker(const char *query, int num_fields, - reply_list_foreach_t callback, void *user_data) -{ - struct pending_reply *pending; - GCancellable *cancellable; - TrackerSparqlCursor *cursor; - GError *error = NULL; - - DBG(""); - - if (connection == NULL) - connection = tracker_sparql_connection_get_direct( - NULL, &error); - - if (!connection) { - if (error) { - DBG("direct-connection error: %s", error->message); - g_error_free(error); - } - - return -EINTR; - } - - cancellable = g_cancellable_new(); - update_cancellable(user_data, cancellable); - cursor = tracker_sparql_connection_query(connection, query, - cancellable, &error); - - if (cursor == NULL) { - if (error) { - DBG("connection_query error: %s", error->message); - g_error_free(error); - } - - g_object_unref(cancellable); - - return -EINTR; - } - - pending = g_new0(struct pending_reply, 1); - pending->callback = callback; - pending->user_data = user_data; - pending->num_fields = num_fields; - - /* Now asynchronously going through each row of results - callback - * async_query_cursor_next_cb will be called ALWAYS, even if async - * request was canceled */ - tracker_sparql_cursor_next_async(cursor, cancellable, - async_query_cursor_next_cb, - pending); - - return 0; -} - -static char *iso8601_utc_to_localtime(const char *datetime) -{ - time_t time; - struct tm tm, *local; - char localdate[32]; - int nr; - - memset(&tm, 0, sizeof(tm)); - - nr = sscanf(datetime, "%04u-%02u-%02uT%02u:%02u:%02u", - &tm.tm_year, &tm.tm_mon, &tm.tm_mday, - &tm.tm_hour, &tm.tm_min, &tm.tm_sec); - if (nr < 6) { - /* Invalid time format */ - error("sscanf(): %s (%d)", strerror(errno), errno); - return g_strdup(""); - } - - /* Time already in localtime */ - if (!g_str_has_suffix(datetime, "Z")) { - strftime(localdate, sizeof(localdate), "%Y%m%dT%H%M%S", &tm); - return g_strdup(localdate); - } - - tm.tm_year -= 1900; /* Year since 1900 */ - tm.tm_mon--; /* Months since January, values 0-11 */ - - time = mktime(&tm); - time -= timezone; - - local = localtime(&time); - - strftime(localdate, sizeof(localdate), "%Y%m%dT%H%M%S", local); - - return g_strdup(localdate); -} - -static void set_call_type(struct phonebook_contact *contact, - const char *datetime, const char *is_sent, - const char *is_answered) -{ - gboolean sent, answered; - - if (g_strcmp0(datetime, "NOTACALL") == 0) { - contact->calltype = CALL_TYPE_NOT_A_CALL; - return; - } - - sent = g_str_equal(is_sent, "true"); - answered = g_str_equal(is_answered, "true"); - - if (sent == FALSE) { - if (answered == FALSE) - contact->calltype = CALL_TYPE_MISSED; - else - contact->calltype = CALL_TYPE_INCOMING; - } else - contact->calltype = CALL_TYPE_OUTGOING; - - /* Tracker gives time in the ISO 8601 format, UTC time */ - contact->datetime = iso8601_utc_to_localtime(datetime); -} - -static gboolean contact_matches(struct contact_data *c_data, const char *id, - const char *datetime) -{ - char *localtime; - int cmp_ret; - - if (g_strcmp0(c_data->id, id) != 0) - return FALSE; - - /* id is equal and not call history entry => contact matches */ - if (c_data->contact->calltype == CALL_TYPE_NOT_A_CALL) - return TRUE; - - /* for call history entries have to compare also timestamps of calls */ - localtime = iso8601_utc_to_localtime(datetime); - cmp_ret = g_strcmp0(c_data->contact->datetime, localtime); - g_free(localtime); - - return (cmp_ret == 0) ? TRUE : FALSE; -} - -static struct phonebook_contact *find_contact(GSList *contacts, const char *id, - const char *datetime) -{ - GSList *l; - - for (l = contacts; l; l = l->next) { - struct contact_data *c_data = l->data; - - if (contact_matches(c_data, id, datetime)) - return c_data->contact; - } - - return NULL; -} - -static struct phonebook_field *find_field(GSList *fields, const char *value, - int type) -{ - GSList *l; - - for (l = fields; l; l = l->next) { - struct phonebook_field *field = l->data; - /* Returning phonebook number if phone values and type values - * are equal */ - if (g_strcmp0(field->text, value) == 0 && field->type == type) - return field; - } - - return NULL; -} - -static void add_phone_number(struct phonebook_contact *contact, - const char *phone, int type) -{ - struct phonebook_field *number; - - if (phone == NULL || strlen(phone) == 0) - return; - - /* Not adding number if there is already added with the same value */ - if (find_field(contact->numbers, phone, type)) - return; - - number = g_new0(struct phonebook_field, 1); - number->text = g_strdup(phone); - number->type = type; - - contact->numbers = g_slist_append(contact->numbers, number); -} - -static void add_email(struct phonebook_contact *contact, const char *address, - int type) -{ - struct phonebook_field *email; - - if (address == NULL || strlen(address) == 0) - return; - - /* Not adding email if there is already added with the same value */ - if (find_field(contact->emails, address, type)) - return; - - email = g_new0(struct phonebook_field, 1); - email->text = g_strdup(address); - email->type = type; - - contact->emails = g_slist_append(contact->emails, email); -} - -static gboolean addr_matches(struct phonebook_addr *a, struct phonebook_addr *b) -{ - GSList *la, *lb; - - if (a->type != b->type) - return FALSE; - - for (la = a->fields, lb = b->fields; la && lb; - la = la->next, lb = lb->next) { - char *field_a = la->data; - char *field_b = lb->data; - - if (g_strcmp0(field_a, field_b) != 0) - return FALSE; - } - - return TRUE; -} - -/* generates phonebook_addr struct from tracker address data string. */ -static struct phonebook_addr *gen_addr(const char *address, int type) -{ - struct phonebook_addr *addr; - GSList *fields = NULL; - char **addr_parts; - int i; - - /* This test handles cases when address points to empty string - * (or address is NULL pointer) or string containing only six - * separators. It indicates that none of address fields is present - * and there is no sense to create dummy phonebook_addr struct */ - if (address == NULL || strlen(address) < ADDR_FIELD_AMOUNT) - return NULL; - - addr_parts = g_strsplit(address, ADDR_DELIM, ADDR_FIELD_AMOUNT); - - for (i = 0; i < ADDR_FIELD_AMOUNT; ++i) - fields = g_slist_append(fields, g_strdup(addr_parts[i])); - - g_strfreev(addr_parts); - - addr = g_new0(struct phonebook_addr, 1); - addr->fields = fields; - addr->type = type; - - return addr; -} - -static void add_address(struct phonebook_contact *contact, - const char *address, int type) -{ - struct phonebook_addr *addr; - GSList *l; - - addr = gen_addr(address, type); - if (addr == NULL) - return; - - /* Not adding address if there is already added with the same value. - * These type of checks have to be done because sometimes tracker - * returns results for contact data in more than 1 row - then the same - * address may be returned more than once in query results */ - for (l = contact->addresses; l; l = l->next) { - struct phonebook_addr *tmp = l->data; - - if (addr_matches(tmp, addr)) { - phonebook_addr_free(addr); - return; - } - } - - contact->addresses = g_slist_append(contact->addresses, addr); -} - -static void add_url(struct phonebook_contact *contact, const char *url_val, - int type) -{ - struct phonebook_field *url; - - if (url_val == NULL || strlen(url_val) == 0) - return; - - /* Not adding url if there is already added with the same value */ - if (find_field(contact->urls, url_val, type)) - return; - - url = g_new0(struct phonebook_field, 1); - - url->text = g_strdup(url_val); - url->type = type; - - contact->urls = g_slist_append(contact->urls, url); -} - -static GString *gen_vcards(GSList *contacts, - const struct apparam_field *params) -{ - GSList *l; - GString *vcards; - - vcards = g_string_new(NULL); - - /* Generating VCARD string from contacts and freeing used contacts */ - for (l = contacts; l; l = l->next) { - struct contact_data *c_data = l->data; - phonebook_add_contact(vcards, c_data->contact, - params->filter, params->format); - } - - return vcards; -} - -static int pull_contacts_size(const char **reply, int num_fields, - void *user_data) -{ - struct phonebook_data *data = user_data; - - if (num_fields < 0) { - data->cb(NULL, 0, num_fields, 0, TRUE, data->user_data); - return -EINTR; - } - - if (reply != NULL) { - data->index = atoi(reply[0]); - return 0; - } - - data->cb(NULL, 0, data->index, data->newmissedcalls, TRUE, - data->user_data); - - return 0; - /* - * phonebook_data is freed in phonebook_req_finalize. Useful in - * cases when call is terminated. - */ -} - -static void add_affiliation(char **field, const char *value) -{ - if (strlen(*field) > 0 || value == NULL || strlen(value) == 0) - return; - - g_free(*field); - - *field = g_strdup(value); -} - -static void contact_init(struct phonebook_contact *contact, - const char **reply) -{ - if (reply[COL_FAMILY_NAME][0] == '\0' && - reply[COL_GIVEN_NAME][0] == '\0' && - reply[COL_ADDITIONAL_NAME][0] == '\0' && - reply[COL_NAME_PREFIX][0] == '\0' && - reply[COL_NAME_SUFFIX][0] == '\0') { - if (reply[COL_FULL_NAME][0] != '\0') - contact->family = g_strdup(reply[COL_FULL_NAME]); - else - contact->family = g_strdup(reply[COL_NICKNAME]); - } else { - contact->family = g_strdup(reply[COL_FAMILY_NAME]); - contact->given = g_strdup(reply[COL_GIVEN_NAME]); - contact->additional = g_strdup(reply[COL_ADDITIONAL_NAME]); - contact->prefix = g_strdup(reply[COL_NAME_PREFIX]); - contact->suffix = g_strdup(reply[COL_NAME_SUFFIX]); - } - contact->fullname = g_strdup(reply[COL_FULL_NAME]); - contact->birthday = g_strdup(reply[COL_BIRTH_DATE]); - contact->nickname = g_strdup(reply[COL_NICKNAME]); - contact->photo = g_strdup(reply[COL_PHOTO]); - contact->company = g_strdup(reply[COL_ORG_NAME]); - contact->department = g_strdup(reply[COL_ORG_DEPARTMENT]); - contact->role = g_strdup(reply[COL_ORG_ROLE]); - contact->uid = g_strdup(reply[COL_UID]); - contact->title = g_strdup(reply[COL_TITLE]); - - set_call_type(contact, reply[COL_DATE], reply[COL_SENT], - reply[COL_ANSWERED]); -} - -static enum phonebook_number_type get_phone_type(const char *affilation) -{ - if (g_strcmp0(AFFILATION_HOME, affilation) == 0) - return TEL_TYPE_HOME; - else if (g_strcmp0(AFFILATION_WORK, affilation) == 0) - return TEL_TYPE_WORK; - - return TEL_TYPE_OTHER; -} - -static void add_aff_number(struct phonebook_contact *contact, - const char *pnumber, const char *aff_type) -{ - char **num_parts; - char *type, *number; - - /* For phone taken directly from contacts data, phone number string - * is represented as number type and number string - those strings are - * separated by SUB_DELIM string */ - num_parts = g_strsplit(pnumber, SUB_DELIM, 2); - - if (!num_parts) - return; - - if (num_parts[0]) - type = num_parts[0]; - else - goto failed; - - if (num_parts[1]) - number = num_parts[1]; - else - goto failed; - - if (g_strrstr(type, FAX_NUM_TYPE)) - add_phone_number(contact, number, TEL_TYPE_FAX); - else if (g_strrstr(type, MOBILE_NUM_TYPE)) - add_phone_number(contact, number, TEL_TYPE_MOBILE); - else - /* if this is no fax/mobile phone, then adding phone number - * type based on type of the affilation field */ - add_phone_number(contact, number, get_phone_type(aff_type)); - -failed: - g_strfreev(num_parts); -} - -static void contact_add_numbers(struct phonebook_contact *contact, - const char **reply) -{ - char **aff_numbers; - int i; - - /* Filling phone numbers from contact's affilation */ - aff_numbers = g_strsplit(reply[COL_PHONE_AFF], MAIN_DELIM, MAX_FIELDS); - - if (aff_numbers) - for (i = 0; aff_numbers[i]; ++i) - add_aff_number(contact, aff_numbers[i], - reply[COL_AFF_TYPE]); - - g_strfreev(aff_numbers); -} - -static enum phonebook_field_type get_field_type(const char *affilation) -{ - if (g_strcmp0(AFFILATION_HOME, affilation) == 0) - return FIELD_TYPE_HOME; - else if (g_strcmp0(AFFILATION_WORK, affilation) == 0) - return FIELD_TYPE_WORK; - - return FIELD_TYPE_OTHER; -} - -static void add_aff_field(struct phonebook_contact *contact, - const char *aff_email, add_field_t add_field_cb) -{ - char **email_parts; - char *type, *email; - - /* Emails from affilation data, are represented as real email - * string and affilation type - those strings are separated by - * SUB_DELIM string */ - email_parts = g_strsplit(aff_email, SUB_DELIM, 2); - - if (!email_parts) - return; - - if (email_parts[0]) - email = email_parts[0]; - else - goto failed; - - if (email_parts[1]) - type = email_parts[1]; - else - goto failed; - - add_field_cb(contact, email, get_field_type(type)); - -failed: - g_strfreev(email_parts); -} - -static void contact_add_emails(struct phonebook_contact *contact, - const char **reply) -{ - char **aff_emails; - int i; - - /* Emails from affilation */ - aff_emails = g_strsplit(reply[COL_EMAIL_AFF], MAIN_DELIM, MAX_FIELDS); - - if (aff_emails) - for (i = 0; aff_emails[i] != NULL; ++i) - add_aff_field(contact, aff_emails[i], add_email); - - g_strfreev(aff_emails); -} - -static void contact_add_addresses(struct phonebook_contact *contact, - const char **reply) -{ - char **aff_addr; - int i; - - /* Addresses from affilation */ - aff_addr = g_strsplit(reply[COL_ADDR_AFF], MAIN_DELIM, MAX_FIELDS); - - if (aff_addr) - for (i = 0; aff_addr[i] != NULL; ++i) - add_aff_field(contact, aff_addr[i], add_address); - - g_strfreev(aff_addr); -} - -static void contact_add_urls(struct phonebook_contact *contact, - const char **reply) -{ - char **aff_url; - int i; - - /* Addresses from affilation */ - aff_url = g_strsplit(reply[COL_URL], MAIN_DELIM, MAX_FIELDS); - - if (aff_url) - for (i = 0; aff_url[i] != NULL; ++i) - add_aff_field(contact, aff_url[i], add_url); - - g_strfreev(aff_url); -} - -static void contact_add_organization(struct phonebook_contact *contact, - const char **reply) -{ - /* Adding fields connected by nco:hasAffiliation - they may be in - * separate replies */ - add_affiliation(&contact->title, reply[COL_TITLE]); - add_affiliation(&contact->company, reply[COL_ORG_NAME]); - add_affiliation(&contact->department, reply[COL_ORG_DEPARTMENT]); - add_affiliation(&contact->role, reply[COL_ORG_ROLE]); -} - -static void free_data_contacts(struct phonebook_data *data) -{ - GSList *l; - - /* freeing contacts */ - for (l = data->contacts; l; l = l->next) { - struct contact_data *c_data = l->data; - - g_free(c_data->id); - phonebook_contact_free(c_data->contact); - g_free(c_data); - } - - g_slist_free(data->contacts); - data->contacts = NULL; -} - -static void send_pull_part(struct phonebook_data *data, - const struct apparam_field *params, gboolean lastpart) -{ - GString *vcards; - - DBG(""); - vcards = gen_vcards(data->contacts, params); - data->cb(vcards->str, vcards->len, g_slist_length(data->contacts), - data->newmissedcalls, lastpart, data->user_data); - - if (!lastpart) - free_data_contacts(data); - g_string_free(vcards, TRUE); -} - -static int pull_contacts(const char **reply, int num_fields, void *user_data) -{ - struct phonebook_data *data = user_data; - const struct apparam_field *params = data->params; - struct phonebook_contact *contact; - struct contact_data *contact_data; - int last_index, i; - gboolean cdata_present = FALSE, part_sent = FALSE; - static char *temp_id = NULL; - - if (num_fields < 0) { - data->cb(NULL, 0, num_fields, 0, TRUE, data->user_data); - goto fail; - } - - DBG("reply %p", reply); - data->tracker_index++; - - if (reply == NULL) - goto done; - - /* Trying to find contact in recently added contacts. It is needed for - * contacts that have more than one telephone number filled */ - contact = find_contact(data->contacts, reply[CONTACTS_ID_COL], - reply[COL_DATE]); - - /* If contact is already created then adding only new phone numbers */ - if (contact) { - cdata_present = TRUE; - goto add_numbers; - } - - /* We are doing a PullvCardEntry, no need for those checks */ - if (data->vcardentry) - goto add_entry; - - /* Last four fields are always present, ignoring them */ - for (i = 0; i < num_fields - 4; i++) { - if (reply[i][0] != '\0') - break; - } - - if (i == num_fields - 4 && !g_str_equal(reply[CONTACTS_ID_COL], - TRACKER_DEFAULT_CONTACT_ME)) - return 0; - - if (g_strcmp0(temp_id, reply[CONTACTS_ID_COL])) { - data->index++; - g_free(temp_id); - temp_id = g_strdup(reply[CONTACTS_ID_COL]); - - /* Incrementing counter for vcards in current part of data, - * but only if liststartoffset has been already reached */ - if (data->index > params->liststartoffset) - data->vcard_part_count++; - } - - if (data->vcard_part_count > VCARDS_PART_COUNT) { - DBG("Part of vcard data ready for sending..."); - data->vcard_part_count = 0; - /* Sending part of data to PBAP core - more data can be still - * fetched, so marking lastpart as FALSE */ - send_pull_part(data, params, FALSE); - - /* Later, after adding contact data, need to return -EINTR to - * stop fetching more data for this request. Data will be - * downloaded again from this point, when phonebook_pull_read - * will be called again with current request as a parameter*/ - part_sent = TRUE; - } - - last_index = params->liststartoffset + params->maxlistcount; - - if (data->index <= params->liststartoffset) - return 0; - - /* max number of results achieved - need send vcards data that was - * already collected and stop further data processing (these operations - * will be invoked in "done" section) */ - if (data->index > last_index && params->maxlistcount > 0) { - DBG("Maxlistcount achieved"); - goto done; - } - -add_entry: - contact = g_new0(struct phonebook_contact, 1); - contact_init(contact, reply); - -add_numbers: - contact_add_numbers(contact, reply); - contact_add_emails(contact, reply); - contact_add_addresses(contact, reply); - contact_add_urls(contact, reply); - contact_add_organization(contact, reply); - - DBG("contact %p", contact); - - /* Adding contacts data to wrapper struct - this data will be used to - * generate vcard list */ - if (!cdata_present) { - contact_data = g_new0(struct contact_data, 1); - contact_data->contact = contact; - contact_data->id = g_strdup(reply[CONTACTS_ID_COL]); - data->contacts = g_slist_append(data->contacts, contact_data); - } - - if (part_sent) - return -EINTR; - - return 0; - -done: - /* Processing is end, this is definitely last part of transmission - * (marking lastpart as TRUE) */ - send_pull_part(data, params, TRUE); - -fail: - g_free(temp_id); - temp_id = NULL; - - return -EINTR; - /* - * phonebook_data is freed in phonebook_req_finalize. Useful in - * cases when call is terminated. - */ -} - -static int add_to_cache(const char **reply, int num_fields, void *user_data) -{ - struct phonebook_data *data = user_data; - char *formatted; - int i; - - if (reply == NULL || num_fields < 0) - goto done; - - /* the first element is the URI, always not empty */ - for (i = 1; i < num_fields; i++) { - if (reply[i][0] != '\0') - break; - } - - if (i == num_fields && - !g_str_equal(reply[0], TRACKER_DEFAULT_CONTACT_ME)) - return 0; - - if (i == 7) - formatted = g_strdup(reply[7]); - else if (i == 6) - formatted = g_strdup(reply[6]); - else - formatted = g_strdup_printf("%s;%s;%s;%s;%s", - reply[1], reply[2], reply[3], reply[4], - reply[5]); - - /* The owner vCard must have the 0 handle */ - if (strcmp(reply[0], TRACKER_DEFAULT_CONTACT_ME) == 0) - data->entry_cb(reply[0], 0, formatted, "", - reply[6], data->user_data); - else - data->entry_cb(reply[0], PHONEBOOK_INVALID_HANDLE, formatted, - "", reply[6], data->user_data); - - g_free(formatted); - - return 0; - -done: - if (num_fields <= 0) - data->ready_cb(data->user_data); - - return -EINTR; - /* - * phonebook_data is freed in phonebook_req_finalize. Useful in - * cases when call is terminated. - */ -} - -int phonebook_init(void) -{ - g_type_init(); - - return 0; -} - -void phonebook_exit(void) -{ -} - -char *phonebook_set_folder(const char *current_folder, const char *new_folder, - uint8_t flags, int *err) -{ - char *tmp1, *tmp2, *base, *path = NULL; - gboolean root, child; - int ret = 0; - int len; - - root = (g_strcmp0("/", current_folder) == 0); - child = (new_folder && strlen(new_folder) != 0); - - switch (flags) { - case 0x02: - /* Go back to root */ - if (!child) { - path = g_strdup("/"); - goto done; - } - - path = g_build_filename(current_folder, new_folder, NULL); - break; - case 0x03: - /* Go up 1 level */ - if (root) { - /* Already root */ - path = g_strdup("/"); - goto done; - } - - /* - * Removing one level of the current folder. Current folder - * contains AT LEAST one level since it is not at root folder. - * Use glib utility functions to handle invalid chars in the - * folder path properly. - */ - tmp1 = g_path_get_basename(current_folder); - tmp2 = g_strrstr(current_folder, tmp1); - len = tmp2 - (current_folder + 1); - - g_free(tmp1); - - if (len == 0) - base = g_strdup("/"); - else - base = g_strndup(current_folder, len); - - /* Return: one level only */ - if (!child) { - path = base; - goto done; - } - - path = g_build_filename(base, new_folder, NULL); - g_free(base); - - break; - default: - ret = -EBADR; - break; - } - -done: - if (path && !folder_is_valid(path)) - ret = -ENOENT; - - if (ret < 0) { - g_free(path); - path = NULL; - } - - if (err) - *err = ret; - - return path; -} - -static int pull_newmissedcalls(const char **reply, int num_fields, - void *user_data) -{ - struct phonebook_data *data = user_data; - reply_list_foreach_t pull_cb; - int col_amount, err; - const char *query; - int nmissed; - - if (num_fields < 0) { - data->cb(NULL, 0, num_fields, 0, TRUE, data->user_data); - - return -EINTR; - } - - if (reply != NULL) { - nmissed = atoi(reply[0]); - data->newmissedcalls = - nmissed <= UINT8_MAX ? nmissed : UINT8_MAX; - DBG("newmissedcalls %d", data->newmissedcalls); - - return 0; - } - - if (data->params->maxlistcount == 0) { - query = name2count_query(PB_CALLS_MISSED); - col_amount = COUNT_QUERY_COL_AMOUNT; - pull_cb = pull_contacts_size; - } else { - query = name2query(PB_CALLS_MISSED); - col_amount = PULL_QUERY_COL_AMOUNT; - pull_cb = pull_contacts; - } - - err = query_tracker(query, col_amount, pull_cb, data); - if (err < 0) { - data->cb(NULL, 0, err, 0, TRUE, data->user_data); - - return -EINTR; - } - - return 0; -} - -void phonebook_req_finalize(void *request) -{ - struct phonebook_data *data = request; - - DBG(""); - - if (!data) - return; - - /* canceling asynchronous operation on tracker if any is active */ - if (data->query_canc) { - g_cancellable_cancel(data->query_canc); - g_object_unref(data->query_canc); - } - - free_data_contacts(data); - g_free(data->req_name); - g_free(data); -} - -void *phonebook_pull(const char *name, const struct apparam_field *params, - phonebook_cb cb, void *user_data, int *err) -{ - struct phonebook_data *data; - - DBG("name %s", name); - - data = g_new0(struct phonebook_data, 1); - data->params = params; - data->user_data = user_data; - data->cb = cb; - data->req_name = g_strdup(name); - - if (err) - *err = 0; - - return data; -} - -int phonebook_pull_read(void *request) -{ - struct phonebook_data *data = request; - reply_list_foreach_t pull_cb; - const char *query; - char *offset_query; - int col_amount; - int ret; - - if (!data) - return -ENOENT; - - data->newmissedcalls = 0; - - if (g_strcmp0(data->req_name, PB_CALLS_MISSED) == 0 && - data->tracker_index == 0) { - /* new missed calls amount should be counted only once - it - * will be done during generating first part of results of - * missed calls history */ - query = NEW_MISSED_CALLS_COUNT_QUERY; - col_amount = COUNT_QUERY_COL_AMOUNT; - pull_cb = pull_newmissedcalls; - } else if (data->params->maxlistcount == 0) { - query = name2count_query(data->req_name); - col_amount = COUNT_QUERY_COL_AMOUNT; - pull_cb = pull_contacts_size; - } else { - query = name2query(data->req_name); - col_amount = PULL_QUERY_COL_AMOUNT; - pull_cb = pull_contacts; - } - - if (query == NULL) - return -ENOENT; - - if (pull_cb == pull_contacts && data->tracker_index > 0) { - /* Adding offset to pull query to download next parts of data - * from tracker (phonebook_pull_read may be called many times - * from PBAP core to fetch data partially) */ - offset_query = g_strdup_printf(QUERY_OFFSET_FORMAT, query, - data->tracker_index); - ret = query_tracker(offset_query, col_amount, pull_cb, data); - - g_free(offset_query); - - return ret; - } - - return query_tracker(query, col_amount, pull_cb, data); -} - -void *phonebook_get_entry(const char *folder, const char *id, - const struct apparam_field *params, - phonebook_cb cb, void *user_data, int *err) -{ - struct phonebook_data *data; - char *query; - int ret; - - DBG("folder %s id %s", folder, id); - - data = g_new0(struct phonebook_data, 1); - data->user_data = user_data; - data->params = params; - data->cb = cb; - data->vcardentry = TRUE; - - if (g_str_has_prefix(id, CONTACT_ID_PREFIX) == TRUE || - g_strcmp0(id, TRACKER_DEFAULT_CONTACT_ME) == 0) - query = g_strdup_printf(CONTACTS_QUERY_FROM_URI, id, id, id, id, - id, id, id, id, id, id, id, id, id); - else if (g_str_has_prefix(id, CALL_ID_PREFIX) == TRUE) - query = g_strdup_printf(CONTACT_FROM_CALL_QUERY, id); - else - query = g_strdup_printf(CONTACTS_OTHER_QUERY_FROM_URI, - id, id, id); - - ret = query_tracker(query, PULL_QUERY_COL_AMOUNT, pull_contacts, data); - if (err) - *err = ret; - - g_free(query); - - return data; -} - -void *phonebook_create_cache(const char *name, phonebook_entry_cb entry_cb, - phonebook_cache_ready_cb ready_cb, void *user_data, int *err) -{ - struct phonebook_data *data; - const char *query; - int ret; - - DBG("name %s", name); - - query = folder2query(name); - if (query == NULL) { - if (err) - *err = -ENOENT; - return NULL; - } - - data = g_new0(struct phonebook_data, 1); - data->entry_cb = entry_cb; - data->ready_cb = ready_cb; - data->user_data = user_data; - - ret = query_tracker(query, 8, add_to_cache, data); - if (err) - *err = ret; - - return data; -} From patchwork Mon Feb 12 20:02:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via B4 Relay X-Patchwork-Id: 13553949 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A26A5481B7 for ; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; cv=none; b=iwHy5SC1PPuh1CDboVliZ8FYZjNcVFfmjLSmZf1Q5LB3y2lPRigMX6nwfF+/KOc49ebAJXMKK5NxCCKZgfqkmJ/XrH4fF4OvPFdBY/GcqGuFU6s8x24ApdP9mbd9iT5cpV532A7afS/uStBy8xUAhZZPPrxeDxAeoHm0sZNPn6A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; c=relaxed/simple; bh=86t49+zrMpop3+LBasTQDP6WPhep6F5sBzb6VCO3Wq4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PmEs3zmzKMOQcxy9DIAkdXPMQlMcGiiJXleHsv2q1f/7LxMfm6skbXkjdmaNoSjsg+iKTMXwekwPW6QwI6dH/CvrFyu6iTK3JtoTZCHGC34bAq39z91QeLOS837jYetYQXRZefDqK2jzdHHCe3+q55pYKgsjHlWcdGKKs98j224= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=G47AdXp1; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="G47AdXp1" Received: by smtp.kernel.org (Postfix) with ESMTPS id 2B6A4C43330; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707768160; bh=86t49+zrMpop3+LBasTQDP6WPhep6F5sBzb6VCO3Wq4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=G47AdXp1Yx8Fbt/rIV7md4ZSXNgcComT5o1jTeCmOSP0rHKWPT+OVATCr6t7lSGWA zumZ7ScSiTpsP/z/SnkTIg7Db3xQ8iO7SWhOG6mJ+qABblwWfC62SoRG42iv3lG9sq l+TlnQe9ayo8pyt0lacPSAbqLvspECFwpAqrk9Qc7P06XOUqBczNc/AZ7Mxn7DJREq s2pLcWORKw2bEHxBqMGbCjqxOM5snVbWcviXt2GY7FfFa2yvQkIvyKSy7LPwRZ6p62 +lUOcVCvvUgfsbDf+1DXqIXVWmcBmxaO6PD07+h+x/eiTPPJhD7geZKVWRpOsAy6TN /I2zSMtT0XQ0g== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1C0D7C48BC4; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) From: Emil Velikov via B4 Relay Date: Mon, 12 Feb 2024 20:02:44 +0000 Subject: [PATCH BlueZ v2 08/10] build: ship all config files with --enable-datafiles Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240212-disto-patches-v2-8-8bab1bd08f4d@gmail.com> References: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> In-Reply-To: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> To: linux-bluetooth@vger.kernel.org Cc: Emil Velikov X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707768157; l=1705; i=emil.l.velikov@gmail.com; s=20230301; h=from:subject:message-id; bh=ukSb4msDR5fjqRG8A0bYJ7QVffGjcQu3Z3Tc8kb10CQ=; b=xK9CkzK5fzFcBBf720C/4yHCdPEbAhMR5/IPP7H4Utn9Q6IxtCEuQdWid5wFzg/1UgK7/n5nW erVHcLvEa7xDpk2ornXWv57kq853YKNOtRfvzMBeU1DNOQM2GP9fqBe X-Developer-Key: i=emil.l.velikov@gmail.com; a=ed25519; pk=qeUTVTNyI3rcR2CfNNWsloTihgzmtbZo98GdxwZKCkY= X-Endpoint-Received: by B4 Relay for emil.l.velikov@gmail.com/20230301 with auth_id=35 X-Original-From: Emil Velikov Reply-To: From: Emil Velikov Currently we ship only the dbus/systemd policy files and omit the other four - /etc/bluetooth/{main,mesh-main,input,network}.conf. Outside of those files, there is no documentation what the defaults are and the other possible options. A number of distributions (Arch, Gentoo, Fedora) have opted to manually copy those into the package. Alas this does not scale and leaves other distros at disadvantage, in a sense. Note: we need a custom install target to ensure confdir and statedir have the correct permissions. --- Some distributions do toggle some of the default values, by patching the source tree. Future patches will add support for more maintainable configuration handling akin to `man sysctl.d`. --- Makefile.am | 8 +++++++- Makefile.mesh | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 2b1b9acdf..2cbfed2db 100644 --- a/Makefile.am +++ b/Makefile.am @@ -31,11 +31,17 @@ AM_LDFLAGS = $(MISC_LDFLAGS) confdir = $(sysconfdir)/bluetooth statedir = $(localstatedir)/lib/bluetooth +install-data-hook: + install -dm555 $(DESTDIR)$(confdir) + install -dm700 $(DESTDIR)$(statedir) + if DATAFILES dbusdir = $(DBUS_CONFDIR)/dbus-1/system.d dbus_DATA = src/bluetooth.conf -conf_DATA = +conf_DATA = src/main.conf +conf_DATA += profiles/input/input.conf +conf_DATA += profiles/network/network.conf state_DATA = endif diff --git a/Makefile.mesh b/Makefile.mesh index ea50383d2..e4c9fa6a3 100644 --- a/Makefile.mesh +++ b/Makefile.mesh @@ -3,6 +3,7 @@ if MESH if DATAFILES dbus_DATA += mesh/bluetooth-mesh.conf +conf_DATA += mesh/mesh-main.conf endif if SYSTEMD From patchwork Mon Feb 12 20:02:45 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via B4 Relay X-Patchwork-Id: 13553946 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A10CD481B4 for ; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; cv=none; b=DVstvQqXWmrR5OtA7gIpTfYpd+7DP/sKFpXnFVWgIvlTu/ldOWhbwwgeipKKibCcsaLr3aBS8d6z8VnWIqxaGBAagsSJf7lFqit4EaMZj+HNxXzb7cb8XrW387w3gg63k46Y0vvqCsXXivtomG8gzsx9URg9+zHw+0T9fkN6Qtg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; c=relaxed/simple; bh=qZ2uzciqi4+RwnW8iju+QrSzvIe2nSE2ggeNLNb1+Tc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n0J4Upgt5CptghgQDdYNK2937vErpaTcevxFuq6tO1LGReA30fFHxq1W+gwZNCzm04jT2NmDybTAjOrC6AlLFU3daWWcs//SGGP16H85yku3tF8Ehm6lwO4qLwkr5AJ2xHvz+xxLYg5Ns2gdabhbpIjdaB86KvZ1iPWsAkziyHU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RWh6xI+m; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="RWh6xI+m" Received: by smtp.kernel.org (Postfix) with ESMTPS id 39172C43609; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707768160; bh=qZ2uzciqi4+RwnW8iju+QrSzvIe2nSE2ggeNLNb1+Tc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=RWh6xI+mFVWMPK1zDRwmRAXCdfBi/j0Py+40kcX4Z3vWwKVrqcDqpWEsKedTKPFpj R/tdyRuASQvC+KeYlI19MC07ybY84N8HL1UXCODCpiY8mpifKfFktufZ5dU29V/6R7 olPxAlQL40MGp5BHeyQ6ZfRfgHDKJsKUffQXMpGVdnDjT/4ATKLDiLVL2mlkmBa5DT +ZefTV9StX03LzeZqZIvhW2yyv70uG2tMAQX9oyzBMkyPQUFVImmQS0jhAecY1yvO7 fNfti0HFyMVHQWxnzTX33p7RpXT8Z85XkrOQj6vrrLXIqXLwz+huWr7l24vrJP+7T+ 2ZkdSvjXPzlgQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 28CA5C48BC1; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) From: Emil Velikov via B4 Relay Date: Mon, 12 Feb 2024 20:02:45 +0000 Subject: [PATCH BlueZ v2 09/10] obex: Use GLib helper function to manipulate paths Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240212-disto-patches-v2-9-8bab1bd08f4d@gmail.com> References: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> In-Reply-To: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> To: linux-bluetooth@vger.kernel.org Cc: Bastien Nocera X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707768157; l=1584; i=emil.l.velikov@gmail.com; s=20230301; h=from:subject:message-id; bh=GCUo/Nwzng2MpKTdvtQwQRt2p4nwTwzY0gaSQk+Xr7Y=; b=RRoKj0QjKCRqD8xfnN2FNs9AmfqfPFWy3NGEAPoYb6kR9t3DnLMdKUnhKvXrkYoKTz7Ee4YDh oCs3Rd8L+1SCgjpDZsqTWrUAYOxxG+cjQZVsJyJRhV9dvB9NwvH4wrK X-Developer-Key: i=emil.l.velikov@gmail.com; a=ed25519; pk=qeUTVTNyI3rcR2CfNNWsloTihgzmtbZo98GdxwZKCkY= X-Endpoint-Received: by B4 Relay for emil.l.velikov@gmail.com/20230301 with auth_id=35 X-Original-From: Emil Velikov Reply-To: From: Bastien Nocera Instead of trying to do it by hand. This also makes sure that relative paths aren't used by the agent. [Emil Velikov] Originally this patch was posted in 2013, but deferred since bluez was planning to move away from glib. Presently there's no obvious action towards that goal, so I think we can safely land this. As mentioned by the author, current code allows for relative paths and considering that obexd service runs without meaningful sandboxing and on some distributions it is ran as root, we should plug the whole before anyone (ab)uses it. --- obexd/src/manager.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/obexd/src/manager.c b/obexd/src/manager.c index 73fd6b9af..cc1de7ae2 100644 --- a/obexd/src/manager.c +++ b/obexd/src/manager.c @@ -644,18 +644,13 @@ static void agent_reply(DBusPendingCall *call, void *user_data) DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) { /* Splits folder and name */ - const char *slash = strrchr(name, '/'); + gboolean is_relative = !g_path_is_absolute(name); DBG("Agent replied with %s", name); - if (!slash) { - agent->new_name = g_strdup(name); + agent->new_name = g_path_get_basename(name); + if (is_relative) agent->new_folder = NULL; - } else { - if (strlen(slash) == 1) - agent->new_name = NULL; - else - agent->new_name = g_strdup(slash + 1); - agent->new_folder = g_strndup(name, slash - name); - } + else + agent->new_folder = g_path_get_dirname(name); } dbus_message_unref(reply); From patchwork Mon Feb 12 20:02:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via B4 Relay X-Patchwork-Id: 13553945 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 849CE47F69 for ; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; cv=none; b=d0hL7DAZpIJ0F94jJQ8MrO0a3He3LcB/s9LPd35oHusLD91zEWDv9Dkeruc5oGmA4L5d+Km2waIxyCK5brQ1jOWGO4OQwM956Kc5uT0GJxoivqhEA6p3RgyVcm6tAj33xLFQz6HDlKS2IBNC9Oqh501LKoT+ayMXIcUUZJzZRDA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707768160; c=relaxed/simple; bh=5btvwpoDeTsjWKw6B/3bS0i+ZrvloE4dM5K9xepdv3k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aui/xwEcK93KiuYD7vh3tsYt4AjDJz/xCuM53HMEhg6WAMf4Mjg8DGKSqbrXzw5UFqQCw4o4x/ptu0D91klMDClvs8CaHfRCxqJEORsI2l1YobFGiW5hlkbhN5P3+WANYFpzNMIZaNe/x1VojHRoACIeGpwdW4+qGRm74k5+QvQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qdyavNr8; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qdyavNr8" Received: by smtp.kernel.org (Postfix) with ESMTPS id 4800DC43601; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1707768160; bh=5btvwpoDeTsjWKw6B/3bS0i+ZrvloE4dM5K9xepdv3k=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=qdyavNr8xkmjLlTtBugJSjaIoTUknxqdoy4A1RlWR0VOfswzgL5rTO/2jR12r7YF8 a530UfTdSgk2QhLVwb2KnYWLtzx4lO/5A8qKflpQip8bzCZnvavdHbYwyazcYkclfV 1Yb7h8olVLTOFIkS2X0mvy8e5FG8FOC1nIWELmmFJlTLx+34Jx+jSsj9nHMWio+GNy p9PfWezQhydjE2Cr8UhTUzJCTtmrzKh4pvdjhNNbWSWkGdG6q/YmOEeSq5E105qTql s0UaOMwxVUZ36ydx7lrQDfXybXMREXjRap14Q0XtgedlPL/0197T6xtW418uhbRd3q eB4gU1GguB74w== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 373ACC4829E; Mon, 12 Feb 2024 20:02:40 +0000 (UTC) From: Emil Velikov via B4 Relay Date: Mon, 12 Feb 2024 20:02:46 +0000 Subject: [PATCH BlueZ v2 10/10] Allow using obexd without systemd in the user session Precedence: bulk X-Mailing-List: linux-bluetooth@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240212-disto-patches-v2-10-8bab1bd08f4d@gmail.com> References: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> In-Reply-To: <20240212-disto-patches-v2-0-8bab1bd08f4d@gmail.com> To: linux-bluetooth@vger.kernel.org Cc: Giovanni Campagna X-Mailer: b4 0.12.4 X-Developer-Signature: v=1; a=ed25519-sha256; t=1707768157; l=2136; i=emil.l.velikov@gmail.com; s=20230301; h=from:subject:message-id; bh=qcOLWrp/zFE+VyNJF7l0mQSwvOHD0sHm7hQeD6mJ4p0=; b=rYipQQQoYBBKWJFCC4K7udhkanjCpN2+07thPENzUcgBhRU5BUTR/5vfKrY1ar12U8rlU3nhq z6nLK6nxg1eBkKbfhKMUWhe+JJOP/fGUr426X5ynFZJBomzeWigKJaD X-Developer-Key: i=emil.l.velikov@gmail.com; a=ed25519; pk=qeUTVTNyI3rcR2CfNNWsloTihgzmtbZo98GdxwZKCkY= X-Endpoint-Received: by B4 Relay for emil.l.velikov@gmail.com/20230301 with auth_id=35 X-Original-From: Emil Velikov Reply-To: From: Giovanni Campagna Not all sessions run systemd --user and in some cases one may be missing systemd all together. Provide the correct path instead of /bin/false, allowing dbus to start the service in such cases. DBUS implementations can ignore the Exec line all together when run in systemd aware mode - at least the OG dbus does that. So ultimately this change is a no-op for the systemd --user case. On my system, this is literally the only non-system service which uses /bin/false. [Emil Velikov] Port to AC_CONFIG_FILES() .in files handling. Reword commit message. --- Makefile.obexd | 4 +--- configure.ac | 1 + obexd/src/{org.bluez.obex.service => org.bluez.obex.service.in} | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Makefile.obexd b/Makefile.obexd index 1d37a1bd4..d88708e66 100644 --- a/Makefile.obexd +++ b/Makefile.obexd @@ -8,12 +8,10 @@ install-data-hook: uninstall-hook: rm -f $(DESTDIR)$(SYSTEMD_USERUNITDIR)/dbus-org.bluez.obex.service +endif dbussessionbusdir = $(DBUS_SESSIONBUSDIR) dbussessionbus_DATA = obexd/src/org.bluez.obex.service -endif - -EXTRA_DIST += obexd/src/org.bluez.obex.service if OBEX diff --git a/configure.ac b/configure.ac index 387db8c7d..c66991a3d 100644 --- a/configure.ac +++ b/configure.ac @@ -457,6 +457,7 @@ AC_CONFIG_FILES( mesh/bluetooth-meshd.rst mesh/bluetooth-mesh.service obexd/src/obex.service + obexd/src/org.bluez.obex.service src/bluetoothd.rst src/bluetooth.service tools/bluetooth-logger.service diff --git a/obexd/src/org.bluez.obex.service b/obexd/src/org.bluez.obex.service.in similarity index 69% rename from obexd/src/org.bluez.obex.service rename to obexd/src/org.bluez.obex.service.in index a53808884..14c16d3e3 100644 --- a/obexd/src/org.bluez.obex.service +++ b/obexd/src/org.bluez.obex.service.in @@ -1,4 +1,4 @@ [D-BUS Service] Name=org.bluez.obex -Exec=/bin/false +Exec=@exec_prefix@/bluetooth/obexd SystemdService=dbus-org.bluez.obex.service