From: Stéphane Graber Date: Thu, 2 Sep 2021 15:42:26 +0000 (-0400) Subject: Merge pull request #474 from brauner/2021-09-01.meson X-Git-Tag: lxcfs-5.0.0~27 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=35abf07fa516d7a6650805717d138c2afaf62c21;hp=d48e86510fa328c1b199b61ab6dff8cc357d69c4;p=mirror_lxcfs.git Merge pull request #474 from brauner/2021-09-01.meson meson: add meson support --- diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml index 218e951..379be61 100644 --- a/.github/workflows/coverity.yml +++ b/.github/workflows/coverity.yml @@ -24,16 +24,17 @@ jobs: sudo apt-get update -qq sudo apt-get install -qq gcc clang sudo apt-get install -qq libfuse-dev uuid-runtime + sudo apt-get install -qq python3 python3-setuptools + sudo pip3 install meson ninja - name: Run coverity run: | export PATH="$(pwd)/cov-analysis-linux64/bin:${PATH}" - # Configure - ./bootstrap.sh - mkdir build + meson setup -Dtests=true -Dinit-script=systemd -Dprefix=/usr build/ + meson compile -C build + ninja -C build cd build - ../configure --prefix=/usr # Build cov-build --dir cov-int make -j4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index aa5bced..19d4803 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,6 +28,8 @@ jobs: sudo apt-get update -qq sudo apt-get install -qq gcc clang sudo apt-get install -qq libfuse-dev uuid-runtime + sudo apt-get install -qq python3 python3-setuptools + sudo pip3 install meson==0.55.1 ninja - name: Compiler version env: @@ -39,17 +41,11 @@ jobs: env: CC: ${{ matrix.compiler }} run: | - # Configure - ./bootstrap.sh - CFLAGS='-g -O0 -std=c11 -DDEBUG -DVERBOSE -DRESOLVE_NOW -Wall -Werror' ./configure --prefix=/usr - - # Build - make -j4 - (cd tests && make tests) - + meson setup -Dtests=true -Dinit-script=systemd -Dprefix=/usr build/ + ninja -C build - name: Test env: CC: ${{ matrix.compiler }} run: | echo 1 | sudo tee /sys/fs/cgroup/cpuset/cgroup.clone_children || true - sudo -E PATH="${PATH}" LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" tests/main.sh + sudo -E PATH="${PATH}" LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" build/tests/main.sh diff --git a/.gitignore b/.gitignore index da934c4..f3af2b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,15 @@ -.deps/ INSTALL -Makefile -Makefile.in -aclocal.m4 -autom4te.cache/ -compile -config.guess -config.h -config.h.in -config.log -config.status -config.sub -configure -depcomp -install-sh -libtool -ltmain.sh lxcfs -m4/ missing -stamp-h1 lxcfs.1 lxcfs.spec share/00-lxcfs.conf share/lxc.mount.hook share/lxc.reboot.hook -tests/cpusetrange +tests/test-cpusetrange tests/test-read lxcfs_mkdir -tests/test_syscalls +tests/test-syscalls config/init/systemd/lxcfs.service *.o tags diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eeb0dbc --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +all: + ninja -C build + +install: + DESTDIR=$(DESTDIR) ninja -C build install diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 0c0ae0b..0000000 --- a/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -ACLOCAL_AMFLAGS = -I m4 - -LIBTOOL_DEPS = @LIBTOOL_DEPS@ -SUBDIRS = config share src tests doc -DIST_SUBDIRS = config share src tests doc - -EXTRA_DIST = lxcfs.spec - -libtool: $(LIBTOOL_DEPS) - $(SHELL) ./config.status libtool diff --git a/bootstrap.sh b/bootstrap.sh deleted file mode 100755 index 97ceeda..0000000 --- a/bootstrap.sh +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-or-later - -set -x -set -e - -test -d autom4te.cache && rm -rf autom4te.cache -libtoolize || exit 1 -aclocal -I m4 || exit 1 -autoheader || exit 1 -autoconf || exit 1 -automake --add-missing --copy || exit 1 diff --git a/config/Makefile.am b/config/Makefile.am deleted file mode 100644 index a89fbfb..0000000 --- a/config/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = init diff --git a/config/init/Makefile.am b/config/init/Makefile.am deleted file mode 100644 index e2ffe28..0000000 --- a/config/init/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = systemd sysvinit upstart diff --git a/config/init/systemd/Makefile.am b/config/init/systemd/Makefile.am deleted file mode 100644 index 79e96f5..0000000 --- a/config/init/systemd/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -EXTRA_DIST = lxcfs.service - -if INIT_SCRIPT_SYSTEMD -SYSTEMD_UNIT_DIR = /lib/systemd/system - -install-systemd: lxcfs.service - $(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR) - $(INSTALL_DATA) lxcfs.service $(DESTDIR)$(SYSTEMD_UNIT_DIR)/ - -uninstall-systemd: - rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/lxcfs.service - rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || : - -install-data-local: install-systemd -uninstall-local: uninstall-systemd -endif diff --git a/config/init/sysvinit/Makefile.am b/config/init/sysvinit/Makefile.am deleted file mode 100644 index 31ad09b..0000000 --- a/config/init/sysvinit/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -EXTRA_DIST = lxcfs - -if INIT_SCRIPT_SYSV -install-sysvinit: lxcfs - $(MKDIR_P) $(DESTDIR)$(sysconfdir)/rc.d/init.d - $(INSTALL_SCRIPT) lxcfs $(DESTDIR)$(sysconfdir)/rc.d/init.d/lxcfs - -uninstall-sysvinit: - rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/lxcfs - rmdir $(DESTDIR)$(sysconfdir)/rc.d/init.d || : - -install-data-local: install-sysvinit -uninstall-local: uninstall-sysvinit -endif diff --git a/config/init/upstart/Makefile.am b/config/init/upstart/Makefile.am deleted file mode 100644 index 8c87562..0000000 --- a/config/init/upstart/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -EXTRA_DIST = lxcfs.conf - -if INIT_SCRIPT_UPSTART -install-upstart: lxcfs.conf - $(MKDIR_P) $(DESTDIR)$(sysconfdir)/init/ - $(INSTALL_DATA) lxcfs.conf $(DESTDIR)$(sysconfdir)/init/ - -uninstall-upstart: - rm -f $(DESTDIR)$(sysconfdir)/init/lxcfs.conf - rmdir $(DESTDIR)$(sysconfdir)/init || : - -install-data-local: install-upstart -uninstall-local: uninstall-upstart -endif diff --git a/configure.ac b/configure.ac deleted file mode 100644 index 90bcd8d..0000000 --- a/configure.ac +++ /dev/null @@ -1,283 +0,0 @@ -AC_PREREQ([2.69]) - -AC_INIT([lxcfs], [4.0.0], [lxc-devel@lists.linuxcontainers.org]) - -# We need pkg-config -PKG_PROG_PKG_CONFIG - -AC_CONFIG_SRCDIR([configure.ac]) -AC_CONFIG_AUX_DIR([config]) -AC_CONFIG_HEADERS([config.h]) - -AC_SUBST(ACLOCAL_AMFLAGS, "-I m4") -AC_CONFIG_MACRO_DIR([m4]) -AM_INIT_AUTOMAKE([-Wall -Werror -Wno-portability subdir-objects]) -AC_CANONICAL_HOST -AM_PROG_CC_C_O -AC_USE_SYSTEM_EXTENSIONS - -# Test if we have a new enough compiler. -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ -#define GCC_VERSION \ - (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) - -#define CLANG_VERSION \ - (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) - -#if GCC_VERSION < 40700 && CLANG_VERSION < 10000 -#error Sorry, your compiler is too old - please upgrade it -#endif - ]])], [valid_compiler=yes], [valid_compiler=no]) -if test "x$valid_compiler" = "xno"; then - AC_MSG_ERROR([Sorry, your compiler is too old - please upgrade it]) -fi - -# libtool -LT_INIT -AC_SUBST([LIBTOOL_DEPS]) - -AC_CONFIG_FILES([ - Makefile - lxcfs.spec - - config/Makefile - config/init/Makefile - config/init/systemd/Makefile - config/init/systemd/lxcfs.service - config/init/sysvinit/Makefile - config/init/upstart/Makefile - - doc/Makefile - - share/Makefile - share/00-lxcfs.conf - share/lxc.mount.hook - share/lxc.reboot.hook - - src/Makefile - - tests/Makefile ]) - -AC_CHECK_LIB(pthread, main) - -PKG_CHECK_MODULES(FUSE, fuse, [], [ - PKG_CHECK_MODULES(FUSE, fuse3, [AC_DEFINE([HAVE_FUSE3], [1], [Use fuse3])]) -]) - -AC_PATH_PROG(HELP2MAN, help2man, false // No help2man //) -AM_CONDITIONAL([HAVE_HELP2MAN], [test "x$HELP2MAN" != "xfalse // No help2man //" ]) - -AC_ARG_WITH([runtime-path], - [AC_HELP_STRING( - [--with-runtime-path=dir], - [runtime directory (default: /run)] - )], [], [with_runtime_path=['/run']]) - -AS_AC_EXPAND(RUNTIME_PATH, "$with_runtime_path") -AS_AC_EXPAND(LXCFSSHAREDIR, "$datarootdir/lxcfs") -AS_AC_EXPAND(LXCCONFDIR, "$datarootdir/lxc/config/common.conf.d") -AS_AC_EXPAND(LXCFSTARGETDIR, "$localstatedir/lib/lxcfs") - -# Detect the distribution. This is used for the default configuration and -# for some distro-specific build options. -AC_MSG_CHECKING([host distribution]) -AC_ARG_WITH(distro, AS_HELP_STRING([--with-distro=DISTRO], [Specify the Linux distribution to target: One of redhat, oracle, centos, fedora, suse, gentoo, debian, arch, slackware, paldo, openmandriva or pardus.])) -if type lsb_release >/dev/null 2>&1 && test "z$with_distro" = "z"; then - with_distro=`lsb_release -is` -fi - -if test "z$with_distro" = "z"; then - AC_CHECK_FILE(/etc/redhat-release,with_distro="redhat") - AC_CHECK_FILE(/etc/oracle-release,with_distro="oracle") - AC_CHECK_FILE(/etc/centos-release,with_distro="centos") - AC_CHECK_FILE(/etc/fedora-release,with_distro="fedora") - AC_CHECK_FILE(/etc/SuSE-release,with_distro="suse") - AC_CHECK_FILE(/etc/gentoo-release,with_distro="gentoo") - AC_CHECK_FILE(/etc/debian_version,with_distro="debian") - AC_CHECK_FILE(/etc/arch-release,with_distro="arch") - AC_CHECK_FILE(/etc/slackware-version,with_distro="slackware") - AC_CHECK_FILE(/etc/frugalware-release,with_distro="frugalware") - AC_CHECK_FILE(/etc/mandrakelinux-release, with_distro="openmandriva") - AC_CHECK_FILE(/etc/mandriva-release,with_distro="openmandriva") - AC_CHECK_FILE(/etc/pardus-release,with_distro="pardus") - AC_CHECK_FILE(/etc/pld-release,with_distro="pld") -fi - -with_distro=`echo ${with_distro} | tr '[[:upper:]]' '[[:lower:]]'` - -if test "z$with_distro" = "z"; then - with_distro="unknown" -fi - -case $with_distro in - ubuntu) - distroconf=default.conf.ubuntu - ;; - redhat|centos|fedora|oracle|oracleserver|pld) - distroconf=default.conf.libvirt - ;; - *) - distroconf=default.conf.unknown - ;; -esac - -AC_MSG_RESULT([$with_distro]) -AM_CONDITIONAL([HAVE_DEBIAN], [test x"$with_distro" = "xdebian" -o x"$with_distro" = "xubuntu"]) -AM_CONDITIONAL([DISTRO_UBUNTU], [test "x$with_distro" = "xubuntu"]) - -# Check for init system type -AC_MSG_CHECKING([for init system type]) -AC_ARG_WITH([init-script], - [AC_HELP_STRING([--with-init-script@<:@=TYPE@<:@,TYPE,...@:>@@:>@], - [Type(s) of init script to install: bsd, openrc, sysvinit, systemd, upstart, - distro @<:@default=distro@:>@])],[],[with_init_script=distro]) -case "$with_init_script" in - distro) - case $with_distro in - fedora) - init_script=systemd - ;; - redhat|centos|oracle|oracleserver) - init_script=sysvinit - ;; - debian) - init_script=upstart,systemd,sysvinit - ;; - ubuntu) - init_script=upstart,systemd,sysvinit - ;; - pld) - init_script=systemd,sysvinit - ;; - slackware) - echo -n "Warning: bsd init job not yet implemented" - init_script= - ;; - gentoo) - echo -n "Warning: openrc init job not yet implemented" - init_script= - ;; - *) - echo -n "Linux distribution init system unknown." - init_script= - ;; - esac - ;; - *) - init_script=$with_init_script - ;; -esac - -# Check valid init systems were given, run in subshell so we don't mess up IFS -(IFS="," ; for init_sys in $init_script; -do - case "$init_sys" in - none|bsd|openrc|sysvinit|systemd|upstart) - ;; - *) - exit 1 - ;; - esac -done) || AC_MSG_ERROR([Unknown init system type in $init_script]) - -AM_CONDITIONAL([INIT_SCRIPT_BSD], [echo "$init_script" |grep -q "bsd"]) -AM_CONDITIONAL([INIT_SCRIPT_OPENRC], [echo "$init_script" |grep -q "openrc"]) -AM_CONDITIONAL([INIT_SCRIPT_SYSV], [echo "$init_script" |grep -q "sysvinit"]) -AM_CONDITIONAL([INIT_SCRIPT_SYSTEMD], [echo "$init_script" |grep -q "systemd"]) -AM_CONDITIONAL([INIT_SCRIPT_UPSTART], [echo "$init_script" |grep -q "upstart"]) -AC_MSG_RESULT($init_script) - -AC_SUBST([lxcfsdir], "${libdir}/lxcfs") - -# Rootfs path, where the container mount structure is assembled -AC_ARG_WITH([rootfs-path], - [AC_HELP_STRING( - [--with-rootfs-path=dir], - [lxc rootfs mount point] - )], [], [with_rootfs_path=['${libdir}/lxc/rootfs']]) - -AS_AC_EXPAND(LIBDIR, "$libdir") - -AC_CHECK_FUNCS([strlcpy], - AM_CONDITIONAL(HAVE_STRLCPY, true) - AC_DEFINE(HAVE_STRLCPY,1,[Have strlcpy]), - AM_CONDITIONAL(HAVE_STRLCPY, false)) - -AC_CHECK_FUNCS([strlcat], - AM_CONDITIONAL(HAVE_STRLCAT, true) - AC_DEFINE(HAVE_STRLCAT,1,[Have strlcat]), - AM_CONDITIONAL(HAVE_STRLCAT, false)) - -AC_CHECK_FUNCS([pidfd_open], - AM_CONDITIONAL(HAVE_PIDFD_OPEN, true) - AC_DEFINE(HAVE_PIDFD_OPEN,1,[Supports pidfd_open]), - AM_CONDITIONAL(HAVE_PIDFD_OPEN, false)) - -AC_CHECK_FUNCS([pidfd_send_signal], - AM_CONDITIONAL(HAVE_PIDFD_SEND_SIGNAL, true) - AC_DEFINE(HAVE_PIDFD_SEND_SIGNAL,1,[Supports pidfd_send_signal]), - AM_CONDITIONAL(HAVE_PIDFD_SEND_SIGNAL, false)) - -AX_CHECK_COMPILE_FLAG([-fdiagnostics-color], [CFLAGS="$CFLAGS -fdiagnostics-color"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough=5], [CFLAGS="$CFLAGS -Wimplicit-fallthrough=5"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wcast-align], [CFLAGS="$CFLAGS -Wcast-align"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wstrict-prototypes], [CFLAGS="$CFLAGS -Wstrict-prototypes"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing], [CFLAGS="$CFLAGS -fno-strict-aliasing"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-fstack-clash-protection], [CFLAGS="$CFLAGS -fstack-clash-protection"],,[-Werror]) -AX_CHECK_LINK_FLAG([-fstack-protector-strong], [CFLAGS="$CFLAGS -fstack-protector-strong"],,[-Werror]) -AX_CHECK_LINK_FLAG([--param=ssp-buffer-size=4], [CFLAGS="$CFLAGS --param=ssp-buffer-size=4"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-g], [CFLAGS="$CFLAGS -g"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([--mcet -fcf-protection], [CFLAGS="$CFLAGS --mcet -fcf-protection"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Werror=implicit-function-declaration], [CFLAGS="$CFLAGS -Werror=implicit-function-declaration"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wlogical-op], [CFLAGS="$CFLAGS -Wlogical-op"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wmissing-include-dirs], [CFLAGS="$CFLAGS -Wmissing-include-dirs"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wold-style-definition], [CFLAGS="$CFLAGS -Wold-style-definition"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Winit-self], [CFLAGS="$CFLAGS -Winit-self"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wunused-but-set-variable], [CFLAGS="$CFLAGS -Wunused-but-set-variable"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wfloat-equal], [CFLAGS="$CFLAGS -Wfloat-equal"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wsuggest-attribute=noreturn], [CFLAGS="$CFLAGS -Wsuggest-attribute=noreturn"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Werror=return-type], [CFLAGS="$CFLAGS -Werror=return-type"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Werror=incompatible-pointer-types], [CFLAGS="$CFLAGS -Werror=incompatible-pointer-types"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wformat=2], [CFLAGS="$CFLAGS -Wformat=2"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wshadow], [CFLAGS="$CFLAGS -Wshadow"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wendif-labels], [CFLAGS="$CFLAGS -Wendif-labels"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Werror=overflow], [CFLAGS="$CFLAGS -Werror=overflow"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-fdiagnostics-show-option], [CFLAGS="$CFLAGS -fdiagnostics-show-option"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Werror=shift-count-overflow], [CFLAGS="$CFLAGS -Werror=shift-count-overflow"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Werror=shift-overflow=2], [CFLAGS="$CFLAGS -Werror=shift-overflow=2"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wdate-time], [CFLAGS="$CFLAGS -Wdate-time"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-Wnested-externs], [CFLAGS="$CFLAGS -Wnested-externs"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-fasynchronous-unwind-tables], [CFLAGS="$CFLAGS -fasynchronous-unwind-tables"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-pipe], [CFLAGS="$CFLAGS -pipe"],,[-Werror]) -AX_CHECK_COMPILE_FLAG([-fexceptions], [CFLAGS="$CFLAGS -fexceptions"],,[-Werror]) - -CFLAGS="$CFLAGS -fvisibility=hidden -Wvla -std=gnu11" -AX_CHECK_LINK_FLAG([-z relro], [LDFLAGS="$LDFLAGS -z relro"],,[]) -AX_CHECK_LINK_FLAG([-z now], [LDFLAGS="$LDFLAGS -z now"],,[]) - -# Build with ASAN commands -AC_ARG_ENABLE([asan], - [AS_HELP_STRING([--enable-asan], [build with address sanitizer enabled [default=no]])], - [enable_asan=$enableval], [enable_asan=no]) -AM_CONDITIONAL([ENABLE_ASAN], [test "x$enable_asan" = "xyes"]) - -# Build with UBSAN commands -AC_ARG_ENABLE([ubsan], - [AS_HELP_STRING([--enable-ubsan], [build with ubsan sanitizer enabled [default=no]])], - [enable_asan=$enableval], [enable_ubsan=no]) -AM_CONDITIONAL([ENABLE_UBSAN], [test "x$enable_ubsan" = "xyes"]) - -AC_OUTPUT - -# Configuration overview -cat << EOF - ----------------------------- -Environment: - - compiler: $CC - -Debugging: - - tests: $enable_tests - - ASAN: $enable_asan - - mutex debugging: $enable_mutex_debugging -EOF diff --git a/doc/Makefile.am b/doc/Makefile.am deleted file mode 100644 index 022ea22..0000000 --- a/doc/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -EXTRA_DIST = lxcfs.man.add - -if HAVE_HELP2MAN -man_MANS = lxcfs.1 - -lxcfs.1: ../src/lxcfs lxcfs.man.add - $(HELP2MAN) -n "System virtualization filesystem for containers" --no-discard-stderr -s 1 -I lxcfs.man.add -N ../src/lxcfs > lxcfs.1 -endif diff --git a/m4/acinclude.m4 b/m4/acinclude.m4 deleted file mode 100644 index d718b5e..0000000 --- a/m4/acinclude.m4 +++ /dev/null @@ -1,137 +0,0 @@ -dnl as-ac-expand.m4 0.2.0 -dnl autostars m4 macro for expanding directories using configure's prefix -dnl thomas@apestaart.org -dnl - -dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR) -dnl example -dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir) -dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local - -AC_DEFUN([AS_AC_EXPAND], -[ - EXP_VAR=[$1] - FROM_VAR=[$2] - - dnl first expand prefix and exec_prefix if necessary - prefix_save=$prefix - exec_prefix_save=$exec_prefix - - dnl if no prefix given, then use /usr/local, the default prefix - if test "x$prefix" = "xNONE"; then - prefix="$ac_default_prefix" - fi - dnl if no exec_prefix given, then use prefix - if test "x$exec_prefix" = "xNONE"; then - exec_prefix=$prefix - fi - - full_var="$FROM_VAR" - dnl loop until it doesn't change anymore - while true; do - new_full_var="`eval echo $full_var`" - if test "x$new_full_var" = "x$full_var"; then break; fi - full_var=$new_full_var - done - - dnl clean up - full_var=$new_full_var - AC_SUBST([$1], "$full_var") - - dnl restore prefix and exec_prefix - prefix=$prefix_save - exec_prefix=$exec_prefix_save -]) - -dnl Available from the GNU Autoconf Macro Archive at: -dnl http://www.gnu.org/software/ac-archive/htmldoc/ax_compare_version.html -AC_DEFUN([AX_COMPARE_VERSION], [ -# Used to indicate true or false condition -ax_compare_version=false - # Convert the two version strings to be compared into a format that - # allows a simple string comparison. The end result is that a version - # string of the form 1.12.5-r617 will be converted to the form - # 0001001200050617. In other words, each number is zero padded to four - # digits, and non digits are removed. - AS_VAR_PUSHDEF([A],[ax_compare_version_A]) - A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ - -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ - -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ - -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ - -e 's/[[^0-9]]//g'` - - AS_VAR_PUSHDEF([B],[ax_compare_version_B]) - B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ - -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ - -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ - -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ - -e 's/[[^0-9]]//g'` - - dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary - dnl # then the first line is used to determine if the condition is true. - dnl # The sed right after the echo is to remove any indented white space. - m4_case(m4_tolower($2), - [lt],[ - ax_compare_version=`echo "x$A -x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` - ], - [gt],[ - ax_compare_version=`echo "x$A -x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` - ], - [le],[ - ax_compare_version=`echo "x$A -x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` - ], - [ge],[ - ax_compare_version=`echo "x$A -x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` - ],[ - dnl Split the operator from the subversion count if present. - m4_bmatch(m4_substr($2,2), - [0],[ - # A count of zero means use the length of the shorter version. - # Determine the number of characters in A and B. - ax_compare_version_len_A=`echo "$A" | awk '{print(length)}'` - ax_compare_version_len_B=`echo "$B" | awk '{print(length)}'` - - # Set A to no more than B's length and B to no more than A's length. - A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` - B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` - ], - [[0-9]+],[ - # A count greater than zero means use only that many subversions - A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` - B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` - ], - [.+],[ - AC_WARNING( - [illegal OP numeric parameter: $2]) - ],[]) - - # Pad zeros at end of numbers to make same length. - ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" - B="$B`echo $A | sed 's/./0/g'`" - A="$ax_compare_version_tmp_A" - - # Check for equality or inequality as necessary. - m4_case(m4_tolower(m4_substr($2,0,2)), - [eq],[ - test "x$A" = "x$B" && ax_compare_version=true - ], - [ne],[ - test "x$A" != "x$B" && ax_compare_version=true - ],[ - AC_WARNING([illegal OP parameter: $2]) - ]) - ]) - - AS_VAR_POPDEF([A])dnl - AS_VAR_POPDEF([B])dnl - - dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. - if test "$ax_compare_version" = "true" ; then - m4_ifvaln([$4],[$4],[:])dnl - m4_ifvaln([$5],[else $5])dnl - fi -]) dnl AX_COMPARE_VERSION diff --git a/m4/ax_check_compile_flag.m4 b/m4/ax_check_compile_flag.m4 deleted file mode 100644 index bd753b3..0000000 --- a/m4/ax_check_compile_flag.m4 +++ /dev/null @@ -1,53 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) -# -# DESCRIPTION -# -# Check whether the given FLAG works with the current language's compiler -# or gives an error. (Warnings, however, are ignored) -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# If EXTRA-FLAGS is defined, it is added to the current language's default -# flags (e.g. CFLAGS) when the check is done. The check is thus made with -# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to -# force the compiler to issue an error when a bad flag is given. -# -# INPUT gives an alternative input source to AC_COMPILE_IFELSE. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 6 - -AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl -AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ - ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS - _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_VAR_IF(CACHEVAR,yes, - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_COMPILE_FLAGS diff --git a/m4/ax_check_link_flag.m4 b/m4/ax_check_link_flag.m4 deleted file mode 100644 index 03a30ce..0000000 --- a/m4/ax_check_link_flag.m4 +++ /dev/null @@ -1,53 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) -# -# DESCRIPTION -# -# Check whether the given FLAG works with the linker or gives an error. -# (Warnings, however, are ignored) -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# If EXTRA-FLAGS is defined, it is added to the linker's default flags -# when the check is done. The check is thus made with the flags: "LDFLAGS -# EXTRA-FLAGS FLAG". This can for example be used to force the linker to -# issue an error when a bad flag is given. -# -# INPUT gives an alternative input source to AC_LINK_IFELSE. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 6 - -AC_DEFUN([AX_CHECK_LINK_FLAG], -[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl -AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ - ax_check_save_flags=$LDFLAGS - LDFLAGS="$LDFLAGS $4 $1" - AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - LDFLAGS=$ax_check_save_flags]) -AS_VAR_IF(CACHEVAR,yes, - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_LINK_FLAGS diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4 deleted file mode 100644 index 5fbf9fe..0000000 --- a/m4/ax_pthread.m4 +++ /dev/null @@ -1,485 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_pthread.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) -# -# DESCRIPTION -# -# This macro figures out how to build C programs using POSIX threads. It -# sets the PTHREAD_LIBS output variable to the threads library and linker -# flags, and the PTHREAD_CFLAGS output variable to any special C compiler -# flags that are needed. (The user can also force certain compiler -# flags/libs to be tested by setting these environment variables.) -# -# Also sets PTHREAD_CC to any special C compiler that is needed for -# multi-threaded programs (defaults to the value of CC otherwise). (This -# is necessary on AIX to use the special cc_r compiler alias.) -# -# NOTE: You are assumed to not only compile your program with these flags, -# but also to link with them as well. For example, you might link with -# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS -# -# If you are only building threaded programs, you may wish to use these -# variables in your default LIBS, CFLAGS, and CC: -# -# LIBS="$PTHREAD_LIBS $LIBS" -# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" -# CC="$PTHREAD_CC" -# -# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to -# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). -# -# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the -# PTHREAD_PRIO_INHERIT symbol is defined when compiling with -# PTHREAD_CFLAGS. -# -# ACTION-IF-FOUND is a list of shell commands to run if a threads library -# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it -# is not found. If ACTION-IF-FOUND is not specified, the default action -# will define HAVE_PTHREAD. -# -# Please let the authors know if this macro fails on any platform, or if -# you have any other suggestions or comments. This macro was based on work -# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help -# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by -# Alejandro Forero Cuervo to the autoconf macro repository. We are also -# grateful for the helpful feedback of numerous users. -# -# Updated for Autoconf 2.68 by Daniel Richard G. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2011 Daniel Richard G. -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 24 - -AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) -AC_DEFUN([AX_PTHREAD], [ -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_CC]) -AC_REQUIRE([AC_PROG_SED]) -AC_LANG_PUSH([C]) -ax_pthread_ok=no - -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on Tru64 or Sequent). -# It gets checked for in the link test anyway. - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then - ax_pthread_save_CC="$CC" - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) - AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) - AC_MSG_RESULT([$ax_pthread_ok]) - if test "x$ax_pthread_ok" = "xno"; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - CC="$ax_pthread_save_CC" - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" -fi - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. - -ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 -# (Note: HP C rejects this with "bad form for `-t' option") -# -pthreads: Solaris/gcc (Note: HP C also rejects) -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads and -# -D_REENTRANT too), HP C (must be checked before -lpthread, which -# is present but should not be used directly; and before -mthreads, -# because the compiler interprets this as "-mt" + "-hreads") -# -mthreads: Mingw32/gcc, Lynx/gcc -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) - -case $host_os in - - freebsd*) - - # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) - # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) - - ax_pthread_flags="-kthread lthread $ax_pthread_flags" - ;; - - hpux*) - - # From the cc(1) man page: "[-mt] Sets various -D flags to enable - # multi-threading and also sets -lpthread." - - ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" - ;; - - openedition*) - - # IBM z/OS requires a feature-test macro to be defined in order to - # enable POSIX threads at all, so give the user a hint if this is - # not set. (We don't define these ourselves, as they can affect - # other portions of the system API in unpredictable ways.) - - AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], - [ -# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) - AX_PTHREAD_ZOS_MISSING -# endif - ], - [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) - ;; - - solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (N.B.: The stubs are missing - # pthread_cleanup_push, or rather a function called by this macro, - # so we could check for that, but who knows whether they'll stub - # that too in a future libc.) So we'll check first for the - # standard Solaris way of linking pthreads (-mt -lpthread). - - ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" - ;; -esac - -# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) - -AS_IF([test "x$GCC" = "xyes"], - [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"]) - -# The presence of a feature test macro requesting re-entrant function -# definitions is, on some systems, a strong hint that pthreads support is -# correctly enabled - -case $host_os in - darwin* | hpux* | linux* | osf* | solaris*) - ax_pthread_check_macro="_REENTRANT" - ;; - - aix*) - ax_pthread_check_macro="_THREAD_SAFE" - ;; - - *) - ax_pthread_check_macro="--" - ;; -esac -AS_IF([test "x$ax_pthread_check_macro" = "x--"], - [ax_pthread_check_cond=0], - [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) - -# Are we compiling with Clang? - -AC_CACHE_CHECK([whether $CC is Clang], - [ax_cv_PTHREAD_CLANG], - [ax_cv_PTHREAD_CLANG=no - # Note that Autoconf sets GCC=yes for Clang as well as GCC - if test "x$GCC" = "xyes"; then - AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], - [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ -# if defined(__clang__) && defined(__llvm__) - AX_PTHREAD_CC_IS_CLANG -# endif - ], - [ax_cv_PTHREAD_CLANG=yes]) - fi - ]) -ax_pthread_clang="$ax_cv_PTHREAD_CLANG" - -ax_pthread_clang_warning=no - -# Clang needs special handling, because older versions handle the -pthread -# option in a rather... idiosyncratic way - -if test "x$ax_pthread_clang" = "xyes"; then - - # Clang takes -pthread; it has never supported any other flag - - # (Note 1: This will need to be revisited if a system that Clang - # supports has POSIX threads in a separate library. This tends not - # to be the way of modern systems, but it's conceivable.) - - # (Note 2: On some systems, notably Darwin, -pthread is not needed - # to get POSIX threads support; the API is always present and - # active. We could reasonably leave PTHREAD_CFLAGS empty. But - # -pthread does define _REENTRANT, and while the Darwin headers - # ignore this macro, third-party headers might not.) - - PTHREAD_CFLAGS="-pthread" - PTHREAD_LIBS= - - ax_pthread_ok=yes - - # However, older versions of Clang make a point of warning the user - # that, in an invocation where only linking and no compilation is - # taking place, the -pthread option has no effect ("argument unused - # during compilation"). They expect -pthread to be passed in only - # when source code is being compiled. - # - # Problem is, this is at odds with the way Automake and most other - # C build frameworks function, which is that the same flags used in - # compilation (CFLAGS) are also used in linking. Many systems - # supported by AX_PTHREAD require exactly this for POSIX threads - # support, and in fact it is often not straightforward to specify a - # flag that is used only in the compilation phase and not in - # linking. Such a scenario is extremely rare in practice. - # - # Even though use of the -pthread flag in linking would only print - # a warning, this can be a nuisance for well-run software projects - # that build with -Werror. So if the active version of Clang has - # this misfeature, we search for an option to squash it. - - AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], - [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], - [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown - # Create an alternate version of $ac_link that compiles and - # links in two steps (.c -> .o, .o -> exe) instead of one - # (.c -> exe), because the warning occurs only in the second - # step - ax_pthread_save_ac_link="$ac_link" - ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' - ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` - ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" - ax_pthread_save_CFLAGS="$CFLAGS" - for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do - AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) - CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" - ac_link="$ax_pthread_save_ac_link" - AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], - [ac_link="$ax_pthread_2step_ac_link" - AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], - [break]) - ]) - done - ac_link="$ax_pthread_save_ac_link" - CFLAGS="$ax_pthread_save_CFLAGS" - AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) - ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" - ]) - - case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in - no | unknown) ;; - *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; - esac - -fi # $ax_pthread_clang = yes - -if test "x$ax_pthread_ok" = "xno"; then -for ax_pthread_try_flag in $ax_pthread_flags; do - - case $ax_pthread_try_flag in - none) - AC_MSG_CHECKING([whether pthreads work without any flags]) - ;; - - -mt,pthread) - AC_MSG_CHECKING([whether pthreads work with -mt -lpthread]) - PTHREAD_CFLAGS="-mt" - PTHREAD_LIBS="-lpthread" - ;; - - -*) - AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) - PTHREAD_CFLAGS="$ax_pthread_try_flag" - ;; - - pthread-config) - AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) - AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - - *) - AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) - PTHREAD_LIBS="-l$ax_pthread_try_flag" - ;; - esac - - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include -# if $ax_pthread_check_cond -# error "$ax_pthread_check_macro must be defined" -# endif - static void routine(void *a) { a = 0; } - static void *start_routine(void *a) { return a; }], - [pthread_t th; pthread_attr_t attr; - pthread_create(&th, 0, start_routine, 0); - pthread_join(th, 0); - pthread_attr_init(&attr); - pthread_cleanup_push(routine, 0); - pthread_cleanup_pop(0) /* ; */])], - [ax_pthread_ok=yes], - []) - - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" - - AC_MSG_RESULT([$ax_pthread_ok]) - AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - -# Various other checks: -if test "x$ax_pthread_ok" = "xyes"; then - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_CACHE_CHECK([for joinable pthread attribute], - [ax_cv_PTHREAD_JOINABLE_ATTR], - [ax_cv_PTHREAD_JOINABLE_ATTR=unknown - for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], - [int attr = $ax_pthread_attr; return attr /* ; */])], - [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], - []) - done - ]) - AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ - test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ - test "x$ax_pthread_joinable_attr_defined" != "xyes"], - [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], - [$ax_cv_PTHREAD_JOINABLE_ATTR], - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - ax_pthread_joinable_attr_defined=yes - ]) - - AC_CACHE_CHECK([whether more special flags are required for pthreads], - [ax_cv_PTHREAD_SPECIAL_FLAGS], - [ax_cv_PTHREAD_SPECIAL_FLAGS=no - case $host_os in - solaris*) - ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" - ;; - esac - ]) - AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ - test "x$ax_pthread_special_flags_added" != "xyes"], - [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" - ax_pthread_special_flags_added=yes]) - - AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], - [ax_cv_PTHREAD_PRIO_INHERIT], - [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[int i = PTHREAD_PRIO_INHERIT;]])], - [ax_cv_PTHREAD_PRIO_INHERIT=yes], - [ax_cv_PTHREAD_PRIO_INHERIT=no]) - ]) - AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ - test "x$ax_pthread_prio_inherit_defined" != "xyes"], - [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) - ax_pthread_prio_inherit_defined=yes - ]) - - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" - - # More AIX lossage: compile with *_r variant - if test "x$GCC" != "xyes"; then - case $host_os in - aix*) - AS_CASE(["x/$CC"], - [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], - [#handle absolute path differently from PATH based program lookup - AS_CASE(["x$CC"], - [x/*], - [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], - [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) - ;; - esac - fi -fi - -test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" - -AC_SUBST([PTHREAD_LIBS]) -AC_SUBST([PTHREAD_CFLAGS]) -AC_SUBST([PTHREAD_CC]) - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test "x$ax_pthread_ok" = "xyes"; then - ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) - : -else - ax_pthread_ok=no - $2 -fi -AC_LANG_POP -])dnl AX_PTHREAD diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..58df887 --- /dev/null +++ b/meson.build @@ -0,0 +1,248 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +project('lxcfs', 'c', + version : '4.0.0', + license : 'LGPLv2+', + default_options: [ + 'c_std=gnu11', + 'warning_level=2', + ], + meson_version : '>= 0.45', + ) + +conf = configuration_data() +conf.set_quoted('PROJECT_URL', 'https://linuxcontainers.org/lxcfs/introduction/') +conf.set('PROJECT_VERSION', meson.project_version(), + description : 'Numerical project version (used where a simple number is expected)') +project_source_root = meson.current_source_dir() +project_build_root = meson.current_build_dir() + +# join_paths ignores the preceding arguments if an absolute component is +# encountered, so this should canonicalize various paths when they are +# absolute or relative. +prefixdir = get_option('prefix') +if not prefixdir.startswith('/') + error('Prefix is not absolute: "@0@"'.format(prefixdir)) +endif +bindir = join_paths(prefixdir, get_option('bindir')) +libdir = join_paths(prefixdir, get_option('libdir')) +lxcfsdir = join_paths(libdir, 'lxcfs') +sysconfdir = join_paths(prefixdir, get_option('sysconfdir')) +runtimepath = join_paths(prefixdir, get_option('runtime-path')) +localstatedir = join_paths('/', get_option('localstatedir')) + +conf.set_quoted('LXCFS_BUILD_ROOT', project_build_root) +conf.set_quoted('LXCFS_SOURCE_ROOT', project_source_root) +conf.set_quoted('BINDIR', bindir) +conf.set_quoted('LIBDIR', libdir) +conf.set_quoted('LOCALSTATEDIR', localstatedir) +conf.set_quoted('LXCFSSHAREDIR', join_paths(localstatedir, 'lxcfs')) +conf.set_quoted('LXCCONFDIR', join_paths(localstatedir, '/lxc/config/common.conf.d')) +conf.set_quoted('RUNTIME_PATH', runtimepath) +conf.set_quoted('SYSCONFDIR', sysconfdir) + +init_script = get_option('init-script') + +cc = meson.get_compiler('c') +meson_build_sh = find_program('tools/meson-build.sh') + +want_tests = get_option('tests') + +possible_cc_flags = [ + '-fPIE', + '-Wvla', + '-std=gnu11', + '-fdiagnostics-color', + '-Wimplicit-fallthrough=5', + '-Wcast-align', + '-Wstrict-prototypes', + '-fno-strict-aliasing', + '-fstack-clash-protection', + '-fstack-protector-strong', + '--param=ssp-buffer-size=4', + '--mcet -fcf-protection', + '-Werror=implicit-function-declaration', + '-Wlogical-op', + '-Wmissing-include-dirs', + '-Wold-style-definition', + '-Winit-self', + '-Wunused-but-set-variable', + '-Wno-unused-parameter', + '-Wfloat-equal', + '-Wsuggest-attribute=noreturn', + '-Werror=return-type', + '-Werror=incompatible-pointer-types', + '-Wformat=2', + '-Wshadow', + '-Wendif-labels', + '-Werror=overflow', + '-fdiagnostics-show-option', + '-Werror=shift-count-overflow', + '-Werror=shift-overflow=2', + '-Wdate-time', + '-Wnested-externs', + '-fasynchronous-unwind-tables', + '-fexceptions', + '-Warray-bounds', + '-Wrestrict', + '-Wreturn-local-addr', + '-fsanitize=cfi', + '-Wstringop-overflow', +] + +possible_link_flags = [ + '-Wl,--as-needed', + '-Wl,--gc-sections', + '-Wl,-z,relro', + '-Wl,-z,now', + '-pie', + '-Wl,-fuse-ld=gold', +] + +if meson.version().version_compare('>=0.46') + add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c') +else + add_project_link_arguments(possible_link_flags, language : 'c') +endif + +add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c') + +foreach ident : [ + ['strlcpy', '''#include '''], + ['strlcat', '''#include '''], + ['pidfd_send_signal', '''#include + #include + #include + #include '''], + ['pidfd_open', '''#include + #include + #include + #include '''], +] + + have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE') + conf.set10('HAVE_' + ident[0].to_upper(), have) +endforeach + +conf.set('_FILE_OFFSET_BITS', 64) + +libfuse = cc.find_library('fuse3', required : false) +if libfuse.found() + conf.set10('HAVE_FUSE3', libfuse.found()) + conf.set('FUSE_USE_VERSION', 30) +else + libfuse = cc.find_library('fuse') + conf.set10('HAVE_FUSE', libfuse.found()) + conf.set('FUSE_USE_VERSION', 26) +endif + +libdl = cc.find_library('dl') +threads = dependency('threads') + +config_h = configure_file( + output : 'config.h', + configuration : conf) +config_include = include_directories('.') + +add_project_arguments('-include', 'config.h', language : 'c') + +subdir('tests') + +public_programs = [] + +lxcfs_sources = files('src/lxcfs.c') + +public_programs += executable( + 'lxcfs', + lxcfs_sources, + dependencies : [threads, + libdl, + libfuse], + install : true, + install_dir : bindir) + +liblxcfs_sources = files( + 'src/api_extensions.h', + 'src/bindings.c', + 'src/bindings.h', + 'src/cgroups/cgfsng.c', + 'src/cgroups/cgroup.c', + 'src/cgroups/cgroup.h', + 'src/cgroups/cgroup2_devices.c', + 'src/cgroups/cgroup2_devices.h', + 'src/cgroups/cgroup_utils.c', + 'src/cgroups/cgroup_utils.h', + 'src/cgroup_fuse.c', + 'src/cgroup_fuse.h', + 'src/cpuset_parse.c', + 'src/cpuset_parse.h', + 'src/lxcfs.c', + 'src/lxcfs_fuse_compat.h', + 'src/macro.h', + 'src/memory_utils.h', + 'src/proc_cpuview.c', + 'src/proc_cpuview.h', + 'src/proc_fuse.c', + 'src/proc_fuse.h', + 'src/proc_loadavg.c', + 'src/proc_loadavg.h', + 'src/syscall_numbers.h', + 'src/sysfs_fuse.c', + 'src/sysfs_fuse.h', + 'src/utils.c', + 'src/utils.h') + +liblxcfs = shared_library( + 'lxcfs', + liblxcfs_sources, + link_args : ['-shared'], + dependencies : [threads, + libdl, + libfuse], + install : true, + install_dir : lxcfsdir) + +if want_tests == true + liblxcfs_test = shared_library( + 'lxcfstest', + liblxcfs_sources, + link_args : ['-shared'], + dependencies : [threads, + libdl, + libfuse], + install : false, + install_dir : lxcfsdir, + c_args : '-DRELOADTEST -DDEBUG') +endif + +if init_script == 'systemd' + systemd_service_data = configuration_data() + systemd_service_data.set_quoted('LXCFSTARGETDIR', join_paths(localstatedir, 'lib/lxcfs')) + systemd_service = configure_file( + configuration : systemd_service_data, + input : 'config/init/systemd/lxcfs.service.in', + output : 'lxcfs.service') + install_data(join_paths(project_build_root, 'lxcfs.service'), install_dir : '/lib/systemd/system') +elif init_script == 'upstart' + install_data('config/init/upstart/lxcfs.conf', install_dir : join_paths(sysconfdir, 'init')) +elif init_script == 'openrc' + install_data('config/init/sysvinit/lxcfs', install_dir : join_paths(sysconfdir, 'rc.d/init.d/lxcfs')) +elif init_script == 'sysvinit' + install_data('config/init/sysvinit/lxcfs', install_dir : join_paths(sysconfdir, 'rc.d/init.d/lxcfs')) +endif + +status = [ + '@0@ @1@'.format(meson.project_name(), meson.project_version()), + + 'prefix directory: @0@'.format(prefixdir), + 'sysconf directory: @0@'.format(sysconfdir), + 'bin directory: @0@'.format(bindir), + 'lxcfs directory: @0@'.format(lxcfsdir), + 'runtime directory: @0@'.format(runtimepath), + 'local state directory: @0@'.format(localstatedir), + 'lxcfs build root directory: @0@'.format(project_build_root), + 'lxcfs source root directory: @0@'.format(project_source_root), + 'init system: @0@'.format(init_script), + 'tests: @0@'.format(want_tests)] + +message('\n '.join(status)) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..8529aef --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,14 @@ +# -*- mode: meson -*- + +option('tests', type : 'boolean', value: 'false', + description : 'enable tests') + +option('runtime-path', type : 'string', value : '/run', + description : 'the runtime directory') + +option('with-init-script', type : 'string', value : 'systemd', + description : 'the runtime directory') + +option('init-script', type : 'combo', + choices : ['systemd', 'sysvinit', 'openrc', 'upstart'], value : 'systemd', + description : 'init script') diff --git a/share/Makefile.am b/share/Makefile.am deleted file mode 100644 index 64e43a9..0000000 --- a/share/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -lxccommondir=@LXCCONFDIR@ -lxcfssharedir=@LXCFSSHAREDIR@ - -lxcfsshare_SCRIPTS = lxc.mount.hook lxc.reboot.hook -lxccommon_DATA = 00-lxcfs.conf diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index e06dc35..0000000 --- a/src/Makefile.am +++ /dev/null @@ -1,107 +0,0 @@ -AM_CFLAGS = -Wall -ggdb -D_GNU_SOURCE -DSBINDIR=\"$(SBINDIR)\" -pthread -AM_CFLAGS += $(FUSE_CFLAGS) -AM_CFLAGS += -DLIBDIR=\"$(LIBDIR)\" -AM_LDFLAGS = $(FUSE_LIBS) -pthread -#AM_CFLAGS += -DDEBUG -#AM_CFLAGS += -DVERBOSE - -AM_CFLAGS += -DRUNTIME_PATH=\"$(RUNTIME_PATH)\" - -liblxcfs_la_SOURCES = api_extensions.h \ - bindings.c bindings.h \ - cgroup_fuse.c cgroup_fuse.h \ - cgroups/cgfsng.c \ - cgroups/cgroup.c cgroups/cgroup.h \ - cgroups/cgroup2_devices.c cgroups/cgroup2_devices.h \ - cgroups/cgroup_utils.c cgroups/cgroup_utils.h \ - cpuset_parse.c cpuset_parse.h \ - lxcfs_fuse_compat.h \ - macro.h \ - memory_utils.h \ - proc_cpuview.c proc_cpuview.h \ - proc_fuse.c proc_fuse.h \ - proc_loadavg.c proc_loadavg.h \ - syscall_numbers.h \ - sysfs_fuse.c sysfs_fuse.h \ - utils.c utils.h -liblxcfs_la_CFLAGS = $(AM_CFLAGS) - -if ENABLE_ASAN -liblxcfs_la_CFLAGS += -fsanitize=address \ - -fno-omit-frame-pointer -endif - -if ENABLE_UBSAN -liblxcfs_la_CFLAGS += -fsanitize=undefined -endif - -liblxcfs_la_LDFLAGS = $(AM_CFLAGS) -module -avoid-version -shared - -liblxcfstest_la_SOURCES = api_extensions.h \ - bindings.c bindings.h \ - cgroup_fuse.c cgroup_fuse.h \ - cgroups/cgfsng.c \ - cgroups/cgroup.c cgroups/cgroup.h \ - cgroups/cgroup2_devices.c cgroups/cgroup2_devices.h \ - cgroups/cgroup_utils.c cgroups/cgroup_utils.h \ - cpuset_parse.c cpuset_parse.h \ - lxcfs_fuse_compat.h \ - macro.h \ - memory_utils.h \ - proc_cpuview.c proc_cpuview.h \ - proc_fuse.c proc_fuse.h \ - proc_loadavg.c proc_loadavg.h \ - syscall_numbers.h \ - sysfs_fuse.c sysfs_fuse.h \ - utils.c utils.h -liblxcfstest_la_CFLAGS = $(AM_CFLAGS) -DRELOADTEST - -if ENABLE_ASAN -liblxcfstest_la_CFLAGS += -fsanitize=address \ - -fno-omit-frame-pointer -endif - -if ENABLE_UBSAN -liblxcfstest_la_CFLAGS += -fsanitize=undefined -endif - -liblxcfstest_la_LDFLAGS = $(AM_CFLAGS) -module -avoid-version -shared - -noinst_HEADERS = api_extensions.h \ - bindings.h \ - cgroup_fuse.h \ - cgroups/cgroup.h \ - cgroups/cgroup2_devices.h \ - cgroups/cgroup_utils.h \ - cpuset_parse.h \ - lxcfs_fuse_compat.h \ - macro.h \ - memory_utils.h \ - proc_cpuview.h \ - proc_fuse.h \ - proc_loadavg.h \ - syscall_numbers.h \ - sysfs_fuse.h \ - utils.h - -sodir=$(libdir) -lxcfs_LTLIBRARIES = liblxcfs.la -EXTRA_LTLIBRARIES = liblxcfstest.la - -lxcfs_SOURCES = lxcfs.c -lxcfs_LDADD = -ldl -lxcfs_CFLAGS = $(AM_CFLAGS) -lxcfs_LDFLAGS = $(AM_LDFLAGS) -bin_PROGRAMS = lxcfs - -TEST_READ: tests/test-read.c - $(CC) -o tests/test-read \ - tests/test-read.c -TEST_CPUSET: tests/cpusetrange.c cpuset_parse.c - $(CC) -o tests/cpusetrange \ - tests/cpusetrange.c \ - cpuset_parse.c -TEST_SYSCALLS: tests/test_syscalls.c - $(CC) -o tests/test_syscalls \ - tests/test_syscalls.c -tests: TEST_READ TEST_CPUSET TEST_SYSCALLS diff --git a/src/bindings.c b/src/bindings.c index ccf52e2..dc4da14 100644 --- a/src/bindings.c +++ b/src/bindings.c @@ -6,22 +6,9 @@ #include "config.h" -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - -#define _FILE_OFFSET_BITS 64 - #include #include #include -#include #include #include #include @@ -46,8 +33,9 @@ #include #include -#include "api_extensions.h" #include "bindings.h" + +#include "api_extensions.h" #include "cgroup_fuse.h" #include "cgroups/cgroup.h" #include "cgroups/cgroup_utils.h" @@ -621,7 +609,7 @@ static bool is_on_ramfs(void) return false; } -static int pivot_enter() +static int pivot_enter(void) { __do_close int oldroot = -EBADF, newroot = -EBADF; @@ -664,7 +652,7 @@ static int pivot_enter() return 0; } -static int chroot_enter() +static int chroot_enter(void) { if (mount(ROOTDIR, "/", NULL, MS_REC | MS_BIND, NULL)) { lxcfs_error("Failed to recursively bind-mount %s into /.", ROOTDIR); @@ -911,8 +899,8 @@ static void __attribute__((constructor)) lxcfs_init(void) lxcfs_info("Kernel does not support swap accounting"); lxcfs_info("api_extensions:"); - for (i = 0; i < nr_api_extensions; i++) - lxcfs_info("- %s", api_extensions[i]); + for (size_t nr = 0; nr < nr_api_extensions; nr++) + lxcfs_info("- %s", api_extensions[nr]); root_fd = open("/", O_PATH | O_CLOEXEC); if (root_fd < 0) diff --git a/src/bindings.h b/src/bindings.h index 686df0c..4e03362 100644 --- a/src/bindings.h +++ b/src/bindings.h @@ -3,17 +3,8 @@ #ifndef __LXCFS_BINDINGS_H #define __LXCFS_BINDINGS_H -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" -#include #include #include #include @@ -23,8 +14,13 @@ #include #include +#if HAVE_FUSE3 +#include +#else +#include +#endif + #include "cgroup_fuse.h" -#include "config.h" #include "macro.h" #include "proc_cpuview.h" #include "proc_fuse.h" diff --git a/src/cgroup_fuse.c b/src/cgroup_fuse.c index 98ef236..cfdf770 100644 --- a/src/cgroup_fuse.c +++ b/src/cgroup_fuse.c @@ -6,23 +6,10 @@ #include "config.h" -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - -#define _FILE_OFFSET_BITS 64 - #define __STDC_FORMAT_MACROS #include #include #include -#include #include #include #include @@ -47,6 +34,8 @@ #include #include +#include "cgroup_fuse.h" + #include "bindings.h" #include "cgroups/cgroup.h" #include "cgroups/cgroup_utils.h" @@ -357,7 +346,7 @@ static struct cgfs_files *cgfs_get_key(const char *controller, * pid's namespace. * Returns the mapped id, or -1 on error. */ -static unsigned int convert_id_to_ns(FILE *idfile, unsigned int in_id) +static int convert_id_to_ns(FILE *idfile, unsigned int in_id) { unsigned int nsuid, // base id for a range in the idfile's namespace hostuid, // base id for a range in the caller's namespace @@ -406,12 +395,13 @@ static unsigned int convert_id_to_ns(FILE *idfile, unsigned int in_id) static bool is_privileged_over(pid_t pid, uid_t uid, uid_t victim, bool req_ns_root) { + FILE *f; char fpath[PROCLEN]; int ret; bool answer = false; uid_t nsuid; - if (victim == -1 || uid == -1) + if (victim == (uid_t)-1 || uid == (uid_t)-1) return false; /* @@ -425,7 +415,8 @@ static bool is_privileged_over(pid_t pid, uid_t uid, uid_t victim, bool req_ns_r ret = snprintf(fpath, PROCLEN, "/proc/%d/uid_map", pid); if (ret < 0 || ret >= PROCLEN) return false; - FILE *f = fopen(fpath, "re"); + + f = fopen(fpath, "re"); if (!f) return false; @@ -440,7 +431,7 @@ static bool is_privileged_over(pid_t pid, uid_t uid, uid_t victim, bool req_ns_r * will be sending requests where the vfs has converted */ nsuid = convert_id_to_ns(f, victim); - if (nsuid == -1) + if (nsuid == (uid_t)-1) goto out; answer = true; @@ -1218,7 +1209,7 @@ static void pid_to_ns_wrapper(int sock, pid_t tpid) char v; ret = snprintf(fnam, sizeof(fnam), "/proc/%d/ns/pid", tpid); - if (ret < 0 || ret >= sizeof(fnam)) + if (ret < 0 || (size_t)ret >= sizeof(fnam)) _exit(1); newnsfd = open(fnam, O_RDONLY); if (newnsfd < 0) @@ -1361,7 +1352,8 @@ __lxcfs_fuse_ops int cg_read(const char *path, char *buf, size_t size, struct file_info *f = INTTYPE_TO_PTR(fi->fh); struct cgfs_files *k = NULL; char *data = NULL; - int ret, s; + int ret; + size_t s; bool r; if (!liblxcfs_functional()) @@ -1414,7 +1406,7 @@ __lxcfs_fuse_ops int cg_read(const char *path, char *buf, size_t size, if (s > size) s = size; memcpy(buf, data, s); - if (s > 0 && s < size && data[s-1] != '\n') + if ((s > 0) && (s < size) && (data[s - 1] != '\n')) buf[s++] = '\n'; ret = s; @@ -1555,7 +1547,7 @@ static void pid_from_ns_wrapper(int sock, pid_t tpid) char v; ret = snprintf(fnam, sizeof(fnam), "/proc/%d/ns/pid", tpid); - if (ret < 0 || ret >= sizeof(fnam)) + if (ret < 0 || (size_t)ret >= sizeof(fnam)) _exit(1); newnsfd = open(fnam, O_RDONLY); if (newnsfd < 0) @@ -1647,7 +1639,7 @@ static bool hostuid_to_ns(uid_t uid, pid_t pid, uid_t *answer) *answer = convert_id_to_ns(f, uid); fclose(f); - if (*answer == -1) + if (*answer == (uid_t)-1) return false; return true; } @@ -1764,6 +1756,7 @@ static bool cgfs_set_value(const char *controller, const char *cgroup, __do_free char *path = NULL; int cfd; size_t len; + ssize_t ret; cfd = get_cgroup_fd_handle_named(controller); if (cfd < 0) @@ -1776,7 +1769,11 @@ static bool cgfs_set_value(const char *controller, const char *cgroup, return false; len = strlen(value); - return write_nointr(fd, value, len) == len; + ret = write_nointr(fd, value, len); + if (ret < 0) + return false; + + return (size_t)ret == len; } __lxcfs_fuse_ops int cg_write(const char *path, const char *buf, size_t size, @@ -1872,7 +1869,7 @@ static bool cgfs_iterate_cgroup(const char *controller, const char *cgroup, continue; ret = snprintf(pathname, sizeof(pathname), "%s/%s", path, dirent->d_name); - if (ret < 0 || ret >= sizeof(pathname)) { + if (ret < 0 || (size_t)ret >= sizeof(pathname)) { lxcfs_error("Pathname too long under %s\n", path); continue; } diff --git a/src/cgroup_fuse.h b/src/cgroup_fuse.h index 4f3d21d..494dac7 100644 --- a/src/cgroup_fuse.h +++ b/src/cgroup_fuse.h @@ -3,24 +3,20 @@ #ifndef __LXCFS_CGROUP_FUSE_H #define __LXCFS_CGROUP_FUSE_H -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" -#include #include #include #include #include #include -#include "config.h" +#if HAVE_FUSE3 +#include +#else +#include +#endif + #include "macro.h" __visible extern int cg_getattr(const char *path, struct stat *sb); diff --git a/src/cgroups/cgfsng.c b/src/cgroups/cgfsng.c index f80785f..eb951b4 100644 --- a/src/cgroups/cgfsng.c +++ b/src/cgroups/cgfsng.c @@ -16,19 +16,7 @@ #define _GNU_SOURCE #endif -#include "../config.h" - -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" #include #include diff --git a/src/cgroups/cgroup.c b/src/cgroups/cgroup.c index 26c87ae..7aec7ae 100644 --- a/src/cgroups/cgroup.c +++ b/src/cgroups/cgroup.c @@ -4,19 +4,7 @@ #define _GNU_SOURCE #endif -#include "../config.h" - -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" #include #include diff --git a/src/cgroups/cgroup2_devices.c b/src/cgroups/cgroup2_devices.c index c40b087..06d258f 100644 --- a/src/cgroups/cgroup2_devices.c +++ b/src/cgroups/cgroup2_devices.c @@ -6,19 +6,7 @@ #define _GNU_SOURCE #endif -#include "../config.h" - -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" #include #include diff --git a/src/cgroups/cgroup2_devices.h b/src/cgroups/cgroup2_devices.h index d5ba963..67a2da8 100644 --- a/src/cgroups/cgroup2_devices.h +++ b/src/cgroups/cgroup2_devices.h @@ -30,7 +30,7 @@ #include #endif -#include "syscall_numbers.h" +#include "../syscall_numbers.h" #if !HAVE_BPF diff --git a/src/cgroups/cgroup_utils.c b/src/cgroups/cgroup_utils.c index 5165a09..f4ae4cc 100644 --- a/src/cgroups/cgroup_utils.c +++ b/src/cgroups/cgroup_utils.c @@ -4,19 +4,7 @@ #define _GNU_SOURCE #endif -#include "../config.h" - -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" #include #include @@ -443,7 +431,7 @@ int safe_mount(const char *src, const char *dest, const char *fstype, return 0; } -#ifndef HAVE_STRLCPY +#if !HAVE_STRLCPY size_t strlcpy(char *dest, const char *src, size_t size) { size_t ret = strlen(src); @@ -458,7 +446,7 @@ size_t strlcpy(char *dest, const char *src, size_t size) } #endif -#ifndef HAVE_STRLCAT +#if !HAVE_STRLCAT size_t strlcat(char *d, const char *s, size_t n) { size_t l = strnlen(d, n); diff --git a/src/cgroups/cgroup_utils.h b/src/cgroups/cgroup_utils.h index d1f5639..8576e5e 100644 --- a/src/cgroups/cgroup_utils.h +++ b/src/cgroups/cgroup_utils.h @@ -70,11 +70,11 @@ extern bool dir_exists(const char *path); extern int safe_mount(const char *src, const char *dest, const char *fstype, unsigned long flags, const void *data, const char *rootfs); -#ifndef HAVE_STRLCPY +#if !HAVE_STRLCPY extern size_t strlcpy(char *, const char *, size_t); #endif -#ifndef HAVE_STRLCAT +#if !HAVE_STRLCAT extern size_t strlcat(char *d, const char *s, size_t n); #endif diff --git a/src/lxcfs.c b/src/lxcfs.c index 7861398..172140b 100644 --- a/src/lxcfs.c +++ b/src/lxcfs.c @@ -6,24 +6,11 @@ #include "config.h" -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - -#define _FILE_OFFSET_BITS 64 - #include #include #include #include #include -#include #include #include #include @@ -41,6 +28,12 @@ #include #include +#if HAVE_FUSE3 +#include +#else +#include +#endif + #include "bindings.h" #include "lxcfs_fuse_compat.h" #include "macro.h" @@ -152,7 +145,7 @@ static void do_reload(void) #else ret = snprintf(lxcfs_lib_path, sizeof(lxcfs_lib_path), "/usr/local/lib/lxcfs/liblxcfs.so"); #endif - if (ret < 0 || ret >= sizeof(lxcfs_lib_path)) + if (ret < 0 || (size_t)ret >= sizeof(lxcfs_lib_path)) log_exit("Failed to create path to open liblxcfs"); dlopen_handle = dlopen(lxcfs_lib_path, RTLD_LAZY); @@ -1078,7 +1071,7 @@ const struct fuse_operations lxcfs_ops = { #endif }; -static void usage() +static void usage(void) { lxcfs_info("Usage: lxcfs \n"); lxcfs_info("lxcfs is a FUSE-based proc, sys and cgroup virtualizing filesystem\n"); @@ -1123,7 +1116,7 @@ static int set_pidfile(char *pidfile) return log_error(-1, "Error truncating PID file '%s': %m", pidfile); ret = snprintf(buf, sizeof(buf), "%ld\n", (long)getpid()); - if (ret < 0 || ret >= sizeof(buf)) + if (ret < 0 || (size_t)ret >= sizeof(buf)) return log_error(-1, "Failed to convert pid to string %m"); if (write(fd, buf, ret) != ret) diff --git a/src/macro.h b/src/macro.h index 05eee65..a7fe05d 100644 --- a/src/macro.h +++ b/src/macro.h @@ -28,10 +28,10 @@ #define CGROUP2_SUPER_MAGIC 0x63677270 #endif -#define lxcfs_debug_stream(stream, format, ...) \ - do { \ - fprintf(stream, "%s: %d: %s: " format "\n", __FILE__, __LINE__, \ - __func__, ##__VA_ARGS__); \ +#define lxcfs_debug_stream(stream, format, ...) \ + do { \ + fprintf(stream, "%s: %d: %s: " format "\n", __FILE__, \ + __LINE__, __func__, ##__VA_ARGS__); \ } while (false) #define lxcfs_error(format, ...) lxcfs_debug_stream(stderr, format, ##__VA_ARGS__) @@ -39,7 +39,9 @@ #ifdef DEBUG #define lxcfs_debug(format, ...) lxcfs_error(format, ##__VA_ARGS__) #else -#define lxcfs_debug(format, ...) +#define lxcfs_debug(format, ...) \ + do { \ + } while (false) #endif /* DEBUG */ #ifdef VERBOSE diff --git a/src/proc_cpuview.c b/src/proc_cpuview.c index cbb0375..653e7eb 100644 --- a/src/proc_cpuview.c +++ b/src/proc_cpuview.c @@ -6,23 +6,10 @@ #include "config.h" -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - -#define _FILE_OFFSET_BITS 64 - #define __STDC_FORMAT_MACROS #include #include #include -#include #include #include #include @@ -47,6 +34,8 @@ #include #include +#include "proc_cpuview.h" + #include "bindings.h" #include "cgroup_fuse.h" #include "cpuset_parse.h" @@ -246,7 +235,7 @@ static struct cg_proc_stat *prune_proc_stat_list(struct cg_proc_stat *node) for (struct cg_proc_stat *prev = NULL; node; ) { if (!cgroup_supports("cpu", node->cg, "cpu.shares")) { - call_cleaner(free_proc_stat_node) struct cg_proc_stat *cur = node; + struct cg_proc_stat *cur = node; if (prev) prev->next = node->next; @@ -254,7 +243,9 @@ static struct cg_proc_stat *prune_proc_stat_list(struct cg_proc_stat *node) first = node->next; node = node->next; - lxcfs_debug("Removing stat node for %s\n", cur->cg); + lxcfs_debug("Removing stat node for %s\n", cur); + + free_proc_stat_node(cur); } else { if (!first) first = node; @@ -766,7 +757,7 @@ int cpuview_proc_stat(const char *cg, const char *cpuset, total_len = 0; goto out_pthread_mutex_unlock; } - if (l >= buf_size) { + if ((size_t)l >= buf_size) { lxcfs_error("Write to cache was truncated"); total_len = 0; goto out_pthread_mutex_unlock; @@ -797,7 +788,7 @@ int cpuview_proc_stat(const char *cg, const char *cpuset, total_len = 0; goto out_pthread_mutex_unlock; } - if (l >= buf_size) { + if ((size_t)l >= buf_size) { lxcfs_error("Write to cache was truncated"); total_len = 0; goto out_pthread_mutex_unlock; @@ -815,7 +806,7 @@ int cpuview_proc_stat(const char *cg, const char *cpuset, total_len = 0; goto out_pthread_mutex_unlock; } - if (l >= buf_size) { + if ((size_t)l >= buf_size) { lxcfs_error("Write to cache was truncated"); total_len = 0; goto out_pthread_mutex_unlock; @@ -833,7 +824,7 @@ int cpuview_proc_stat(const char *cg, const char *cpuset, total_len = 0; goto out_pthread_mutex_unlock; } - if (l >= buf_size) { + if ((size_t)l >= buf_size) { lxcfs_error("Write to cache was truncated"); total_len = 0; goto out_pthread_mutex_unlock; @@ -887,7 +878,7 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset, size_t cache_size = d->buflen; if (offset) { - int left; + size_t left; if (offset > d->size) return -EINVAL; @@ -950,7 +941,7 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset, l = snprintf(cache, cache_size, "processor : %d\n", curcpu); if (l < 0) return log_error(0, "Failed to write cache"); - if (l >= cache_size) + if ((size_t)l >= cache_size) return log_error(0, "Write to cache was truncated"); cache += l; cache_size -= l; @@ -975,7 +966,7 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset, l = snprintf(cache, cache_size, "processor %d:%s", curcpu, p); if (l < 0) return log_error(0, "Failed to write cache"); - if (l >= cache_size) + if ((size_t)l >= cache_size) return log_error(0, "Write to cache was truncated"); cache += l; @@ -988,7 +979,7 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset, l = snprintf(cache, cache_size, "%s", line); if (l < 0) return log_error(0, "Failed to write cache"); - if (l >= cache_size) + if ((size_t)l >= cache_size) return log_error(0, "Write to cache was truncated"); cache += l; @@ -1011,21 +1002,21 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset, cache_size = d->buflen; total_len = 0; l = snprintf(cache, cache_size, "vendor_id : IBM/S390\n"); - if (l < 0 || l >= cache_size) + if (l < 0 || (size_t)l >= cache_size) return 0; cache_size -= l; cache += l; total_len += l; l = snprintf(cache, cache_size, "# processors : %d\n", curcpu + 1); - if (l < 0 || l >= cache_size) + if (l < 0 || (size_t)l >= cache_size) return 0; cache_size -= l; cache += l; total_len += l; l = snprintf(cache, cache_size, "%s", origcache); - if (l < 0 || l >= cache_size) + if (l < 0 || (size_t)l >= cache_size) return 0; total_len += l; } diff --git a/src/proc_cpuview.h b/src/proc_cpuview.h index 6935d95..15511e9 100644 --- a/src/proc_cpuview.h +++ b/src/proc_cpuview.h @@ -3,22 +3,19 @@ #ifndef __LXCFS_PROC_CPUVIEW_FUSE_H #define __LXCFS_PROC_CPUVIEW_FUSE_H -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" #include #include #include #include -#include "config.h" +#if HAVE_FUSE3 +#include +#else +#include +#endif + #include "macro.h" struct cpuacct_usage { diff --git a/src/proc_fuse.c b/src/proc_fuse.c index bb7be96..8208a32 100644 --- a/src/proc_fuse.c +++ b/src/proc_fuse.c @@ -6,23 +6,10 @@ #include "config.h" -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - -#define _FILE_OFFSET_BITS 64 - #define __STDC_FORMAT_MACROS #include #include #include -#include #include #include #include @@ -47,6 +34,8 @@ #include #include +#include "proc_fuse.h" + #include "bindings.h" #include "cgroup_fuse.h" #include "cgroups/cgroup.h" @@ -340,7 +329,7 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, size_t linelen = 0; if (offset) { - int left; + size_t left; if (offset > d->size) return -EINVAL; @@ -437,7 +426,7 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, d->cached = 1; d->size = (int)total_len; - if (total_len > size) + if ((size_t)total_len > size) total_len = size; memcpy(buf, d->buf, total_len); @@ -511,7 +500,7 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, int ret; if (offset) { - int left; + size_t left; if (offset > d->size) return -EINVAL; @@ -642,7 +631,7 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, l = snprintf(cache, cache_size, "%s", lbuf); if (l < 0) return log_error(0, "Failed to write cache"); - if (l >= cache_size) + if ((size_t)l >= cache_size) return log_error(0, "Write to cache was truncated"); cache += l; @@ -659,7 +648,7 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, return total_len; } -#if RELOADTEST +#ifdef RELOADTEST static inline void iwashere(void) { mknod("/tmp/lxcfs-iwashere", S_IFREG, 0644); @@ -814,12 +803,12 @@ static int proc_uptime_read(char *buf, size_t size, off_t offset, ssize_t total_len = 0, ret = 0; double busytime, idletime, reaperage; -#if RELOADTEST +#ifdef RELOADTEST iwashere(); #endif if (offset) { - int left; + size_t left; if (offset > d->size) return -EINVAL; @@ -851,7 +840,7 @@ static int proc_uptime_read(char *buf, size_t size, off_t offset, d->cached = 1; d->size = total_len; - if (total_len > size) + if ((size_t)total_len > size) total_len = size; memcpy(buf, d->buf, total_len); @@ -884,7 +873,7 @@ static int proc_stat_read(char *buf, size_t size, off_t offset, int cg_cpu_usage_size = 0; if (offset) { - int left; + size_t left; if (offset > d->size) return -EINVAL; @@ -958,7 +947,7 @@ static int proc_stat_read(char *buf, size_t size, off_t offset, l = snprintf(cache, cache_size, "%s", line); if (l < 0) return log_error(0, "Failed to write cache"); - if (l >= cache_size) + if ((size_t)l >= cache_size) return log_error(0, "Write to cache was truncated"); cache += l; @@ -995,7 +984,7 @@ static int proc_stat_read(char *buf, size_t size, off_t offset, l = snprintf(cache, cache_size, "cpu%d%s", curcpu, c); if (l < 0) return log_error(0, "Failed to write cache"); - if (l >= cache_size) + if ((size_t)l >= cache_size) return log_error(0, "Write to cache was truncated"); cache += l; @@ -1027,7 +1016,7 @@ static int proc_stat_read(char *buf, size_t size, off_t offset, cg_cpu_usage[physcpu].system, new_idle); if (l < 0) return log_error(0, "Failed to write cache"); - if (l >= cache_size) + if ((size_t)l >= cache_size) return log_error(0, "Write to cache was truncated"); cache += l; @@ -1171,7 +1160,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, int ret; if (offset) { - int left; + size_t left; if (offset > d->size) return -EINVAL; @@ -1381,7 +1370,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, l = snprintf(cache, cache_size, "%s", printme); if (l < 0) return log_error(0, "Failed to write cache"); - if (l >= cache_size) + if ((size_t)l >= cache_size) return log_error(0, "Write to cache was truncated"); cache += l; @@ -1413,7 +1402,7 @@ static int proc_slabinfo_read(char *buf, size_t size, off_t offset, pid_t initpid; if (offset) { - int left; + size_t left; if (offset > d->size) return -EINVAL; @@ -1450,7 +1439,7 @@ static int proc_slabinfo_read(char *buf, size_t size, off_t offset, ssize_t l = snprintf(cache, cache_size, "%s", line); if (l < 0) return log_error(0, "Failed to write cache"); - if (l >= cache_size) + if ((size_t)l >= cache_size) return log_error(0, "Write to cache was truncated"); cache += l; diff --git a/src/proc_fuse.h b/src/proc_fuse.h index f696085..2c1f572 100644 --- a/src/proc_fuse.h +++ b/src/proc_fuse.h @@ -3,24 +3,20 @@ #ifndef __LXCFS_PROC_FUSE_H #define __LXCFS_PROC_FUSE_H -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif +#include "config.h" -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 +#if HAVE_FUSE3 +#include +#else +#include #endif -#define _FILE_OFFSET_BITS 64 - -#include #include #include #include #include #include -#include "config.h" #include "macro.h" __visible extern int proc_getattr(const char *path, struct stat *sb); diff --git a/src/proc_loadavg.c b/src/proc_loadavg.c index ca90b06..b70437a 100644 --- a/src/proc_loadavg.c +++ b/src/proc_loadavg.c @@ -6,23 +6,10 @@ #include "config.h" -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - -#define _FILE_OFFSET_BITS 64 - #define __STDC_FORMAT_MACROS #include #include #include -#include #include #include #include @@ -47,6 +34,8 @@ #include #include +#include "proc_loadavg.h" + #include "bindings.h" #include "cgroup_fuse.h" #include "cgroups/cgroup.h" @@ -185,7 +174,7 @@ int proc_loadavg_read(char *buf, size_t size, off_t offset, uint64_t a, b, c; if (offset) { - int left; + size_t left; if (offset > d->size) return -EINVAL; @@ -263,7 +252,7 @@ int proc_loadavg_read(char *buf, size_t size, off_t offset, d->size = (int)total_len; d->cached = 1; - if (total_len > size) + if ((size_t)total_len > size) total_len = size; memcpy(buf, d->buf, total_len); diff --git a/src/proc_loadavg.h b/src/proc_loadavg.h index 34b61ba..bb6a78b 100644 --- a/src/proc_loadavg.h +++ b/src/proc_loadavg.h @@ -3,24 +3,20 @@ #ifndef __LXCFS_PROC_LOADAVG_FUSE_H #define __LXCFS_PROC_LOADAVG_FUSE_H -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" -#include #include #include #include #include #include -#include "config.h" +#if HAVE_FUSE3 +#include +#else +#include +#endif + #include "macro.h" __visible extern pthread_t load_daemon(int load_use); diff --git a/src/sysfs_fuse.c b/src/sysfs_fuse.c index 4c74db7..4525b69 100644 --- a/src/sysfs_fuse.c +++ b/src/sysfs_fuse.c @@ -6,29 +6,16 @@ #include "config.h" -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - /* Taken over modified from the kernel sources. */ #define NBITS 32 /* bits in uint32_t */ #define DIV_ROUND_UP(n, d) (((n) + (d)-1) / (d)) #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, NBITS) -#define _FILE_OFFSET_BITS 64 - #define __STDC_FORMAT_MACROS #include #include #include #include -#include #include #include #include @@ -52,11 +39,12 @@ #include #include +#include "sysfs_fuse.h" + #include "bindings.h" #include "memory_utils.h" #include "cgroups/cgroup.h" #include "lxcfs_fuse_compat.h" -#include "sysfs_fuse.h" #include "utils.h" static ssize_t get_max_cpus(char *cpulist) @@ -159,7 +147,7 @@ static int sys_devices_system_cpu_online_read(char *buf, size_t size, ssize_t total_len = 0; if (offset) { - int left; + size_t left; if (!d->cached) return 0; @@ -209,7 +197,7 @@ static int sys_devices_system_cpu_online_read(char *buf, size_t size, d->size = (int)total_len; d->cached = 1; - if (total_len > size) + if ((size_t)total_len > size) total_len = size; memcpy(buf, d->buf, total_len); @@ -250,7 +238,7 @@ static int filler_sys_devices_system_cpu(const char *path, void *buf, if (!cpumask) return -errno; - for (size_t i = 0; i < max_cpus; i++) { + for (ssize_t i = 0; i < max_cpus; i++) { int ret; char cpu[100]; @@ -258,7 +246,7 @@ static int filler_sys_devices_system_cpu(const char *path, void *buf, continue; ret = snprintf(cpu, sizeof(cpu), "cpu%ld", i); - if (ret < 0 || ret >= sizeof(cpu)) + if (ret < 0 || (size_t)ret >= sizeof(cpu)) continue; if (DIR_FILLER(filler, buf, cpu, NULL, 0) != 0) @@ -543,14 +531,16 @@ __lxcfs_fuse_ops int sys_readdir(const char *path, void *buf, __lxcfs_fuse_ops int sys_readlink(const char *path, char *buf, size_t size) { - int ret = readlink(path, buf, size); + ssize_t ret; if (!liblxcfs_functional()) return -EIO; + ret = readlink(path, buf, size); if (ret < 0) return -errno; - if (ret > size) + + if ((size_t)ret > size) return -1; buf[ret] = '\0'; diff --git a/src/sysfs_fuse.h b/src/sysfs_fuse.h index 592e8ec..f151af7 100644 --- a/src/sysfs_fuse.h +++ b/src/sysfs_fuse.h @@ -3,24 +3,20 @@ #ifndef __LXCFS_SYSFS_FUSE_H #define __LXCFS_SYSFS_FUSE_H -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" -#include #include #include #include #include #include -#include "config.h" +#if HAVE_FUSE3 +#include +#else +#include +#endif + #include "macro.h" __visible extern int sys_getattr(const char *path, struct stat *sb); diff --git a/src/utils.c b/src/utils.c index 65629eb..9927185 100644 --- a/src/utils.c +++ b/src/utils.c @@ -6,22 +6,10 @@ #include "config.h" -#ifdef HAVE_FUSE3 -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 30 -#endif -#else -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif -#endif - #define _FILE_OFFSET_BITS 64 - #include #include #include -#include #include #include #include @@ -36,10 +24,11 @@ #include #include +#include "utils.h" + #include "bindings.h" #include "macro.h" #include "memory_utils.h" -#include "utils.h" /* * append the given formatted string to *src. @@ -331,10 +320,12 @@ int read_file_fuse(const char *path, char *buf, size_t size, struct file_info *d return 0; while (getline(&line, &linelen, f) != -1) { - ssize_t l = snprintf(cache, cache_size, "%s", line); + ssize_t l; + + l = snprintf(cache, cache_size, "%s", line); if (l < 0) return log_error(0, "Failed to write cache"); - if (l >= cache_size) + if ((size_t)l >= cache_size) return log_error(0, "Write to cache was truncated"); cache += l; @@ -349,7 +340,7 @@ int read_file_fuse(const char *path, char *buf, size_t size, struct file_info *d /* read from off 0 */ memcpy(buf, d->buf, total_len); - if (d->size > total_len) + if (d->size > (int)total_len) d->cached = d->size - total_len; return total_len; @@ -361,7 +352,7 @@ int read_file_fuse_with_offset(const char *path, char *buf, size_t size, if (offset) { ssize_t total_len = 0; char *cache = d->buf; - int left; + size_t left; if (offset > d->size) return -EINVAL; diff --git a/src/utils.h b/src/utils.h index c8f31e9..e19eba4 100644 --- a/src/utils.h +++ b/src/utils.h @@ -3,17 +3,8 @@ #ifndef __LXCFS_UTILS_H #define __LXCFS_UTILS_H -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" -#include #include #include #include @@ -22,7 +13,12 @@ #include #include -#include "config.h" +#if HAVE_FUSE3 +#include +#else +#include +#endif + #include "macro.h" #include "syscall_numbers.h" @@ -49,14 +45,14 @@ extern int read_file_fuse_with_offset(const char *path, char *buf, size_t size, extern void prune_init_slice(char *cg); extern int wait_for_pid(pid_t pid); -#ifndef HAVE_PIDFD_OPEN +#if !HAVE_PIDFD_OPEN static inline int pidfd_open(pid_t pid, unsigned int flags) { return syscall(__NR_pidfd_open, pid, flags); } #endif -#ifndef HAVE_PIDFD_SEND_SIGNAL +#if !HAVE_PIDFD_SEND_SIGNAL static inline int pidfd_send_signal(int pidfd, int sig, siginfo_t *info, unsigned int flags) { diff --git a/tests/Makefile.am b/tests/Makefile.am deleted file mode 100644 index 8572269..0000000 --- a/tests/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -EXTRA_DIST = \ - cpusetrange.c \ - main.sh \ - test_cgroup \ - test_confinement.sh \ - test_meminfo_hierarchy.sh \ - test_proc \ - test-read.c \ - test_read_proc.sh \ - test_readdir \ - test_reload.sh \ - test_sigusr2.sh \ - test_syscalls.c - -TEST_READ: test-read.c - $(CC) -o test-read test-read.c -TEST_CPUSET: cpusetrange.c - $(CC) -I../ -I../src/ -o cpusetrange cpusetrange.c ../src/cpuset_parse.c -TEST_SYSCALLS: test_syscalls.c - $(CC) -o test_syscalls test_syscalls.c - -tests: TEST_READ TEST_CPUSET TEST_SYSCALLS diff --git a/tests/cpusetrange.c b/tests/cpusetrange.c index 06bbe4e..38eea26 100644 --- a/tests/cpusetrange.c +++ b/tests/cpusetrange.c @@ -4,11 +4,7 @@ #define _GNU_SOURCE #endif -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" #include #include @@ -26,7 +22,7 @@ static void verify(bool condition) { } } -int main() { +int main(void) { char *a = "1,2"; char *b = "1-3,5"; char *c = "1,4-5"; diff --git a/tests/main.sh b/tests/main.sh deleted file mode 100755 index 1231a0a..0000000 --- a/tests/main.sh +++ /dev/null @@ -1,107 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: LGPL-2.1+ - -set -eu -[ -n "${DEBUG:-}" ] && set -x - -[ $(id -u) -eq 0 ] - -# Run lxcfs testsuite -export LXCFSDIR=$(mktemp -d) -pidfile=$(mktemp) -export LXCFSPID=-1 - -cmdline=$(realpath $0) -dirname=$(dirname ${cmdline}) -topdir=$(dirname ${dirname}) - -FAILED=1 -UNSHARE=1 -cleanup() { - echo "=> Cleaning up" - set +e - if [ $LXCFSPID -ne -1 ]; then - kill -9 $LXCFSPID - fi - if [ ${LXCFSDIR} != "/var/lib/lxcfs" ]; then - umount -l ${LXCFSDIR} - rmdir ${LXCFSDIR} - fi - rm -f ${pidfile} - if [ ${FAILED} -eq 1 ]; then - echo "=> FAILED at $TESTCASE" - exit 1 - fi - echo "=> PASSED" - exit 0 -} - -TESTCASE="setup" -lxcfs=${topdir}/src/lxcfs - -if [ -x ${lxcfs} ]; then - if [ -n "${LD_LIBRARY_PATH:-}" ]; then - export LD_LIBRARY_PATH="${topdir}/src/.libs/:${LD_LIBRARY_PATH}" - else - export LD_LIBRARY_PATH="${topdir}/src/.libs/" - fi - echo "=> Spawning ${lxcfs} ${LXCFSDIR}" - ${lxcfs} -p ${pidfile} ${LXCFSDIR} & - LXCFSPID=$! -else - UNSHARE=0 - LXCFSPID=$(cat "/run/lxcfs.pid") - echo "=> Re-using host lxcfs" - rmdir $LXCFSDIR - export LXCFSDIR=/var/lib/lxcfs -fi - -trap cleanup EXIT HUP INT TERM - -count=1 -while ! mountpoint -q $LXCFSDIR; do - sleep 1s - if [ $count -gt 5 ]; then - echo "lxcfs failed to start" - false - fi - count=$((count+1)) -done - -RUNTEST() { - echo "" - echo "=> Running ${TESTCASE}" - - if [ "${UNSHARE:-1}" != "0" ]; then - unshare -fmp --mount-proc $* - else - $* - fi -} - -TESTCASE="Stress readdir" -RUNTEST ${dirname}/test_readdir -TESTCASE="test_proc" -RUNTEST ${dirname}/test_proc -TESTCASE="test_cgroup" -RUNTEST ${dirname}/test_cgroup -TESTCASE="test_read_proc.sh" -RUNTEST ${dirname}/test_read_proc.sh -TESTCASE="cpusetrange" -RUNTEST ${dirname}/cpusetrange -TESTCASE="meminfo hierarchy" -RUNTEST ${dirname}/test_meminfo_hierarchy.sh -TESTCASE="liblxcfs reloading" -UNSHARE=0 RUNTEST ${dirname}/test_reload.sh -TESTCASE="SIGUSR2 virtualization mode switching" -echo "==> Switching to non-virtualization mode" -kill -USR2 $LXCFSPID -RUNTEST ${dirname}/test_sigusr2.sh -echo "==> Switching to virtualization mode" -kill -USR2 $LXCFSPID - -# Check for any defunct processes - children we didn't reap -n=`ps -ef | grep lxcfs | grep defunct | wc -l` -[ $n = 0 ] - -FAILED=0 diff --git a/tests/main.sh.in b/tests/main.sh.in new file mode 100755 index 0000000..261fc99 --- /dev/null +++ b/tests/main.sh.in @@ -0,0 +1,106 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1+ + +set -eu +[ -n "${DEBUG:-}" ] && set -x + +[ $(id -u) -eq 0 ] + +# Run lxcfs testsuite +export LXCFSDIR=$(mktemp -d) +pidfile=$(mktemp) +export LXCFSPID=-1 + +cmdline=$(realpath $0) +dirname=$(dirname ${cmdline}) + +FAILED=1 +UNSHARE=1 +cleanup() { + echo "=> Cleaning up" + set +e + if [ $LXCFSPID -ne -1 ]; then + kill -9 $LXCFSPID + fi + if [ ${LXCFSDIR} != "/var/lib/lxcfs" ]; then + umount -l ${LXCFSDIR} + rmdir ${LXCFSDIR} + fi + rm -f ${pidfile} + if [ ${FAILED} -eq 1 ]; then + echo "=> FAILED at $TESTCASE" + exit 1 + fi + echo "=> PASSED" + exit 0 +} + +TESTCASE="setup" +lxcfs="@LXCFS_BUILD_ROOT@/lxcfs" + +if [ -x ${lxcfs} ]; then + if [ -n "${LD_LIBRARY_PATH:-}" ]; then + export LD_LIBRARY_PATH="@LXCFS_BUILD_ROOT@:${LD_LIBRARY_PATH}" + else + export LD_LIBRARY_PATH="@LXCFS_BUILD_ROOT@" + fi + echo "=> Spawning ${lxcfs} ${LXCFSDIR}" + ${lxcfs} -p ${pidfile} ${LXCFSDIR} & + LXCFSPID=$! +else + UNSHARE=0 + LXCFSPID=$(cat "@RUNTIME_PATH@/lxcfs.pid") + echo "=> Re-using host lxcfs" + rmdir $LXCFSDIR + export LXCFSDIR=/var/lib/lxcfs +fi + +trap cleanup EXIT HUP INT TERM + +count=1 +while ! mountpoint -q $LXCFSDIR; do + sleep 1s + if [ $count -gt 5 ]; then + echo "lxcfs failed to start" + false + fi + count=$((count+1)) +done + +RUNTEST() { + echo "" + echo "=> Running ${TESTCASE}" + + if [ "${UNSHARE:-1}" != "0" ]; then + unshare -fmp --mount-proc $* + else + $* + fi +} + +TESTCASE="Stress readdir" +RUNTEST ${dirname}/test_readdir +TESTCASE="test_proc" +RUNTEST ${dirname}/test_proc +TESTCASE="test_cgroup" +RUNTEST ${dirname}/test_cgroup +TESTCASE="test_read_proc.sh" +RUNTEST ${dirname}/test_read_proc.sh +TESTCASE="cpusetrange" +RUNTEST ${dirname}/test-cpusetrange +TESTCASE="meminfo hierarchy" +RUNTEST ${dirname}/test_meminfo_hierarchy.sh +TESTCASE="liblxcfs reloading" +UNSHARE=0 RUNTEST ${dirname}/test_reload.sh +TESTCASE="SIGUSR2 virtualization mode switching" +echo "==> Switching to non-virtualization mode" +kill -USR2 $LXCFSPID +RUNTEST ${dirname}/test_sigusr2.sh +echo "==> Switching to virtualization mode" +kill -USR2 $LXCFSPID + +# Check for any defunct processes - children we didn't reap +n=`ps -ef | grep lxcfs | grep defunct | wc -l` +[ $n = 0 ] + +FAILED=0 diff --git a/tests/meson.build b/tests/meson.build new file mode 100644 index 0000000..eafcd1f --- /dev/null +++ b/tests/meson.build @@ -0,0 +1,73 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +test_main = configure_file( + input : 'main.sh.in', + output : 'main.sh', + configuration : conf) + +test_main = configure_file( + input : 'test_cgroup.in', + output : 'test_cgroup', + configuration : conf) + +test_main = configure_file( + input : 'test_confinement.sh.in', + output : 'test_confinement.sh', + configuration : conf) + +test_main = configure_file( + input : 'test_meminfo_hierarchy.sh.in', + output : 'test_meminfo_hierarchy.sh', + configuration : conf) + +test_main = configure_file( + input : 'test_proc.in', + output : 'test_proc', + configuration : conf) + +test_main = configure_file( + input : 'test_read_proc.sh.in', + output : 'test_read_proc.sh', + configuration : conf) + +test_main = configure_file( + input : 'test_readdir.in', + output : 'test_readdir', + configuration : conf) + +test_main = configure_file( + input : 'test_reload.sh.in', + output : 'test_reload.sh', + configuration : conf) + +test_main = configure_file( + input : 'test_sigusr2.sh.in', + output : 'test_sigusr2.sh', + configuration : conf) + +test_read = executable( + 'test-read', + 'test-read.c', + include_directories: config_include, + install: false, + build_by_default : want_tests != false) + +test_syscalls = executable( + 'test-syscalls', + 'test_syscalls.c', + include_directories: config_include, + install: false, + build_by_default : want_tests != false) + +test_cpusetrange_sources = files( + 'cpusetrange.c', + '../src/cpuset_parse.c', + '../src/cpuset_parse.h') + +test_cpusetrange = executable( + 'test-cpusetrange', + test_cpusetrange_sources, + include_directories: config_include, + install: false, + build_by_default : want_tests != false) + diff --git a/tests/test-read.c b/tests/test-read.c index 5be9e43..9166dde 100644 --- a/tests/test-read.c +++ b/tests/test-read.c @@ -4,11 +4,7 @@ #define _GNU_SOURCE #endif -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" #include #include diff --git a/tests/test_cgroup b/tests/test_cgroup deleted file mode 100755 index 17eba9f..0000000 --- a/tests/test_cgroup +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: LGPL-2.1+ - -set -eu -[ -n "${DEBUG:-}" ] && set -x - -PASS=0 -UUID=$(uuidgen) - -cleanup() { - [ "$PASS" = "1" ] || (echo FAIL && exit 1) -} - -LXCFSDIR=${LXCFSDIR:-/var/lib/lxcfs} - -trap cleanup EXIT HUP INT TERM - -if ! mountpoint -q ${LXCFSDIR}; then - echo "lxcfs isn't mounted on ${LXCFSDIR}" - exit 1 -fi - -echo "==> Setting up memory, freeze and cpuset cgroups" -for c in memory freezer cpuset; do - [ ! -d /sys/fs/cgroup/${c} ] && exit 0 -done - -initcpuset=`awk -F: '/cpuset/ { print $3 }' /proc/1/cgroup` -initmemory=`awk -F: '/memory/ { print $3 }' /proc/1/cgroup` -initfreezer=`awk -F: '/freezer/ { print $3 }' /proc/1/cgroup` - -cpupath=/sys/fs/cgroup/cpuset/${initcpuset} -mempath=/sys/fs/cgroup/memory/${initmemory} -frzpath=/sys/fs/cgroup/freezer/${initfreezer} - -rmdir ${cpupath}/${UUID} 2>/dev/null || true -rmdir ${mempath}/${UUID} 2>/dev/null || true -rmdir ${frzpath}/${UUID} 2>/dev/null || true -mkdir ${cpupath}/${UUID} -mkdir ${mempath}/${UUID} -mkdir ${frzpath}/${UUID} - -# Check that the fs is readable -for p in ${mempath} ${frzpath} ${cpupath}; do - echo "==> Test that ${p} is readable" - find ${p} > /dev/null - echo 1 > ${p}/${UUID}/tasks -done - -echo "==> Testing memory.limit_in_bytes" -echo $((64*1024*1024)) > ${LXCFSDIR}/cgroup/memory/${initmemory}/${UUID}/memory.limit_in_bytes -v=`cat $mempath/${UUID}/memory.limit_in_bytes` -[ "$v" = "$((64*1024*1024))" ] - -echo "==> Testing cpuset.cpus" -echo 0 > ${LXCFSDIR}/cgroup/cpuset/${initcpuset}/${UUID}/cpuset.cpus -v=`cat ${cpupath}/${UUID}/cpuset.cpus` -[ "$v" = "0" ] - -PASS=1 diff --git a/tests/test_cgroup.in b/tests/test_cgroup.in new file mode 100755 index 0000000..17eba9f --- /dev/null +++ b/tests/test_cgroup.in @@ -0,0 +1,60 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1+ + +set -eu +[ -n "${DEBUG:-}" ] && set -x + +PASS=0 +UUID=$(uuidgen) + +cleanup() { + [ "$PASS" = "1" ] || (echo FAIL && exit 1) +} + +LXCFSDIR=${LXCFSDIR:-/var/lib/lxcfs} + +trap cleanup EXIT HUP INT TERM + +if ! mountpoint -q ${LXCFSDIR}; then + echo "lxcfs isn't mounted on ${LXCFSDIR}" + exit 1 +fi + +echo "==> Setting up memory, freeze and cpuset cgroups" +for c in memory freezer cpuset; do + [ ! -d /sys/fs/cgroup/${c} ] && exit 0 +done + +initcpuset=`awk -F: '/cpuset/ { print $3 }' /proc/1/cgroup` +initmemory=`awk -F: '/memory/ { print $3 }' /proc/1/cgroup` +initfreezer=`awk -F: '/freezer/ { print $3 }' /proc/1/cgroup` + +cpupath=/sys/fs/cgroup/cpuset/${initcpuset} +mempath=/sys/fs/cgroup/memory/${initmemory} +frzpath=/sys/fs/cgroup/freezer/${initfreezer} + +rmdir ${cpupath}/${UUID} 2>/dev/null || true +rmdir ${mempath}/${UUID} 2>/dev/null || true +rmdir ${frzpath}/${UUID} 2>/dev/null || true +mkdir ${cpupath}/${UUID} +mkdir ${mempath}/${UUID} +mkdir ${frzpath}/${UUID} + +# Check that the fs is readable +for p in ${mempath} ${frzpath} ${cpupath}; do + echo "==> Test that ${p} is readable" + find ${p} > /dev/null + echo 1 > ${p}/${UUID}/tasks +done + +echo "==> Testing memory.limit_in_bytes" +echo $((64*1024*1024)) > ${LXCFSDIR}/cgroup/memory/${initmemory}/${UUID}/memory.limit_in_bytes +v=`cat $mempath/${UUID}/memory.limit_in_bytes` +[ "$v" = "$((64*1024*1024))" ] + +echo "==> Testing cpuset.cpus" +echo 0 > ${LXCFSDIR}/cgroup/cpuset/${initcpuset}/${UUID}/cpuset.cpus +v=`cat ${cpupath}/${UUID}/cpuset.cpus` +[ "$v" = "0" ] + +PASS=1 diff --git a/tests/test_confinement.sh b/tests/test_confinement.sh deleted file mode 100755 index 4fb49ea..0000000 --- a/tests/test_confinement.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: LGPL-2.1+ - -set -ex - -UUID=$(uuidgen) - -[ $(id -u) -eq 0 ] - -d=$(mktemp -t -d tmp.XXX) -d2=$(mktemp -t -d tmp.XXX) - -pid=-1 -cleanup() { - [ $pid -ne -1 ] && kill -9 $pid - umount -l $d || true - umount -l $d2 || true - rm -rf $d $d2 -} - -cmdline=$(realpath $0) -dirname=$(dirname ${cmdline}) -topdir=$(dirname ${dirname}) - -trap cleanup EXIT HUP INT TERM - -${topdir}/lxcfs $d & -pid=$! - -# put ourselves into x1 -cgm movepidabs freezer / 1 -cgm create freezer x1 -cgm movepid freezer x1 1 - -mount -t cgroup -o freezer freezer $d2 -sudo rmdir $d2/${UUID}_a1/${UUID}_a2 || true -sudo rmdir $d2/${UUID}_a1 || true - -echo "Making sure root cannot mkdir" -bad=0 -mkdir $d/cgroup/freezer/${UUID}_a1 && bad=1 -if [ "${bad}" -eq 1 ]; then - false -fi - -echo "Making sure root cannot rmdir" -mkdir $d2/${UUID}_a1 -mkdir $d2/${UUID}_a1/${UUID}_a2 -rmdir $d/cgroup/freezer/${UUID}_a1 && bad=1 -if [ "${bad}" -eq 1 ]; then - false -fi -[ -d $d2/${UUID}_a1 ] -rmdir $d/cgroup/freezer/${UUID}_a1/${UUID}_a2 && bad=1 -if [ "${bad}" -eq 1 ]; then - false -fi -[ -d $d2/${UUID}_a1/${UUID}_a2 ] - -echo "Making sure root cannot read/write" -sleep 200 & -p=$! -echo $p > $d/cgroup/freezer/${UUID}_a1/tasks && bad=1 -if [ "${bad}" -eq 1 ]; then - false -fi -cat $d/cgroup/freezer/${UUID}_a1/tasks && bad=1 -if [ "${bad}" -eq 1 ]; then - false -fi -echo $p > $d/cgroup/freezer/${UUID}_a1/${UUID}_a2/tasks && bad=1 -if [ "${bad}" -eq 1 ]; then - false -fi -cat $d/cgroup/freezer/${UUID}_a1/${UUID}_a2/tasks && bad=1 -if [ "${bad}" -eq 1 ]; then - false -fi - -# make sure things like truncate and access don't leak info about -# the /${UUID}_a1 cgroup which we shouldn't be able to reach -echo "Testing other system calls" -${dirname}/test_syscalls $d/cgroup/freezer/${UUID}_a1 -${dirname}/test_syscalls $d/cgroup/freezer/${UUID}_a1/${UUID}_a2 - -echo "Making sure root can act on descendents" -mycg=$(cgm getpidcgroupabs freezer 1) -newcg=${mycg}/${UUID}_a1 -rmdir $d2/$newcg || true # cleanup previosu run -mkdir $d/cgroup/freezer/$newcg -echo $p > $d/cgroup/freezer/$newcg/tasks -cat $d/cgroup/freezer/$newcg/tasks -kill -9 $p -while [ `wc -l $d/cgroup/freezer/$newcg/tasks | awk '{ print $1 }'` -ne 0 ]; do - sleep 1 -done -rmdir $d/cgroup/freezer/$newcg - -echo "All tests passed!" diff --git a/tests/test_confinement.sh.in b/tests/test_confinement.sh.in new file mode 100755 index 0000000..345ae12 --- /dev/null +++ b/tests/test_confinement.sh.in @@ -0,0 +1,98 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1+ + +set -ex + +UUID=$(uuidgen) + +[ $(id -u) -eq 0 ] + +d=$(mktemp -t -d tmp.XXX) +d2=$(mktemp -t -d tmp.XXX) + +pid=-1 +cleanup() { + [ $pid -ne -1 ] && kill -9 $pid + umount -l $d || true + umount -l $d2 || true + rm -rf $d $d2 +} + +cmdline=$(realpath $0) +dirname=$(dirname ${cmdline}) + +trap cleanup EXIT HUP INT TERM + +lxcfs="@LXCFS_BUILD_ROOT@/lxcfs" $d & +pid=$! + +# put ourselves into x1 +cgm movepidabs freezer / 1 +cgm create freezer x1 +cgm movepid freezer x1 1 + +mount -t cgroup -o freezer freezer $d2 +sudo rmdir $d2/${UUID}_a1/${UUID}_a2 || true +sudo rmdir $d2/${UUID}_a1 || true + +echo "Making sure root cannot mkdir" +bad=0 +mkdir $d/cgroup/freezer/${UUID}_a1 && bad=1 +if [ "${bad}" -eq 1 ]; then + false +fi + +echo "Making sure root cannot rmdir" +mkdir $d2/${UUID}_a1 +mkdir $d2/${UUID}_a1/${UUID}_a2 +rmdir $d/cgroup/freezer/${UUID}_a1 && bad=1 +if [ "${bad}" -eq 1 ]; then + false +fi +[ -d $d2/${UUID}_a1 ] +rmdir $d/cgroup/freezer/${UUID}_a1/${UUID}_a2 && bad=1 +if [ "${bad}" -eq 1 ]; then + false +fi +[ -d $d2/${UUID}_a1/${UUID}_a2 ] + +echo "Making sure root cannot read/write" +sleep 200 & +p=$! +echo $p > $d/cgroup/freezer/${UUID}_a1/tasks && bad=1 +if [ "${bad}" -eq 1 ]; then + false +fi +cat $d/cgroup/freezer/${UUID}_a1/tasks && bad=1 +if [ "${bad}" -eq 1 ]; then + false +fi +echo $p > $d/cgroup/freezer/${UUID}_a1/${UUID}_a2/tasks && bad=1 +if [ "${bad}" -eq 1 ]; then + false +fi +cat $d/cgroup/freezer/${UUID}_a1/${UUID}_a2/tasks && bad=1 +if [ "${bad}" -eq 1 ]; then + false +fi + +# make sure things like truncate and access don't leak info about +# the /${UUID}_a1 cgroup which we shouldn't be able to reach +echo "Testing other system calls" +${dirname}/test-syscalls $d/cgroup/freezer/${UUID}_a1 +${dirname}/test-syscalls $d/cgroup/freezer/${UUID}_a1/${UUID}_a2 + +echo "Making sure root can act on descendents" +mycg=$(cgm getpidcgroupabs freezer 1) +newcg=${mycg}/${UUID}_a1 +rmdir $d2/$newcg || true # cleanup previosu run +mkdir $d/cgroup/freezer/$newcg +echo $p > $d/cgroup/freezer/$newcg/tasks +cat $d/cgroup/freezer/$newcg/tasks +kill -9 $p +while [ `wc -l $d/cgroup/freezer/$newcg/tasks | awk '{ print $1 }'` -ne 0 ]; do + sleep 1 +done +rmdir $d/cgroup/freezer/$newcg + +echo "All tests passed!" diff --git a/tests/test_meminfo_hierarchy.sh b/tests/test_meminfo_hierarchy.sh deleted file mode 100755 index de3b672..0000000 --- a/tests/test_meminfo_hierarchy.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: LGPL-2.1+ - -set -eu -[ -n "${DEBUG:-}" ] && set -x - -LXCFSDIR=${LXCFSDIR:-/var/lib/lxcfs} - -cg1=$(uuidgen).$$ -cg2=$(uuidgen).$$ - -cleanup() { - if [ $FAILED -eq 1 ]; then - exit 1 - fi - exit 0 -} - -FAILED=1 -trap cleanup EXIT HUP INT TERM - -[ ! -d /sys/fs/cgroup/memory ] && exit 0 -echo "==> Setting up memory cgroup" -initmemory=`awk -F: '/memory/ { print $3 }' /proc/1/cgroup` -mempath=/sys/fs/cgroup/memory/${initmemory} -rmdir ${mempath}/${cg1} 2>/dev/null || true -rmdir ${mempath}/${cg2} 2>/dev/null || true - -echo "==> Testing /proc/meminfo with limit" -mkdir ${mempath}/${cg1} -echo 500000000 > ${mempath}/${cg1}/memory.limit_in_bytes -echo 1 > ${mempath}/${cg1}/tasks -m1=`awk '/^MemTotal:/ { print $2 }' ${LXCFSDIR}/proc/meminfo` - -echo "==> Testing /proc/meminfo with sub-cgroup" -mkdir ${mempath}/${cg1}/${cg2} -echo 1 > ${mempath}/${cg1}/${cg2}/tasks -m2=`awk '/^MemTotal:/ { print $2 }' ${LXCFSDIR}/proc/meminfo` - -echo "==> Confirming same limits" -[ $m1 -eq $m2 ] - -FAILED=0 diff --git a/tests/test_meminfo_hierarchy.sh.in b/tests/test_meminfo_hierarchy.sh.in new file mode 100755 index 0000000..de3b672 --- /dev/null +++ b/tests/test_meminfo_hierarchy.sh.in @@ -0,0 +1,43 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1+ + +set -eu +[ -n "${DEBUG:-}" ] && set -x + +LXCFSDIR=${LXCFSDIR:-/var/lib/lxcfs} + +cg1=$(uuidgen).$$ +cg2=$(uuidgen).$$ + +cleanup() { + if [ $FAILED -eq 1 ]; then + exit 1 + fi + exit 0 +} + +FAILED=1 +trap cleanup EXIT HUP INT TERM + +[ ! -d /sys/fs/cgroup/memory ] && exit 0 +echo "==> Setting up memory cgroup" +initmemory=`awk -F: '/memory/ { print $3 }' /proc/1/cgroup` +mempath=/sys/fs/cgroup/memory/${initmemory} +rmdir ${mempath}/${cg1} 2>/dev/null || true +rmdir ${mempath}/${cg2} 2>/dev/null || true + +echo "==> Testing /proc/meminfo with limit" +mkdir ${mempath}/${cg1} +echo 500000000 > ${mempath}/${cg1}/memory.limit_in_bytes +echo 1 > ${mempath}/${cg1}/tasks +m1=`awk '/^MemTotal:/ { print $2 }' ${LXCFSDIR}/proc/meminfo` + +echo "==> Testing /proc/meminfo with sub-cgroup" +mkdir ${mempath}/${cg1}/${cg2} +echo 1 > ${mempath}/${cg1}/${cg2}/tasks +m2=`awk '/^MemTotal:/ { print $2 }' ${LXCFSDIR}/proc/meminfo` + +echo "==> Confirming same limits" +[ $m1 -eq $m2 ] + +FAILED=0 diff --git a/tests/test_proc b/tests/test_proc deleted file mode 100755 index 9e16878..0000000 --- a/tests/test_proc +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: LGPL-2.1+ - -set -eu -[ -n "${DEBUG:-}" ] && set -x - -PASS=0 - -cleanup() { - [ "$PASS" = "1" ] || (echo FAIL && exit 1) -} - -trap cleanup EXIT HUP INT TERM - -LXCFSDIR=${LXCFSDIR:-/var/lib/lxcfs} - -if ! mountpoint -q ${LXCFSDIR}; then - echo "lxcfs isn't mounted on ${LXCFSDIR}" - exit 1 -fi - -echo "==> Setting up memory/cpuset cgroup in lxcfs_test_proc" -[ ! -d /sys/fs/cgroup/memory ] && exit 0 -[ ! -d /sys/fs/cgroup/cpuset ] && exit 0 - -initcpuset=`awk -F: '/cpuset/ { print $3 }' /proc/1/cgroup` -initmemory=`awk -F: '/memory/ { print $3 }' /proc/1/cgroup` - -cpupath=/sys/fs/cgroup/cpuset/${initcpuset} -mempath=/sys/fs/cgroup/memory/${initmemory} - -rmdir ${cpupath}/lxcfs_test_proc 2>/dev/null || true -rmdir ${mempath}/lxcfs_test_proc 2>/dev/null || true -mkdir ${cpupath}/lxcfs_test_proc -mkdir ${mempath}/lxcfs_test_proc - -echo 1 > ${cpupath}/lxcfs_test_proc/tasks -echo 1 > ${mempath}/lxcfs_test_proc/tasks - -echo $((64*1024*1024)) > ${mempath}/lxcfs_test_proc/memory.limit_in_bytes -echo 0 > ${cpupath}/lxcfs_test_proc/cpuset.cpus - -# Test uptime -echo "==> Testing /proc/uptime" -grep -Eq "^0.[0-9]{2} 0.[0-9]{2}$" ${LXCFSDIR}/proc/uptime - -# Test cpuinfo -echo "==> Testing /proc/cpuinfo" -[ "$(grep "^processor" ${LXCFSDIR}/proc/cpuinfo | wc -l)" = "1" ] -grep -q "^processor.*0$" ${LXCFSDIR}/proc/cpuinfo || grep -q "^processor 0:.*" ${LXCFSDIR}/proc/cpuinfo - -echo "==> Testing /sys/devices/system/cpu/online" -[ "$(cat ${LXCFSDIR}/sys/devices/system/cpu/online)" = "$(cat ${cpupath}/lxcfs_test_proc/cpuset.cpus)" ] - -# Test stat -echo "==> Testing /proc/stat" -[ "$(grep "^cpu" ${LXCFSDIR}/proc/stat | wc -l)" = "2" ] - -# Test meminfo -echo "==> Testing /proc/meminfo" -grep -q "^MemTotal.*65536 kB$" ${LXCFSDIR}/proc/meminfo - -PASS=1 diff --git a/tests/test_proc.in b/tests/test_proc.in new file mode 100755 index 0000000..9e16878 --- /dev/null +++ b/tests/test_proc.in @@ -0,0 +1,63 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1+ + +set -eu +[ -n "${DEBUG:-}" ] && set -x + +PASS=0 + +cleanup() { + [ "$PASS" = "1" ] || (echo FAIL && exit 1) +} + +trap cleanup EXIT HUP INT TERM + +LXCFSDIR=${LXCFSDIR:-/var/lib/lxcfs} + +if ! mountpoint -q ${LXCFSDIR}; then + echo "lxcfs isn't mounted on ${LXCFSDIR}" + exit 1 +fi + +echo "==> Setting up memory/cpuset cgroup in lxcfs_test_proc" +[ ! -d /sys/fs/cgroup/memory ] && exit 0 +[ ! -d /sys/fs/cgroup/cpuset ] && exit 0 + +initcpuset=`awk -F: '/cpuset/ { print $3 }' /proc/1/cgroup` +initmemory=`awk -F: '/memory/ { print $3 }' /proc/1/cgroup` + +cpupath=/sys/fs/cgroup/cpuset/${initcpuset} +mempath=/sys/fs/cgroup/memory/${initmemory} + +rmdir ${cpupath}/lxcfs_test_proc 2>/dev/null || true +rmdir ${mempath}/lxcfs_test_proc 2>/dev/null || true +mkdir ${cpupath}/lxcfs_test_proc +mkdir ${mempath}/lxcfs_test_proc + +echo 1 > ${cpupath}/lxcfs_test_proc/tasks +echo 1 > ${mempath}/lxcfs_test_proc/tasks + +echo $((64*1024*1024)) > ${mempath}/lxcfs_test_proc/memory.limit_in_bytes +echo 0 > ${cpupath}/lxcfs_test_proc/cpuset.cpus + +# Test uptime +echo "==> Testing /proc/uptime" +grep -Eq "^0.[0-9]{2} 0.[0-9]{2}$" ${LXCFSDIR}/proc/uptime + +# Test cpuinfo +echo "==> Testing /proc/cpuinfo" +[ "$(grep "^processor" ${LXCFSDIR}/proc/cpuinfo | wc -l)" = "1" ] +grep -q "^processor.*0$" ${LXCFSDIR}/proc/cpuinfo || grep -q "^processor 0:.*" ${LXCFSDIR}/proc/cpuinfo + +echo "==> Testing /sys/devices/system/cpu/online" +[ "$(cat ${LXCFSDIR}/sys/devices/system/cpu/online)" = "$(cat ${cpupath}/lxcfs_test_proc/cpuset.cpus)" ] + +# Test stat +echo "==> Testing /proc/stat" +[ "$(grep "^cpu" ${LXCFSDIR}/proc/stat | wc -l)" = "2" ] + +# Test meminfo +echo "==> Testing /proc/meminfo" +grep -q "^MemTotal.*65536 kB$" ${LXCFSDIR}/proc/meminfo + +PASS=1 diff --git a/tests/test_read_proc.sh b/tests/test_read_proc.sh deleted file mode 100755 index 697d772..0000000 --- a/tests/test_read_proc.sh +++ /dev/null @@ -1,23 +0,0 @@ -#/bin/sh -# SPDX-License-Identifier: LGPL-2.1+ - -set -eu -[ -n "${DEBUG:-}" ] && set -x - -DIR=${LXCFSDIR:-/var/lib/lxcfs} - -if ! mountpoint -q $DIR; then - echo "lxcfs isn't mounted on ${DIR}" - exit 1 -fi - -echo "==> Testing /proc/cpuinfo" -tests/test-read $DIR/proc/cpuinfo 3 >/dev/null - -echo "==> Testing /proc/stat" -tests/test-read $DIR/proc/stat 3 >/dev/null - -echo "==> Testing /proc/meminfo" -tests/test-read $DIR/proc/meminfo 3 >/dev/null - -exit 0 diff --git a/tests/test_read_proc.sh.in b/tests/test_read_proc.sh.in new file mode 100755 index 0000000..e94c62d --- /dev/null +++ b/tests/test_read_proc.sh.in @@ -0,0 +1,23 @@ +#/bin/sh +# SPDX-License-Identifier: LGPL-2.1+ + +set -eu +[ -n "${DEBUG:-}" ] && set -x + +DIR=${LXCFSDIR:-/var/lib/lxcfs} + +if ! mountpoint -q $DIR; then + echo "lxcfs isn't mounted on ${DIR}" + exit 1 +fi + +echo "==> Testing /proc/cpuinfo" +@LXCFS_BUILD_ROOT@/tests/test-read $DIR/proc/cpuinfo 3 >/dev/null + +echo "==> Testing /proc/stat" +@LXCFS_BUILD_ROOT@/tests/test-read $DIR/proc/stat 3 >/dev/null + +echo "==> Testing /proc/meminfo" +@LXCFS_BUILD_ROOT@/tests/test-read $DIR/proc/meminfo 3 >/dev/null + +exit 0 diff --git a/tests/test_readdir b/tests/test_readdir deleted file mode 100755 index 6848bfb..0000000 --- a/tests/test_readdir +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: LGPL-2.1+ - -set -eu -[ -n "${DEBUG:-}" ] && set -x - -PASS=0 -UUID=$(uuidgen) - -cleanup() { - [ "$PASS" = "1" ] || (echo FAIL && exit 1) -} - -LXCFSDIR=${LXCFSDIR:-/var/lib/lxcfs} - -trap cleanup EXIT HUP INT TERM - -if ! mountpoint -q ${LXCFSDIR}; then - echo "lxcfs isn't mounted on ${LXCFSDIR}" - exit 1 -fi - -TESTCASE="Stress readdir" -echo "==> Checking for cpuset cgroups" -if [ -d /sys/fs/cgroup/cpuset ]; then - for i in `seq 1 1000`;do ls -al "${LXCFSDIR}/cgroup/cpuset" >/dev/null; done -else - echo "==> Skipping $TESTCASE" -fi - -PASS=1 diff --git a/tests/test_readdir.in b/tests/test_readdir.in new file mode 100755 index 0000000..6848bfb --- /dev/null +++ b/tests/test_readdir.in @@ -0,0 +1,31 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1+ + +set -eu +[ -n "${DEBUG:-}" ] && set -x + +PASS=0 +UUID=$(uuidgen) + +cleanup() { + [ "$PASS" = "1" ] || (echo FAIL && exit 1) +} + +LXCFSDIR=${LXCFSDIR:-/var/lib/lxcfs} + +trap cleanup EXIT HUP INT TERM + +if ! mountpoint -q ${LXCFSDIR}; then + echo "lxcfs isn't mounted on ${LXCFSDIR}" + exit 1 +fi + +TESTCASE="Stress readdir" +echo "==> Checking for cpuset cgroups" +if [ -d /sys/fs/cgroup/cpuset ]; then + for i in `seq 1 1000`;do ls -al "${LXCFSDIR}/cgroup/cpuset" >/dev/null; done +else + echo "==> Skipping $TESTCASE" +fi + +PASS=1 diff --git a/tests/test_reload.sh b/tests/test_reload.sh deleted file mode 100755 index 9c6e55f..0000000 --- a/tests/test_reload.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: LGPL-2.1+ - -set -eu -[ -n "${DEBUG:-}" ] && set -x - -[ $(id -u) -eq 0 ] - -cmdline=$(realpath $0) -dirname=$(dirname ${cmdline}) -topdir=$(dirname ${dirname}) - -testdir=`mktemp -t -d libs.XXX` -installdir=`mktemp -t -d libs.XXX` -pidfile=$(mktemp) -libdir=${installdir}/$(grep ^LIBDIR Makefile | awk '{print $NF}') -bindir=${installdir}/usr/bin -lxcfspid=-1 -FAILED=1 - -cleanup() { - if [ ${lxcfspid} -ne -1 ]; then - kill -9 ${lxcfspid} - count=1 - while [ -d ${testdir}/proc -a $count -lt 5 ]; do - sleep 1 - done - umount -l ${testdir} - fi - rm -rf ${testdir} ${installdir} - rm -f /tmp/lxcfs-iwashere - rm -f ${pidfile} - if [ ${FAILED} -eq 1 ]; then - echo "liblxcfs.so reload test FAILED" - else - echo "liblxcfs.so reload test PASSED" - fi -} - -trap cleanup EXIT HUP INT TERM - -echo "==> Installing lxcfs to temporary path" -( cd ${topdir}; DESTDIR=${installdir} make -s install >/dev/null 2>&1) -if [ -n "${LD_LIBRARY_PATH:-}" ]; then - export LD_LIBRARY_PATH="${libdir}:${LD_LIBRARY_PATH}" -else - export LD_LIBRARY_PATH=${libdir} -fi - -echo "==> Spawning lxcfs" -${bindir}/lxcfs -p ${pidfile} ${testdir} & - -lxcfspid=$! - -count=1 -while [ ! -d ${testdir}/proc ]; do - [ $count -lt 5 ] - sleep 1 - count=$((count+1)) -done - -rm -f /tmp/lxcfs-iwashere - -echo "==> Testing that lxcfs is functional" -cat ${testdir}/proc/uptime - -[ ! -f /tmp/lxcfs-iwashere ] -( - cd ${topdir}/src; - make -s liblxcfstest.la - gcc -shared -fPIC -DPIC -Wl,-soname,liblxcfs.so .libs/liblxcfstest_la-*.o cgroups/.libs/liblxcfstest_la-*.o -lpthread -pthread -o .libs/liblxcfstest.so - cp .libs/liblxcfstest.* "${libdir}" -) > /dev/null -rm -f ${libdir}/liblxcfs.so* ${libdir}/liblxcfs.la -cp ${libdir}/liblxcfstest.so ${libdir}/liblxcfs.so - -kill -USR1 ${lxcfspid} -sleep 1 -cat ${testdir}/proc/uptime -sleep 1 -[ -f /tmp/lxcfs-iwashere ] - -FAILED=0 diff --git a/tests/test_reload.sh.in b/tests/test_reload.sh.in new file mode 100755 index 0000000..322ed5c --- /dev/null +++ b/tests/test_reload.sh.in @@ -0,0 +1,77 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1+ + +set -eu +[ -n "${DEBUG:-}" ] && set -x + +[ $(id -u) -eq 0 ] + +cmdline=$(realpath $0) +topdir=@LXCFS_BUILD_ROOT@ + +testdir=`mktemp -t -d libs.XXX` +installdir=`mktemp -t -d libs.XXX` +pidfile=$(mktemp) +libdir=${installdir}/@LIBDIR@ +bindir=${installdir}/usr/bin +lxcfspid=-1 +FAILED=1 + +cleanup() { + if [ ${lxcfspid} -ne -1 ]; then + kill -9 ${lxcfspid} + count=1 + while [ -d ${testdir}/proc -a $count -lt 5 ]; do + sleep 1 + done + umount -l ${testdir} + fi + rm -rf ${testdir} ${installdir} + rm -f /tmp/lxcfs-iwashere + rm -f ${pidfile} + if [ ${FAILED} -eq 1 ]; then + echo "liblxcfs.so reload test FAILED" + else + echo "liblxcfs.so reload test PASSED" + fi +} + +trap cleanup EXIT HUP INT TERM + +echo "==> Installing lxcfs to temporary path" +cd @LXCFS_BUILD_ROOT@ +DESTDIR=${installdir} meson install +if [ -n "${LD_LIBRARY_PATH:-}" ]; then + export LD_LIBRARY_PATH="${libdir}:${LD_LIBRARY_PATH}" +else + export LD_LIBRARY_PATH=${libdir} +fi + +echo "==> Spawning lxcfs" +${bindir}/lxcfs -p ${pidfile} ${testdir} & + +lxcfspid=$! + +count=1 +while [ ! -d ${testdir}/proc ]; do + [ $count -lt 5 ] + sleep 1 + count=$((count+1)) +done + +rm -f /tmp/lxcfs-iwashere + +echo "==> Testing that lxcfs is functional" +cat ${testdir}/proc/uptime + +[ ! -f /tmp/lxcfs-iwashere ] +rm -f ${libdir}/liblxcfs.so* ${libdir}/liblxcfs.la +cp @LXCFS_BUILD_ROOT@/liblxcfstest.so ${libdir}/liblxcfs.so + +kill -USR1 ${lxcfspid} +sleep 1 +cat ${testdir}/proc/uptime +sleep 1 +[ -f /tmp/lxcfs-iwashere ] + +FAILED=0 diff --git a/tests/test_sigusr2.sh b/tests/test_sigusr2.sh deleted file mode 100755 index a17f4f1..0000000 --- a/tests/test_sigusr2.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: LGPL-2.1+ - -set -eu -[ -n "${DEBUG:-}" ] && set -x - -PASS=0 - -cleanup() { - [ "$PASS" = "1" ] || (echo FAIL && exit 1) -} - -trap cleanup EXIT HUP INT TERM - -LXCFSDIR=${LXCFSDIR:-/var/lib/lxcfs} - -if ! mountpoint -q ${LXCFSDIR}; then - echo "lxcfs isn't mounted on ${LXCFSDIR}" - exit 1 -fi - -echo "==> Setting up memory cgroup in lxcfs_test_proc" -[ ! -d /sys/fs/cgroup/memory ] && exit 0 - -initmemory=`awk -F: '/memory/ { print $3 }' /proc/1/cgroup` -mempath=/sys/fs/cgroup/memory/${initmemory} -rmdir ${mempath}/lxcfs_test_proc 2>/dev/null || true -mkdir ${mempath}/lxcfs_test_proc -echo 1 > ${mempath}/lxcfs_test_proc/tasks - -echo $((64*1024*1024)) > ${mempath}/lxcfs_test_proc/memory.limit_in_bytes - -# Test meminfo -echo "==> Testing /proc/meminfo" -[ "$(grep "^MemTotal:.*kB$" ${LXCFSDIR}/proc/meminfo)" = "$(grep "^MemTotal:.*kB$" /proc/meminfo)" ] - -PASS=1 diff --git a/tests/test_sigusr2.sh.in b/tests/test_sigusr2.sh.in new file mode 100755 index 0000000..a17f4f1 --- /dev/null +++ b/tests/test_sigusr2.sh.in @@ -0,0 +1,37 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1+ + +set -eu +[ -n "${DEBUG:-}" ] && set -x + +PASS=0 + +cleanup() { + [ "$PASS" = "1" ] || (echo FAIL && exit 1) +} + +trap cleanup EXIT HUP INT TERM + +LXCFSDIR=${LXCFSDIR:-/var/lib/lxcfs} + +if ! mountpoint -q ${LXCFSDIR}; then + echo "lxcfs isn't mounted on ${LXCFSDIR}" + exit 1 +fi + +echo "==> Setting up memory cgroup in lxcfs_test_proc" +[ ! -d /sys/fs/cgroup/memory ] && exit 0 + +initmemory=`awk -F: '/memory/ { print $3 }' /proc/1/cgroup` +mempath=/sys/fs/cgroup/memory/${initmemory} +rmdir ${mempath}/lxcfs_test_proc 2>/dev/null || true +mkdir ${mempath}/lxcfs_test_proc +echo 1 > ${mempath}/lxcfs_test_proc/tasks + +echo $((64*1024*1024)) > ${mempath}/lxcfs_test_proc/memory.limit_in_bytes + +# Test meminfo +echo "==> Testing /proc/meminfo" +[ "$(grep "^MemTotal:.*kB$" ${LXCFSDIR}/proc/meminfo)" = "$(grep "^MemTotal:.*kB$" /proc/meminfo)" ] + +PASS=1 diff --git a/tests/test_syscalls.c b/tests/test_syscalls.c index afbb52c..f0dbf45 100644 --- a/tests/test_syscalls.c +++ b/tests/test_syscalls.c @@ -4,11 +4,7 @@ #define _GNU_SOURCE #endif -#ifndef FUSE_USE_VERSION -#define FUSE_USE_VERSION 26 -#endif - -#define _FILE_OFFSET_BITS 64 +#include "config.h" #include #include @@ -70,7 +66,7 @@ void test_access(const char *path) void test_bind(const char *path) { int sfd; - struct sockaddr_un my_addr, peer_addr; + struct sockaddr_un my_addr; sfd = socket(AF_UNIX, SOCK_STREAM, 0); diff --git a/tools/meson-build.sh b/tools/meson-build.sh new file mode 100755 index 0000000..26f995d --- /dev/null +++ b/tools/meson-build.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# SPDX-License-Identifier: LGPL-2.1-or-later +set -eux + +src="$1" +dst="$2" +target="$3" +options="$4" +CC="$5" +CXX="$6" + +[ -f "$dst/ninja.build" ] || CC="$CC" CXX="$CXX" meson "$src" "$dst" $options + +# Locate ninja binary, on CentOS 7 it is called ninja-build, so +# use that name if available. +ninja=ninja +if which ninja-build >/dev/null 2>&1 ; then + ninja=ninja-build +fi + +"$ninja" -C "$dst" "$target"