From: Bartosz Golaszewski <brgl@bgdev.pl>
To: Linus Walleij <linus.walleij@linaro.org>,
Kent Gibson <warthog618@gmail.com>,
Erik Schilling <erik.schilling@linaro.org>,
Phil Howard <phil@gadgetoid.com>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Viresh Kumar <viresh.kumar@linaro.org>,
Dan Carpenter <dan.carpenter@linaro.org>,
Philip Withnall <philip@tecnocode.co.uk>
Cc: linux-gpio@vger.kernel.org,
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>,
Alexander Sverdlin <alexander.sverdlin@siemens.com>
Subject: [PATCH libgpiod v4 00/18] dbus: add GLib-based D-Bus daemon and command-line client
Date: Wed, 07 Aug 2024 11:10:31 +0200 [thread overview]
Message-ID: <20240807-dbus-v4-0-64ea80169e51@linaro.org> (raw)
Big thanks to Philip Withnall <philip@tecnocode.co.uk> for his thorough review
of this series. I think I addressed most of the issues pointed out.
This series introduces the D-Bus API definition and its implementation in the
form of a GPIO manager daemon and a companion command-line client as well as
GLib bindings to libgpiod which form the base on which the former are built.
While I split the GLib and D-Bus code into several commits for easier review,
I intend to apply all changes to bindings/glib/ and dbus/ as two big commits
in the end as otherwise the split commits are not buildable until all of them
are applied.
The main point of interest is the D-Bus interface definition XML at
dbus/lib/io.gpiod1.xml as it is what defines the actual D-Bus API. Everything
else can be considered as implementation details as it's easier to change
later than the API that's supposed to be stable once released.
The first two patches expose the test infrastructure we use for the core
library and tools to the GLib bindings and dbus code. Next we add the GLib
bindings themselves. Not much to discuss here, they cover the entire libgpiod
API but wrap it in GObject abstractions and plug into the GLib event loop.
Finally we add the D-Bus code that's split into the daemon and command-line
client. I added some examples to the README and documented the behavior in
the help text of the programs as well as documented the interface file with
XML comments that gdbus-codegen can parse and use to generate docbook output.
For D-Bus, most of the testing happens in the command-line client bash tests.
It has a very good coverage of the daemon's code and also allows to run the
daemon through valgrind and verify there are no memory leaks and invalid
accesses. I still intend to extend the C test-suite for D-Bus with some corner
cases but didn't not have enough time for it.
Changes in v4:
- fix generating GObject introspection data
- use GLib doc blocks with introspection annotations suitable for generating
docs with gi-docgen
- various comment and doc tweaks
- Link to v3: https://lore.kernel.org/r/20240718-dbus-v3-0-c9ea2604f082@linaro.org
Changes in v3:
- make gpio-manager run as its own user in the systemd service file and add
udev rules that automate the group assignment for gpiochips
- add sandboxing options to the service file for an overall exposure score
from systemd-analyze of 2.3
- enable introspection for GLib bindings
- set the minimum required GLib version for gdbus-codegen
- fix time units in dbus docs
- change the D-Bus type for Chip's path to byte-array
- change the naming convention in strings: s/DBus/D-Bus/g
- add the "unknown" value to the EventClock property and document how to
interpret other unrecognized values
- various doc updates
- don't set environment variables from the daemon code, use the provided
g_log_writer_default_set_debug_domains() helper
- use g_build_filename() where appropriate
- use g_steal_pointer() to improve error propagation
- use G_PARAM_STATIC_STRINGS across all properties
- use G_GNUC_PRINTF() in g_gpiod_set_error_from_errno()
- change the library's namespace to Gpiodglib/GPIODGLIB/gpiodglib_
- remove the "handle" properties in favor of passing the core libgpiod pointers
to GObjects directly after they're constructed
- add typedefs to property enums for better build-time safety
- don't use g_value_set_static_string() for strings that are not really static
across the entire lifetime of the program
- rework the code for internal property setting and getting
- add Requires.private: libgpiod to gpiod-glib pkgconfig file
- Link to v2: https://lore.kernel.org/r/20240628-dbus-v2-0-c1331ac17cb8@linaro.org
Changes in v2:
- fixed most segfaults I noticed (or was made aware of by others) in RFC
- improve the code in GLib examples
- make command-line tests pass shellckeck
- fix build issue resulting in implicit pointer-to-int casting on some
platforms
- many small tweaks, fixes and improvements all over the place but without
changing the API
- fix a bunch of memory leaks reported by valgrind
- Link to v1: https://lore.kernel.org/linux-gpio/20240412122804.109323-1-brgl@bgdev.pl/
---
Bartosz Golaszewski (18):
tests: split out reusable test code into a local static library
tests: split out the common test code for bash scripts
bindings: glib: add build files
bindings: glib: add public headers
bindings: glib: add core code
bindings: glib: add examples
bindings: glib: add tests
README: document GLib bindings
dbus: add build files
dbus: add the API definitions
dbus: add a wrapper around the gdbus-codegen generated header
dbus: add data files
dbus: add gpio-manager code
dbus: add tests
dbus: add a command-line client
dbus: client: add tests
README: document the DBus API
TODO: drop the DBus daemon from the list
.gitignore | 2 +
Makefile.am | 7 +
README | 73 +-
TODO | 17 -
bindings/Makefile.am | 7 +
bindings/glib/.gitignore | 6 +
bindings/glib/Makefile.am | 131 ++
bindings/glib/chip-info.c | 129 ++
bindings/glib/chip.c | 397 ++++++
bindings/glib/edge-event.c | 186 +++
bindings/glib/error.c | 67 +
bindings/glib/examples/.gitignore | 14 +
bindings/glib/examples/Makefile.am | 22 +
bindings/glib/examples/find_line_by_name_glib.c | 71 +
bindings/glib/examples/get_chip_info_glib.c | 42 +
bindings/glib/examples/get_line_info_glib.c | 80 ++
bindings/glib/examples/get_line_value_glib.c | 68 +
.../glib/examples/get_multiple_line_values_glib.c | 73 +
.../examples/reconfigure_input_to_output_glib.c | 104 ++
bindings/glib/examples/toggle_line_value_glib.c | 99 ++
.../examples/toggle_multiple_line_values_glib.c | 132 ++
bindings/glib/examples/watch_line_info_glib.c | 63 +
bindings/glib/examples/watch_line_value_glib.c | 91 ++
.../examples/watch_multiple_edge_rising_glib.c | 95 ++
bindings/glib/generated-enums.c.template | 43 +
bindings/glib/generated-enums.h.template | 30 +
bindings/glib/gpiod-glib.h | 22 +
bindings/glib/gpiod-glib.pc.in | 15 +
bindings/glib/gpiod-glib/chip-info.h | 62 +
bindings/glib/gpiod-glib/chip.h | 157 +++
bindings/glib/gpiod-glib/edge-event.h | 97 ++
bindings/glib/gpiod-glib/error.h | 45 +
bindings/glib/gpiod-glib/info-event.h | 76 ++
bindings/glib/gpiod-glib/line-config.h | 101 ++
bindings/glib/gpiod-glib/line-info.h | 171 +++
bindings/glib/gpiod-glib/line-request.h | 186 +++
bindings/glib/gpiod-glib/line-settings.h | 220 +++
bindings/glib/gpiod-glib/line.h | 113 ++
bindings/glib/gpiod-glib/misc.h | 39 +
bindings/glib/gpiod-glib/request-config.h | 93 ++
bindings/glib/info-event.c | 163 +++
bindings/glib/internal.c | 327 +++++
bindings/glib/internal.h | 79 ++
bindings/glib/line-config.c | 193 +++
bindings/glib/line-info.c | 342 +++++
bindings/glib/line-request.c | 452 ++++++
bindings/glib/line-settings.c | 408 ++++++
bindings/glib/misc.c | 17 +
bindings/glib/request-config.c | 170 +++
bindings/glib/tests/.gitignore | 4 +
bindings/glib/tests/Makefile.am | 29 +
bindings/glib/tests/helpers.c | 12 +
bindings/glib/tests/helpers.h | 140 ++
bindings/glib/tests/tests-chip-info.c | 58 +
bindings/glib/tests/tests-chip.c | 187 +++
bindings/glib/tests/tests-edge-event.c | 225 +++
bindings/glib/tests/tests-info-event.c | 322 +++++
bindings/glib/tests/tests-line-config.c | 187 +++
bindings/glib/tests/tests-line-info.c | 102 ++
bindings/glib/tests/tests-line-request.c | 710 ++++++++++
bindings/glib/tests/tests-line-settings.c | 256 ++++
bindings/glib/tests/tests-misc.c | 88 ++
bindings/glib/tests/tests-request-config.c | 64 +
configure.ac | 84 ++
dbus/Makefile.am | 10 +
dbus/client/.gitignore | 4 +
dbus/client/Makefile.am | 31 +
dbus/client/common.c | 646 +++++++++
dbus/client/common.h | 203 +++
dbus/client/detect.c | 53 +
dbus/client/find.c | 66 +
dbus/client/get.c | 212 +++
dbus/client/gpiocli-test.bash | 1443 ++++++++++++++++++++
dbus/client/gpiocli.c | 174 +++
dbus/client/info.c | 184 +++
dbus/client/monitor.c | 191 +++
dbus/client/notify.c | 295 ++++
dbus/client/reconfigure.c | 76 ++
dbus/client/release.c | 64 +
dbus/client/request.c | 250 ++++
dbus/client/requests.c | 71 +
dbus/client/set.c | 173 +++
dbus/client/wait.c | 188 +++
dbus/data/90-gpio.rules | 4 +
dbus/data/Makefile.am | 16 +
dbus/data/gpio-manager.service | 50 +
dbus/data/io.gpiod1.conf | 41 +
dbus/lib/Makefile.am | 29 +
dbus/lib/gpiodbus.h | 9 +
dbus/lib/io.gpiod1.xml | 324 +++++
dbus/manager/.gitignore | 4 +
dbus/manager/Makefile.am | 21 +
dbus/manager/daemon.c | 821 +++++++++++
dbus/manager/daemon.h | 22 +
dbus/manager/gpio-manager.c | 173 +++
dbus/manager/helpers.c | 431 ++++++
dbus/manager/helpers.h | 26 +
dbus/tests/.gitignore | 4 +
dbus/tests/Makefile.am | 25 +
dbus/tests/daemon-process.c | 129 ++
dbus/tests/daemon-process.h | 20 +
dbus/tests/helpers.c | 107 ++
dbus/tests/helpers.h | 114 ++
dbus/tests/tests-chip.c | 133 ++
dbus/tests/tests-line.c | 231 ++++
dbus/tests/tests-request.c | 116 ++
tests/Makefile.am | 14 +-
tests/gpiod-test-helpers.c | 41 -
tests/gpiosim-glib/Makefile.am | 13 +
.../gpiosim-glib.c} | 30 +-
.../gpiosim-glib.h} | 14 +
tests/harness/Makefile.am | 12 +
tests/harness/gpiod-test-common.h | 23 +
tests/{ => harness}/gpiod-test.c | 0
tests/{ => harness}/gpiod-test.h | 0
tests/{gpiod-test-helpers.h => helpers.h} | 36 +-
tests/scripts/Makefile.am | 4 +
tests/scripts/gpiod-bash-test-helper.inc | 330 +++++
tests/tests-chip-info.c | 7 +-
tests/tests-chip.c | 15 +-
tests/tests-edge-event.c | 7 +-
tests/tests-info-event.c | 7 +-
tests/tests-kernel-uapi.c | 7 +-
tests/tests-line-config.c | 7 +-
tests/tests-line-info.c | 11 +-
tests/tests-line-request.c | 7 +-
tests/tests-line-settings.c | 5 +-
tests/tests-misc.c | 7 +-
tests/tests-request-config.c | 5 +-
tools/gpio-tools-test.bash | 566 ++------
130 files changed, 15833 insertions(+), 584 deletions(-)
---
base-commit: 9fdd6e23faa5e0011d6ee047b25928e8ad4c3320
change-id: 20240527-dbus-820e9f7463d0
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
next reply other threads:[~2024-08-07 9:10 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-07 9:10 Bartosz Golaszewski [this message]
2024-08-07 9:10 ` [PATCH libgpiod v4 01/18] tests: split out reusable test code into a local static library Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 02/18] tests: split out the common test code for bash scripts Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 03/18] bindings: glib: add build files Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 04/18] bindings: glib: add public headers Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 05/18] bindings: glib: add core code Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 06/18] bindings: glib: add examples Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 07/18] bindings: glib: add tests Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 08/18] README: document GLib bindings Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 09/18] dbus: add build files Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 10/18] dbus: add the API definitions Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 11/18] dbus: add a wrapper around the gdbus-codegen generated header Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 12/18] dbus: add data files Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 13/18] dbus: add gpio-manager code Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 14/18] dbus: add tests Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 15/18] dbus: add a command-line client Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 16/18] dbus: client: add tests Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 17/18] README: document the DBus API Bartosz Golaszewski
2024-08-07 9:10 ` [PATCH libgpiod v4 18/18] TODO: drop the DBus daemon from the list Bartosz Golaszewski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240807-dbus-v4-0-64ea80169e51@linaro.org \
--to=brgl@bgdev.pl \
--cc=alexander.sverdlin@siemens.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=bartosz.golaszewski@linaro.org \
--cc=dan.carpenter@linaro.org \
--cc=erik.schilling@linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=phil@gadgetoid.com \
--cc=philip@tecnocode.co.uk \
--cc=viresh.kumar@linaro.org \
--cc=warthog618@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).