From 87a2cff681da73330cf3e3a6a8b4632488c38db1 Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Sat, 20 Jan 2024 05:06:58 +0900 Subject: [PATCH] lsfd: build lsfd even if kcmp.h is not available As reported in #2691 by @rrrossi, lsfd was not built on the platform where kcmp.h was not available. However, lsfd just uses kcmp(2) only for optimization; it can work without kcmp. Signed-off-by: Masatake YAMATO --- configure.ac | 1 - misc-utils/lsfd.c | 26 +++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index a03f3c4428..d89cf16a71 100644 --- a/configure.ac +++ b/configure.ac @@ -1805,7 +1805,6 @@ AC_ARG_ENABLE([lsfd], UL_BUILD_INIT([lsfd]) UL_REQUIRES_LINUX([lsfd]) UL_REQUIRES_BUILD([lsfd], [libsmartcols]) -UL_REQUIRES_HAVE([lsfd], [linux_kcmp_h], [linux/kcmp.h header file]) AM_CONDITIONAL([BUILD_LSFD], [test "x$build_lsfd" = xyes]) AC_ARG_ENABLE([lslogins], diff --git a/misc-utils/lsfd.c b/misc-utils/lsfd.c index cc6a00e374..2c1a880c4e 100644 --- a/misc-utils/lsfd.c +++ b/misc-utils/lsfd.c @@ -37,12 +37,36 @@ #include #include #include -#include + +#ifdef HAVE_LINUX_KCMP_H +# include static int kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) { return syscall(SYS_kcmp, pid1, pid2, type, idx1, idx2); } +#else +# ifndef KCMP_FS +# define KCMP_FS 0 +# endif +# ifndef KCMP_VM +# define KCMP_VM 0 +# endif +# ifndef KCMP_FILES +# define KCMP_FILES 0 +# endif +static int kcmp(pid_t pid1 __attribute__((__unused__)), + pid_t pid2 __attribute__((__unused__)), + int type __attribute__((__unused__)), + unsigned long idx1 __attribute__((__unused__)), + unsigned long idx2 __attribute__((__unused__))) +{ + /* lsfd uses kcmp only for optimization. If the platform doesn't provide + * kcmp, just returning an error is acceptable. */ + errno = ENOSYS; + return -1; +} +#endif /* See proc(5). * Defined in linux/include/linux/sched.h private header file. */ -- 2.47.3