Hello community, here is the log from the commit of package posixovl for openSUSE:Factory checked in at 2018-09-24 13:12:14 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/posixovl (Old) and /work/SRC/openSUSE:Factory/.posixovl.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "posixovl" Mon Sep 24 13:12:14 2018 rev:12 rq:636862 version:1.3 Changes: -------- --- /work/SRC/openSUSE:Factory/posixovl/posixovl.changes 2014-09-26 11:21:11.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.posixovl.new/posixovl.changes 2018-09-24 13:12:15.241812833 +0200 @@ -1,0 +2,6 @@ +Thu Sep 20 09:13:54 UTC 2018 - Jan Engelhardt <[email protected]> + +- Update to new upstream release 1.3 + * Support xattr.h moved from libattr-devel to glibc-devel. + +------------------------------------------------------------------- Old: ---- posixovl-1.2.tar.xz posixovl-1.2.tar.xz.asc New: ---- posixovl-1.3.tar.asc posixovl-1.3.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ posixovl.spec ++++++ --- /var/tmp/diff_new_pack.4nDqFB/_old 2018-09-24 13:12:15.825811805 +0200 +++ /var/tmp/diff_new_pack.4nDqFB/_new 2018-09-24 13:12:15.829811798 +0200 @@ -1,7 +1,7 @@ # # spec file for package posixovl # -# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -12,54 +12,48 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # Name: posixovl -Version: 1.2 +Version: 1.3 Release: 0 Summary: POSIX overlay filesystem -License: GPL-2.0+ +License: GPL-2.0-or-later Group: System/Filesystems Url: http://posixovl.sf.net/ Source: http://downloads.sf.net/posixovl/%name-%version.tar.xz -Source2: http://downloads.sf.net/posixovl/%name-%version.tar.xz.asc -# Next version should be signed with a new key. Use "gpg-offline --package=posixovl --delete 844C4360" then. +Source2: http://downloads.sf.net/posixovl/%name-%version.tar.asc Source3: %name.keyring BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: autoconf >= 2.61 BuildRequires: automake >= 1.9 -BuildRequires: libattr-devel BuildRequires: pkgconfig BuildRequires: xz BuildRequires: pkgconfig(fuse) >= 2.6.5 %description -A FUSE filesystem that provides POSIX functionality - UNIX-style -permissions, ownership, special files - for filesystems that do not -have such, e.g. vfat. It is a modern equivalent of the UMSDOS fs. - -Author: -------- - Jan Engelhardt +A FUSE filesystem that provides POSIX functionality - UNIX-style permissions, +ownership, special files - for filesystems that do not have such, e.g. vfat. It +can be seen as a contemporary equivalent of the UMSDOS fs. %prep -%setup -qn %name +%setup -q %build if [ ! -e configure ]; then autoreconf -fiv fi %configure -make %{?_smp_mflags}; +make %{?_smp_mflags} %install -b="%buildroot"; -make install DESTDIR="$b"; -mkdir -p "$b/%_mandir/man8"; -ln -s ../man1/posixovl.1 "$b/%_mandir/man8/mount.posixovl.8"; +b="%buildroot" +%make_install +mkdir -p "$b/%_mandir/man8" +ln -s ../man1/posixovl.1 "$b/%_mandir/man8/mount.posixovl.8" %files %defattr(-,root,root) ++++++ posixovl-1.2.tar.xz -> posixovl-1.3.tar.xz ++++++ ++++ 11243 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/.gitignore new/posixovl-1.3/.gitignore --- old/posixovl/.gitignore 2011-04-17 03:28:27.000000000 +0200 +++ new/posixovl-1.3/.gitignore 2018-09-20 10:41:18.000000000 +0200 @@ -3,15 +3,12 @@ Makefile Makefile.in -/autom4te.cache +/autom4te.cache/ /aclocal.m4 -/compile +/build-aux/ /config.* /configure -/depcomp -/install-sh /lntest -/missing /mount.posixovl /socket /stamp-h1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/Makefile.am new/posixovl-1.3/Makefile.am --- old/posixovl/Makefile.am 2011-04-17 03:28:27.000000000 +0200 +++ new/posixovl-1.3/Makefile.am 2018-09-20 10:41:18.000000000 +0200 @@ -13,7 +13,7 @@ .PHONY: tarball tarball: rm -Rf /tmp/${PACKAGE_TARNAME}-${PACKAGE_VERSION}; - pushd ${top_srcdir} && git-archive --prefix=${PACKAGE_TARNAME}-${PACKAGE_VERSION}/ HEAD | tar -C /tmp -x && popd; + pushd ${top_srcdir} && git archive --prefix=${PACKAGE_TARNAME}-${PACKAGE_VERSION}/ HEAD | tar -C /tmp -x && popd pushd /tmp/${PACKAGE_TARNAME}-${PACKAGE_VERSION} && ./autogen.sh && popd; - tar -C /tmp -cjf ${PACKAGE_TARNAME}-${PACKAGE_VERSION}.tar.bz2 --owner=root --group=root ${PACKAGE_TARNAME}-${PACKAGE_VERSION}/; + tar -C /tmp --use=xz -cf ${PACKAGE_TARNAME}-${PACKAGE_VERSION}.tar.xz --owner=root --group=root ${PACKAGE_TARNAME}-${PACKAGE_VERSION}/ rm -Rf /tmp/${PACKAGE_TARNAME}-${PACKAGE_VERSION}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/build-aux/compile new/posixovl-1.3/build-aux/compile --- old/posixovl/build-aux/compile 1970-01-01 01:00:00.000000000 +0100 +++ new/posixovl-1.3/build-aux/compile 2018-09-20 10:41:22.346333068 +0200 @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2018 Free Software Foundation, Inc. +# Written by Tom Tromey <[email protected]>. +# +# 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 2, 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 to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <[email protected]> or send patches to +# <[email protected]>. + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to <[email protected]>. +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/build-aux/missing new/posixovl-1.3/build-aux/missing --- old/posixovl/build-aux/missing 1970-01-01 01:00:00.000000000 +0100 +++ new/posixovl-1.3/build-aux/missing 2018-09-20 10:41:22.350333025 +0200 @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard <[email protected]>, 1996. + +# 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 2, 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 to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to <[email protected]>." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/config.h.in new/posixovl-1.3/config.h.in --- old/posixovl/config.h.in 1970-01-01 01:00:00.000000000 +0100 +++ new/posixovl-1.3/config.h.in 2018-09-20 10:41:21.942337439 +0200 @@ -0,0 +1,67 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the <attr/xattr.h> header file. */ +#undef HAVE_ATTR_XATTR_H + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* Define if you have a FUSE version >= 2.6.5 but < 2.7.0 */ +#undef HAVE_JUST_FUSE_2_6_5 + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the <sys/xattr.h> header file. */ +#undef HAVE_SYS_XATTR_H + +/* Define to 1 if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Define if utimensat() function is available */ +#undef HAVE_UTIMENSAT + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/configure.ac new/posixovl-1.3/configure.ac --- old/posixovl/configure.ac 2011-04-17 03:31:09.000000000 +0200 +++ new/posixovl-1.3/configure.ac 2018-09-20 10:41:18.000000000 +0200 @@ -1,5 +1,6 @@ -AC_INIT([posixovl], [1.2]) +AC_INIT([posixovl], [1.3]) AC_PREREQ([2.61]) +AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADERS([config.h]) AC_PROG_INSTALL AM_INIT_AUTOMAKE([-Wall foreign subdir-objects]) @@ -8,13 +9,13 @@ regular_CPPFLAGS="-D_FORTIFY_SOURCE=2 -D_LARGEFILE_SOURCE=1 -D_LARGE_FILES \ -D_FILE_OFFSET_BITS=64 -D_REENTRANT"; -regular_CFLAGS="-Wall -Waggregate-return \ +regular_CFLAGS="-std=c99 -Wall -Waggregate-return \ -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls \ -Wshadow -Wstrict-prototypes -Winline -pipe" AC_SUBST([regular_CPPFLAGS]) AC_SUBST([regular_CFLAGS]) -AC_CHECK_HEADER(attr/xattr.h, [], AC_MSG_ERROR([libattr-devel not installed])) +AC_CHECK_HEADERS([attr/xattr.h sys/xattr.h]) # FUSE >= 2.7.0 got subtype name support. # 2.6.5 does not, but has a similar thing. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/format.txt new/posixovl-1.3/format.txt --- old/posixovl/format.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/posixovl-1.3/format.txt 2018-09-20 10:41:18.000000000 +0200 @@ -0,0 +1,127 @@ +Overview of posixovl file translation. + + +logical file := file as seen in the posixovl mount +physical file := file as seen in the lower mount + + +Summary + +State 0: + * dentry "subdir/hello.txt" represented using + "subdir/hello.txt" + * inode contents stored in "subdir/hello.txt" + * inode metadata synthesized +State 1: + * dentry "subdir/hello.txt" represented using + "subdir/hello.txt" + * inode contents stored in "subdir/hello.txt" + * inode metadata stored in "subdir/.pxovl.hello.txt" +State 2: + * dentry "subdir/hello.txt" represented using + "subdir/hello.txt" of size 0 and ".pxovl.hello.txt" + containing "type S_IFLNK|S_ISVTX" (acts as S_IFHARDLINK) + and the mention of "/.pxovd.1234567890". + * inode metadata stored in "/.pxovn.1234567890" + * inode contents stored in "/.pxovd.1234567890" + + +State 0 - plain map + +* A single logical file or directory is represented in the lower + filesystem as a single file as well. For one logical file there is + exactly one physical file. (For example, "/posixovl/hello.txt" <--> + "/lower/hello.txt"). + +* The file name in the lower filesystem may be encoded in an + implementation-specific fashion. There is a 1:1 (bijective) mapping + between logical filename and the filename of the physical file + holding the file contents. (For example, "/posixovl/hello*.txt" + <--> "/lower/hello%(2A).txt".) + + (N.B.: The posixovl mount program implementation does not handle + all of the awkward corner cases. In particular, it does not try to + hide modifications outside of posixovl that would violate the + bijective property.) + +* The POSIX attributes shown in the logical filesystem are + unspecified and implementation-specific. (The posixovl mount + program will try to produce something sensible.) + +* POSIX attributes cannot be changed in state 0. (If this is + attempted, the mount program will create a HCB and transition the + file to state 1.) + +* The hardlink count cannot be changed in state 0. (The mount program + will advance the file to state 1.) + + +State 1 - metadata present + +* HCB is the "hidden control block", a companion file in the lower + filesystem storing file type, permissions, owner/group, rdev, + symlink target, etc. + +* For each logical object, there will be two physical files + (the file with the contents and the HCB metadata file). + +* Like in state 0, there is a 1:1 mapping between a logical filename + and the filename of the physical file holding the contents. + +* There is a 1:1 mapping between a logical filename and the filename + of the HCB file. + +* For non-directories, the HCB is stored in parallel to the physical + file, for example "/lower/hello.txt" <--> + "/lower/.pxovl.hello.txt". Encoding rules apply as well, e.g. + "/lower/hello.txt" <--> "/lower/.pxovl.hello%(2A).txt". + +* For directories, the HCB is stored within the directory that it + describes, for example "/lower/pictures" <--> + "/lower/pictures/.pxovl.". + +* Deleting the logical file or directory will delete both content + file and the HCB file (as expected). + +* The hardlink count cannot be changed in state 1. + (If this is attempted, the mount program will do a conversion and + advance the file to state 2.) + +* There is no way back to state 0. (Other than perhaps manual + modifications in the lower filesystem outside of posixovl.) + + +State 2 - data in a separate node + +* Directories have no state 2 defined, because it is not permitted to + hardlink them anyway. + +* The contents of a logical file are stored in a separate physical + file, "/lower/.pxovd.1234567890" (a random unique number is + chosen), and the inode metadata such as owner/group and permissions + is stored in "/lower/.pxovn.1234567890" (same number that was + chosen for the pxovd file). + +* A dentry such as "/posixovl/foo.txt" is represented using a + zero-sized file "/lower/foo.txt" and a metadata file + "/lower/.pxovl.foo.txt", the latter of which specifies file type + S_IFLNK|S_ISVTX (121000) to indicate a hardlink, and with the + target set to ".pxovd.1234567890". + + (N.B.: They are implemented quite like symlinks, which differ + only in the file type.) + +* The pxovd and pxovn files always live in the root directory of the + lower filesystem. (This is to ensure that the target of all + S_IFHARDLINK HCB files remains valid for all time, which would not + be possible if the pxovd file had to be moved.) + +* Deleting the dentry will delete both the 0-sized placeholder file + and its HCB ("/lower/foo.txt" and "/lower/.pxovl.foo.txt" in our + example). + +* Deleting the last reference (as determined by looking at the link + count field in the pxovn file) will eliminate the pxovd and pxovn + files. + +* There is no way back to state 1. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/lntest.c new/posixovl-1.3/lntest.c --- old/posixovl/lntest.c 2011-04-17 03:28:27.000000000 +0200 +++ new/posixovl-1.3/lntest.c 2018-09-20 10:41:18.000000000 +0200 @@ -1,4 +1,4 @@ - +/* Program that exercises hardlinks and mmap, to be used with posixovl. */ #undef NDEBUG #include <sys/mman.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/posixovl.1 new/posixovl-1.3/posixovl.1 --- old/posixovl/posixovl.1 2011-04-17 03:28:27.000000000 +0200 +++ new/posixovl-1.3/posixovl.1 2018-09-20 10:41:18.000000000 +0200 @@ -4,7 +4,7 @@ posixovl \(em The POSIX Overlay Filesystem .SH Syntax .PP -\fBmount.posixovl\fP [\fB\-F\fP] [\fB\-S\fP \fIsource_dir\fP] \fItarget_dir\fP +\fBmount.posixovl\fP [\fB\-FH\fP] [\fB\-S\fP \fIsource_dir\fP] \fItarget_dir\fP [\fB\-\-\fP \fIfuse_opts\fP] .SH Description .PP @@ -25,6 +25,12 @@ would be used to check for POSIX filesystems mounted inside a non-POSIX tree. (For example, where /vfat is vfat, and /vfat/xfs is a POSIX-behaving filesystem.) +.TP +\fB\-H\fP +When this option is enabled and a hardlink in the posixovl namespace is +created, the contents of the file will be replicated in the lower filesystem +rather than using zero-sized placeholder files. Note that the replicas will not +be updated later on when editing the inode through posixovl. .SH Supported operations .PP posixovl will emulate the following calls if the lower filesystem is incapable @@ -63,13 +69,13 @@ all lower-level files will be operated on/created with the user who inititated the mount .PP -If no HCB exists for a file or directory, the default permissions are 644 and -755, respectively. The owner and group of the inode will be the owner/group of -the real file. +If no HCB exists for a file or directory, the default permissions are rw-r--r-- +or rwxr-xr-x, respectively. The owner and group of the inode will be the +owner/group of the real file. .PP Each non-regular, non-directory virtual file will have a zero-size real file. (Simplifies handling, and makes it apprarent the object exists when using other -OS.) +operating systems.) .PP `df` will show: .nf diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/posixovl.c new/posixovl-1.3/posixovl.c --- old/posixovl/posixovl.c 2011-04-17 03:28:27.000000000 +0200 +++ new/posixovl-1.3/posixovl.c 2018-09-20 10:41:18.000000000 +0200 @@ -1,6 +1,6 @@ /* * posixovl - POSIX overlay filesystem - * Copyright © Jan Engelhardt <[email protected]>, 2007 - 2008 + * Copyright Jan Engelhardt, 2007-2008,2013 * * Development of posixovl sponsored by Slax (http://www.slax.org/) * @@ -12,6 +12,7 @@ #define _ATFILE_SOURCE 1 #define _GNU_SOURCE 1 #define FUSE_USE_VERSION 26 +#include "config.h" #include <sys/fsuid.h> #include <sys/stat.h> #include <sys/statvfs.h> @@ -31,8 +32,12 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> -#include <asm/unistd.h> -#include <attr/xattr.h> +#ifdef HAVE_XATTR_XATTR_H +# include <attr/xattr.h> +#endif +#ifdef HAVE_SYS_XATTR_H +# include <sys/xattr.h> +#endif #include "config.h" #ifndef S_IRUGO # define S_IRUGO (S_IRUSR | S_IRGRP | S_IROTH) @@ -77,19 +82,18 @@ # define should_not_happen() do {} while (false) #endif #define hcb_got_busted(path) \ - fprintf(stderr, "HCB %s got busted\n", (path)) - -/* Shortcut */ -#define XRET(v) \ - return ({ \ - int __ret = (v); \ - (__ret >= 0) ? __ret : -errno; \ - }) + fprintf(stderr, "HCB %s is corrupt\n", (path)) /* Definitions */ -#define HCB_PREFIX1 ".pxovl" /* extra vfat idiocy */ + #define HCB_PREFIX ".pxovl." #define HCB_PREFIX_LEN (sizeof(HCB_PREFIX) - 1) +/* + * Trailing dots may be eaten, so we need to check some filenames for + * another variant. + */ +#define HCB_PREFIX1 ".pxovl" + #define HL_DNODE_PREFIX ".pxovd." #define HL_DNODE_PREFIX_LEN (sizeof(HL_DNODE_PREFIX) - 1) #define HL_INODE_PREFIX ".pxovn." @@ -100,6 +104,13 @@ ENOENT_HCB = 4096, }; +/** + * ll_hcb - lowlevel HCB + * @buf: buffer for contents of HCB file + * @new_target: buffer to hold the link target + * @target: pointer to @new_target (always?) + * rest: inode properties + */ struct ll_hcb { char buf[PATH_MAX], new_target[PATH_MAX]; const char *target; @@ -111,6 +122,9 @@ size_t size; }; +/** + * The "hidden control block". + */ struct hcb { char path[PATH_MAX]; struct ll_hcb ll; @@ -120,11 +134,24 @@ /* Global */ static mode_t default_mode = S_IRUGO | S_IWUSR; -static unsigned int assume_vfat, single_threaded; +static unsigned int assume_vfat, single_threaded, hardlink_with_copy; static const char *root_dir; static int root_fd; static pthread_mutex_t posixovl_protect = PTHREAD_MUTEX_INITIALIZER; +static inline int retcode_int(int code) +{ + return (code >= 0) ? code : -errno; +} + +static inline ssize_t retcode_ssize(ssize_t code) +{ + return (code >= 0) ? code : -errno; +} + +/** + * Set a read lock on the entire of a file. + */ static int lock_read(int fd) { static const struct flock fl = { @@ -138,6 +165,9 @@ return fcntl(fd, F_SETLKW, &fl); } +/** + * Set a write lock on the entire of a file. + */ static int lock_write(int fd) { static const struct flock fl = { @@ -151,7 +181,7 @@ return fcntl(fd, F_SETLK, &fl); } -/* +/** * at - turn a virtual path into a relative (to root_fd) one */ static __attribute__((pure)) const char *at(const char *in) @@ -170,7 +200,7 @@ return dest; } -/* +/** * __hl_dtoi - build the HL.I-node path from the HL.D-node path */ static void __hl_dtoi(char *dest, size_t destsize, const char *src) @@ -187,7 +217,7 @@ #define hl_dtoi(dest, src) __hl_dtoi((dest), sizeof(dest), (src)) -/* +/** * __real_to_hcb - build the hidden control block (HCB) path from a real path */ static int __real_to_hcb(char *dest, size_t destsize, const char *src) @@ -221,11 +251,11 @@ if (strncmp(filename_part, HL_DNODE_PREFIX, HL_DNODE_PREFIX_LEN) == 0) ret = snprintf(dest, destsize, "%.*s" HL_INODE_PREFIX "%s", - filename_part - directory_part, directory_part, + (int)(filename_part - directory_part), directory_part, filename_part + HL_DNODE_PREFIX_LEN); else ret = snprintf(dest, destsize, "%.*s" HCB_PREFIX "%s", - filename_part - directory_part, directory_part, + (int)(filename_part - directory_part), directory_part, filename_part); if (ret > destsize) return -ENAMETOOLONG; @@ -234,7 +264,7 @@ #define real_to_hcb(dest, src) __real_to_hcb((dest), sizeof(dest), (src)) -/* +/** * ll_hcb_read - lowlevel read of HCB * @path: path to HCB (used for debug and unlink) * @info: destination structure @@ -294,7 +324,7 @@ return -EINVAL; } -/* +/** * ll_hcb_write - lowlevel write of HCB * @path: path to HCB (used for debug and unlink) * @info: source structure @@ -333,7 +363,7 @@ return 0; } -/* +/** * hcb_new - create new HCB * @path: file path (not HCB path) * @cb: destination structure @@ -367,15 +397,15 @@ return 0; } -/* +/** * hcb_get - read HCB - * @path: L0 file path + * @path: fuse-namespace relative file path (L0) * @cb: destination struct * - * Read @path's HCB into @cb. This does not follow hardlinks. - * To distinguish whether @path or the HCB was not found, hcb_get() will - * return -ENOENT when @path was not found, and -ENOENT_HCB when the HCB - * was not found. + * Read @path's HCB into @cb. This function does not follow posixovl hardlinks. + * When the file given by @path was not found, -ENOENT will be returned, but if + * the HCB was not found, this funciton returns -ENOENT_HCB instead to indicate + * so. */ static int hcb_get(const char *path, struct hcb *cb) { @@ -428,7 +458,7 @@ return 0; } -/* +/** * hcb_put - release HCB * @cb: data * @@ -443,7 +473,7 @@ close(cb->fd); } -/* +/** * hcb_deref - dereference an S_IFHARDLNK HCB * @cb: data * @@ -499,7 +529,7 @@ return 0; } -/* +/** * hcb_get_deref - shortcut for hcb_get()+hcb_deref() * @path: virtual path * @cb: destination structure @@ -518,7 +548,7 @@ return 0; } -/* +/** * hcb_update - write HCB * @cb: data * @@ -548,7 +578,7 @@ return ret; } -/* +/** * hcb_lookup - shortcut for hcb_get()+hcb_put() * @path: virtual path * @cb: destination structure @@ -566,7 +596,7 @@ return 0; } -/* +/** * hcb_lookup_deref - shortcut for hcb_get_deref()+hcb_put() * @path: virtual path * @cb: destination structure @@ -584,7 +614,7 @@ return 0; } -/* +/** * hcb_lookup_readdir - * @dir: working directory * @name: file @@ -639,7 +669,7 @@ return is_resv_name(file); } -/* +/** * supports_owners - check whether @path can do that * @path: path to existing file * @uid: uid to change to (used for figuring out) @@ -711,7 +741,7 @@ return __supports_owners(path, uid, gid, restore); } -/* +/** * supports_permissions - check whether @path can do that * @path: existing path to file * @@ -747,6 +777,14 @@ return __supports_permissions(path); } +/** + * @read_ptr: original to-disk filename + * + * Encode all the special characters that are invalid to use on VFAT by + * substituting each by "%(xx)", where xx is the textual hexadecimal + * representation. Returns a pointer to an allocated memory block containing + * the encoded result. + */ static char *xfrm_to_disk(const char *read_ptr) { unsigned int needed = 0; @@ -801,6 +839,12 @@ ['C'] = 12, ['D'] = 13, ['E'] = 14, ['F'] = 15, }; +/** + * @read_ptr: original on-disk filename + * + * Decode a name that has the %(xx) special sequences in it and return a + * pointer to an allocated memory block with the result. + */ static char *xfrm_from_disk(const char *read_ptr) { const char *seek_ptr = read_ptr, *next; @@ -842,8 +886,8 @@ ret = hcb_get_deref(path, &info); if (ret == -ENOENT_HCB) { if (supports_permissions(path)) - XRET(fchmodat(root_fd, at(path), mode, - AT_SYMLINK_NOFOLLOW)); + return retcode_int(fchmodat(root_fd, at(path), mode, + AT_SYMLINK_NOFOLLOW)); if ((ret = hcb_new(path, &info, 1)) < 0) return ret; /* nlink already set (hcb_new() stat'ed @path) */ @@ -873,8 +917,8 @@ ret = hcb_get_deref(path, &info); if (ret == -ENOENT_HCB) { if (supports_owners(path, uid, gid, false)) - XRET(fchownat(root_fd, at(path), uid, gid, - AT_SYMLINK_NOFOLLOW)); + return retcode_int(fchownat(root_fd, at(path), uid, + gid, AT_SYMLINK_NOFOLLOW)); if ((ret = hcb_new(path, &info, 1)) < 0) return ret; /* nlink already set (hcb_new() stat'ed @path) */ @@ -899,7 +943,7 @@ static int posixovl_close(const char *path, struct fuse_file_info *filp) { - XRET(close(filp->fh)); + return retcode_int(close(filp->fh)); } static __attribute__((pure)) bool could_be_too_long(const char *path) @@ -908,7 +952,7 @@ return strlen(path) + 1 + HCB_PREFIX_LEN >= PATH_MAX; } -/* +/** * parent_owner_match - * @path: path, of which the parent is to be checked * @uid: uid to test @@ -985,10 +1029,10 @@ static int posixovl_ftruncate(const char *path, off_t length, struct fuse_file_info *filp) { - XRET(ftruncate(filp->fh, length)); + return retcode_int(ftruncate(filp->fh, length)); } -/* +/** * hl_demote - collapse S_IFHARDLNK into normal file * @l0_file: * @l0_hcb: @@ -1026,7 +1070,7 @@ return ret; } -/* +/** * hl_try_demote - try to collapse a one-link hardlink net into one file * @path: real path * @@ -1082,7 +1126,7 @@ static int posixovl_getxattr(const char *path, const char *name, char *value, size_t size) { - XRET(lgetxattr(at(path), name, value, size)); + return retcode_int(lgetxattr(at(path), name, value, size)); } static int posixovl1_fgetattr(const char *path, struct stat *sb, @@ -1106,8 +1150,44 @@ return NULL; } -/* - * hl_promote - transform file into hardlink master +static int posixovl_fcopy(int dfd, const char *source) +{ + int sfd = open(source, O_RDONLY); + ssize_t ret; + char buffer[65536]; + + if (sfd < 0) + return -errno; + while ((ret = read(sfd, buffer, sizeof(buffer))) > 0) + if (write(dfd, buffer, ret) < 0) { + ret = -errno; + break; + } + return ret; +} + +/** + * The size of the inode type may be larger than that of the type that rand() + * returns, so call rand() as often as needed to fill all bits. + * Minus 1 is used because it may be a signed integer whose sign is never set. + * So in the usual case of ino_t being 64 bit and int being 32 bit, we will + * call rand() thrice. + */ +static ino_t make_inum(void) +{ + static const unsigned int advance = + sizeof(__typeof__(rand())) * CHAR_BIT - 1; + ino_t ino = 0; + + for (unsigned int b = 0; b < sizeof(ino) * CHAR_BIT; b += advance) { + ino <<= advance; + ino ^= rand(); + } + return ino; +} + +/** + * hl_promote - transform state 0/1 file into hardlink master (state 2) * @l0_path: path to real file * @orig_info: L0 HCB * @l0_hcb_exists: what it says @@ -1128,13 +1208,13 @@ */ work_sb.st_ino = orig_info->sb.st_ino; do { - snprintf(l1_path, sizeof(l1_path), "/" HL_DNODE_PREFIX "%lu", + snprintf(l1_path, sizeof(l1_path), "/" HL_DNODE_PREFIX "%lx", static_cast(unsigned long, work_sb.st_ino)); - snprintf(l1_hcb, sizeof(l1_hcb), "/" HL_INODE_PREFIX "%lu", + snprintf(l1_hcb, sizeof(l1_hcb), "/" HL_INODE_PREFIX "%lx", static_cast(unsigned long, work_sb.st_ino)); if (fstatat(root_fd, at(l1_path), &work_sb, AT_SYMLINK_NOFOLLOW) == 0) { - work_sb.st_ino = rand(); + work_sb.st_ino = make_inum(); continue; } if (errno == ENOENT) @@ -1178,7 +1258,8 @@ ret = -errno; goto out3; } - + if (hardlink_with_copy) + posixovl_fcopy(fd, new_info.ll.new_target); close(fd); return 0; @@ -1192,7 +1273,7 @@ return ret; } -/* +/** * hl_up_nlink - increase nlink count of hardlink master * @l1_path: name of the L1 file * (Could have used the L0 file, but using L1 saves a derefernce, @@ -1212,7 +1293,7 @@ return hcb_update(&cb); } -/* +/** * hl_drop - drop nlink count of hardlink master * @l1_path: name of the L1 file * @@ -1246,12 +1327,10 @@ return hcb_update(&cb); } -/* - * hl_instantiate - +/** + * hl_instantiate - make (another) hardlink * @oldpath: * @newpath: - * - * This is perhaps the most expensive operation among all. */ static int hl_instantiate(const char *oldpath, const char *newpath) { @@ -1263,12 +1342,13 @@ if (ret == -ENOENT_HCB || (ret == 0 && !S_ISHARDLNK(cb_old.ll.mode))) { /* * If no HCB attached or if not a hardlink slave... + * Transform file from state 0/1 to 2. */ if ((ret = hl_promote(oldpath, &cb_old, ret != -ENOENT_HCB)) < 0) goto unlock_and_out; /* - * Relookup to get the L1 file path + * Relookup to get the dnode file path */ if ((ret = hcb_lookup(oldpath, &cb_old)) < 0) goto unlock_and_out; @@ -1297,7 +1377,8 @@ ret = -errno; goto out2; } - + if (hardlink_with_copy) + posixovl_fcopy(fd, cb_new.ll.new_target); close(fd); return 0; @@ -1350,7 +1431,7 @@ static int posixovl_listxattr(const char *path, char *list, size_t size) { - XRET(llistxattr(at(path), list, size)); + return retcode_int(llistxattr(at(path), list, size)); } static int posixovl_mkdir(const char *path, mode_t mode) @@ -1489,7 +1570,7 @@ static int posixovl_read(const char *path, char *buffer, size_t size, off_t offset, struct fuse_file_info *filp) { - XRET(pread(filp->fh, buffer, size, offset)); + return retcode_ssize(pread(filp->fh, buffer, size, offset)); } static int posixovl_readdir(const char *path, void *buffer, @@ -1575,7 +1656,7 @@ static int posixovl_removexattr(const char *path, const char *name) { - XRET(lremovexattr(path, name)); + return retcode_int(lremovexattr(path, name)); } static int posixovl_rename(const char *oldpath, const char *newpath) @@ -1593,7 +1674,8 @@ ret = hcb_lookup(oldpath, &old_info); if (ret == -ENOENT_HCB || S_ISDIR(old_info.sb.st_mode)) - XRET(renameat(root_fd, at(oldpath), root_fd, at(newpath))); + return retcode_int(renameat(root_fd, at(oldpath), + root_fd, at(newpath))); else if (ret < 0) return ret; @@ -1645,7 +1727,7 @@ ret = hcb_lookup(path, &info); if (ret == 0 && unlinkat(root_fd, at(info.path), 0) < 0) return -errno; - XRET(unlinkat(root_fd, at(path), AT_REMOVEDIR)); + return retcode_int(unlinkat(root_fd, at(path), AT_REMOVEDIR)); } static int posixovl1_rmdir(const char *path) @@ -1659,7 +1741,7 @@ static int posixovl_setxattr(const char *path, const char *name, const char *value, size_t size, int flags) { - XRET(lsetxattr(at(path), name, value, size, flags)); + return retcode_int(lsetxattr(at(path), name, value, size, flags)); } static int posixovl_statfs(const char *path, struct statvfs *sb) @@ -1781,7 +1863,7 @@ /* * Need to unlink the real file first so that the potential case - * "HCB non-existant but real file existant" does not happen in + * "HCB non-existent but real file existent" does not happen in * readdir(). */ h_ret = hcb_lookup(path, &info); @@ -1850,8 +1932,7 @@ else ret = utimensat(root_fd, at(path), ts, AT_SYMLINK_NOFOLLOW); #endif - - XRET(ret); + return retcode_int(ret); } static int posixovl1_utimens(const char *path, const struct timespec *ts) @@ -1865,7 +1946,7 @@ static int posixovl_write(const char *path, const char *buffer, size_t size, off_t offset, struct fuse_file_info *filp) { - XRET(pwrite(filp->fh, buffer, size, offset)); + return retcode_ssize(pwrite(filp->fh, buffer, size, offset)); } static bool user_allow_other(void) @@ -1921,7 +2002,7 @@ static void usage(const char *p) { fprintf(stderr, - "Usage: %s [-F] [-S source] mountpoint [-- fuseoptions]\n", p); + "Usage: %s [-FH] [-S source] mountpoint [-- fuseoptions]\n", p); exit(EXIT_FAILURE); } @@ -1931,7 +2012,7 @@ int new_argc = 0, original_wd, c; char xargs[256]; - while ((c = getopt(argc, argv, "1FS:")) > 0) { + while ((c = getopt(argc, argv, "1FHS:")) > 0) { switch (c) { case '1': single_threaded = true; @@ -1939,6 +2020,9 @@ case 'F': assume_vfat = true; break; + case 'H': + hardlink_with_copy = true; + break; case 'S': root_dir = optarg; break; @@ -1986,6 +2070,6 @@ new_argv[new_argc] = NULL; c = fuse_main(new_argc, (char **)new_argv, &posixovl_ops, NULL); if (fchdir(original_wd) < 0) - /* ignore */; + /* ignore */{} return c; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/posixovl/socket.c new/posixovl-1.3/socket.c --- old/posixovl/socket.c 2011-04-17 03:28:27.000000000 +0200 +++ new/posixovl-1.3/socket.c 2018-09-20 10:41:18.000000000 +0200 @@ -1,3 +1,5 @@ +/* Program that exercises filesystem socket dentries to see if posixovl + * properly deals with these. */ #include <sys/socket.h> #include <sys/stat.h> #include <sys/types.h> ++++++ posixovl.keyring ++++++ --- /var/tmp/diff_new_pack.4nDqFB/_old 2018-09-24 13:12:15.913811650 +0200 +++ /var/tmp/diff_new_pack.4nDqFB/_new 2018-09-24 13:12:15.917811643 +0200 @@ -1,168 +1,85 @@ -pub 1024D/844C4360 2006-07-11 [expires: 2011-07-10] -uid Jan Engelhardt <[email protected]> -sub 4096g/84229FC4 2006-07-11 [expires: 2011-07-10] - -pub 4096R/19FC338D 2011-05-09 [expires: 2016-05-07] -uid Jan Engelhardt <[email protected]> -sub 4096R/C66DD881 2011-05-09 [expires: 2016-05-07] -sub 4096g/34C483D3 2011-05-09 [expires: 2016-05-07] -sub 3072D/68A20E45 2011-05-09 [expires: 2016-05-07] - -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v2.0.19 (GNU/Linux) -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 -=Kn2C +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 +cCAy +=ePMx -----END PGP PUBLIC KEY BLOCK-----
