https://bugs.gentoo.org/926344 hex2hcd: https://github.com/bluez/bluez/pull/897 (https://lore.kernel.org/linux-bluetooth/20240710123002.5639-1-rahul@sandhuservices.dev/) rpl: 1) https://github.com/bluez/bluez/commit/690eccbe8562cc33f33503af67beb313ca737817 2) https://github.com/bluez/bluez/issues/843#issuecomment-2354143400 From e2f12111385dc4c21e2ef435025e1ddf8c386fa2 Mon Sep 17 00:00:00 2001 From: Rahul Sandhu Date: Wed, 10 Jul 2024 11:12:30 +0100 Subject: [PATCH] tools/hex2hcd: fix musl compatibility The call to basename() relies on a GNU extension to take a const char * vs a char *. Let's define a trivial helper function to ensure compatibility with musl. Downstream gentoo bug: https://bugs.gentoo.org/926344 Fixes: #843 Signed-off-by: Rahul Sandhu --- tools/hex2hcd.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/hex2hcd.c b/tools/hex2hcd.c index e6dca5a810..42c95b759b 100644 --- a/tools/hex2hcd.c +++ b/tools/hex2hcd.c @@ -285,6 +285,11 @@ static void ver_parse_file(const char *pathname) prev->next = ver; } +static const char *helper_basename(const char *path) { + const char *base = strrchr(path, '/'); + return base ? base + 1 : path; +} + static void ver_parse_entry(const char *pathname) { struct stat st; @@ -302,7 +307,7 @@ static void ver_parse_entry(const char *pathname) } if (S_ISREG(st.st_mode)) { - ver_parse_file(basename(pathname)); + ver_parse_file(helper_basename(pathname)); goto done; } From 690eccbe8562cc33f33503af67beb313ca737817 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Tue, 27 Aug 2024 23:09:26 -0700 Subject: [PATCH] mesh: Provide GNU basename compatible implementation Call to basename() relies on a GNU extension to take a const char * vs a char *. Let's define a trivial helper function to ensure compatibility with musl. Fixes: https://github.com/bluez/bluez/issues/843 --- configure.ac | 11 ++++++++++- mesh/mesh-config-json.c | 4 +++- mesh/missing.h | 21 +++++++++++++++++++++ mesh/rpl.c | 1 + tools/hex2hcd.c | 1 + tools/missing.h | 21 +++++++++++++++++++++ 6 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 mesh/missing.h create mode 100644 tools/missing.h diff --git a/configure.ac b/configure.ac index 790a19560d..7093e41ff7 100644 --- a/configure.ac +++ b/configure.ac @@ -70,7 +70,16 @@ AC_CHECK_LIB(pthread, pthread_create, dummy=yes, AC_CHECK_LIB(dl, dlopen, dummy=yes, AC_MSG_ERROR(dynamic linking loader is required)) -AC_CHECK_HEADERS(linux/types.h linux/if_alg.h linux/uinput.h linux/uhid.h sys/random.h) +AC_CHECK_HEADERS(string.h linux/types.h linux/if_alg.h linux/uinput.h linux/uhid.h sys/random.h) + +# basename may be only available in libgen.h with the POSIX behavior, +# not desired here +AC_CHECK_DECLS([basename], [], + AC_MSG_WARN([GNU basename extension not found]), + [#define _GNU_SOURCE 1 + #include + ]) + PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.28) diff --git a/mesh/mesh-config-json.c b/mesh/mesh-config-json.c index c198627c6f..a17a48b6d1 100644 --- a/mesh/mesh-config-json.c +++ b/mesh/mesh-config-json.c @@ -28,6 +28,7 @@ #include #include +#include "mesh/missing.h" #include "mesh/mesh-defs.h" #include "mesh/util.h" #include "mesh/mesh-config.h" @@ -2694,7 +2695,8 @@ bool mesh_config_load_nodes(const char *cfgdir_name, mesh_config_node_func_t cb, void mesh_config_destroy_nvm(struct mesh_config *cfg) { - char *node_dir, *node_name; + char *node_dir; + const char *node_name; char uuid[33]; if (!cfg) diff --git a/mesh/missing.h b/mesh/missing.h new file mode 100644 index 0000000000..464df9b1c3 --- /dev/null +++ b/mesh/missing.h @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2024 Khem Raj + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#if !HAVE_DECL_BASENAME +#include +static inline const char *basename(const char *path) +{ + const char *base = strrchr(path, '/'); + + return base ? base + 1 : path; +} +#endif diff --git a/mesh/rpl.c b/mesh/rpl.c index fb225dddd6..2fa17d72f6 100644 --- a/mesh/rpl.c +++ b/mesh/rpl.c @@ -24,6 +24,7 @@ #include +#include "mesh/missing.h" #include "mesh/mesh-defs.h" #include "mesh/node.h" diff --git a/tools/hex2hcd.c b/tools/hex2hcd.c index e6dca5a810..452ab2beb5 100644 --- a/tools/hex2hcd.c +++ b/tools/hex2hcd.c @@ -24,6 +24,7 @@ #include #include #include +#include "tools/missing.h" static ssize_t process_record(int fd, const char *line, uint16_t *upper_addr) { diff --git a/tools/missing.h b/tools/missing.h new file mode 100644 index 0000000000..464df9b1c3 --- /dev/null +++ b/tools/missing.h @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2024 Khem Raj + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#if !HAVE_DECL_BASENAME +#include +static inline const char *basename(const char *path) +{ + const char *base = strrchr(path, '/'); + + return base ? base + 1 : path; +} +#endif From e882342db836d267a9ca4d0886e6828a2aba67b4 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Mon, 16 Sep 2024 15:11:01 -0700 Subject: [PATCH] mesh: Move local basename into utility file Defining an override via a missing.h can prove difficult when a file needs to use basename and dirname both the APIs and needs to include libgen.h for them, in such situations there will be signature clash for basename function. --- mesh/mesh-config-json.c | 3 +-- mesh/missing.h | 21 --------------------- mesh/rpl.c | 3 +-- mesh/util.c | 10 ++++++++++ mesh/util.h | 5 +++++ 5 files changed, 17 insertions(+), 25 deletions(-) delete mode 100644 mesh/missing.h diff --git a/mesh/mesh-config-json.c b/mesh/mesh-config-json.c index a17a48b6d..5372130d7 100644 --- a/mesh/mesh-config-json.c +++ b/mesh/mesh-config-json.c @@ -28,7 +28,6 @@ #include #include -#include "mesh/missing.h" #include "mesh/mesh-defs.h" #include "mesh/util.h" #include "mesh/mesh-config.h" @@ -2708,7 +2707,7 @@ void mesh_config_destroy_nvm(struct mesh_config *cfg) if (!hex2str(cfg->uuid, 16, uuid, sizeof(uuid))) return; - node_name = basename(node_dir); + node_name = mesh_basename(node_dir); /* Make sure path name of node follows expected guidelines */ if (strcmp(node_name, uuid)) diff --git a/mesh/missing.h b/mesh/missing.h deleted file mode 100644 index 464df9b1c..000000000 --- a/mesh/missing.h +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: LGPL-2.1-or-later -/* - * - * BlueZ - Bluetooth protocol stack for Linux - * - * Copyright (C) 2024 Khem Raj - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif -#if !HAVE_DECL_BASENAME -#include -static inline const char *basename(const char *path) -{ - const char *base = strrchr(path, '/'); - - return base ? base + 1 : path; -} -#endif diff --git a/mesh/rpl.c b/mesh/rpl.c index 2fa17d72f..69533bf43 100644 --- a/mesh/rpl.c +++ b/mesh/rpl.c @@ -24,7 +24,6 @@ #include -#include "mesh/missing.h" #include "mesh/mesh-defs.h" #include "mesh/node.h" @@ -147,7 +146,7 @@ static void get_entries(const char *iv_path, struct l_queue *rpl_list) if (!dir) return; - iv_txt = basename(iv_path); + iv_txt = mesh_basename(iv_path); if (sscanf(iv_txt, "%08x", &iv_index) != 1) { closedir(dir); return; diff --git a/mesh/util.c b/mesh/util.c index 82b57f642..73f13aab7 100644 --- a/mesh/util.c +++ b/mesh/util.c @@ -161,3 +161,13 @@ void enable_debug(void) debug_enabled = true; l_debug_enable("*"); } + +#if !HAVE_DECL_BASENAME +#include +const char *mesh_basename(const char *path) +{ + const char *base = strrchr(path, '/'); + + return base ? base + 1 : path; +} +#endif diff --git a/mesh/util.h b/mesh/util.h index 085ec3330..bb417dc40 100644 --- a/mesh/util.h +++ b/mesh/util.h @@ -16,3 +16,8 @@ void print_packet(const char *label, const void *data, uint16_t size); int create_dir(const char *dir_name); void del_path(const char *path); void enable_debug(void); +#if !HAVE_DECL_BASENAME +const char *mesh_basename(const char *path); +#else +#define mesh_basename basename +#endif