Files
rpi-buildroot/package/tini/0001-support-posix-basename-from-musl-libc.patch
Thomas Perale eeac9d5935 package/tini: fix build w/ musl
When building tini with musl libc, the following error occurs dur to
missing declaration of 'basename':

```
/home/buildroot/instance-0/output-1/build/tini-0.19.0/src/tini.c: In function 'print_usage':
/home/buildroot/instance-0/output-1/build/tini-0.19.0/src/tini.c:227:36: error: implicit declaration of function 'basename' [-Wimplicit-function-declaration]
  227 |         fprintf(file, "%s (%s)\n", basename(name), TINI_VERSION_STRING);
      |                                    ^~~~~~~~
make: *** [package/pkg-generic.mk:273: /home/buildroot/instance-0/output-1/build/tini-0.19.0/.stamp_built] Error 1
make: Leaving directory '/home/buildroot/instance-0/buildroot'
```

This error can be reproduced with:

```
cat >.config <<EOF
BR2_aarch64=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_BOOTLIN=y
BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_AARCH64_MUSL_BLEEDING_EDGE=y
BR2_PACKAGE_TINI=y
EOF
make olddefconfig
make tini
```

This patch adds the upstream commit [1], that fixes this issue by
including `libgen.h`.

[1] 924c4bd602

Fixes: https://autobuild.buildroot.org/results/f0d/f0d10cd25f3b0e2a4af7266f7417b339ea5d242a
Signed-off-by: Thomas Perale <thomas.perale@mind.be>
Signed-off-by: Romain Naour <romain.naour@smile.fr>
(cherry picked from commit 064f7592d3)
Signed-off-by: Thomas Perale <thomas.perale@mind.be>
2025-08-14 09:26:33 +02:00

77 lines
2.9 KiB
Diff

From 924c4bd6028457188942ecbfdc75e6a343fa9395 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Sun, 14 Apr 2024 15:33:51 +0200
Subject: [PATCH] Support POSIX basename() from musl libc
Musl libc 1.2.5 removed the definition of the basename() function from
string.h and only provides it in libgen.h as the POSIX standard
defines it.
This change fixes compilation with musl libc 1.2.5.
````
build_dir/target-mips_24kc_musl/tini-0.19.0/src/tini.c:227:36: error: implicit declaration of function 'basename' [-Wimplicit-function-declaration]
227 | fprintf(file, "%s (%s)\n", basename(name), TINI_VERSION_STRING);
build_dir/target-mips_24kc_musl/tini-0.19.0/src/tini.c:227:25: error: format '%s' expects argument of type 'char *', but argument 3 has type 'int' [-Werror=format=]
227 | fprintf(file, "%s (%s)\n", basename(name), TINI_VERSION_STRING);
| ~^ ~~~~~~~~~~~~~~
| | |
| char * int
| %d
````
basename() modifies the input string, copy it first with strdup(), If
strdup() returns NULL the code will handle it.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Upstream: https://github.com/krallin/tini/commit/924c4bd6028457188942ecbfdc75e6a343fa9395
Signed-off-by: Thomas Perale <thomas.perale@mind.be>
---
src/tini.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/src/tini.c b/src/tini.c
index 7914d3a..41d1506 100644
--- a/src/tini.c
+++ b/src/tini.c
@@ -14,6 +14,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
+#include <libgen.h>
#include "tiniConfig.h"
#include "tiniLicense.h"
@@ -224,14 +225,19 @@ int spawn(const signal_configuration_t* const sigconf_ptr, char* const argv[], i
}
void print_usage(char* const name, FILE* const file) {
- fprintf(file, "%s (%s)\n", basename(name), TINI_VERSION_STRING);
+ char *dirc, *bname;
+
+ dirc = strdup(name);
+ bname = basename(dirc);
+
+ fprintf(file, "%s (%s)\n", bname, TINI_VERSION_STRING);
#if TINI_MINIMAL
- fprintf(file, "Usage: %s PROGRAM [ARGS] | --version\n\n", basename(name));
+ fprintf(file, "Usage: %s PROGRAM [ARGS] | --version\n\n", bname);
#else
- fprintf(file, "Usage: %s [OPTIONS] PROGRAM -- [ARGS] | --version\n\n", basename(name));
+ fprintf(file, "Usage: %s [OPTIONS] PROGRAM -- [ARGS] | --version\n\n", bname);
#endif
- fprintf(file, "Execute a program under the supervision of a valid init process (%s)\n\n", basename(name));
+ fprintf(file, "Execute a program under the supervision of a valid init process (%s)\n\n", bname);
fprintf(file, "Command line options:\n\n");
@@ -261,6 +267,7 @@ void print_usage(char* const name, FILE* const file) {
fprintf(file, " %s: Send signals to the child's process group.\n", KILL_PROCESS_GROUP_GROUP_ENV_VAR);
fprintf(file, "\n");
+ free(dirc);
}
void print_license(FILE* const file) {