Musl libc does not define the glibc specific macro __GLIBC_PREREQ(), but it has the clock_adjtime() function. Assume that a libc implementation which does not define __GLIBC_PREREQ at all still implements clock_adjtime().
This fixes a build problem with musl libc because the __GLIBC_PREREQ() macro is missing.
Fixes: 42e1358e103d ("ptp: In the testptp utility, use clock_adjtime from glibc when available") Signed-off-by: Hauke Mehrtens hauke@hauke-m.de --- tools/testing/selftests/ptp/testptp.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/tools/testing/selftests/ptp/testptp.c b/tools/testing/selftests/ptp/testptp.c index f7911aaeb007..ecffe2c78543 100644 --- a/tools/testing/selftests/ptp/testptp.c +++ b/tools/testing/selftests/ptp/testptp.c @@ -38,6 +38,7 @@ #define NSEC_PER_SEC 1000000000LL
/* clock_adjtime is not available in GLIBC < 2.14 */ +#ifdef __GLIBC_PREREQ #if !__GLIBC_PREREQ(2, 14) #include <sys/syscall.h> static int clock_adjtime(clockid_t id, struct timex *tx) @@ -45,6 +46,7 @@ static int clock_adjtime(clockid_t id, struct timex *tx) return syscall(__NR_clock_adjtime, id, tx); } #endif +#endif /* __GLIBC_PREREQ */
static void show_flag_test(int rq_index, unsigned int flags, int err) {
Hi Hauke,
On Sun, Feb 14, 2021 at 06:09:40PM +0100, Hauke Mehrtens wrote:
Musl libc does not define the glibc specific macro __GLIBC_PREREQ(), but it has the clock_adjtime() function. Assume that a libc implementation which does not define __GLIBC_PREREQ at all still implements clock_adjtime().
This fixes a build problem with musl libc because the __GLIBC_PREREQ() macro is missing.
Fixes: 42e1358e103d ("ptp: In the testptp utility, use clock_adjtime from glibc when available") Signed-off-by: Hauke Mehrtens hauke@hauke-m.de
tools/testing/selftests/ptp/testptp.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/tools/testing/selftests/ptp/testptp.c b/tools/testing/selftests/ptp/testptp.c index f7911aaeb007..ecffe2c78543 100644 --- a/tools/testing/selftests/ptp/testptp.c +++ b/tools/testing/selftests/ptp/testptp.c @@ -38,6 +38,7 @@ #define NSEC_PER_SEC 1000000000LL /* clock_adjtime is not available in GLIBC < 2.14 */ +#ifdef __GLIBC_PREREQ #if !__GLIBC_PREREQ(2, 14) #include <sys/syscall.h> static int clock_adjtime(clockid_t id, struct timex *tx) @@ -45,6 +46,7 @@ static int clock_adjtime(clockid_t id, struct timex *tx) return syscall(__NR_clock_adjtime, id, tx); } #endif +#endif /* __GLIBC_PREREQ */
I guess this works, but as you say, there is still an assumption to be made there, which is that all other C libraries provide the clock_adjtime syscall definition. So it is likely that this set of #if's and #ifdef's will be revisited again and again and ...
Maybe this is a matter of personal preference, but I wonder if it's not actually preferable to do something like this?
#include <sys/syscall.h>
static int compat_clock_adjtime(clockid_t id, struct timex *tx) { return syscall(__NR_clock_adjtime, id, tx); }
#define clock_adjtime compat_clock_adjtime
This way, everybody uses the same definition of clock_adjtime, and we bypass the definition provided by libc if there is one, and we provide our own if there is none.
On 2/14/21 6:37 PM, Vladimir Oltean wrote:
Hi Hauke,
On Sun, Feb 14, 2021 at 06:09:40PM +0100, Hauke Mehrtens wrote:
Musl libc does not define the glibc specific macro __GLIBC_PREREQ(), but it has the clock_adjtime() function. Assume that a libc implementation which does not define __GLIBC_PREREQ at all still implements clock_adjtime().
This fixes a build problem with musl libc because the __GLIBC_PREREQ() macro is missing.
Fixes: 42e1358e103d ("ptp: In the testptp utility, use clock_adjtime from glibc when available") Signed-off-by: Hauke Mehrtens hauke@hauke-m.de
tools/testing/selftests/ptp/testptp.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/tools/testing/selftests/ptp/testptp.c b/tools/testing/selftests/ptp/testptp.c index f7911aaeb007..ecffe2c78543 100644 --- a/tools/testing/selftests/ptp/testptp.c +++ b/tools/testing/selftests/ptp/testptp.c @@ -38,6 +38,7 @@ #define NSEC_PER_SEC 1000000000LL /* clock_adjtime is not available in GLIBC < 2.14 */ +#ifdef __GLIBC_PREREQ #if !__GLIBC_PREREQ(2, 14) #include <sys/syscall.h> static int clock_adjtime(clockid_t id, struct timex *tx) @@ -45,6 +46,7 @@ static int clock_adjtime(clockid_t id, struct timex *tx) return syscall(__NR_clock_adjtime, id, tx); } #endif +#endif /* __GLIBC_PREREQ */
I guess this works, but as you say, there is still an assumption to be made there, which is that all other C libraries provide the clock_adjtime syscall definition. So it is likely that this set of #if's and #ifdef's will be revisited again and again and ...
Maybe this is a matter of personal preference, but I wonder if it's not actually preferable to do something like this?
#include <sys/syscall.h>
static int compat_clock_adjtime(clockid_t id, struct timex *tx) { return syscall(__NR_clock_adjtime, id, tx); }
#define clock_adjtime compat_clock_adjtime
This way, everybody uses the same definition of clock_adjtime, and we bypass the definition provided by libc if there is one, and we provide our own if there is none.
Hi,
glibc 2.14 was released 1. June 2011 and musl libc also supports this function since version v0.9.7 28. October 2012. I would just assume that the libc has this function.
musl also does some special handling, probably for the 64 bit time handling, in this function: https://git.musl-libc.org/cgit/musl/tree/src/linux/clock_adjtime.c#n37 I am not sure if this will also work fine with the compat function.
Hauke
On Sun, Feb 14, 2021 at 07:00:39PM +0100, Hauke Mehrtens wrote:
glibc 2.14 was released 1. June 2011 and musl libc also supports this function since version v0.9.7 28. October 2012. I would just assume that the libc has this function.
Considering that somebody wanted it to work with a GNU libc prior to 2011, why would we not assume that somebody will eventually want it to work with a musl libc prior to 2012?
musl also does some special handling, probably for the 64 bit time handling, in this function: https://git.musl-libc.org/cgit/musl/tree/src/linux/clock_adjtime.c#n37 I am not sure if this will also work fine with the compat function.
I've stared at commit https://git.musl-libc.org/cgit/musl/commit/src/linux/clock_adjtime.c?id=2b4f... which added the conversion logic between struct ktimex64/struct ktimex and struct timex, and sadly I don't understand what is the point of wrapping the clock_adjtime function around the SYS_clock_adjtime64 syscall, when the struct timex::time member will still not be Y2038 safe on 32-bit systems...
That being said, I didn't know that musl libc provides any wrappers around these syscalls.
linux-kselftest-mirror@lists.linaro.org