[PATCH libinput] FreeBSD portability fixes
Peter Hutterer
peter.hutterer at who-t.net
Fri Dec 1 00:10:06 UTC 2017
On Thu, Nov 23, 2017 at 09:15:27PM +0300, Greg V wrote:
> - some items in meson were missing a dependency on udev
> - libdl does not exist on FreeBSD, dlopen is in libc
> - no linux/types.h on FreeBSD
> - stdarg.h included when variadic functions are used
> - and other fixes
> ---
> include/linux/input.h | 11 +++++++++++
> meson.build | 9 +++++++--
> src/evdev.h | 1 +
> src/libinput-private.h | 1 +
> src/libinput-util.h | 4 ++++
> src/libinput.c | 1 +
> src/libinput.h | 1 +
> test/litest.c | 27 +++++++++++++++++++++++++--
> test/litest.h | 1 +
> test/test-log.c | 1 +
> test/test-misc.c | 1 +
> test/test-pointer.c | 2 ++
> test/test-tablet.c | 1 +
> tools/libinput-debug-events.c | 1 +
> tools/libinput-debug-gui.c | 1 +
> tools/ptraccel-debug.c | 8 +++++++-
> 16 files changed, 66 insertions(+), 5 deletions(-)
>
> diff --git a/include/linux/input.h b/include/linux/input.h
> index 06316b27..95134d8e 100644
> --- a/include/linux/input.h
> +++ b/include/linux/input.h
> @@ -11,7 +11,18 @@
> #include <sys/time.h>
> #include <sys/ioctl.h>
> #include <sys/types.h>
> +#ifdef __FreeBSD__
> +#define __u8 uint8_t
> +#define __u16 uint16_t
> +#define __u32 uint32_t
> +#define __u64 uint64_t
> +#define __s16 int16_t
> +#define __s32 int32_t
> +#define _IOC_READ IOC_OUT
> +#define _IOC_WRITE IOC_IN
> +#else
> #include <linux/types.h>
> +#endif
I'd rather have these defines in the config.h for BSD if possible. This
header file should be modified as little as possible.
> #include "input-event-codes.h"
>
> diff --git a/meson.build b/meson.build
> index 13c6a27f..5d9db605 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -145,7 +145,9 @@ src_libfilter = [
> 'src/filter.h',
> 'src/filter-private.h'
> ]
> -libfilter = static_library('filter', src_libfilter)
> +libfilter = static_library('filter', src_libfilter,
> + dependencies : dep_udev,
> + include_directories : includes_include)
> dep_libfilter = declare_dependency(link_with : libfilter)
>
> ############ libinput.so ############
> @@ -598,7 +600,7 @@ if get_option('tests')
> 'test/litest.c'
> ]
>
> - dep_dl = cc.find_library('dl')
> + dep_dl = cc.find_library('dl', required : false)
> deps_litest = [
> dep_libinput,
> dep_check,
> @@ -689,12 +691,14 @@ if get_option('tests')
> # build-test only
> executable('test-build-pedantic',
> 'test/build-pedantic.c',
> + dependencies : [dep_udev],
> include_directories : [includes_src, includes_include],
> c_args : ['-std=c99', '-pedantic', '-Werror'],
> install : false)
> # build-test only
> executable('test-build-std-gnuc90',
> 'test/build-pedantic.c',
> + dependencies : [dep_udev],
> include_directories : [includes_src, includes_include],
> c_args : ['-std=gnu90', '-Werror'],
> install : false)
> @@ -707,6 +711,7 @@ if get_option('tests')
> # test including from C++
> executable('test-build-cxx',
> 'test/build-cxx.cc',
> + dependencies : [dep_udev],
> include_directories : [includes_src, includes_include],
> install : false)
>
I split those into a separate commit, pushed, thanks.
> diff --git a/src/evdev.h b/src/evdev.h
> index 11ed7da5..75223852 100644
> --- a/src/evdev.h
> +++ b/src/evdev.h
> @@ -29,6 +29,7 @@
> #include "config.h"
>
> #include <stdbool.h>
> +#include <stdarg.h>
I split all the stdarg.h into a separate commit, pushed, thanks.
> diff --git a/src/libinput-util.h b/src/libinput-util.h
> index 57bcdbb5..a4522f6b 100644
> --- a/src/libinput-util.h
> +++ b/src/libinput-util.h
> @@ -30,7 +30,11 @@
> #include <assert.h>
> #include <errno.h>
> #include <limits.h>
> +#ifdef __FreeBSD__
> +#include <xlocale.h>
> +#else
> #include <locale.h>
> +#endif
is there a freebsd image on the docker registry that's reliable? adding this
to circleci seems like the only way to make sure it keeps building.
> #include <math.h>
> #include <stdarg.h>
> #include <stdbool.h>
> diff --git a/src/libinput.c b/src/libinput.c
> index 49de8f27..d85693a4 100644
> --- a/src/libinput.c
> +++ b/src/libinput.c
> @@ -28,6 +28,7 @@
> #include <inttypes.h>
> #include <stdio.h>
> #include <stdlib.h>
> +#include <stdarg.h>
> #include <string.h>
> #include <sys/epoll.h>
> #include <unistd.h>
> diff --git a/src/libinput.h b/src/libinput.h
> index 1a06bc7c..759bce91 100644
> --- a/src/libinput.h
> +++ b/src/libinput.h
> @@ -31,6 +31,7 @@ extern "C" {
>
> #include <stdlib.h>
> #include <stdint.h>
> +#include <stdarg.h>
> #include <libudev.h>
>
> #define LIBINPUT_ATTRIBUTE_PRINTF(_format, _args) \
> diff --git a/test/litest.c b/test/litest.c
> index 3ca319c2..c27c2369 100644
> --- a/test/litest.c
> +++ b/test/litest.c
> @@ -36,12 +36,17 @@
> #include <stdint.h>
> #include <stdio.h>
> #include <stdlib.h>
> +#include <stdarg.h>
> #include <time.h>
> #include <unistd.h>
> #include "linux/input.h"
> #include <sys/ptrace.h>
> #include <sys/resource.h>
> +#ifdef __linux__
> #include <sys/sendfile.h>
> +#elif __FreeBSD__
> +#include <sys/socket.h>
> +#endif
> #include <sys/timerfd.h>
> #include <sys/wait.h>
> #include <sys/stat.h>
> @@ -1031,7 +1036,13 @@ litest_copy_file(const char *dest, const char *src, const char *header)
> src,
> strerror(errno));
> /* lazy, just check for error and empty file copy */
> - litest_assert_int_gt(sendfile(out, in, NULL, 40960), 0);
> + litest_assert_int_gt(
> +#ifdef __linux__
> + sendfile(out, in, NULL, 40960)
> +#elif __FreeBSD__
> + sendfile(out, in, 0, 40960, NULL, NULL, 0)
> +#endif
> + , 0);
I really dislike having ifdefs for parameter order inside a function. Please
make this a static inline that does nothing but the ifdefs. Bonus points for
finding a function that does the same job that we don't need ifdefs. It's
the test suite, I'd rather go for readability than efficiency.
> close(out);
> close(in);
>
> @@ -3536,10 +3547,17 @@ is_debugger_attached(void)
>
> if (pid == 0) {
> int ppid = getppid();
> +#ifdef __linux__
> if (ptrace(PTRACE_ATTACH, ppid, NULL, NULL) == 0) {
> waitpid(ppid, NULL, 0);
> ptrace(PTRACE_CONT, NULL, NULL);
oh. this one looks like it's buggy anyway but just happens to work. I'm
surprised nothing warned about it.
> ptrace(PTRACE_DETACH, ppid, NULL, NULL);
> +#elif __FreeBSD__
> + if (ptrace(PT_ATTACH, ppid, NULL, 0) == 0) {
> + waitpid(ppid, NULL, 0);
> + ptrace(PT_CONTINUE, ppid, NULL, 0);
> + ptrace(PT_DETACH, ppid, NULL, 0);
> +#endif
afaict the only difference between linux and bsd here is the name of the
PTRACE_ defines - they can be in the config.h again.
> rc = 0;
> } else {
> rc = 1;
> @@ -3608,7 +3626,12 @@ main(int argc, char **argv)
> if (getuid() != 0) {
> fprintf(stderr,
> "%s must be run as root.\n",
> - program_invocation_short_name);
> +#ifdef __linux__
> + program_invocation_short_name
> +#else
> + argv[0]
> +#endif
no. think of something nicer please. either a global, or using
basename(argv[0]) or something else. But I'm not having ifdefs for this.
same for the ptraccel-debug one.
Cheers,
Peter
> + );
> return 77;
> }
>
> diff --git a/test/litest.h b/test/litest.h
> index b7667ffe..faa469c0 100644
> --- a/test/litest.h
> +++ b/test/litest.h
> @@ -27,6 +27,7 @@
> #define LITEST_H
>
> #include <stdbool.h>
> +#include <stdarg.h>
> #include <check.h>
> #include <libevdev/libevdev.h>
> #include <libevdev/libevdev-uinput.h>
> diff --git a/test/test-log.c b/test/test-log.c
> index 2705a81e..02ff0185 100644
> --- a/test/test-log.c
> +++ b/test/test-log.c
> @@ -28,6 +28,7 @@
> #include <fcntl.h>
> #include <libinput.h>
> #include <unistd.h>
> +#include <stdarg.h>
>
> #include "litest.h"
>
> diff --git a/test/test-misc.c b/test/test-misc.c
> index 32081c03..94cbfcc1 100644
> --- a/test/test-misc.c
> +++ b/test/test-misc.c
> @@ -29,6 +29,7 @@
> #include <libinput.h>
> #include <libinput-util.h>
> #include <unistd.h>
> +#include <stdarg.h>
>
> #include "litest.h"
> #include "libinput-util.h"
> diff --git a/test/test-pointer.c b/test/test-pointer.c
> index 7324c0f6..14801aeb 100644
> --- a/test/test-pointer.c
> +++ b/test/test-pointer.c
> @@ -30,7 +30,9 @@
> #include <libinput.h>
> #include <math.h>
> #include <unistd.h>
> +#ifdef __linux__
> #include <values.h>
> +#endif
>
> #include "libinput-util.h"
> #include "litest.h"
> diff --git a/test/test-tablet.c b/test/test-tablet.c
> index 218b6e40..bc089389 100644
> --- a/test/test-tablet.c
> +++ b/test/test-tablet.c
> @@ -29,6 +29,7 @@
> #include <libinput.h>
> #include <unistd.h>
> #include <stdbool.h>
> +#include <stdarg.h>
>
> #include "libinput-util.h"
> #include "evdev-tablet.h"
> diff --git a/tools/libinput-debug-events.c b/tools/libinput-debug-events.c
> index 56810c57..33f51d0e 100644
> --- a/tools/libinput-debug-events.c
> +++ b/tools/libinput-debug-events.c
> @@ -29,6 +29,7 @@
> #include <getopt.h>
> #include <poll.h>
> #include <stdio.h>
> +#include <stdarg.h>
> #include <signal.h>
> #include <string.h>
> #include <time.h>
> diff --git a/tools/libinput-debug-gui.c b/tools/libinput-debug-gui.c
> index 43ae5499..ab49ad66 100644
> --- a/tools/libinput-debug-gui.c
> +++ b/tools/libinput-debug-gui.c
> @@ -31,6 +31,7 @@
> #include <math.h>
> #include <stdio.h>
> #include <stdlib.h>
> +#include <stdarg.h>
> #include <string.h>
> #include <unistd.h>
>
> diff --git a/tools/ptraccel-debug.c b/tools/ptraccel-debug.c
> index 93be523f..262b8587 100644
> --- a/tools/ptraccel-debug.c
> +++ b/tools/ptraccel-debug.c
> @@ -190,7 +190,13 @@ print_accel_func_trackpoint(struct motion_filter *filter,
> static void
> usage(void)
> {
> - printf("Usage: %s [options] [dx1] [dx2] [...] > gnuplot.data\n", program_invocation_short_name);
> + printf("Usage: %s [options] [dx1] [dx2] [...] > gnuplot.data\n",
> +#ifdef __linux__
> + program_invocation_short_name
> +#else
> + "ptraccel-debug"
> +#endif
> + );
> printf("\n"
> "Options:\n"
> "--mode=<motion|accel|delta|sequence> \n"
> --
> 2.15.0
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
More information about the wayland-devel
mailing list