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
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:
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
-.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
--- /dev/null
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+all:
+ ninja -C build
+
+install:
+ DESTDIR=$(DESTDIR) ninja -C build install
+++ /dev/null
-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
+++ /dev/null
-# 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
+++ /dev/null
-SUBDIRS = init
+++ /dev/null
-SUBDIRS = systemd sysvinit upstart
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-# ===========================================================================
-# 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 <guidod@gmx.de>
-# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
-#
-# 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
+++ /dev/null
-# ===========================================================================
-# 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 <guidod@gmx.de>
-# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
-#
-# 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
+++ /dev/null
-# ===========================================================================
-# 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 <stevenj@alum.mit.edu>
-# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
-#
-# 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 <https://www.gnu.org/licenses/>.
-#
-# 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 <pthread.h>
-# 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 <pthread.h>],
- [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 <pthread.h>]],
- [[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
--- /dev/null
+# 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 <string.h>'''],
+ ['strlcat', '''#include <string.h>'''],
+ ['pidfd_send_signal', '''#include <stdlib.h>
+ #include <unistd.h>
+ #include <signal.h>
+ #include <sys/wait.h>'''],
+ ['pidfd_open', '''#include <stdlib.h>
+ #include <unistd.h>
+ #include <signal.h>
+ #include <sys/wait.h>'''],
+]
+
+ 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))
--- /dev/null
+# -*- 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')
+++ /dev/null
-lxccommondir=@LXCCONFDIR@
-lxcfssharedir=@LXCFSSHAREDIR@
-
-lxcfsshare_SCRIPTS = lxc.mount.hook lxc.reboot.hook
-lxccommon_DATA = 00-lxcfs.conf
+++ /dev/null
-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
#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 <dirent.h>
#include <errno.h>
#include <fcntl.h>
-#include <fuse.h>
#include <inttypes.h>
#include <libgen.h>
#include <linux/magic.h>
#include <unistd.h>
#include <wait.h>
-#include "api_extensions.h"
#include "bindings.h"
+
+#include "api_extensions.h"
#include "cgroup_fuse.h"
#include "cgroups/cgroup.h"
#include "cgroups/cgroup_utils.h"
return false;
}
-static int pivot_enter()
+static int pivot_enter(void)
{
__do_close int oldroot = -EBADF, newroot = -EBADF;
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);
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)
#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 <fuse.h>
#include <linux/types.h>
#include <signal.h>
#include <stdbool.h>
#include <sys/types.h>
#include <unistd.h>
+#if HAVE_FUSE3
+#include <fuse3/fuse.h>
+#else
+#include <fuse.h>
+#endif
+
#include "cgroup_fuse.h"
-#include "config.h"
#include "macro.h"
#include "proc_cpuview.h"
#include "proc_fuse.h"
#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 <dirent.h>
#include <errno.h>
#include <fcntl.h>
-#include <fuse.h>
#include <inttypes.h>
#include <libgen.h>
#include <pthread.h>
#include <sys/sysinfo.h>
#include <sys/vfs.h>
+#include "cgroup_fuse.h"
+
#include "bindings.h"
#include "cgroups/cgroup.h"
#include "cgroups/cgroup_utils.h"
* 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
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;
/*
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;
* 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;
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)
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())
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;
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)
*answer = convert_id_to_ns(f, uid);
fclose(f);
- if (*answer == -1)
+ if (*answer == (uid_t)-1)
return false;
return true;
}
__do_free char *path = NULL;
int cfd;
size_t len;
+ ssize_t ret;
cfd = get_cgroup_fd_handle_named(controller);
if (cfd < 0)
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,
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;
}
#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 <fuse.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
-#include "config.h"
+#if HAVE_FUSE3
+#include <fuse3/fuse.h>
+#else
+#include <fuse.h>
+#endif
+
#include "macro.h"
__visible extern int cg_getattr(const char *path, struct stat *sb);
#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 <ctype.h>
#include <dirent.h>
#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 <dirent.h>
#include <errno.h>
#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 <errno.h>
#include <fcntl.h>
#include <linux/filter.h>
#endif
-#include "syscall_numbers.h"
+#include "../syscall_numbers.h"
#if !HAVE_BPF
#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 <fcntl.h>
#include <stdarg.h>
return 0;
}
-#ifndef HAVE_STRLCPY
+#if !HAVE_STRLCPY
size_t strlcpy(char *dest, const char *src, size_t size)
{
size_t ret = strlen(src);
}
#endif
-#ifndef HAVE_STRLCAT
+#if !HAVE_STRLCAT
size_t strlcat(char *d, const char *s, size_t n)
{
size_t l = strnlen(d, n);
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
#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 <alloca.h>
#include <dirent.h>
#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
-#include <fuse.h>
#include <getopt.h>
#include <libgen.h>
#include <pthread.h>
#include <sys/socket.h>
#include <linux/limits.h>
+#if HAVE_FUSE3
+#include <fuse3/fuse.h>
+#else
+#include <fuse.h>
+#endif
+
#include "bindings.h"
#include "lxcfs_fuse_compat.h"
#include "macro.h"
#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);
#endif
};
-static void usage()
+static void usage(void)
{
lxcfs_info("Usage: lxcfs <directory>\n");
lxcfs_info("lxcfs is a FUSE-based proc, sys and cgroup virtualizing filesystem\n");
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)
#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__)
#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
#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 <dirent.h>
#include <errno.h>
#include <fcntl.h>
-#include <fuse.h>
#include <inttypes.h>
#include <libgen.h>
#include <pthread.h>
#include <sys/sysinfo.h>
#include <sys/vfs.h>
+#include "proc_cpuview.h"
+
#include "bindings.h"
#include "cgroup_fuse.h"
#include "cpuset_parse.h"
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;
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;
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;
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;
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;
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;
size_t cache_size = d->buflen;
if (offset) {
- int left;
+ size_t left;
if (offset > d->size)
return -EINVAL;
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;
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;
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;
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;
}
#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 <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
-#include "config.h"
+#if HAVE_FUSE3
+#include <fuse3/fuse.h>
+#else
+#include <fuse.h>
+#endif
+
#include "macro.h"
struct cpuacct_usage {
#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 <dirent.h>
#include <errno.h>
#include <fcntl.h>
-#include <fuse.h>
#include <inttypes.h>
#include <libgen.h>
#include <pthread.h>
#include <sys/sysinfo.h>
#include <sys/vfs.h>
+#include "proc_fuse.h"
+
#include "bindings.h"
#include "cgroup_fuse.h"
#include "cgroups/cgroup.h"
size_t linelen = 0;
if (offset) {
- int left;
+ size_t left;
if (offset > d->size)
return -EINVAL;
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);
int ret;
if (offset) {
- int left;
+ size_t left;
if (offset > d->size)
return -EINVAL;
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;
return total_len;
}
-#if RELOADTEST
+#ifdef RELOADTEST
static inline void iwashere(void)
{
mknod("/tmp/lxcfs-iwashere", S_IFREG, 0644);
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;
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);
int cg_cpu_usage_size = 0;
if (offset) {
- int left;
+ size_t left;
if (offset > d->size)
return -EINVAL;
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;
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;
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;
int ret;
if (offset) {
- int left;
+ size_t left;
if (offset > d->size)
return -EINVAL;
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;
pid_t initpid;
if (offset) {
- int left;
+ size_t left;
if (offset > d->size)
return -EINVAL;
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;
#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 <fuse3/fuse.h>
+#else
+#include <fuse.h>
#endif
-#define _FILE_OFFSET_BITS 64
-
-#include <fuse.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
-#include "config.h"
#include "macro.h"
__visible extern int proc_getattr(const char *path, struct stat *sb);
#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 <dirent.h>
#include <errno.h>
#include <fcntl.h>
-#include <fuse.h>
#include <inttypes.h>
#include <libgen.h>
#include <pthread.h>
#include <sys/sysinfo.h>
#include <sys/vfs.h>
+#include "proc_loadavg.h"
+
#include "bindings.h"
#include "cgroup_fuse.h"
#include "cgroups/cgroup.h"
uint64_t a, b, c;
if (offset) {
- int left;
+ size_t left;
if (offset > d->size)
return -EINVAL;
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);
#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 <fuse.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
-#include "config.h"
+#if HAVE_FUSE3
+#include <fuse3/fuse.h>
+#else
+#include <fuse.h>
+#endif
+
#include "macro.h"
__visible extern pthread_t load_daemon(int load_use);
#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 <ctype.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
-#include <fuse.h>
#include <inttypes.h>
#include <libgen.h>
#include <pthread.h>
#include <sys/sysinfo.h>
#include <sys/vfs.h>
+#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)
ssize_t total_len = 0;
if (offset) {
- int left;
+ size_t left;
if (!d->cached)
return 0;
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);
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];
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)
__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';
#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 <fuse.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
-#include "config.h"
+#if HAVE_FUSE3
+#include <fuse3/fuse.h>
+#else
+#include <fuse.h>
+#endif
+
#include "macro.h"
__visible extern int sys_getattr(const char *path, struct stat *sb);
#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 <ctype.h>
#include <errno.h>
#include <fcntl.h>
-#include <fuse.h>
#include <inttypes.h>
#include <sched.h>
#include <stdarg.h>
#include <sys/wait.h>
#include <unistd.h>
+#include "utils.h"
+
#include "bindings.h"
#include "macro.h"
#include "memory_utils.h"
-#include "utils.h"
/*
* append the given formatted string to *src.
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;
/* 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;
if (offset) {
ssize_t total_len = 0;
char *cache = d->buf;
- int left;
+ size_t left;
if (offset > d->size)
return -EINVAL;
#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 <fuse.h>
#include <signal.h>
#include <stdbool.h>
#include <sys/socket.h>
#include <sys/syscall.h>
#include <unistd.h>
-#include "config.h"
+#if HAVE_FUSE3
+#include <fuse3/fuse.h>
+#else
+#include <fuse.h>
+#endif
+
#include "macro.h"
#include "syscall_numbers.h"
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)
{
+++ /dev/null
-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
#define _GNU_SOURCE
#endif
-#ifndef FUSE_USE_VERSION
-#define FUSE_USE_VERSION 26
-#endif
-
-#define _FILE_OFFSET_BITS 64
+#include "config.h"
#include <stdio.h>
#include <string.h>
}
}
-int main() {
+int main(void) {
char *a = "1,2";
char *b = "1-3,5";
char *c = "1,4-5";
+++ /dev/null
-#!/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
--- /dev/null
+#!/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
--- /dev/null
+# 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)
+
#define _GNU_SOURCE
#endif
-#ifndef FUSE_USE_VERSION
-#define FUSE_USE_VERSION 26
-#endif
-
-#define _FILE_OFFSET_BITS 64
+#include "config.h"
#include <stdio.h>
#include <unistd.h>
+++ /dev/null
-#!/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
--- /dev/null
+#!/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
+++ /dev/null
-#!/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!"
--- /dev/null
+#!/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!"
+++ /dev/null
-#!/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
--- /dev/null
+#!/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
+++ /dev/null
-#!/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
--- /dev/null
+#!/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
+++ /dev/null
-#/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
--- /dev/null
+#/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
+++ /dev/null
-#!/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
--- /dev/null
+#!/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
+++ /dev/null
-#!/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
--- /dev/null
+#!/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
+++ /dev/null
-#!/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
--- /dev/null
+#!/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
#define _GNU_SOURCE
#endif
-#ifndef FUSE_USE_VERSION
-#define FUSE_USE_VERSION 26
-#endif
-
-#define _FILE_OFFSET_BITS 64
+#include "config.h"
#include <errno.h>
#include <fcntl.h>
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);
--- /dev/null
+#!/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"