Compare commits
No commits in common. "master" and "65418e9b6be4d59aa0b07636a97ed2b52c2130d4" have entirely different histories.
master
...
65418e9b6b
64
README.md
64
README.md
@ -1,56 +1,22 @@
|
||||
# rm_
|
||||
代替rm命令防止错误删除文件
|
||||
基于coreutils-9.1 mv源代码
|
||||
基于coreutils-8.32 mv源代码
|
||||
|
||||
# Build
|
||||
git clone https://git.aixiao.me/aixiao/rm_
|
||||
git clone https://github.com/niuyuling/rm_.git
|
||||
cd rm_
|
||||
bash build.sh
|
||||
apt-get build-dep coreutils
|
||||
bash build_mv.sh
|
||||
|
||||
# Help Information
|
||||
root@NIUYULING:/mnt/c/Users/niuyuling/Desktop/rm_# ./rm_ --help
|
||||
Usage: ./rm_ [OPTION]... [-T] SOURCE DEST
|
||||
or: ./rm_ [OPTION]... SOURCE... DIRECTORY
|
||||
or: ./rm_ [OPTION]... -t DIRECTORY SOURCE...
|
||||
Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
|
||||
|
||||
Mandatory arguments to long options are mandatory for short options too.
|
||||
--backup[=CONTROL] make a backup of each existing destination file
|
||||
-b like --backup but does not accept an argument
|
||||
-f, --force do not prompt before overwriting
|
||||
-i, --interactive prompt before overwrite
|
||||
-n, --no-clobber do not overwrite an existing file
|
||||
If you specify more than one of -i, -f, -n, only the final one takes effect.
|
||||
--strip-trailing-slashes remove any trailing slashes from each SOURCE
|
||||
argument
|
||||
-S, --suffix=SUFFIX override the usual backup suffix
|
||||
-t, --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY
|
||||
-T, --no-target-directory treat DEST as a normal file
|
||||
-u, --update move only when the SOURCE file is newer
|
||||
than the destination file or when the
|
||||
destination file is missing
|
||||
-v, --verbose explain what is being done
|
||||
-Z, --context set SELinux security context of destination
|
||||
file to default type
|
||||
--help display this help and exit
|
||||
--version output version information and exit
|
||||
|
||||
Instead of rm command to prevent mistaken deletion of files
|
||||
Author: aixiao@aixiao.me
|
||||
|
||||
代替rm命令,以防止错误删除文件
|
||||
作者: aixiao@aixiao.me
|
||||
|
||||
The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
|
||||
The version control method may be selected via the --backup option or through
|
||||
the VERSION_CONTROL environment variable. Here are the values:
|
||||
|
||||
none, off never make backups (even if --backup is given)
|
||||
numbered, t make numbered backups
|
||||
existing, nil numbered if numbered backups exist, simple otherwise
|
||||
simple, never always make simple backups
|
||||
|
||||
GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
|
||||
Report any translation bugs to <https://translationproject.org/team/>
|
||||
Full documentation <https://www.gnu.org/software/coreutils/mv>
|
||||
or available locally via: info '(coreutils) mv invocation'
|
||||
root@niuyuling:/mnt/c/Users/niuyuling/Desktop/Arm-tool# rm_ busybox-1.31.1
|
||||
rm_
|
||||
busybox-1.31.1
|
||||
/tmp/
|
||||
3
|
||||
root@niuyuling:/mnt/c/Users/niuyuling/Desktop/Arm-tool#
|
||||
|
||||
#支持配置文件
|
||||
root@NIUYULING:/mnt/c/Users/niuyuling/Desktop/rm_# cat /etc/rm_.conf
|
||||
/opt/
|
||||
root@NIUYULING:/mnt/c/Users/niuyuling/Desktop/rm_#
|
141
build.sh
141
build.sh
@ -1,141 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Build MV command
|
||||
# Based on coreutils-9.1
|
||||
# Test System: Debian GNU/Linux bookworm/sid (WSL)
|
||||
#
|
||||
|
||||
init()
|
||||
{
|
||||
SHELL_FOLDER=$(dirname $(readlink -f "$0"));
|
||||
CC=${CROSS_COMPILE}gcc
|
||||
AR=${CROSS_COMPILE}ar
|
||||
STRIP=${CROSS_COMPILE}strip
|
||||
}
|
||||
|
||||
check_os()
|
||||
{
|
||||
if test -f /etc/debian_version ; then
|
||||
OS=debian
|
||||
OS_VER=$(cat /etc/debian_version)
|
||||
echo -e SYSTEM: DEBIAN $(uname -m) ${OS_VER}\\nKERNEL: $(uname -sr)
|
||||
apt-get build-dep coreutils
|
||||
else
|
||||
echo "Only supports Debian system build source code!";
|
||||
exit 3
|
||||
fi
|
||||
}
|
||||
|
||||
build_lib()
|
||||
{
|
||||
S=(lib/copy-acl.c lib/set-acl.c lib/acl-errno-valid.c lib/acl-internal.c lib/get-permissions.c lib/set-permissions.c lib/alignalloc.c lib/allocator.c lib/areadlink.c lib/areadlink-with-size.c lib/areadlinkat.c lib/areadlinkat-with-size.c lib/argmatch.c lib/argv-iter.c lib/openat-proc.c lib/backupfile.c lib/backup-rename.c lib/backupfile.c lib/backup-find.c lib/base32.c lib/base64.c lib/basename-lgpl.c lib/binary-io.c lib/bitrotate.c lib/buffer-lcm.c lib/c-ctype.c lib/c-strcasecmp.c lib/c-strncasecmp.c lib/c-strtod.c lib/c-strtold.c lib/canon-host.c lib/canonicalize.c lib/careadlinkat.c lib/chdir-long.c lib/chmodat.c lib/chownat.c lib/cl-strtod.c lib/cl-strtold.c lib/cloexec.c lib/close-stream.c lib/closein.c lib/closeout.c lib/count-leading-zeros.c lib/af_alg.c lib/md5-stream.c lib/md5.c lib/sha1-stream.c lib/sha1.c lib/sha256-stream.c lib/sha256.c lib/sha512-stream.c lib/sha512.c lib/sm3-stream.c lib/sm3.c lib/cycle-check.c lib/di-set.c lib/opendir-safer.c lib/dirname.c lib/basename.c lib/dirname-lgpl.c lib/stripslash.c lib/dtoastr.c lib/dtotimespec.c lib/malloc/dynarray_at_failure.c lib/malloc/dynarray_emplace_enlarge.c lib/malloc/dynarray_finalize.c lib/malloc/dynarray_resize.c lib/malloc/dynarray_resize_clear.c lib/exclude.c lib/exitfail.c lib/fadvise.c lib/fchmodat.c lib/fclose.c lib/fcntl.c lib/creat-safer.c lib/open-safer.c lib/fd-hook.c lib/fd-reopen.c lib/fd-safer-flag.c lib/dup-safer-flag.c lib/fdutimensat.c lib/fflush.c lib/file-has-acl.c lib/file-set.c lib/file-type.c lib/filemode.c lib/filenamecat.c lib/filenamecat-lgpl.c lib/filevercmp.c lib/fopen-safer.c lib/fprintftime.c lib/fpurge.c lib/freadahead.c lib/freading.c lib/freadptr.c lib/freadseek.c lib/freopen-safer.c lib/fseek.c lib/fseeko.c lib/fseterr.c lib/fsusage.c lib/ftoastr.c lib/fts.c lib/full-read.c lib/full-write.c lib/gethrxtime.c lib/xtime.c lib/getndelim2.c lib/getprogname.c lib/gettime.c lib/gettime-res.c lib/getugroups.c lib/hard-locale.c lib/hash.c lib/hash-pjw.c lib/hash-triple.c lib/hash-triple-simple.c lib/heap.c lib/human.c lib/i-ring.c lib/ialloc.c lib/idcache.c lib/ino-map.c lib/imaxtostr.c lib/inttostr.c lib/offtostr.c lib/uinttostr.c lib/umaxtostr.c lib/isapipe.c lib/ldtoastr.c lib/linebuffer.c lib/localcharset.c lib/glthread/lock.c lib/long-options.c lib/malloca.c lib/math.c lib/mbchar.c lib/mbiter.c lib/mbrlen.c lib/mbrtowc.c lib/mbsalign.c lib/mbscasecmp.c lib/mbschr.c lib/mbslen.c lib/mbsstr.c lib/mbswidth.c lib/mbuiter.c lib/memcasecmp.c lib/memchr2.c lib/memcmp2.c lib/memcoll.c lib/mgetgroups.c lib/mkancesdirs.c lib/dirchownmod.c lib/mkdir-p.c lib/mknod.c lib/mkstemp.c lib/modechange.c lib/mountlist.c lib/mpsort.c lib/nanosleep.c lib/nproc.c lib/nstrftime.c lib/obstack.c lib/openat-die.c lib/openat-safer.c lib/opendirat.c lib/parse-datetime.c lib/physmem.c lib/pipe2.c lib/posixtm.c lib/posixver.c lib/printf-frexp.c lib/printf-frexpl.c lib/priv-set.c lib/progname.c lib/propername.c lib/qcopy-acl.c lib/qset-acl.c lib/quotearg.c lib/randint.c lib/randperm.c lib/randread.c lib/rand-isaac.c lib/read-file.c lib/readtokens.c lib/readtokens0.c lib/readutmp.c lib/regex.c lib/renameatu.c lib/root-dev-ino.c lib/safe-read.c lib/safe-write.c lib/same.c lib/save-cwd.c lib/savedir.c lib/savewd.c lib/malloc/scratch_buffer_dupfree.c lib/malloc/scratch_buffer_grow.c lib/malloc/scratch_buffer_grow_preserve.c lib/malloc/scratch_buffer_set_array_size.c lib/selinux-at.c lib/getfilecon.c lib/se-context.c lib/se-label.c lib/se-selinux.c lib/setlocale_null.c lib/settime.c lib/sig2str.c lib/sig-handler.c lib/sockets.c lib/stat-time.c lib/mkstemp-safer.c lib/striconv.c lib/strnlen1.c lib/strintcmp.c lib/strnumcmp.c lib/sys_socket.c lib/targetdir.c lib/tempname.c lib/glthread/threadlib.c lib/time_rz.c lib/timegm.c lib/timespec.c lib/glthread/tls.c lib/trim.c lib/u64.c lib/unicodeio.c lib/unistd.c lib/dup-safer.c lib/fd-safer.c lib/pipe-safer.c lib/unistr/u8-mbtoucr.c lib/unistr/u8-uctomb.c lib/unistr/u8-uctomb-aux.c lib/uniwidth/width.c lib/unlinkdir.c lib/userspec.c lib/utimecmp.c lib/utimens.c lib/verror.c lib/version-etc.c lib/version-etc-fsf.c lib/wctype-h.c lib/write-any-file.c lib/xalignalloc.c lib/xmalloc.c lib/xalloc-die.c lib/xbinary-io.c lib/xdectoimax.c lib/xdectoumax.c lib/xfts.c lib/xgetcwd.c lib/xgetgroups.c lib/xgethostname.c lib/xmemcoll.c lib/xnanosleep.c lib/xprintf.c lib/xreadlink.c lib/xsize.c lib/xstriconv.c lib/xstrtod.c lib/xstrtoimax.c lib/xstrtol.c lib/xstrtoul.c lib/xstrtol-error.c lib/xstrtold.c lib/xstrtoumax.c lib/xvasprintf.c lib/xasprintf.c lib/yesno.c lib/asnprintf.c lib/mktime.c lib/printf-args.c lib/printf-parse.c lib/vasnprintf.c)
|
||||
O="lib/copy-acl.o lib/set-acl.o lib/acl-errno-valid.o lib/acl-internal.o lib/get-permissions.o lib/set-permissions.o lib/alignalloc.o lib/allocator.o lib/areadlink.o lib/areadlink-with-size.o lib/areadlinkat.o lib/areadlinkat-with-size.o lib/argmatch.o lib/argv-iter.o lib/openat-proc.o lib/backupfile.o lib/backup-rename.o lib/backupfile.o lib/backup-find.o lib/base32.o lib/base64.o lib/basename-lgpl.o lib/binary-io.o lib/bitrotate.o lib/buffer-lcm.o lib/c-ctype.o lib/c-strcasecmp.o lib/c-strncasecmp.o lib/c-strtod.o lib/c-strtold.o lib/canon-host.o lib/canonicalize.o lib/careadlinkat.o lib/chdir-long.o lib/chmodat.o lib/chownat.o lib/cl-strtod.o lib/cl-strtold.o lib/cloexec.o lib/close-stream.o lib/closein.o lib/closeout.o lib/count-leading-zeros.o lib/af_alg.o lib/md5-stream.o lib/md5.o lib/sha1-stream.o lib/sha1.o lib/sha256-stream.o lib/sha256.o lib/sha512-stream.o lib/sha512.o lib/sm3-stream.o lib/sm3.o lib/cycle-check.o lib/di-set.o lib/opendir-safer.o lib/dirname.o lib/basename.o lib/dirname-lgpl.o lib/stripslash.o lib/dtoastr.o lib/dtotimespec.o lib/malloc/dynarray_at_failure.o lib/malloc/dynarray_emplace_enlarge.o lib/malloc/dynarray_finalize.o lib/malloc/dynarray_resize.o lib/malloc/dynarray_resize_clear.o lib/exclude.o lib/exitfail.o lib/fadvise.o lib/fchmodat.o lib/fclose.o lib/fcntl.o lib/creat-safer.o lib/open-safer.o lib/fd-hook.o lib/fd-reopen.o lib/fd-safer-flag.o lib/dup-safer-flag.o lib/fdutimensat.o lib/fflush.o lib/file-has-acl.o lib/file-set.o lib/file-type.o lib/filemode.o lib/filenamecat.o lib/filenamecat-lgpl.o lib/filevercmp.o lib/fopen-safer.o lib/fprintftime.o lib/fpurge.o lib/freadahead.o lib/freading.o lib/freadptr.o lib/freadseek.o lib/freopen-safer.o lib/fseek.o lib/fseeko.o lib/fseterr.o lib/fsusage.o lib/ftoastr.o lib/fts.o lib/full-read.o lib/full-write.o lib/gethrxtime.o lib/xtime.o lib/getndelim2.o lib/getprogname.o lib/gettime.o lib/gettime-res.o lib/getugroups.o lib/hard-locale.o lib/hash.o lib/hash-pjw.o lib/hash-triple.o lib/hash-triple-simple.o lib/heap.o lib/human.o lib/i-ring.o lib/ialloc.o lib/idcache.o lib/ino-map.o lib/imaxtostr.o lib/inttostr.o lib/offtostr.o lib/uinttostr.o lib/umaxtostr.o lib/isapipe.o lib/ldtoastr.o lib/linebuffer.o lib/localcharset.o lib/glthread/lock.o lib/long-options.o lib/malloca.o lib/math.o lib/mbchar.o lib/mbiter.o lib/mbrlen.o lib/mbrtowc.o lib/mbsalign.o lib/mbscasecmp.o lib/mbschr.o lib/mbslen.o lib/mbsstr.o lib/mbswidth.o lib/mbuiter.o lib/memcasecmp.o lib/memchr2.o lib/memcmp2.o lib/memcoll.o lib/mgetgroups.o lib/mkancesdirs.o lib/dirchownmod.o lib/mkdir-p.o lib/mknod.o lib/mkstemp.o lib/modechange.o lib/mountlist.o lib/mpsort.o lib/nanosleep.o lib/nproc.o lib/nstrftime.o lib/obstack.o lib/openat-die.o lib/openat-safer.o lib/opendirat.o lib/parse-datetime.o lib/physmem.o lib/pipe2.o lib/posixtm.o lib/posixver.o lib/printf-frexp.o lib/printf-frexpl.o lib/priv-set.o lib/progname.o lib/propername.o lib/qcopy-acl.o lib/qset-acl.o lib/quotearg.o lib/randint.o lib/randperm.o lib/randread.o lib/rand-isaac.o lib/read-file.o lib/readtokens.o lib/readtokens0.o lib/readutmp.o lib/regex.o lib/renameatu.o lib/root-dev-ino.o lib/safe-read.o lib/safe-write.o lib/same.o lib/save-cwd.o lib/savedir.o lib/savewd.o lib/malloc/scratch_buffer_dupfree.o lib/malloc/scratch_buffer_grow.o lib/malloc/scratch_buffer_grow_preserve.o lib/malloc/scratch_buffer_set_array_size.o lib/selinux-at.o lib/getfilecon.o lib/se-context.o lib/se-label.o lib/se-selinux.o lib/setlocale_null.o lib/settime.o lib/sig2str.o lib/sig-handler.o lib/sockets.o lib/stat-time.o lib/mkstemp-safer.o lib/striconv.o lib/strnlen1.o lib/strintcmp.o lib/strnumcmp.o lib/sys_socket.o lib/targetdir.o lib/tempname.o lib/glthread/threadlib.o lib/time_rz.o lib/timegm.o lib/timespec.o lib/glthread/tls.o lib/trim.o lib/u64.o lib/unicodeio.o lib/unistd.o lib/dup-safer.o lib/fd-safer.o lib/pipe-safer.o lib/unistr/u8-mbtoucr.o lib/unistr/u8-uctomb.o lib/unistr/u8-uctomb-aux.o lib/uniwidth/width.o lib/unlinkdir.o lib/userspec.o lib/utimecmp.o lib/utimens.o lib/verror.o lib/version-etc.o lib/version-etc-fsf.o lib/wctype-h.o lib/write-any-file.o lib/xalignalloc.o lib/xmalloc.o lib/xalloc-die.o lib/xbinary-io.o lib/xdectoimax.o lib/xdectoumax.o lib/xfts.o lib/xgetcwd.o lib/xgetgroups.o lib/xgethostname.o lib/xmemcoll.o lib/xnanosleep.o lib/xprintf.o lib/xreadlink.o lib/xsize.o lib/xstriconv.o lib/xstrtod.o lib/xstrtoimax.o lib/xstrtol.o lib/xstrtoul.o lib/xstrtol-error.o lib/xstrtold.o lib/xstrtoumax.o lib/xvasprintf.o lib/xasprintf.o lib/yesno.o lib/asnprintf.o lib/mktime.o lib/printf-args.o lib/printf-parse.o lib/vasnprintf.o"
|
||||
|
||||
for i in ${S[@]}; do
|
||||
echo $i
|
||||
o=$(echo $i | sed 's/\.c/\.o/');
|
||||
echo $o;
|
||||
${CC} -I. -I./lib -Ilib -I./lib -g -O2 -c -o ${o} ${i}
|
||||
done
|
||||
|
||||
${AR} cr lib/libcoreutils.a ${O};
|
||||
}
|
||||
|
||||
build_mv()
|
||||
{
|
||||
|
||||
${CC} -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -c -o src/version.o src/version.c
|
||||
${AR} cr src/libver.a src/version.o
|
||||
|
||||
${CC} -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -c -o src/remove.o src/remove.c
|
||||
${CC} -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -c -o src/copy.o src/copy.c
|
||||
${CC} -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -c -o src/cp-hash.o src/cp-hash.c
|
||||
${CC} -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -c -o src/force-link.o src/force-link.c
|
||||
${CC} -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -c -o src/selinux.o src/selinux.c
|
||||
${CC} -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -c -o src/mv.o src/mv.c
|
||||
|
||||
|
||||
${CC} -g -O2 -Wl,--as-needed -o src/mv src/mv.o src/remove.o src/copy.o src/cp-hash.o src/force-link.o src/selinux.o src/libver.a \
|
||||
lib/libcoreutils.a lib/libcoreutils.a -lselinux -lacl -lattr -pthread -lpcre2-8 -ldl -static
|
||||
|
||||
mv src/mv ./rm_
|
||||
$STRIP ./rm_
|
||||
}
|
||||
|
||||
installbin_()
|
||||
{
|
||||
wget --no-check-certificate -O /bin/rm_ https://git.aixiao.me/attachments/aa26219b-868d-4eb4-a8e0-b1b04da7d964
|
||||
chmod a+x /bin/rm_
|
||||
}
|
||||
|
||||
install_() {
|
||||
cp rm_ /bin/
|
||||
}
|
||||
|
||||
uninstall_() {
|
||||
rm /bin/rm_
|
||||
}
|
||||
|
||||
help_() {
|
||||
cat << EOF
|
||||
Usage:
|
||||
${0} [-x] [installbin|install|uninstall|build|clean].
|
||||
parameter:
|
||||
-x : print debug.
|
||||
|
||||
Option:
|
||||
installbin : download bin.
|
||||
install : install bin.
|
||||
uninstall : uninstall bin.
|
||||
build : build project.
|
||||
clean : clean project.
|
||||
|
||||
EOF
|
||||
exit 1;
|
||||
}
|
||||
|
||||
|
||||
while getopts :x arg; do
|
||||
case ${arg} in
|
||||
x)
|
||||
debug=x;
|
||||
;;
|
||||
*)
|
||||
help_;
|
||||
;;
|
||||
esac
|
||||
|
||||
done
|
||||
shift $((OPTIND-1)); #参数移位
|
||||
test "${debug}" = "x" && set -x;
|
||||
|
||||
init
|
||||
case $1 in
|
||||
"install")
|
||||
install_;
|
||||
;;
|
||||
"uninstall")
|
||||
uninstall_;
|
||||
;;
|
||||
"build")
|
||||
check_os
|
||||
build_lib;
|
||||
build_mv;
|
||||
;;
|
||||
"clean")
|
||||
rm `find . \( -name "*.a" -o -name "*.o" \) | xargs `
|
||||
rm -rf rm_
|
||||
exit 0;
|
||||
;;
|
||||
"installbin")
|
||||
installbin_
|
||||
;;
|
||||
*)
|
||||
help_;
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
exit 0
|
||||
by aixiao@aixiao.me
|
||||
20220728
|
57
build_mv.sh
Normal file
57
build_mv.sh
Normal file
@ -0,0 +1,57 @@
|
||||
#!/bin/bsh
|
||||
#
|
||||
# Build MV command
|
||||
# based on coreutils-8.32
|
||||
#
|
||||
|
||||
function init() {
|
||||
SHELL_FOLDER=$(dirname $(readlink -f "$0"));
|
||||
set -x
|
||||
}
|
||||
|
||||
function LIB() {
|
||||
S=(copy-acl.c set-acl.c acl-errno-valid.c acl-internal.c get-permissions.c set-permissions.c allocator.c areadlink.c areadlink-with-size.c areadlinkat.c argmatch.c argv-iter.c openat-proc.c backupfile.c backup-rename.c backupfile.c backup-find.c base32.c base64.c binary-io.c bitrotate.c buffer-lcm.c c-ctype.c c-strcasecmp.c c-strncasecmp.c c-strtod.c c-strtold.c canon-host.c canonicalize.c careadlinkat.c chmodat.c chownat.c cl-strtod.c cl-strtold.c cloexec.c close-stream.c closein.c closeout.c count-leading-zeros.c af_alg.c md5.c sha1.c sha256.c sha512.c cycle-check.c di-set.c diacrit.c opendir-safer.c dirname.c basename.c dirname-lgpl.c basename-lgpl.c stripslash.c dtoastr.c dtotimespec.c exclude.c exitfail.c fadvise.c creat-safer.c open-safer.c fd-hook.c fd-reopen.c fd-safer-flag.c dup-safer-flag.c fdutimensat.c file-has-acl.c file-set.c file-type.c filemode.c filenamecat.c filenamecat-lgpl.c filevercmp.c fopen-safer.c fprintftime.c freading.c freadseek.c freopen-safer.c ftoastr.c full-read.c full-write.c gethrxtime.c xtime.c getndelim2.c getprogname.c gettime.c getugroups.c hard-locale.c hash.c hash-pjw.c hash-triple.c heap.c human.c i-ring.c idcache.c ino-map.c imaxtostr.c inttostr.c offtostr.c uinttostr.c umaxtostr.c ldtoastr.c linebuffer.c localcharset.c glthread/lock.c long-options.c malloca.c math.c mbchar.c mbiter.c mbsalign.c mbscasecmp.c mbschr.c mbslen.c mbsstr.c mbswidth.c mbuiter.c memcasecmp.c memchr2.c memcmp2.c memcoll.c mgetgroups.c mkancesdirs.c dirchownmod.c mkdir-p.c modechange.c mpsort.c nproc.c nstrftime.c openat-die.c openat-safer.c opendirat.c parse-datetime.c physmem.c pipe2.c posixtm.c posixver.c printf-frexp.c printf-frexpl.c priv-set.c progname.c propername.c qcopy-acl.c qset-acl.c quotearg.c randint.c randperm.c randread.c rand-isaac.c read-file.c readtokens.c readtokens0.c renameatu.c root-dev-ino.c safe-read.c safe-write.c same.c save-cwd.c savedir.c savewd.c selinux-at.c se-context.c se-selinux.c setlocale_null.c settime.c sig-handler.c sockets.c stat-time.c statat.c mkstemp-safer.c striconv.c strnlen1.c strintcmp.c strnumcmp.c sys_socket.c tempname.c glthread/threadlib.c timespec.c glthread/tls.c trim.c u64.c unicodeio.c unistd.c dup-safer.c fd-safer.c pipe-safer.c unistr/u8-mbtoucr.c unistr/u8-uctomb.c unistr/u8-uctomb-aux.c uniwidth/width.c unlinkdir.c userspec.c utimecmp.c utimens.c verror.c version-etc.c version-etc-fsf.c wctype-h.c write-any-file.c xmalloc.c xalloc-die.c xbinary-io.c xdectoimax.c xdectoumax.c xfts.c xgetcwd.c xgetgroups.c xgethostname.c xmemcoll.c xnanosleep.c xprintf.c xreadlink.c xsize.c xstriconv.c xstrndup.c xstrtod.c xstrtoimax.c xstrtol.c xstrtoul.c xstrtol-error.c xstrtold.c xstrtoumax.c xvasprintf.c xasprintf.c yesno.c asnprintf.c chdir-long.c fchmodat.c fclose.c fcntl.c fflush.c fpurge.c freadahead.c freadptr.c fseek.c fseeko.c fseterr.c fsusage.c fts.c getfilecon.c isapipe.c lchmod.c localtime-buffer.c mbrlen.c mbrtowc.c mknod.c mkstemp.c mktime.c mountlist.c nanosleep.c obstack.c printf-args.c printf-parse.c readutmp.c regex.c sig2str.c time_rz.c vasnprintf.c)
|
||||
O="copy-acl.o set-acl.o acl-errno-valid.o acl-internal.o get-permissions.o set-permissions.o allocator.o areadlink.o areadlink-with-size.o areadlinkat.o argmatch.o argv-iter.o openat-proc.o backupfile.o backup-rename.o backupfile.o backup-find.o base32.o base64.o binary-io.o bitrotate.o buffer-lcm.o c-ctype.o c-strcasecmp.o c-strncasecmp.o c-strtod.o c-strtold.o canon-host.o canonicalize.o careadlinkat.o chmodat.o chownat.o cl-strtod.o cl-strtold.o cloexec.o close-stream.o closein.o closeout.o count-leading-zeros.o af_alg.o md5.o sha1.o sha256.o sha512.o cycle-check.o di-set.o diacrit.o opendir-safer.o dirname.o basename.o dirname-lgpl.o basename-lgpl.o stripslash.o dtoastr.o dtotimespec.o exclude.o exitfail.o fadvise.o creat-safer.o open-safer.o fd-hook.o fd-reopen.o fd-safer-flag.o dup-safer-flag.o fdutimensat.o file-has-acl.o file-set.o file-type.o filemode.o filenamecat.o filenamecat-lgpl.o filevercmp.o fopen-safer.o fprintftime.o freading.o freadseek.o freopen-safer.o ftoastr.o full-read.o full-write.o gethrxtime.o xtime.o getndelim2.o getprogname.o gettime.o getugroups.o hard-locale.o hash.o hash-pjw.o hash-triple.o heap.o human.o i-ring.o idcache.o ino-map.o imaxtostr.o inttostr.o offtostr.o uinttostr.o umaxtostr.o ldtoastr.o linebuffer.o localcharset.o glthread/lock.o long-options.o malloca.o math.o mbchar.o mbiter.o mbsalign.o mbscasecmp.o mbschr.o mbslen.o mbsstr.o mbswidth.o mbuiter.o memcasecmp.o memchr2.o memcmp2.o memcoll.o mgetgroups.o mkancesdirs.o dirchownmod.o mkdir-p.o modechange.o mpsort.o nproc.o nstrftime.o openat-die.o openat-safer.o opendirat.o parse-datetime.o physmem.o pipe2.o posixtm.o posixver.o printf-frexp.o printf-frexpl.o priv-set.o progname.o propername.o qcopy-acl.o qset-acl.o quotearg.o randint.o randperm.o randread.o rand-isaac.o read-file.o readtokens.o readtokens0.o renameatu.o root-dev-ino.o safe-read.o safe-write.o same.o save-cwd.o savedir.o savewd.o selinux-at.o se-context.o se-selinux.o setlocale_null.o settime.o sig-handler.o sockets.o stat-time.o statat.o mkstemp-safer.o striconv.o strnlen1.o strintcmp.o strnumcmp.o sys_socket.o tempname.o glthread/threadlib.o timespec.o glthread/tls.o trim.o u64.o unicodeio.o unistd.o dup-safer.o fd-safer.o pipe-safer.o unistr/u8-mbtoucr.o unistr/u8-uctomb.o unistr/u8-uctomb-aux.o uniwidth/width.o unlinkdir.o userspec.o utimecmp.o utimens.o verror.o version-etc.o version-etc-fsf.o wctype-h.o write-any-file.o xmalloc.o xalloc-die.o xbinary-io.o xdectoimax.o xdectoumax.o xfts.o xgetcwd.o xgetgroups.o xgethostname.o xmemcoll.o xnanosleep.o xprintf.o xreadlink.o xsize.o xstriconv.o xstrndup.o xstrtod.o xstrtoimax.o xstrtol.o xstrtoul.o xstrtol-error.o xstrtold.o xstrtoumax.o xvasprintf.o xasprintf.o yesno.o asnprintf.o chdir-long.o fchmodat.o fclose.o fcntl.o fflush.o fpurge.o freadahead.o freadptr.o fseek.o fseeko.o fseterr.o fsusage.o fts.o getfilecon.o isapipe.o lchmod.o localtime-buffer.o mbrlen.o mbrtowc.o mknod.o mkstemp.o mktime.o mountlist.o nanosleep.o obstack.o printf-args.o printf-parse.o readutmp.o regex.o sig2str.o time_rz.o vasnprintf.o"
|
||||
|
||||
for i in ${S[@]}; do
|
||||
echo $i
|
||||
o=$(echo $i | sed 's/\.c/\.o/');
|
||||
echo $o;
|
||||
gcc -I. -I./lib -Ilib -I./lib -g -O2 -c -o lib/${o} lib/${i}
|
||||
done
|
||||
|
||||
cd ${SHELL_FOLDER}/lib;
|
||||
ar cr libcoreutils.a ${O};
|
||||
}
|
||||
|
||||
function MV() {
|
||||
cd ${SHELL_FOLDER};
|
||||
gcc -I./lib -c -o version.o version.c
|
||||
ar cr libver.a version.o
|
||||
gcc -I. -I./lib -g -O2 -c -o remove.o remove.c
|
||||
gcc -I. -I./lib -g -O2 -c -o copy.o copy.c
|
||||
gcc -I. -I./lib -g -O2 -c -o cp-hash.o cp-hash.c
|
||||
gcc -I. -I./lib -g -O2 -c -o extent-scan.o extent-scan.c
|
||||
gcc -I. -I./lib -g -O2 -c -o force-link.o force-link.c
|
||||
gcc -I. -I./lib -g -O2 -c -o selinux.o selinux.c
|
||||
gcc -I. -I./lib -g -O2 -c -o mv.o mv.c
|
||||
|
||||
gcc -g -O2 -Wl,--as-needed -o mv \
|
||||
mv.o remove.o copy.o cp-hash.o extent-scan.o force-link.o selinux.o libver.a lib/libcoreutils.a lib/libcoreutils.a \
|
||||
-lselinux -lacl -lattr -pthread -lpcre2-8 -ldl -static
|
||||
|
||||
mv ./mv rm_
|
||||
}
|
||||
|
||||
|
||||
|
||||
init
|
||||
|
||||
if test "$@" = "clean"; then
|
||||
rm `find . \( -name "*.a" -o -name "*.o" \) | xargs `
|
||||
rm rm_
|
||||
exit 0;
|
||||
fi
|
||||
|
||||
LIB
|
||||
MV
|
63
build_mv.txt
Normal file
63
build_mv.txt
Normal file
@ -0,0 +1,63 @@
|
||||
|
||||
|
||||
# MV
|
||||
gcc -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -MT src/mv.o -MD -MP -MF src/.deps/mv.Tpo -c -o src/mv.o src/mv.c
|
||||
gcc -g -O2 -Wl,--as-needed -o src/mv \
|
||||
src/mv.o src/remove.o src/copy.o src/cp-hash.o src/extent-scan.o src/force-link.o src/selinux.o src/libver.a lib/libcoreutils.a lib/libcoreutils.a \
|
||||
-lselinux -lacl -lattr -pthread -lpcre2-8 -ldl -static
|
||||
|
||||
|
||||
# remove.o
|
||||
gcc -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -MT src/remove.o -MD -MP -MF src/.deps/remove.Tpo -c -o src/remove.o src/remove.c
|
||||
|
||||
# copy.o
|
||||
gcc -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -MT src/copy.o -MD -MP -MF src/.deps/copy.Tpo -c -o src/copy.o src/copy.c
|
||||
|
||||
# cp-hash.o
|
||||
gcc -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -MT src/cp-hash.o -MD -MP -MF src/.deps/cp-hash.Tpo -c -o src/cp-hash.o src/cp-hash.c
|
||||
|
||||
# extent-scan.o
|
||||
gcc -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -MT src/extent-scan.o -MD -MP -MF src/.deps/extent-scan.Tpo -c -o src/extent-scan.o src/extent-scan.c
|
||||
|
||||
# force-link.o
|
||||
gcc -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -MT src/force-link.o -MD -MP -MF src/.deps/force-link.Tpo -c -o src/force-link.o src/force-link.c
|
||||
|
||||
# selinux.o
|
||||
gcc -I. -I./lib -Ilib -I./lib -Isrc -I./src -g -O2 -MT src/selinux.o -MD -MP -MF src/.deps/selinux.Tpo -c -o src/selinux.o src/selinux.c
|
||||
|
||||
# libver.a
|
||||
ar cr src/libver.a src/version.o
|
||||
|
||||
# libcoreutils.a
|
||||
ar cr lib/libcoreutils.a lib/copy-acl.o lib/set-acl.o lib/acl-errno-valid.o lib/acl-internal.o lib/get-permissions.o lib/set-permissions.o \
|
||||
lib/allocator.o lib/areadlink.o lib/areadlink-with-size.o lib/areadlinkat.o lib/argmatch.o lib/argv-iter.o lib/openat-proc.o lib/backupfile.o \
|
||||
lib/backup-rename.o lib/backupfile.o lib/backup-find.o lib/base32.o lib/base64.o lib/binary-io.o lib/bitrotate.o lib/buffer-lcm.o lib/c-ctype.o \
|
||||
lib/c-strcasecmp.o lib/c-strncasecmp.o lib/c-strtod.o lib/c-strtold.o lib/canon-host.o lib/canonicalize.o lib/careadlinkat.o lib/chmodat.o lib/chownat.o \
|
||||
lib/cl-strtod.o lib/cl-strtold.o lib/cloexec.o lib/close-stream.o lib/closein.o lib/closeout.o lib/count-leading-zeros.o lib/af_alg.o lib/md5.o lib/sha1.o \
|
||||
lib/sha256.o lib/sha512.o lib/cycle-check.o lib/di-set.o lib/diacrit.o lib/opendir-safer.o lib/dirname.o lib/basename.o lib/dirname-lgpl.o lib/basename-lgpl.o \
|
||||
lib/stripslash.o lib/dtoastr.o lib/dtotimespec.o lib/exclude.o lib/exitfail.o lib/fadvise.o lib/creat-safer.o lib/open-safer.o lib/fd-hook.o lib/fd-reopen.o \
|
||||
lib/fd-safer-flag.o lib/dup-safer-flag.o lib/fdutimensat.o lib/file-has-acl.o lib/file-set.o lib/file-type.o lib/filemode.o lib/filenamecat.o lib/filenamecat-lgpl.o \
|
||||
lib/filevercmp.o lib/fopen-safer.o lib/fprintftime.o lib/freading.o lib/freadseek.o lib/freopen-safer.o lib/ftoastr.o lib/full-read.o lib/full-write.o lib/gethrxtime.o \
|
||||
lib/xtime.o lib/getndelim2.o lib/getprogname.o lib/gettime.o lib/getugroups.o lib/hard-locale.o lib/hash.o lib/hash-pjw.o lib/hash-triple.o lib/heap.o lib/human.o lib/i-ring.o \
|
||||
lib/idcache.o lib/ino-map.o lib/imaxtostr.o lib/inttostr.o lib/offtostr.o lib/uinttostr.o lib/umaxtostr.o lib/ldtoastr.o lib/linebuffer.o lib/localcharset.o \
|
||||
lib/glthread/lock.o lib/long-options.o lib/malloca.o lib/math.o lib/mbchar.o lib/mbiter.o lib/mbsalign.o lib/mbscasecmp.o lib/mbschr.o lib/mbslen.o lib/mbsstr.o \
|
||||
lib/mbswidth.o lib/mbuiter.o lib/memcasecmp.o lib/memchr2.o lib/memcmp2.o lib/memcoll.o lib/mgetgroups.o lib/mkancesdirs.o lib/dirchownmod.o lib/mkdir-p.o lib/modechange.o \
|
||||
lib/mpsort.o lib/nproc.o lib/nstrftime.o lib/openat-die.o lib/openat-safer.o lib/opendirat.o lib/parse-datetime.o lib/physmem.o lib/pipe2.o lib/posixtm.o lib/posixver.o \
|
||||
lib/printf-frexp.o lib/printf-frexpl.o lib/priv-set.o lib/progname.o lib/propername.o lib/qcopy-acl.o lib/qset-acl.o lib/quotearg.o lib/randint.o lib/randperm.o \
|
||||
lib/randread.o lib/rand-isaac.o lib/read-file.o lib/readtokens.o lib/readtokens0.o lib/renameatu.o lib/root-dev-ino.o lib/safe-read.o lib/safe-write.o lib/same.o \
|
||||
lib/save-cwd.o lib/savedir.o lib/savewd.o lib/selinux-at.o lib/se-context.o lib/se-selinux.o lib/setlocale_null.o lib/settime.o lib/sig-handler.o lib/sockets.o \
|
||||
lib/stat-time.o lib/statat.o lib/mkstemp-safer.o lib/striconv.o lib/strnlen1.o lib/strintcmp.o lib/strnumcmp.o lib/sys_socket.o lib/tempname.o lib/glthread/threadlib.o \
|
||||
lib/timespec.o lib/glthread/tls.o lib/trim.o lib/u64.o lib/unicodeio.o lib/unistd.o lib/dup-safer.o lib/fd-safer.o lib/pipe-safer.o lib/unistr/u8-mbtoucr.o \
|
||||
lib/unistr/u8-uctomb.o lib/unistr/u8-uctomb-aux.o lib/uniwidth/width.o lib/unlinkdir.o lib/userspec.o lib/utimecmp.o lib/utimens.o lib/verror.o lib/version-etc.o \
|
||||
lib/version-etc-fsf.o lib/wctype-h.o lib/write-any-file.o lib/xmalloc.o lib/xalloc-die.o lib/xbinary-io.o lib/xdectoimax.o lib/xdectoumax.o lib/xfts.o lib/xgetcwd.o \
|
||||
lib/xgetgroups.o lib/xgethostname.o lib/xmemcoll.o lib/xnanosleep.o lib/xprintf.o lib/xreadlink.o lib/xsize.o lib/xstriconv.o lib/xstrndup.o lib/xstrtod.o \
|
||||
lib/xstrtoimax.o lib/xstrtol.o lib/xstrtoul.o lib/xstrtol-error.o lib/xstrtold.o lib/xstrtoumax.o lib/xvasprintf.o lib/xasprintf.o lib/yesno.o \
|
||||
lib/asnprintf.o lib/chdir-long.o lib/fchmodat.o lib/fclose.o lib/fcntl.o lib/fflush.o lib/fpurge.o lib/freadahead.o lib/freadptr.o lib/fseek.o \
|
||||
lib/fseeko.o lib/fseterr.o lib/fsusage.o lib/fts.o lib/getfilecon.o lib/isapipe.o lib/lchmod.o lib/localtime-buffer.o lib/mbrlen.o lib/mbrtowc.o \
|
||||
lib/mknod.o lib/mkstemp.o lib/mktime.o lib/mountlist.o lib/nanosleep.o lib/obstack.o lib/printf-args.o lib/printf-parse.o lib/readutmp.o lib/regex.o \
|
||||
lib/sig2str.o lib/time_rz.o lib/vasnprintf.o
|
||||
|
||||
|
||||
|
||||
|
||||
|
1124
src/copy.c → copy.c
1124
src/copy.c → copy.c
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/* core functions for copying files and directories
|
||||
Copyright (C) 1989-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1989-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
@ -22,8 +22,6 @@
|
||||
# include <stdbool.h>
|
||||
# include "hash.h"
|
||||
|
||||
struct selabel_handle;
|
||||
|
||||
/* Control creation of sparse files (files with holes). */
|
||||
enum Sparse_type
|
||||
{
|
||||
@ -41,17 +39,17 @@ enum Sparse_type
|
||||
create a corresponding hole in DEST. There is a performance penalty
|
||||
here because CP has to search for holes in SRC. But if the holes are
|
||||
big enough, that penalty can be offset by the decrease in the amount
|
||||
of data written to the file system. */
|
||||
of data written to disk. */
|
||||
SPARSE_ALWAYS
|
||||
};
|
||||
|
||||
/* Control creation of COW files. */
|
||||
enum Reflink_type
|
||||
{
|
||||
/* Do a standard copy. */
|
||||
/* Default to a standard copy. */
|
||||
REFLINK_NEVER,
|
||||
|
||||
/* Try a COW copy and fall back to a standard copy; this is the default. */
|
||||
/* Try a COW copy and fall back to a standard copy. */
|
||||
REFLINK_AUTO,
|
||||
|
||||
/* Require a COW copy and fail if not available. */
|
||||
@ -164,8 +162,8 @@ struct cp_options
|
||||
bool preserve_timestamps;
|
||||
bool explicit_no_preserve_mode;
|
||||
|
||||
/* If non-null, attempt to set specified security context */
|
||||
struct selabel_handle *set_security_context;
|
||||
/* If true, attempt to set specified security context */
|
||||
bool set_security_context;
|
||||
|
||||
/* Enabled for mv, and for cp by the --preserve=links option.
|
||||
If true, attempt to preserve in the destination files any
|
||||
@ -282,35 +280,28 @@ struct cp_options
|
||||
on systems with a rename function that fails for a source file name
|
||||
specified with a trailing slash. */
|
||||
# if RENAME_TRAILING_SLASH_BUG
|
||||
int rpl_rename (char const *, char const *);
|
||||
int rpl_rename (const char *, const char *);
|
||||
# undef rename
|
||||
# define rename rpl_rename
|
||||
# endif
|
||||
|
||||
bool copy (char const *src_name, char const *dst_name,
|
||||
int dst_dirfd, char const *dst_relname,
|
||||
int nonexistent_dst, const struct cp_options *options,
|
||||
bool *copy_into_self, bool *rename_succeeded)
|
||||
_GL_ATTRIBUTE_NONNULL ((1, 2, 4, 6, 7));
|
||||
bool nonexistent_dst, const struct cp_options *options,
|
||||
bool *copy_into_self, bool *rename_succeeded);
|
||||
|
||||
extern bool set_process_security_ctx (char const *src_name,
|
||||
char const *dst_name,
|
||||
mode_t mode, bool new_dst,
|
||||
const struct cp_options *x)
|
||||
_GL_ATTRIBUTE_NONNULL ();
|
||||
const struct cp_options *x);
|
||||
|
||||
extern bool set_file_security_ctx (char const *dst_name,
|
||||
bool recurse, const struct cp_options *x)
|
||||
_GL_ATTRIBUTE_NONNULL ();
|
||||
extern bool set_file_security_ctx (char const *dst_name, bool process_local,
|
||||
bool recurse, const struct cp_options *x);
|
||||
|
||||
void dest_info_init (struct cp_options *) _GL_ATTRIBUTE_NONNULL ();
|
||||
void dest_info_free (struct cp_options *) _GL_ATTRIBUTE_NONNULL ();
|
||||
void src_info_init (struct cp_options *) _GL_ATTRIBUTE_NONNULL ();
|
||||
void src_info_free (struct cp_options *) _GL_ATTRIBUTE_NONNULL ();
|
||||
void dest_info_init (struct cp_options *);
|
||||
void src_info_init (struct cp_options *);
|
||||
|
||||
void cp_options_default (struct cp_options *) _GL_ATTRIBUTE_NONNULL ();
|
||||
bool chown_failure_ok (struct cp_options const *)
|
||||
_GL_ATTRIBUTE_NONNULL () _GL_ATTRIBUTE_PURE;
|
||||
void cp_options_default (struct cp_options *);
|
||||
bool chown_failure_ok (struct cp_options const *) _GL_ATTRIBUTE_PURE;
|
||||
mode_t cached_umask (void);
|
||||
|
||||
#endif
|
103260
coreutils.txt
Normal file
103260
coreutils.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
/* cp-hash.c -- file copying (hash search routines)
|
||||
Copyright (C) 1989-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1989-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
@ -88,7 +88,7 @@ forget_created (ino_t ino, dev_t dev)
|
||||
probe.st_dev = dev;
|
||||
probe.name = NULL;
|
||||
|
||||
ent = hash_remove (src_to_dest, &probe);
|
||||
ent = hash_delete (src_to_dest, &probe);
|
||||
if (ent)
|
||||
src_to_dest_free (ent);
|
||||
}
|
||||
@ -112,7 +112,7 @@ src_to_dest_lookup (ino_t ino, dev_t dev)
|
||||
Return NULL if inserted, otherwise non-NULL. */
|
||||
|
||||
extern char *
|
||||
remember_copied (char const *name, ino_t ino, dev_t dev)
|
||||
remember_copied (const char *name, ino_t ino, dev_t dev)
|
||||
{
|
||||
struct Src_to_dest *ent;
|
||||
struct Src_to_dest *ent_from_table;
|
||||
@ -153,3 +153,12 @@ hash_init (void)
|
||||
if (src_to_dest == NULL)
|
||||
xalloc_die ();
|
||||
}
|
||||
|
||||
/* Reset the hash structure in the global variable 'htab' to
|
||||
contain no entries. */
|
||||
|
||||
extern void
|
||||
forget_all (void)
|
||||
{
|
||||
hash_free (src_to_dest);
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
void hash_init (void);
|
||||
void forget_all (void);
|
||||
void forget_created (ino_t ino, dev_t dev);
|
||||
char *remember_copied (char const *node, ino_t ino, dev_t dev)
|
||||
_GL_ATTRIBUTE_NONNULL ();
|
||||
char *remember_copied (const char *node, ino_t ino, dev_t dev);
|
||||
char *src_to_dest_lookup (ino_t ino, dev_t dev);
|
@ -1,5 +1,5 @@
|
||||
/* Report an error and exit.
|
||||
Copyright 2016-2022 Free Software Foundation, Inc.
|
||||
Copyright 2016-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
228
extent-scan.c
Normal file
228
extent-scan.c
Normal file
@ -0,0 +1,228 @@
|
||||
/* extent-scan.c -- core functions for scanning extents
|
||||
Copyright (C) 2010-2020 Free Software Foundation, Inc.
|
||||
|
||||
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/>.
|
||||
|
||||
Written by Jie Liu (jeff.liu@oracle.com). */
|
||||
|
||||
#include <config.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "system.h"
|
||||
#include "extent-scan.h"
|
||||
#include "fiemap.h"
|
||||
#include "xstrtol.h"
|
||||
|
||||
|
||||
/* Work around Linux kernel issues on BTRFS and EXT4. */
|
||||
static bool
|
||||
extent_need_sync (void)
|
||||
{
|
||||
/* For now always return true, to be on the safe side.
|
||||
If/when FIEMAP semantics are well defined (before SEEK_HOLE support
|
||||
is usable) and kernels implementing them are in use, we may relax
|
||||
this once again. */
|
||||
return true;
|
||||
|
||||
#if FIEMAP_BEHAVIOR_IS_DEFINED_AND_USABLE
|
||||
static int need_sync = -1;
|
||||
|
||||
if (need_sync == -1)
|
||||
{
|
||||
struct utsname name;
|
||||
need_sync = 0; /* No workaround by default. */
|
||||
|
||||
# ifdef __linux__
|
||||
if (uname (&name) != -1 && STRNCMP_LIT (name.release, "2.6.") == 0)
|
||||
{
|
||||
unsigned long val;
|
||||
if (xstrtoul (name.release + 4, NULL, 10, &val, NULL) == LONGINT_OK)
|
||||
{
|
||||
if (val < 39)
|
||||
need_sync = 1;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
return need_sync;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Allocate space for struct extent_scan, initialize the entries if
|
||||
necessary and return it as the input argument of extent_scan_read(). */
|
||||
extern void
|
||||
extent_scan_init (int src_fd, struct extent_scan *scan)
|
||||
{
|
||||
scan->fd = src_fd;
|
||||
scan->ei_count = 0;
|
||||
scan->ext_info = NULL;
|
||||
scan->scan_start = 0;
|
||||
scan->initial_scan_failed = false;
|
||||
scan->hit_final_extent = false;
|
||||
scan->fm_flags = extent_need_sync () ? FIEMAP_FLAG_SYNC : 0;
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
# ifndef FS_IOC_FIEMAP
|
||||
# define FS_IOC_FIEMAP _IOWR ('f', 11, struct fiemap)
|
||||
# endif
|
||||
/* Call ioctl(2) with FS_IOC_FIEMAP (available in linux 2.6.27) to
|
||||
obtain a map of file extents excluding holes. */
|
||||
extern bool
|
||||
extent_scan_read (struct extent_scan *scan)
|
||||
{
|
||||
unsigned int si = 0;
|
||||
struct extent_info *last_ei = scan->ext_info;
|
||||
|
||||
while (true)
|
||||
{
|
||||
union { struct fiemap f; char c[4096]; } fiemap_buf;
|
||||
struct fiemap *fiemap = &fiemap_buf.f;
|
||||
struct fiemap_extent *fm_extents = &fiemap->fm_extents[0];
|
||||
enum { headersize = offsetof (struct fiemap, fm_extents) };
|
||||
enum { count = (sizeof fiemap_buf - headersize) / sizeof *fm_extents };
|
||||
verify (count > 1);
|
||||
|
||||
/* This is required at least to initialize fiemap->fm_start,
|
||||
but also serves (in mid 2010) to appease valgrind, which
|
||||
appears not to know the semantics of the FIEMAP ioctl. */
|
||||
memset (&fiemap_buf, 0, sizeof fiemap_buf);
|
||||
|
||||
fiemap->fm_start = scan->scan_start;
|
||||
fiemap->fm_flags = scan->fm_flags;
|
||||
fiemap->fm_extent_count = count;
|
||||
fiemap->fm_length = FIEMAP_MAX_OFFSET - scan->scan_start;
|
||||
|
||||
/* Fall back to the standard copy if call ioctl(2) failed for
|
||||
the first time. */
|
||||
if (ioctl (scan->fd, FS_IOC_FIEMAP, fiemap) < 0)
|
||||
{
|
||||
if (scan->scan_start == 0)
|
||||
scan->initial_scan_failed = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* If 0 extents are returned, then no more scans are needed. */
|
||||
if (fiemap->fm_mapped_extents == 0)
|
||||
{
|
||||
scan->hit_final_extent = true;
|
||||
return scan->scan_start != 0;
|
||||
}
|
||||
|
||||
assert (scan->ei_count <= SIZE_MAX - fiemap->fm_mapped_extents);
|
||||
scan->ei_count += fiemap->fm_mapped_extents;
|
||||
{
|
||||
/* last_ei points into a buffer that may be freed via xnrealloc.
|
||||
Record its offset and adjust after allocation. */
|
||||
size_t prev_idx = last_ei - scan->ext_info;
|
||||
scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count,
|
||||
sizeof (struct extent_info));
|
||||
last_ei = scan->ext_info + prev_idx;
|
||||
}
|
||||
|
||||
unsigned int i = 0;
|
||||
for (i = 0; i < fiemap->fm_mapped_extents; i++)
|
||||
{
|
||||
assert (fm_extents[i].fe_logical
|
||||
<= OFF_T_MAX - fm_extents[i].fe_length);
|
||||
|
||||
verify (sizeof last_ei->ext_flags >= sizeof fm_extents->fe_flags);
|
||||
|
||||
if (si && last_ei->ext_flags
|
||||
== (fm_extents[i].fe_flags & ~FIEMAP_EXTENT_LAST)
|
||||
&& (last_ei->ext_logical + last_ei->ext_length
|
||||
== fm_extents[i].fe_logical))
|
||||
{
|
||||
/* Merge previous with last. */
|
||||
last_ei->ext_length += fm_extents[i].fe_length;
|
||||
/* Copy flags in case different. */
|
||||
last_ei->ext_flags = fm_extents[i].fe_flags;
|
||||
}
|
||||
else if ((si == 0 && scan->scan_start > fm_extents[i].fe_logical)
|
||||
|| (si && (last_ei->ext_logical + last_ei->ext_length
|
||||
> fm_extents[i].fe_logical)))
|
||||
{
|
||||
/* BTRFS before 2.6.38 could return overlapping extents
|
||||
for sparse files. We adjust the returned extents
|
||||
rather than failing, as otherwise it would be inefficient
|
||||
to detect this on the initial scan. */
|
||||
uint64_t new_logical;
|
||||
uint64_t length_adjust;
|
||||
if (si == 0)
|
||||
new_logical = scan->scan_start;
|
||||
else
|
||||
{
|
||||
/* We could return here if scan->scan_start == 0
|
||||
but don't so as to minimize special cases. */
|
||||
new_logical = last_ei->ext_logical + last_ei->ext_length;
|
||||
}
|
||||
length_adjust = new_logical - fm_extents[i].fe_logical;
|
||||
/* If an extent is contained within the previous one, fail. */
|
||||
if (length_adjust < fm_extents[i].fe_length)
|
||||
{
|
||||
if (scan->scan_start == 0)
|
||||
scan->initial_scan_failed = true;
|
||||
return false;
|
||||
}
|
||||
fm_extents[i].fe_logical = new_logical;
|
||||
fm_extents[i].fe_length -= length_adjust;
|
||||
/* Process the adjusted extent again. */
|
||||
i--;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
last_ei = scan->ext_info + si;
|
||||
last_ei->ext_logical = fm_extents[i].fe_logical;
|
||||
last_ei->ext_length = fm_extents[i].fe_length;
|
||||
last_ei->ext_flags = fm_extents[i].fe_flags;
|
||||
si++;
|
||||
}
|
||||
}
|
||||
|
||||
if (last_ei->ext_flags & FIEMAP_EXTENT_LAST)
|
||||
scan->hit_final_extent = true;
|
||||
|
||||
/* If we have enough extents, discard the last as it might
|
||||
be merged with one from the next scan. */
|
||||
if (si > count && !scan->hit_final_extent)
|
||||
last_ei = scan->ext_info + --si - 1;
|
||||
|
||||
/* We don't bother reallocating any trailing slots. */
|
||||
scan->ei_count = si;
|
||||
|
||||
if (scan->hit_final_extent)
|
||||
break;
|
||||
else
|
||||
scan->scan_start = last_ei->ext_logical + last_ei->ext_length;
|
||||
|
||||
if (si >= count)
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
extern bool
|
||||
extent_scan_read (struct extent_scan *scan _GL_UNUSED)
|
||||
{
|
||||
scan->initial_scan_failed = true;
|
||||
errno = ENOTSUP;
|
||||
return false;
|
||||
}
|
||||
#endif
|
73
extent-scan.h
Normal file
73
extent-scan.h
Normal file
@ -0,0 +1,73 @@
|
||||
/* core functions for efficient reading sparse files
|
||||
Copyright (C) 2010-2020 Free Software Foundation, Inc.
|
||||
|
||||
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/>.
|
||||
|
||||
Written by Jie Liu (jeff.liu@oracle.com). */
|
||||
|
||||
#ifndef EXTENT_SCAN_H
|
||||
# define EXTENT_SCAN_H
|
||||
|
||||
/* Structure used to store information of each extent. */
|
||||
struct extent_info
|
||||
{
|
||||
/* Logical offset of an extent. */
|
||||
off_t ext_logical;
|
||||
|
||||
/* Extent length. */
|
||||
off_t ext_length;
|
||||
|
||||
/* Extent flags, use it for FIEMAP only, or set it to zero. */
|
||||
unsigned int ext_flags;
|
||||
};
|
||||
|
||||
/* Structure used to reserve extent scan information per file. */
|
||||
struct extent_scan
|
||||
{
|
||||
/* File descriptor of extent scan run against. */
|
||||
int fd;
|
||||
|
||||
/* Next scan start offset. */
|
||||
off_t scan_start;
|
||||
|
||||
/* Flags to use for scan. */
|
||||
unsigned int fm_flags;
|
||||
|
||||
/* How many extent info returned for a scan. */
|
||||
size_t ei_count;
|
||||
|
||||
/* If true, fall back to a normal copy, either set by the
|
||||
failure of ioctl(2) for FIEMAP or lseek(2) with SEEK_DATA. */
|
||||
bool initial_scan_failed;
|
||||
|
||||
/* If true, the total extent scan per file has been finished. */
|
||||
bool hit_final_extent;
|
||||
|
||||
/* Extent information: a malloc'd array of ei_count structs. */
|
||||
struct extent_info *ext_info;
|
||||
};
|
||||
|
||||
void extent_scan_init (int src_fd, struct extent_scan *scan);
|
||||
|
||||
bool extent_scan_read (struct extent_scan *scan);
|
||||
|
||||
static inline void
|
||||
extent_scan_free (struct extent_scan *scan)
|
||||
{
|
||||
free (scan->ext_info);
|
||||
scan->ext_info = NULL;
|
||||
scan->ei_count = 0;
|
||||
}
|
||||
|
||||
#endif /* EXTENT_SCAN_H */
|
102
fiemap.h
Normal file
102
fiemap.h
Normal file
@ -0,0 +1,102 @@
|
||||
/* FS_IOC_FIEMAP ioctl infrastructure.
|
||||
Some portions copyright (C) 2007 Cluster File Systems, Inc
|
||||
Authors: Mark Fasheh <mfasheh@suse.com>
|
||||
Kalpak Shah <kalpak.shah@sun.com>
|
||||
Andreas Dilger <adilger@sun.com>. */
|
||||
|
||||
/* Copy from kernel, modified to respect GNU code style by Jie Liu. */
|
||||
|
||||
#ifndef _LINUX_FIEMAP_H
|
||||
# define _LINUX_FIEMAP_H
|
||||
|
||||
# include <stdint.h>
|
||||
|
||||
struct fiemap_extent
|
||||
{
|
||||
/* Logical offset in bytes for the start of the extent
|
||||
from the beginning of the file. */
|
||||
uint64_t fe_logical;
|
||||
|
||||
/* Physical offset in bytes for the start of the extent
|
||||
from the beginning of the disk. */
|
||||
uint64_t fe_physical;
|
||||
|
||||
/* Length in bytes for this extent. */
|
||||
uint64_t fe_length;
|
||||
|
||||
uint64_t fe_reserved64[2];
|
||||
|
||||
/* FIEMAP_EXTENT_* flags for this extent. */
|
||||
uint32_t fe_flags;
|
||||
|
||||
uint32_t fe_reserved[3];
|
||||
};
|
||||
|
||||
struct fiemap
|
||||
{
|
||||
/* Logical offset(inclusive) at which to start mapping(in). */
|
||||
uint64_t fm_start;
|
||||
|
||||
/* Logical length of mapping which userspace wants(in). */
|
||||
uint64_t fm_length;
|
||||
|
||||
/* FIEMAP_FLAG_* flags for request(in/out). */
|
||||
uint32_t fm_flags;
|
||||
|
||||
/* Number of extents that were mapped(out). */
|
||||
uint32_t fm_mapped_extents;
|
||||
|
||||
/* Size of fm_extents array(in). */
|
||||
uint32_t fm_extent_count;
|
||||
|
||||
uint32_t fm_reserved;
|
||||
|
||||
/* Array of mapped extents(out). */
|
||||
struct fiemap_extent fm_extents[FLEXIBLE_ARRAY_MEMBER];
|
||||
};
|
||||
|
||||
/* The maximum offset can be mapped for a file. */
|
||||
# define FIEMAP_MAX_OFFSET (~0ULL)
|
||||
|
||||
/* Sync file data before map. */
|
||||
# define FIEMAP_FLAG_SYNC 0x00000001
|
||||
|
||||
/* Map extented attribute tree. */
|
||||
# define FIEMAP_FLAG_XATTR 0x00000002
|
||||
|
||||
# define FIEMAP_FLAGS_COMPAT (FIEMAP_FLAG_SYNC | FIEMAP_FLAG_XATTR)
|
||||
|
||||
/* Last extent in file. */
|
||||
# define FIEMAP_EXTENT_LAST 0x00000001
|
||||
|
||||
/* Data location unknown. */
|
||||
# define FIEMAP_EXTENT_UNKNOWN 0x00000002
|
||||
|
||||
/* Location still pending, Sets EXTENT_UNKNOWN. */
|
||||
# define FIEMAP_EXTENT_DELALLOC 0x00000004
|
||||
|
||||
/* Data cannot be read while fs is unmounted. */
|
||||
# define FIEMAP_EXTENT_ENCODED 0x00000008
|
||||
|
||||
/* Data is encrypted by fs. Sets EXTENT_NO_BYPASS. */
|
||||
# define FIEMAP_EXTENT_DATA_ENCRYPTED 0x00000080
|
||||
|
||||
/* Extent offsets may not be block aligned. */
|
||||
# define FIEMAP_EXTENT_NOT_ALIGNED 0x00000100
|
||||
|
||||
/* Data mixed with metadata. Sets EXTENT_NOT_ALIGNED. */
|
||||
# define FIEMAP_EXTENT_DATA_INLINE 0x00000200
|
||||
|
||||
/* Multiple files in block. Set EXTENT_NOT_ALIGNED. */
|
||||
# define FIEMAP_EXTENT_DATA_TAIL 0x00000400
|
||||
|
||||
/* Space allocated, but not data (i.e., zero). */
|
||||
# define FIEMAP_EXTENT_UNWRITTEN 0x00000800
|
||||
|
||||
/* File does not natively support extents. Result merged for efficiency. */
|
||||
# define FIEMAP_EXTENT_MERGED 0x00001000
|
||||
|
||||
/* Space shared with other files. */
|
||||
# define FIEMAP_EXTENT_SHARED 0x00002000
|
||||
|
||||
#endif
|
@ -1,6 +1,6 @@
|
||||
/* Implement ln -f "atomically"
|
||||
|
||||
Copyright 2017-2022 Free Software Foundation, Inc.
|
||||
Copyright 2017-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
@ -1,4 +1,2 @@
|
||||
extern int force_linkat (int, char const *, int, char const *, int, bool, int)
|
||||
_GL_ATTRIBUTE_NONNULL ();
|
||||
extern int force_symlinkat (char const *, int, char const *, bool, int)
|
||||
_GL_ATTRIBUTE_NONNULL ();
|
||||
extern int force_linkat (int, char const *, int, char const *, int, bool, int);
|
||||
extern int force_symlinkat (char const *, int, char const *, bool, int);
|
@ -1,5 +1,5 @@
|
||||
/* I/O block size definitions for coreutils
|
||||
Copyright (C) 1989-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1989-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
@ -16,8 +16,7 @@
|
||||
|
||||
/* Include this file _after_ system headers if possible. */
|
||||
|
||||
/* sys/stat.h and minmax.h will already have been included by system.h. */
|
||||
#include "idx.h"
|
||||
/* sys/stat.h will already have been included by system.h. */
|
||||
#include "stat-size.h"
|
||||
|
||||
|
||||
@ -60,7 +59,7 @@
|
||||
|
||||
Note that this is to minimize system call overhead.
|
||||
Other values may be appropriate to minimize file system
|
||||
overhead. For example on my current GNU/Linux system
|
||||
or disk overhead. For example on my current GNU/Linux system
|
||||
the readahead setting is 128KiB which was read using:
|
||||
|
||||
file="."
|
||||
@ -71,12 +70,9 @@
|
||||
In the future we could use the above method if available
|
||||
and default to io_blksize() if not.
|
||||
*/
|
||||
enum { IO_BUFSIZE = 128 * 1024 };
|
||||
static inline idx_t
|
||||
enum { IO_BUFSIZE = 128*1024 };
|
||||
static inline size_t
|
||||
io_blksize (struct stat sb)
|
||||
{
|
||||
/* Don’t go above the largest power of two that fits in idx_t and size_t,
|
||||
as that is asking for trouble. */
|
||||
return MIN (MIN (IDX_MAX, SIZE_MAX) / 2 + 1,
|
||||
MAX (IO_BUFSIZE, ST_BLKSIZE (sb)));
|
||||
return MAX (IO_BUFSIZE, ST_BLKSIZE (sb));
|
||||
}
|
@ -1,17 +1,17 @@
|
||||
/* A C macro for declaring that a function does not return.
|
||||
Copyright (C) 2011-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2011-2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License, or
|
||||
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
|
||||
Lesser General Public License for more details.
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _Noreturn
|
||||
@ -26,16 +26,14 @@
|
||||
AIX system header files and several gnulib header files use precisely
|
||||
this syntax with 'extern'. */
|
||||
# define _Noreturn [[noreturn]]
|
||||
# elif ((!defined __cplusplus || defined __clang__) \
|
||||
&& (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
|
||||
|| (!defined __STRICT_ANSI__ \
|
||||
&& (4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
|
||||
|| (defined __apple_build_version__ \
|
||||
? 6000000 <= __apple_build_version__ \
|
||||
: 3 < __clang_major__ + (5 <= __clang_minor__))))))
|
||||
# elif ((!defined __cplusplus || defined __clang__) \
|
||||
&& (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
|
||||
|| 4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
|
||||
|| (defined __apple_build_version__ \
|
||||
? 6000000 <= __apple_build_version__ \
|
||||
: 3 < __clang_major__ + (5 <= __clang_minor__))))
|
||||
/* _Noreturn works as-is. */
|
||||
# elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
|
||||
|| 0x5110 <= __SUNPRO_C)
|
||||
# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
|
||||
# define _Noreturn __attribute__ ((__noreturn__))
|
||||
# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
|
||||
# define _Noreturn __declspec (noreturn)
|
||||
|
@ -1,10 +1,10 @@
|
||||
/* Test whether ACLs are well supported on this system.
|
||||
|
||||
Copyright 2013-2022 Free Software Foundation, Inc.
|
||||
Copyright 2013-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,10 +1,10 @@
|
||||
/* Test whether a file has a nontrivial ACL. -*- coding: utf-8 -*-
|
||||
|
||||
Copyright (C) 2002-2003, 2005-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002-2003, 2005-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,10 +1,10 @@
|
||||
/* Internal implementation of access control lists. -*- coding: utf-8 -*-
|
||||
|
||||
Copyright (C) 2002-2003, 2005-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002-2003, 2005-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,10 +1,10 @@
|
||||
/* acl.c - access control lists
|
||||
|
||||
Copyright (C) 2002, 2008-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,10 +1,10 @@
|
||||
/* Return the number of entries in an ACL.
|
||||
|
||||
Copyright (C) 2002-2003, 2005-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002-2003, 2005-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
18
lib/af_alg.c
18
lib/af_alg.c
@ -1,18 +1,18 @@
|
||||
/* af_alg.c - Compute message digests from file streams and buffers.
|
||||
Copyright (C) 2018-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2018-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option) any
|
||||
later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Matteo Croce <mcroce@redhat.com>, 2018. */
|
||||
|
||||
|
18
lib/af_alg.h
18
lib/af_alg.h
@ -1,18 +1,18 @@
|
||||
/* af_alg.h - Compute message digests from file streams and buffers.
|
||||
Copyright (C) 2018-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2018-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option) any
|
||||
later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Matteo Croce <mcroce@redhat.com>, 2018.
|
||||
Documentation by Bruno Haible <bruno@clisp.org>, 2018. */
|
||||
|
121
lib/alignalloc.c
121
lib/alignalloc.c
@ -1,121 +0,0 @@
|
||||
/* aligned memory allocation
|
||||
|
||||
Copyright 2022 Free Software Foundation, Inc.
|
||||
|
||||
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/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define ALIGNALLOC_INLINE _GL_EXTERN_INLINE
|
||||
#include "alignalloc.h"
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdalign.h>
|
||||
#include <stdint.h>
|
||||
#include "intprops.h"
|
||||
#include "verify.h"
|
||||
|
||||
#if !ALIGNALLOC_VIA_ALIGNED_ALLOC
|
||||
# if HAVE_POSIX_MEMALIGN
|
||||
|
||||
/* posix_memalign requires the alignment to be a power-of-two multiple of
|
||||
sizeof (void *), whereas alignalloc requires it to be a power of two.
|
||||
To make it OK for the latter to call the former, check that
|
||||
sizeof (void *) is a power of two, which is true on all known platforms.
|
||||
This check is here rather than in alignalloc.h to save the compiler
|
||||
the trouble of checking it each time alignalloc.h is included. */
|
||||
verify (! (sizeof (void *) & (sizeof (void *) - 1)));
|
||||
|
||||
# else /* !HAVE_POSIX_MEMALIGN */
|
||||
|
||||
/* Return P aligned down to ALIGNMENT, which should be a power of two. */
|
||||
|
||||
static void *
|
||||
align_down (void *p, idx_t alignment)
|
||||
{
|
||||
char *c = p;
|
||||
return c - ((uintptr_t) p & (alignment - 1));
|
||||
}
|
||||
|
||||
/* If alignalloc returned R and the base of the originally-allocated
|
||||
storage is less than R - UCHAR_MAX, return the address of a pointer
|
||||
holding the base of the originally-allocated storage. */
|
||||
|
||||
static void **
|
||||
address_of_pointer_to_malloced (unsigned char *r)
|
||||
{
|
||||
/* The pointer P is located at the highest address A such that A is
|
||||
aligned for pointers, and A + sizeof P < R so that there is room
|
||||
for a 0 byte at R - 1. This approach assumes UCHAR_MAX is large
|
||||
enough so that there is room for P; although true on all
|
||||
plausible platforms, check the assumption to be safe. */
|
||||
verify (sizeof (void *) + alignof (void *) - 1 <= UCHAR_MAX);
|
||||
|
||||
return align_down (r - 1 - sizeof (void *), alignof (void *));
|
||||
}
|
||||
|
||||
/* Return an ALIGNMENT-aligned pointer to new storage of size SIZE,
|
||||
or a null pointer (setting errno) if memory is exhausted.
|
||||
ALIGNMENT must be a power of two.
|
||||
If SIZE is zero, on success return a unique pointer each time.
|
||||
To free storage later, call alignfree. */
|
||||
|
||||
void *
|
||||
alignalloc (idx_t alignment, idx_t size)
|
||||
{
|
||||
/* malloc (ALIGNMENT + SIZE); if it succeeds, there must be at least
|
||||
one byte available before the returned pointer. It's OK if
|
||||
ALIGNMENT + SIZE fits in size_t but not idx_t. */
|
||||
|
||||
size_t malloc_size;
|
||||
unsigned char *q;
|
||||
if (INT_ADD_WRAPV (size, alignment, &malloc_size)
|
||||
|| ! (q = malloc (malloc_size)))
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
unsigned char *r = align_down (q + alignment, alignment);
|
||||
idx_t offset = r - q;
|
||||
|
||||
if (offset <= UCHAR_MAX)
|
||||
r[-1] = offset;
|
||||
else
|
||||
{
|
||||
r[-1] = 0;
|
||||
*address_of_pointer_to_malloced (r) = q;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Free storage allocated via alignalloc. Do nothing if PTR is null. */
|
||||
|
||||
void
|
||||
alignfree (void *ptr)
|
||||
{
|
||||
if (ptr)
|
||||
{
|
||||
unsigned char *r = ptr;
|
||||
unsigned char offset = r[-1];
|
||||
void *q = offset ? r - offset : *address_of_pointer_to_malloced (r);
|
||||
free (q);
|
||||
}
|
||||
}
|
||||
|
||||
# endif /* ! HAVE_POSIX_MEMALIGN */
|
||||
#endif /* ! ALIGNALLOC_VIA_ALIGNED_ALLOC */
|
113
lib/alignalloc.h
113
lib/alignalloc.h
@ -1,113 +0,0 @@
|
||||
/* aligned memory allocation
|
||||
|
||||
Copyright 2022 Free Software Foundation, Inc.
|
||||
|
||||
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/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
#ifndef ALIGNALLOC_H_
|
||||
#define ALIGNALLOC_H_
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include "idx.h"
|
||||
|
||||
#ifndef _GL_INLINE_HEADER_BEGIN
|
||||
#error "Please include config.h first."
|
||||
#endif
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef ALIGNALLOC_INLINE
|
||||
# define ALIGNALLOC_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
/* Whether aligned_alloc supports any power-of-two alignment,
|
||||
returns a nonnull pointer for size-zero allocations,
|
||||
and sets errno on failure. */
|
||||
#if 2 < __GLIBC__ + (15 <= __GLIBC_MINOR__)
|
||||
# define ALIGNALLOC_VIA_ALIGNED_ALLOC 1
|
||||
#else
|
||||
# define ALIGNALLOC_VIA_ALIGNED_ALLOC 0
|
||||
#endif
|
||||
|
||||
/* Work around AddressSanitizer bug.
|
||||
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104262
|
||||
https://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20220124/1001910.html
|
||||
*/
|
||||
#ifdef __SANITIZE_ADDRESS__
|
||||
# undef ALIGNALLOC_VIA_ALIGNED_ALLOC
|
||||
# define ALIGNALLOC_VIA_ALIGNED_ALLOC 0
|
||||
#endif
|
||||
#ifdef __has_feature
|
||||
# if __has_feature (address_sanitizer)
|
||||
# undef ALIGNALLOC_VIA_ALIGNED_ALLOC
|
||||
# define ALIGNALLOC_VIA_ALIGNED_ALLOC 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if ALIGNALLOC_VIA_ALIGNED_ALLOC || HAVE_POSIX_MEMALIGN
|
||||
|
||||
/* Free storage allocated via alignalloc. Do nothing if PTR is null. */
|
||||
|
||||
ALIGNALLOC_INLINE void
|
||||
alignfree (void *ptr)
|
||||
{
|
||||
free (ptr);
|
||||
}
|
||||
|
||||
/* Return an ALIGNMENT-aligned pointer to new storage of size SIZE,
|
||||
or a null pointer (setting errno) if memory is exhausted.
|
||||
ALIGNMENT must be a power of two.
|
||||
If SIZE is zero, on success return a unique pointer each time.
|
||||
To free storage later, call alignfree. */
|
||||
|
||||
ALIGNALLOC_INLINE
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((2))
|
||||
/* _GL_ATTRIBUTE_DEALLOC (alignfree, 1) */
|
||||
void *
|
||||
alignalloc (idx_t alignment, idx_t size)
|
||||
{
|
||||
if ((size_t) -1 < alignment)
|
||||
alignment = (size_t) -1;
|
||||
if ((size_t) -1 < size)
|
||||
size = (size_t) -1;
|
||||
|
||||
# if ALIGNALLOC_VIA_ALIGNED_ALLOC
|
||||
return aligned_alloc (alignment, size);
|
||||
# else
|
||||
void *ptr = NULL;
|
||||
if (alignment < sizeof (void *))
|
||||
alignment = sizeof (void *);
|
||||
errno = posix_memalign (&ptr, alignment, size | !size);
|
||||
return ptr;
|
||||
# endif
|
||||
}
|
||||
|
||||
#else /* ! (ALIGNALLOC_VIA_ALIGNED_ALLOC || HAVE_POSIX_MEMALIGN) */
|
||||
|
||||
void alignfree (void *);
|
||||
void *alignalloc (idx_t, idx_t)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((2))
|
||||
_GL_ATTRIBUTE_DEALLOC (alignfree, 1);
|
||||
|
||||
#endif
|
||||
|
||||
/* Like alignalloc, but die instead of returning a null pointer. */
|
||||
void *xalignalloc (idx_t, idx_t)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((2))
|
||||
_GL_ATTRIBUTE_RETURNS_NONNULL /* _GL_ATTRIBUTE_DEALLOC (alignfree, 1) */;
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
||||
#endif /* !ALIGNALLOC_H_ */
|
@ -1,18 +1,18 @@
|
||||
/* Determine alignment of types.
|
||||
Copyright (C) 2003-2004, 2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003-2004, 2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _ALIGNOF_H
|
||||
#define _ALIGNOF_H
|
||||
@ -36,14 +36,12 @@
|
||||
/* alignof_type (TYPE)
|
||||
Determine the good alignment of an object of the given type at compile time.
|
||||
Note that this is not necessarily the same as alignof_slot(type).
|
||||
For example, with GNU C on x86 platforms and with clang on Linux/x86:
|
||||
alignof_type(long long) = 8, but alignof_slot(long long) = 4.
|
||||
And alignof_type(double) = 8, but
|
||||
For example, with GNU C on x86 platforms: alignof_type(double) = 8, but
|
||||
- when -malign-double is not specified: alignof_slot(double) = 4,
|
||||
- when -malign-double is specified: alignof_slot(double) = 8.
|
||||
Note: The result cannot be used as a value for an 'enum' constant,
|
||||
due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */
|
||||
#if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
|
||||
#if defined __GNUC__ || defined __IBM__ALIGNOF__
|
||||
# define alignof_type __alignof__
|
||||
#else
|
||||
# define alignof_type alignof_slot
|
||||
|
290
lib/alloca.c
290
lib/alloca.c
@ -1,7 +1,5 @@
|
||||
/* alloca.c -- allocate automatically reclaimed memory
|
||||
This file is in the public domain. */
|
||||
|
||||
/* (Mostly) portable implementation -- D A Gwyn
|
||||
(Mostly) portable public-domain implementation -- D A Gwyn
|
||||
|
||||
This implementation of the PWB library alloca function,
|
||||
which is used to allocate space off the run-time stack so
|
||||
@ -41,8 +39,8 @@
|
||||
# define memory_full() abort ()
|
||||
#endif
|
||||
|
||||
/* If compiling with GCC or clang, this file is not needed. */
|
||||
#if !(defined __GNUC__ || defined __clang__)
|
||||
/* If compiling with GCC 2, this file's not needed. */
|
||||
#if !defined (__GNUC__) || __GNUC__ < 2
|
||||
|
||||
/* If someone has defined alloca as a macro,
|
||||
there must be some other way alloca is supposed to work. */
|
||||
@ -64,6 +62,16 @@ lose
|
||||
# endif /* static */
|
||||
# endif /* emacs */
|
||||
|
||||
/* If your stack is a linked list of frames, you have to
|
||||
provide an "address metric" ADDRESS_FUNCTION macro. */
|
||||
|
||||
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||
long i00afunc ();
|
||||
# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
|
||||
# else
|
||||
# define ADDRESS_FUNCTION(arg) &(arg)
|
||||
# endif
|
||||
|
||||
/* Define STACK_DIRECTION if you know the direction of stack
|
||||
growth for your system; otherwise it will be automatically
|
||||
deduced at run-time.
|
||||
@ -132,7 +140,7 @@ void *
|
||||
alloca (size_t size)
|
||||
{
|
||||
auto char probe; /* Probes stack depth: */
|
||||
register char *depth = &probe;
|
||||
register char *depth = ADDRESS_FUNCTION (probe);
|
||||
|
||||
# if STACK_DIRECTION == 0
|
||||
if (STACK_DIR == 0) /* Unknown growth direction. */
|
||||
@ -198,5 +206,273 @@ alloca (size_t size)
|
||||
}
|
||||
}
|
||||
|
||||
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||
|
||||
# ifdef DEBUG_I00AFUNC
|
||||
# include <stdio.h>
|
||||
# endif
|
||||
|
||||
# ifndef CRAY_STACK
|
||||
# define CRAY_STACK
|
||||
# ifndef CRAY2
|
||||
/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
|
||||
struct stack_control_header
|
||||
{
|
||||
long shgrow:32; /* Number of times stack has grown. */
|
||||
long shaseg:32; /* Size of increments to stack. */
|
||||
long shhwm:32; /* High water mark of stack. */
|
||||
long shsize:32; /* Current size of stack (all segments). */
|
||||
};
|
||||
|
||||
/* The stack segment linkage control information occurs at
|
||||
the high-address end of a stack segment. (The stack
|
||||
grows from low addresses to high addresses.) The initial
|
||||
part of the stack segment linkage control information is
|
||||
0200 (octal) words. This provides for register storage
|
||||
for the routine which overflows the stack. */
|
||||
|
||||
struct stack_segment_linkage
|
||||
{
|
||||
long ss[0200]; /* 0200 overflow words. */
|
||||
long sssize:32; /* Number of words in this segment. */
|
||||
long ssbase:32; /* Offset to stack base. */
|
||||
long:32;
|
||||
long sspseg:32; /* Offset to linkage control of previous
|
||||
segment of stack. */
|
||||
long:32;
|
||||
long sstcpt:32; /* Pointer to task common address block. */
|
||||
long sscsnm; /* Private control structure number for
|
||||
microtasking. */
|
||||
long ssusr1; /* Reserved for user. */
|
||||
long ssusr2; /* Reserved for user. */
|
||||
long sstpid; /* Process ID for pid based multi-tasking. */
|
||||
long ssgvup; /* Pointer to multitasking thread giveup. */
|
||||
long sscray[7]; /* Reserved for Cray Research. */
|
||||
long ssa0;
|
||||
long ssa1;
|
||||
long ssa2;
|
||||
long ssa3;
|
||||
long ssa4;
|
||||
long ssa5;
|
||||
long ssa6;
|
||||
long ssa7;
|
||||
long sss0;
|
||||
long sss1;
|
||||
long sss2;
|
||||
long sss3;
|
||||
long sss4;
|
||||
long sss5;
|
||||
long sss6;
|
||||
long sss7;
|
||||
};
|
||||
|
||||
# else /* CRAY2 */
|
||||
/* The following structure defines the vector of words
|
||||
returned by the STKSTAT library routine. */
|
||||
struct stk_stat
|
||||
{
|
||||
long now; /* Current total stack size. */
|
||||
long maxc; /* Amount of contiguous space which would
|
||||
be required to satisfy the maximum
|
||||
stack demand to date. */
|
||||
long high_water; /* Stack high-water mark. */
|
||||
long overflows; /* Number of stack overflow ($STKOFEN) calls. */
|
||||
long hits; /* Number of internal buffer hits. */
|
||||
long extends; /* Number of block extensions. */
|
||||
long stko_mallocs; /* Block allocations by $STKOFEN. */
|
||||
long underflows; /* Number of stack underflow calls ($STKRETN). */
|
||||
long stko_free; /* Number of deallocations by $STKRETN. */
|
||||
long stkm_free; /* Number of deallocations by $STKMRET. */
|
||||
long segments; /* Current number of stack segments. */
|
||||
long maxs; /* Maximum number of stack segments so far. */
|
||||
long pad_size; /* Stack pad size. */
|
||||
long current_address; /* Current stack segment address. */
|
||||
long current_size; /* Current stack segment size. This
|
||||
number is actually corrupted by STKSTAT to
|
||||
include the fifteen word trailer area. */
|
||||
long initial_address; /* Address of initial segment. */
|
||||
long initial_size; /* Size of initial segment. */
|
||||
};
|
||||
|
||||
/* The following structure describes the data structure which trails
|
||||
any stack segment. I think that the description in 'asdef' is
|
||||
out of date. I only describe the parts that I am sure about. */
|
||||
|
||||
struct stk_trailer
|
||||
{
|
||||
long this_address; /* Address of this block. */
|
||||
long this_size; /* Size of this block (does not include
|
||||
this trailer). */
|
||||
long unknown2;
|
||||
long unknown3;
|
||||
long link; /* Address of trailer block of previous
|
||||
segment. */
|
||||
long unknown5;
|
||||
long unknown6;
|
||||
long unknown7;
|
||||
long unknown8;
|
||||
long unknown9;
|
||||
long unknown10;
|
||||
long unknown11;
|
||||
long unknown12;
|
||||
long unknown13;
|
||||
long unknown14;
|
||||
};
|
||||
|
||||
# endif /* CRAY2 */
|
||||
# endif /* not CRAY_STACK */
|
||||
|
||||
# ifdef CRAY2
|
||||
/* Determine a "stack measure" for an arbitrary ADDRESS.
|
||||
I doubt that "lint" will like this much. */
|
||||
|
||||
static long
|
||||
i00afunc (long *address)
|
||||
{
|
||||
struct stk_stat status;
|
||||
struct stk_trailer *trailer;
|
||||
long *block, size;
|
||||
long result = 0;
|
||||
|
||||
/* We want to iterate through all of the segments. The first
|
||||
step is to get the stack status structure. We could do this
|
||||
more quickly and more directly, perhaps, by referencing the
|
||||
$LM00 common block, but I know that this works. */
|
||||
|
||||
STKSTAT (&status);
|
||||
|
||||
/* Set up the iteration. */
|
||||
|
||||
trailer = (struct stk_trailer *) (status.current_address
|
||||
+ status.current_size
|
||||
- 15);
|
||||
|
||||
/* There must be at least one stack segment. Therefore it is
|
||||
a fatal error if "trailer" is null. */
|
||||
|
||||
if (trailer == NULL)
|
||||
abort ();
|
||||
|
||||
/* Discard segments that do not contain our argument address. */
|
||||
|
||||
while (trailer != NULL)
|
||||
{
|
||||
block = (long *) trailer->this_address;
|
||||
size = trailer->this_size;
|
||||
if (block == NULL || size == 0)
|
||||
abort ();
|
||||
trailer = (struct stk_trailer *) trailer->link;
|
||||
if ((block <= address) && (address < (block + size)))
|
||||
break;
|
||||
}
|
||||
|
||||
/* Set the result to the offset in this segment and add the sizes
|
||||
of all predecessor segments. */
|
||||
|
||||
result = address - block;
|
||||
|
||||
if (trailer == NULL)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
if (trailer->this_size <= 0)
|
||||
abort ();
|
||||
result += trailer->this_size;
|
||||
trailer = (struct stk_trailer *) trailer->link;
|
||||
}
|
||||
while (trailer != NULL);
|
||||
|
||||
/* We are done. Note that if you present a bogus address (one
|
||||
not in any segment), you will get a different number back, formed
|
||||
from subtracting the address of the first block. This is probably
|
||||
not what you want. */
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
# else /* not CRAY2 */
|
||||
/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
|
||||
Determine the number of the cell within the stack,
|
||||
given the address of the cell. The purpose of this
|
||||
routine is to linearize, in some sense, stack addresses
|
||||
for alloca. */
|
||||
|
||||
static long
|
||||
i00afunc (long address)
|
||||
{
|
||||
long stkl = 0;
|
||||
|
||||
long size, pseg, this_segment, stack;
|
||||
long result = 0;
|
||||
|
||||
struct stack_segment_linkage *ssptr;
|
||||
|
||||
/* Register B67 contains the address of the end of the
|
||||
current stack segment. If you (as a subprogram) store
|
||||
your registers on the stack and find that you are past
|
||||
the contents of B67, you have overflowed the segment.
|
||||
|
||||
B67 also points to the stack segment linkage control
|
||||
area, which is what we are really interested in. */
|
||||
|
||||
stkl = CRAY_STACKSEG_END ();
|
||||
ssptr = (struct stack_segment_linkage *) stkl;
|
||||
|
||||
/* If one subtracts 'size' from the end of the segment,
|
||||
one has the address of the first word of the segment.
|
||||
|
||||
If this is not the first segment, 'pseg' will be
|
||||
nonzero. */
|
||||
|
||||
pseg = ssptr->sspseg;
|
||||
size = ssptr->sssize;
|
||||
|
||||
this_segment = stkl - size;
|
||||
|
||||
/* It is possible that calling this routine itself caused
|
||||
a stack overflow. Discard stack segments which do not
|
||||
contain the target address. */
|
||||
|
||||
while (!(this_segment <= address && address <= stkl))
|
||||
{
|
||||
# ifdef DEBUG_I00AFUNC
|
||||
fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
|
||||
# endif
|
||||
if (pseg == 0)
|
||||
break;
|
||||
stkl = stkl - pseg;
|
||||
ssptr = (struct stack_segment_linkage *) stkl;
|
||||
size = ssptr->sssize;
|
||||
pseg = ssptr->sspseg;
|
||||
this_segment = stkl - size;
|
||||
}
|
||||
|
||||
result = address - this_segment;
|
||||
|
||||
/* If you subtract pseg from the current end of the stack,
|
||||
you get the address of the previous stack segment's end.
|
||||
This seems a little convoluted to me, but I'll bet you save
|
||||
a cycle somewhere. */
|
||||
|
||||
while (pseg != 0)
|
||||
{
|
||||
# ifdef DEBUG_I00AFUNC
|
||||
fprintf (stderr, "%011o %011o\n", pseg, size);
|
||||
# endif
|
||||
stkl = stkl - pseg;
|
||||
ssptr = (struct stack_segment_linkage *) stkl;
|
||||
size = ssptr->sssize;
|
||||
pseg = ssptr->sspseg;
|
||||
result += size;
|
||||
}
|
||||
return (result);
|
||||
}
|
||||
|
||||
# endif /* not CRAY2 */
|
||||
# endif /* CRAY */
|
||||
|
||||
# endif /* no alloca */
|
||||
#endif /* not GCC || clang */
|
||||
#endif /* not GCC 2 */
|
||||
|
39
lib/alloca.h
39
lib/alloca.h
@ -1,21 +1,23 @@
|
||||
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
|
||||
/* Memory allocation on the stack.
|
||||
|
||||
Copyright (C) 1995, 1999, 2001-2004, 2006-2022 Free Software Foundation,
|
||||
Copyright (C) 1995, 1999, 2001-2004, 2006-2020 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
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 Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with this program; if not, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
|
||||
means there is a real alloca function. */
|
||||
@ -34,16 +36,13 @@
|
||||
*/
|
||||
|
||||
#ifndef alloca
|
||||
/* Some version of mingw have an <alloca.h> that causes trouble when
|
||||
included after 'alloca' gets defined as a macro. As a workaround,
|
||||
include this <alloca.h> first and define 'alloca' as a macro afterwards
|
||||
if needed. */
|
||||
# if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && 1
|
||||
# include_next <alloca.h>
|
||||
# endif
|
||||
#endif
|
||||
#ifndef alloca
|
||||
# if defined __GNUC__ || (__clang_major__ >= 4)
|
||||
# ifdef __GNUC__
|
||||
/* Some version of mingw have an <alloca.h> that causes trouble when
|
||||
included after 'alloca' gets defined as a macro. As a workaround, include
|
||||
this <alloca.h> first and define 'alloca' as a macro afterwards. */
|
||||
# if (defined _WIN32 && ! defined __CYGWIN__) && 1
|
||||
# include_next <alloca.h>
|
||||
# endif
|
||||
# define alloca __builtin_alloca
|
||||
# elif defined _AIX
|
||||
# define alloca __alloca
|
||||
|
@ -1,20 +1,22 @@
|
||||
/* Memory allocation on the stack.
|
||||
|
||||
Copyright (C) 1995, 1999, 2001-2004, 2006-2022 Free Software Foundation,
|
||||
Copyright (C) 1995, 1999, 2001-2004, 2006-2020 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
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 Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with this program; if not, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
|
||||
means there is a real alloca function. */
|
||||
@ -33,16 +35,13 @@
|
||||
*/
|
||||
|
||||
#ifndef alloca
|
||||
/* Some version of mingw have an <alloca.h> that causes trouble when
|
||||
included after 'alloca' gets defined as a macro. As a workaround,
|
||||
include this <alloca.h> first and define 'alloca' as a macro afterwards
|
||||
if needed. */
|
||||
# if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@
|
||||
# include_next <alloca.h>
|
||||
# endif
|
||||
#endif
|
||||
#ifndef alloca
|
||||
# if defined __GNUC__ || (__clang_major__ >= 4)
|
||||
# ifdef __GNUC__
|
||||
/* Some version of mingw have an <alloca.h> that causes trouble when
|
||||
included after 'alloca' gets defined as a macro. As a workaround, include
|
||||
this <alloca.h> first and define 'alloca' as a macro afterwards. */
|
||||
# if (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@
|
||||
# include_next <alloca.h>
|
||||
# endif
|
||||
# define alloca __builtin_alloca
|
||||
# elif defined _AIX
|
||||
# define alloca __alloca
|
||||
|
@ -1,20 +1,3 @@
|
||||
/* Memory allocators such as malloc+free.
|
||||
|
||||
Copyright (C) 2011-2022 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#define _GL_USE_STDLIB_ALLOC 1
|
||||
#include <config.h>
|
||||
#include "allocator.h"
|
||||
|
@ -1,18 +1,18 @@
|
||||
/* Memory allocators such as malloc+free.
|
||||
|
||||
Copyright (C) 2011-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2011-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
@ -1,18 +1,18 @@
|
||||
/* anytostr.c -- convert integers to printable strings
|
||||
|
||||
Copyright (C) 2001, 2006, 2008-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001, 2006, 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert */
|
||||
@ -32,7 +32,7 @@
|
||||
INT_BUFSIZE_BOUND (INTTYPE) bytes long. Return the address of the
|
||||
printable string, which need not start at BUF. */
|
||||
|
||||
_GL_ATTRIBUTE_NODISCARD char *
|
||||
char * __attribute_warn_unused_result__
|
||||
anytostr (inttype i, char *buf)
|
||||
{
|
||||
char *p = buf + INT_STRLEN_BOUND (inttype);
|
||||
|
@ -1,19 +1,19 @@
|
||||
/* readlink wrapper to return the link name in malloc'd storage.
|
||||
Unlike xreadlink and xreadlink_with_size, don't ever call exit.
|
||||
|
||||
Copyright (C) 2001, 2003-2007, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001, 2003-2007, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Jim Meyering <jim@meyering.net> */
|
||||
@ -79,18 +79,19 @@ areadlink_with_size (char const *file, size_t size)
|
||||
{
|
||||
buf = buffer = malloc (buf_size);
|
||||
if (!buffer)
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
r = readlink (file, buf, buf_size);
|
||||
link_length = r;
|
||||
|
||||
if (r < 0)
|
||||
/* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
|
||||
with errno == ERANGE if the buffer is too small. */
|
||||
if (r < 0 && errno != ERANGE)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
free (buffer);
|
||||
errno = saved_errno;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1,19 +1,19 @@
|
||||
/* areadlink.c -- readlink wrapper to return the link name in malloc'd storage
|
||||
Unlike xreadlink and xreadlink_with_size, don't ever call exit.
|
||||
|
||||
Copyright (C) 2001, 2003-2007, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001, 2003-2007, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Jim Meyering <jim@meyering.net>
|
||||
|
@ -1,37 +1,33 @@
|
||||
/* Read symbolic links without size limitation.
|
||||
|
||||
Copyright (C) 2001, 2003-2004, 2007, 2009-2022 Free Software Foundation,
|
||||
Copyright (C) 2001, 2003-2004, 2007, 2009-2020 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Jim Meyering <jim@meyering.net> */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
extern char *areadlink (char const *filename)
|
||||
_GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
extern char *areadlink_with_size (char const *filename, size_t size_hint)
|
||||
_GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
extern char *areadlink (char const *filename);
|
||||
extern char *areadlink_with_size (char const *filename, size_t size_hint);
|
||||
|
||||
#if GNULIB_AREADLINKAT
|
||||
extern char *areadlinkat (int fd, char const *filename)
|
||||
_GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
extern char *areadlinkat (int fd, char const *filename);
|
||||
#endif
|
||||
|
||||
#if GNULIB_AREADLINKAT_WITH_SIZE
|
||||
extern char *areadlinkat_with_size (int fd, char const *filename,
|
||||
size_t size_hint)
|
||||
_GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
size_t size_hint);
|
||||
#endif
|
||||
|
@ -1,154 +0,0 @@
|
||||
/* readlinkat wrapper to return the link name in malloc'd storage.
|
||||
Unlike xreadlinkat, only call exit on failure to change directory.
|
||||
|
||||
Copyright (C) 2001, 2003-2007, 2009-2022 Free Software Foundation, Inc.
|
||||
|
||||
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/>. */
|
||||
|
||||
/* Written by Jim Meyering <jim@meyering.net>
|
||||
and Eric Blake <ebb9@byu.net>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "areadlink.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#if HAVE_READLINKAT
|
||||
|
||||
# ifndef SSIZE_MAX
|
||||
# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
|
||||
# endif
|
||||
|
||||
/* SYMLINK_MAX is used only for an initial memory-allocation sanity
|
||||
check, so it's OK to guess too small on hosts where there is no
|
||||
arbitrary limit to symbolic link length. */
|
||||
# ifndef SYMLINK_MAX
|
||||
# define SYMLINK_MAX 1024
|
||||
# endif
|
||||
|
||||
# define MAXSIZE (SIZE_MAX < SSIZE_MAX ? SIZE_MAX : SSIZE_MAX)
|
||||
|
||||
/* Call readlinkat to get the symbolic link value of FILE, relative to FD.
|
||||
SIZE is a hint as to how long the link is expected to be;
|
||||
typically it is taken from st_size. It need not be correct.
|
||||
Return a pointer to that NUL-terminated string in malloc'd storage.
|
||||
If readlinkat fails, malloc fails, or if the link value is longer
|
||||
than SSIZE_MAX, return NULL (caller may use errno to diagnose).
|
||||
However, failure to change directory during readlinkat will issue
|
||||
a diagnostic and exit. */
|
||||
|
||||
char *
|
||||
areadlinkat_with_size (int fd, char const *file, size_t size)
|
||||
{
|
||||
/* Some buggy file systems report garbage in st_size. Defend
|
||||
against them by ignoring outlandish st_size values in the initial
|
||||
memory allocation. */
|
||||
size_t symlink_max = SYMLINK_MAX;
|
||||
size_t INITIAL_LIMIT_BOUND = 8 * 1024;
|
||||
size_t initial_limit = (symlink_max < INITIAL_LIMIT_BOUND
|
||||
? symlink_max + 1
|
||||
: INITIAL_LIMIT_BOUND);
|
||||
|
||||
enum { stackbuf_size = 128 };
|
||||
|
||||
/* The initial buffer size for the link value. */
|
||||
size_t buf_size = (size == 0 ? stackbuf_size
|
||||
: size < initial_limit ? size + 1 : initial_limit);
|
||||
|
||||
while (1)
|
||||
{
|
||||
ssize_t r;
|
||||
size_t link_length;
|
||||
char stackbuf[stackbuf_size];
|
||||
char *buf = stackbuf;
|
||||
char *buffer = NULL;
|
||||
|
||||
if (! (size == 0 && buf_size == stackbuf_size))
|
||||
{
|
||||
buf = buffer = malloc (buf_size);
|
||||
if (!buffer)
|
||||
/* We can assume errno == ENOMEM here, since all platforms that have
|
||||
readlinkat() have a POSIX compliant malloc(). */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
r = readlinkat (fd, file, buf, buf_size);
|
||||
link_length = r;
|
||||
|
||||
if (r < 0)
|
||||
{
|
||||
free (buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (link_length < buf_size)
|
||||
{
|
||||
buf[link_length] = 0;
|
||||
if (!buffer)
|
||||
{
|
||||
buffer = malloc (link_length + 1);
|
||||
if (buffer)
|
||||
return memcpy (buffer, buf, link_length + 1);
|
||||
}
|
||||
else if (link_length + 1 < buf_size)
|
||||
{
|
||||
/* Shrink BUFFER before returning it. */
|
||||
char *shrinked_buffer = realloc (buffer, link_length + 1);
|
||||
if (shrinked_buffer != NULL)
|
||||
buffer = shrinked_buffer;
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
free (buffer);
|
||||
if (buf_size <= MAXSIZE / 2)
|
||||
buf_size *= 2;
|
||||
else if (buf_size < MAXSIZE)
|
||||
buf_size = MAXSIZE;
|
||||
else
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else /* !HAVE_READLINKAT */
|
||||
|
||||
|
||||
/* It is more efficient to change directories only once and call
|
||||
areadlink_with_size, rather than repeatedly call the replacement
|
||||
readlinkat. */
|
||||
|
||||
# define AT_FUNC_NAME areadlinkat_with_size
|
||||
# define AT_FUNC_F1 areadlink_with_size
|
||||
# define AT_FUNC_POST_FILE_PARAM_DECLS , size_t size
|
||||
# define AT_FUNC_POST_FILE_ARGS , size
|
||||
# define AT_FUNC_RESULT char *
|
||||
# define AT_FUNC_FAIL NULL
|
||||
# include "at-func.c"
|
||||
# undef AT_FUNC_NAME
|
||||
# undef AT_FUNC_F1
|
||||
# undef AT_FUNC_POST_FILE_PARAM_DECLS
|
||||
# undef AT_FUNC_POST_FILE_ARGS
|
||||
# undef AT_FUNC_RESULT
|
||||
# undef AT_FUNC_FAIL
|
||||
|
||||
#endif /* !HAVE_READLINKAT */
|
@ -1,11 +1,11 @@
|
||||
/* areadlinkat.c -- readlinkat wrapper to return malloc'd link name
|
||||
Unlike xreadlinkat, only call exit on failure to change directory.
|
||||
|
||||
Copyright (C) 2001, 2003-2007, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001, 2003-2007, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,24 +1,24 @@
|
||||
/* A C macro for declaring that specific arguments must not be NULL.
|
||||
Copyright (C) 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License, or
|
||||
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
|
||||
Lesser General Public License for more details.
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
|
||||
that the values passed as arguments n, ..., m must be non-NULL pointers.
|
||||
n = 1 stands for the first argument, n = 2 for the second argument etc. */
|
||||
#ifndef _GL_ARG_NONNULL
|
||||
# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
|
||||
# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
|
||||
# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
|
||||
# else
|
||||
# define _GL_ARG_NONNULL(params)
|
||||
|
@ -1,11 +1,11 @@
|
||||
/* argmatch.c -- find a match for a string in an array
|
||||
|
||||
Copyright (C) 1990, 1998-1999, 2001-2007, 2009-2022 Free Software
|
||||
Copyright (C) 1990, 1998-1999, 2001-2007, 2009-2020 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
@ -62,7 +62,7 @@ __argmatch_die (void)
|
||||
ARGMATCH_DIE;
|
||||
}
|
||||
|
||||
/* Used by XARGMATCH. See description in argmatch.h.
|
||||
/* Used by XARGMATCH and XARGCASEMATCH. See description in argmatch.h.
|
||||
Default to __argmatch_die, but allow caller to change this at run-time. */
|
||||
argmatch_exit_fn argmatch_die = __argmatch_die;
|
||||
|
||||
@ -120,21 +120,6 @@ argmatch (const char *arg, const char *const *arglist,
|
||||
return matchind;
|
||||
}
|
||||
|
||||
ptrdiff_t
|
||||
argmatch_exact (const char *arg, const char *const *arglist)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
/* Test elements for exact match. */
|
||||
for (i = 0; arglist[i]; i++)
|
||||
{
|
||||
if (!strcmp (arglist[i], arg))
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Error reporting for argmatch.
|
||||
CONTEXT is a description of the type of entity that was being matched.
|
||||
VALUE is the invalid value that was given.
|
||||
@ -189,16 +174,9 @@ ptrdiff_t
|
||||
__xargmatch_internal (const char *context,
|
||||
const char *arg, const char *const *arglist,
|
||||
const void *vallist, size_t valsize,
|
||||
argmatch_exit_fn exit_fn,
|
||||
bool allow_abbreviation)
|
||||
argmatch_exit_fn exit_fn)
|
||||
{
|
||||
ptrdiff_t res;
|
||||
|
||||
if (allow_abbreviation)
|
||||
res = argmatch (arg, arglist, vallist, valsize);
|
||||
else
|
||||
res = argmatch_exact (arg, arglist);
|
||||
|
||||
ptrdiff_t res = argmatch (arg, arglist, vallist, valsize);
|
||||
if (res >= 0)
|
||||
/* Success. */
|
||||
return res;
|
||||
@ -288,7 +266,7 @@ main (int argc, const char *const *argv)
|
||||
backup_args, backup_vals);
|
||||
|
||||
printf ("The version control is '%s'\n",
|
||||
ARGMATCH_TO_ARGUMENT (&backup_type, backup_args, backup_vals));
|
||||
ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
/* argmatch.h -- definitions and prototypes for argmatch.c
|
||||
|
||||
Copyright (C) 1990, 1998-1999, 2001-2002, 2004-2005, 2009-2022 Free Software
|
||||
Copyright (C) 1990, 1998-1999, 2001-2002, 2004-2005, 2009-2020 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
@ -52,15 +52,9 @@ extern "C" {
|
||||
ptrdiff_t argmatch (char const *arg, char const *const *arglist,
|
||||
void const *vallist, size_t valsize) _GL_ATTRIBUTE_PURE;
|
||||
|
||||
ptrdiff_t argmatch_exact (char const *arg, char const *const *arglist)
|
||||
_GL_ATTRIBUTE_PURE;
|
||||
|
||||
# define ARGMATCH(Arg, Arglist, Vallist) \
|
||||
argmatch (Arg, Arglist, (void const *) (Vallist), sizeof *(Vallist))
|
||||
|
||||
# define ARGMATCH_EXACT(Arg, Arglist) \
|
||||
argmatch_exact (Arg, Arglist)
|
||||
|
||||
/* xargmatch calls this function when it fails. This function should not
|
||||
return. By default, this is a function that calls ARGMATCH_DIE which
|
||||
in turn defaults to 'exit (exit_failure)'. */
|
||||
@ -89,14 +83,13 @@ void argmatch_valid (char const *const *arglist,
|
||||
|
||||
|
||||
|
||||
/* Like argmatch/argmatch_exact, but upon failure, report an explanation
|
||||
of the failure, and exit using the function EXIT_FN. */
|
||||
/* Same as argmatch, but upon failure, report an explanation of the
|
||||
failure, and exit using the function EXIT_FN. */
|
||||
|
||||
ptrdiff_t __xargmatch_internal (char const *context,
|
||||
char const *arg, char const *const *arglist,
|
||||
void const *vallist, size_t valsize,
|
||||
argmatch_exit_fn exit_fn,
|
||||
bool allow_abbreviation);
|
||||
argmatch_exit_fn exit_fn);
|
||||
|
||||
/* Programmer friendly interface to __xargmatch_internal. */
|
||||
|
||||
@ -104,15 +97,7 @@ ptrdiff_t __xargmatch_internal (char const *context,
|
||||
((Vallist) [__xargmatch_internal (Context, Arg, Arglist, \
|
||||
(void const *) (Vallist), \
|
||||
sizeof *(Vallist), \
|
||||
argmatch_die, \
|
||||
true)])
|
||||
|
||||
# define XARGMATCH_EXACT(Context, Arg, Arglist, Vallist) \
|
||||
((Vallist) [__xargmatch_internal (Context, Arg, Arglist, \
|
||||
(void const *) (Vallist), \
|
||||
sizeof *(Vallist), \
|
||||
argmatch_die, \
|
||||
false)])
|
||||
argmatch_die)])
|
||||
|
||||
/* Convert a value into a corresponding argument. */
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Iterate over arguments from argv or --files0-from=FILE
|
||||
Copyright (C) 2008-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Iterate over arguments from argv or --files0-from=FILE
|
||||
Copyright (C) 2008-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
@ -30,14 +30,13 @@ enum argv_iter_err
|
||||
AI_ERR_READ
|
||||
};
|
||||
|
||||
void argv_iter_free (struct argv_iterator *)
|
||||
_GL_ARG_NONNULL ((1));
|
||||
|
||||
struct argv_iterator *argv_iter_init_argv (char **argv)
|
||||
_GL_ARG_NONNULL ((1)) _GL_ATTRIBUTE_DEALLOC (argv_iter_free, 1);
|
||||
_GL_ARG_NONNULL ((1));
|
||||
struct argv_iterator *argv_iter_init_stream (FILE *fp)
|
||||
_GL_ARG_NONNULL ((1)) _GL_ATTRIBUTE_DEALLOC (argv_iter_free, 1);
|
||||
_GL_ARG_NONNULL ((1));
|
||||
char *argv_iter (struct argv_iterator *, enum argv_iter_err *)
|
||||
_GL_ARG_NONNULL ((1, 2));
|
||||
size_t argv_iter_n_args (struct argv_iterator const *)
|
||||
_GL_ATTRIBUTE_PURE _GL_ARG_NONNULL ((1));
|
||||
void argv_iter_free (struct argv_iterator *)
|
||||
_GL_ARG_NONNULL ((1));
|
||||
|
122
lib/arpa/inet.h
122
lib/arpa/inet.h
@ -1,20 +1,20 @@
|
||||
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
|
||||
/* A GNU-like <arpa/inet.h>.
|
||||
|
||||
Copyright (C) 2005-2006, 2008-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2005-2006, 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _GL_ARPA_INET_H
|
||||
|
||||
@ -58,19 +58,19 @@
|
||||
|
||||
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
||||
/* C++ compatible function declaration macros.
|
||||
Copyright (C) 2010-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2010-2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License, or
|
||||
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
|
||||
Lesser General Public License for more details.
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _GL_CXXDEFS_H
|
||||
@ -205,16 +205,6 @@
|
||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#endif
|
||||
|
||||
/* _GL_CXXALIAS_MDA (func, rettype, parameters);
|
||||
is to be used when func is a Microsoft deprecated alias, on native Windows.
|
||||
It declares a C++ alias called GNULIB_NAMESPACE::func
|
||||
that redirects to _func, if GNULIB_NAMESPACE is defined.
|
||||
Example:
|
||||
_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
|
||||
*/
|
||||
#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
|
||||
_GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
|
||||
|
||||
/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
|
||||
is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
|
||||
except that the C function rpl_func may have a slightly different
|
||||
@ -240,14 +230,6 @@
|
||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#endif
|
||||
|
||||
/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
|
||||
is like _GL_CXXALIAS_MDA (func, rettype, parameters);
|
||||
except that the C function func may have a slightly different declaration.
|
||||
A cast is used to silence the "invalid conversion" error that would
|
||||
otherwise occur. */
|
||||
#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
|
||||
_GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
|
||||
|
||||
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||
that redirects to the system provided function func, if GNULIB_NAMESPACE
|
||||
@ -345,7 +327,7 @@
|
||||
_GL_CXXALIASWARN_2 (func, namespace)
|
||||
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||
we enable the warning only when not optimizing. */
|
||||
# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
|
||||
# if !__OPTIMIZE__
|
||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||
_GL_WARN_ON_USE (func, \
|
||||
"The symbol ::" #func " refers to the system function. " \
|
||||
@ -373,9 +355,9 @@
|
||||
_GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
|
||||
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||
we enable the warning only when not optimizing. */
|
||||
# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
|
||||
# if !__OPTIMIZE__
|
||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||
_GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
|
||||
_GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
|
||||
"The symbol ::" #func " refers to the system function. " \
|
||||
"Use " #namespace "::" #func " instead.")
|
||||
# else
|
||||
@ -391,26 +373,26 @@
|
||||
|
||||
/* The definition of _GL_ARG_NONNULL is copied here. */
|
||||
/* A C macro for declaring that specific arguments must not be NULL.
|
||||
Copyright (C) 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License, or
|
||||
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
|
||||
Lesser General Public License for more details.
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
|
||||
that the values passed as arguments n, ..., m must be non-NULL pointers.
|
||||
n = 1 stands for the first argument, n = 2 for the second argument etc. */
|
||||
#ifndef _GL_ARG_NONNULL
|
||||
# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
|
||||
# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
|
||||
# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
|
||||
# else
|
||||
# define _GL_ARG_NONNULL(params)
|
||||
@ -419,19 +401,19 @@
|
||||
|
||||
/* The definition of _GL_WARN_ON_USE is copied here. */
|
||||
/* A C macro for emitting warnings if a function is used.
|
||||
Copyright (C) 2010-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2010-2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License, or
|
||||
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
|
||||
Lesser General Public License for more details.
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
|
||||
@ -504,20 +486,13 @@
|
||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
||||
/* A compiler attribute is available in gcc versions 4.3.0 and later. */
|
||||
# define _GL_WARN_ON_USE(function, message) \
|
||||
_GL_WARN_EXTERN_C __typeof__ (function) function __attribute__ ((__warning__ (message)))
|
||||
extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
|
||||
# define _GL_WARN_ON_USE_ATTRIBUTE(message) \
|
||||
__attribute__ ((__warning__ (message)))
|
||||
# elif __clang_major__ >= 4
|
||||
/* Another compiler attribute is available in clang. */
|
||||
# define _GL_WARN_ON_USE(function, message) \
|
||||
_GL_WARN_EXTERN_C __typeof__ (function) function \
|
||||
__attribute__ ((__diagnose_if__ (1, message, "warning")))
|
||||
# define _GL_WARN_ON_USE_ATTRIBUTE(message) \
|
||||
__attribute__ ((__diagnose_if__ (1, message, "warning")))
|
||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||
/* Verify the existence of the function. */
|
||||
# define _GL_WARN_ON_USE(function, message) \
|
||||
_GL_WARN_EXTERN_C __typeof__ (function) function
|
||||
extern __typeof__ (function) function
|
||||
# define _GL_WARN_ON_USE_ATTRIBUTE(message)
|
||||
# else /* Unsupported. */
|
||||
# define _GL_WARN_ON_USE(function, message) \
|
||||
@ -526,35 +501,24 @@ _GL_WARN_EXTERN_C int _gl_warn_on_use
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
|
||||
is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
|
||||
function is declared with the given prototype, consisting of return type,
|
||||
parameters, and attributes.
|
||||
/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
|
||||
is like _GL_WARN_ON_USE (function, "string"), except that the function is
|
||||
declared with the given prototype, consisting of return type, parameters,
|
||||
and attributes.
|
||||
This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
|
||||
not work in this case. */
|
||||
#ifndef _GL_WARN_ON_USE_CXX
|
||||
# if !defined __cplusplus
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
|
||||
_GL_WARN_ON_USE (function, msg)
|
||||
# else
|
||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
||||
/* A compiler attribute is available in gcc versions 4.3.0 and later. */
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
|
||||
extern rettype_gcc function parameters_and_attributes \
|
||||
__attribute__ ((__warning__ (msg)))
|
||||
# elif __clang_major__ >= 4
|
||||
/* Another compiler attribute is available in clang. */
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
|
||||
extern rettype_clang function parameters_and_attributes \
|
||||
__attribute__ ((__diagnose_if__ (1, msg, "warning")))
|
||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||
extern rettype function parameters_and_attributes \
|
||||
__attribute__ ((__warning__ (msg)))
|
||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||
/* Verify the existence of the function. */
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
|
||||
extern rettype_gcc function parameters_and_attributes
|
||||
# else /* Unsupported. */
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||
extern rettype function parameters_and_attributes
|
||||
# else /* Unsupported. */
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
@ -1,19 +1,19 @@
|
||||
/* A GNU-like <arpa/inet.h>.
|
||||
|
||||
Copyright (C) 2005-2006, 2008-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2005-2006, 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _@GUARD_PREFIX@_ARPA_INET_H
|
||||
|
||||
|
@ -1,18 +1,18 @@
|
||||
/* Formatted output to strings.
|
||||
Copyright (C) 1999, 2002, 2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999, 2002, 2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
@ -1,19 +1,19 @@
|
||||
/* Formatted output to strings.
|
||||
Copyright (C) 1999, 2002, 2006-2007, 2009-2022 Free Software Foundation,
|
||||
Copyright (C) 1999, 2002, 2006-2007, 2009-2020 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
40
lib/assure.h
40
lib/assure.h
@ -1,18 +1,18 @@
|
||||
/* Run-time assert-like macros.
|
||||
|
||||
Copyright (C) 2014-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2014-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
@ -21,32 +21,12 @@
|
||||
#define _GL_ASSURE_H
|
||||
|
||||
#include <assert.h>
|
||||
#include "verify.h"
|
||||
|
||||
/* Evaluate an assertion E that is guaranteed to be true.
|
||||
If NDEBUG is not defined, abort the program if E is false.
|
||||
If NDEBUG is defined, the compiler can assume E and behavior is
|
||||
undefined if E is false, fails to evaluate, or has side effects.
|
||||
|
||||
Unlike standard 'assert', this macro evaluates E even when NDEBUG
|
||||
is defined, so as to catch typos, avoid some GCC warnings, and
|
||||
improve performance when E is simple enough.
|
||||
|
||||
Also see the documentation for 'assume' in verify.h. */
|
||||
|
||||
#ifdef NDEBUG
|
||||
# define affirm(E) assume (E)
|
||||
#else
|
||||
# define affirm(E) assert (E)
|
||||
#endif
|
||||
|
||||
/* Check E's value at runtime, and report an error and abort if not.
|
||||
However, do nothing if NDEBUG is defined.
|
||||
|
||||
Unlike standard 'assert', this macro compiles E even when NDEBUG
|
||||
is defined, so as to catch typos and avoid some GCC warnings.
|
||||
Unlike 'affirm', it is OK for E to use hard-to-optimize features,
|
||||
since E is not executed if NDEBUG is defined. */
|
||||
Unlike standard 'assert', this macro always compiles E even when NDEBUG
|
||||
is defined, so as to catch typos and avoid some GCC warnings. */
|
||||
|
||||
#ifdef NDEBUG
|
||||
# define assure(E) ((void) (0 && (E)))
|
||||
|
@ -1,9 +1,9 @@
|
||||
/* Define at-style functions like fstatat, unlinkat, fchownat, etc.
|
||||
Copyright (C) 2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
@ -16,7 +16,7 @@
|
||||
|
||||
/* written by Jim Meyering */
|
||||
|
||||
#include "filename.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
|
||||
#include "dosname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
|
||||
|
||||
#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD
|
||||
# include <errno.h>
|
||||
|
@ -1,9 +1,9 @@
|
||||
/* Define 2-FD at-style functions like linkat or renameat.
|
||||
Copyright (C) 2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
@ -25,7 +25,7 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "filename.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
|
||||
#include "dosname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
|
||||
#include "filenamecat.h"
|
||||
#include "openat.h"
|
||||
#include "same-inode.h"
|
||||
|
226
lib/attribute.h
226
lib/attribute.h
@ -1,226 +0,0 @@
|
||||
/* ATTRIBUTE_* macros for using attributes in GCC and similar compilers
|
||||
|
||||
Copyright 2020-2022 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
/* Provide public ATTRIBUTE_* names for the private _GL_ATTRIBUTE_*
|
||||
macros used within Gnulib. */
|
||||
|
||||
/* These attributes can be placed in two ways:
|
||||
- At the start of a declaration (i.e. even before storage-class
|
||||
specifiers!); then they apply to all entities that are declared
|
||||
by the declaration.
|
||||
- Immediately after the name of an entity being declared by the
|
||||
declaration; then they apply to that entity only. */
|
||||
|
||||
#ifndef _GL_ATTRIBUTE_H
|
||||
#define _GL_ATTRIBUTE_H
|
||||
|
||||
|
||||
/* This file defines two types of attributes:
|
||||
* C2x standard attributes. These have macro names that do not begin with
|
||||
'ATTRIBUTE_'.
|
||||
* Selected GCC attributes; see:
|
||||
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
|
||||
https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
|
||||
https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html
|
||||
These names begin with 'ATTRIBUTE_' to avoid name clashes. */
|
||||
|
||||
|
||||
/* =============== Attributes for specific kinds of functions =============== */
|
||||
|
||||
/* Attributes for functions that should not be used. */
|
||||
|
||||
/* Warn if the entity is used. */
|
||||
/* Applies to:
|
||||
- function, variable,
|
||||
- struct, union, struct/union member,
|
||||
- enumeration, enumeration item,
|
||||
- typedef,
|
||||
in C++ also: namespace, class, template specialization. */
|
||||
#define DEPRECATED _GL_ATTRIBUTE_DEPRECATED
|
||||
|
||||
/* If a function call is not optimized way, warn with MSG. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_WARNING(msg) _GL_ATTRIBUTE_WARNING (msg)
|
||||
|
||||
/* If a function call is not optimized way, report an error with MSG. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_ERROR(msg) _GL_ATTRIBUTE_ERROR (msg)
|
||||
|
||||
|
||||
/* Attributes for memory-allocating functions. */
|
||||
|
||||
/* The function returns a pointer to freshly allocated memory. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_MALLOC _GL_ATTRIBUTE_MALLOC
|
||||
|
||||
/* ATTRIBUTE_ALLOC_SIZE ((N)) - The Nth argument of the function
|
||||
is the size of the returned memory block.
|
||||
ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments
|
||||
to determine the size of the returned memory block. */
|
||||
/* Applies to: function, pointer to function, function types. */
|
||||
#define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args)
|
||||
|
||||
/* ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
|
||||
that can be freed by passing them as the Ith argument to the
|
||||
function F.
|
||||
ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
|
||||
can be freed via 'free'; it can be used only after declaring 'free'. */
|
||||
/* Applies to: functions. Cannot be used on inline functions. */
|
||||
#define ATTRIBUTE_DEALLOC(f, i) _GL_ATTRIBUTE_DEALLOC(f, i)
|
||||
#define ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC_FREE
|
||||
|
||||
/* Attributes for variadic functions. */
|
||||
|
||||
/* The variadic function expects a trailing NULL argument.
|
||||
ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
|
||||
ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_SENTINEL(pos) _GL_ATTRIBUTE_SENTINEL (pos)
|
||||
|
||||
|
||||
/* ================== Attributes for compiler diagnostics ================== */
|
||||
|
||||
/* Attributes that help the compiler diagnose programmer mistakes.
|
||||
Some of them may also help for some compiler optimizations. */
|
||||
|
||||
/* ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) -
|
||||
The STRING-INDEXth function argument is a format string of style
|
||||
ARCHETYPE, which is one of:
|
||||
printf, gnu_printf
|
||||
scanf, gnu_scanf,
|
||||
strftime, gnu_strftime,
|
||||
strfmon,
|
||||
or the same thing prefixed and suffixed with '__'.
|
||||
If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
|
||||
are suitable for the format string. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_FORMAT(spec) _GL_ATTRIBUTE_FORMAT (spec)
|
||||
|
||||
/* ATTRIBUTE_NONNULL ((N1, N2,...)) - Arguments N1, N2,... must not be NULL.
|
||||
ATTRIBUTE_NONNULL () - All pointer arguments must not be null. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_NONNULL(args) _GL_ATTRIBUTE_NONNULL (args)
|
||||
|
||||
/* The function's return value is a non-NULL pointer. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_RETURNS_NONNULL _GL_ATTRIBUTE_RETURNS_NONNULL
|
||||
|
||||
/* Warn if the caller does not use the return value,
|
||||
unless the caller uses something like ignore_value. */
|
||||
/* Applies to: function, enumeration, class. */
|
||||
#define NODISCARD _GL_ATTRIBUTE_NODISCARD
|
||||
|
||||
|
||||
/* Attributes that disable false alarms when the compiler diagnoses
|
||||
programmer "mistakes". */
|
||||
|
||||
/* Do not warn if the entity is not used. */
|
||||
/* Applies to:
|
||||
- function, variable,
|
||||
- struct, union, struct/union member,
|
||||
- enumeration, enumeration item,
|
||||
- typedef,
|
||||
in C++ also: class. */
|
||||
#define MAYBE_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
|
||||
|
||||
/* The contents of a character array is not meant to be NUL-terminated. */
|
||||
/* Applies to: struct/union members and variables that are arrays of element
|
||||
type '[[un]signed] char'. */
|
||||
#define ATTRIBUTE_NONSTRING _GL_ATTRIBUTE_NONSTRING
|
||||
|
||||
/* Do not warn if control flow falls through to the immediately
|
||||
following 'case' or 'default' label. */
|
||||
/* Applies to: Empty statement (;), inside a 'switch' statement. */
|
||||
#define FALLTHROUGH _GL_ATTRIBUTE_FALLTHROUGH
|
||||
|
||||
|
||||
/* ================== Attributes for debugging information ================== */
|
||||
|
||||
/* Attributes regarding debugging information emitted by the compiler. */
|
||||
|
||||
/* Omit the function from stack traces when debugging. */
|
||||
/* Applies to: function. */
|
||||
#define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL
|
||||
|
||||
/* Make the entity visible to debuggers etc., even with '-fwhole-program'. */
|
||||
/* Applies to: functions, variables. */
|
||||
#define ATTRIBUTE_EXTERNALLY_VISIBLE _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
|
||||
|
||||
|
||||
/* ========== Attributes that mainly direct compiler optimizations ========== */
|
||||
|
||||
/* The function does not throw exceptions. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_NOTHROW _GL_ATTRIBUTE_NOTHROW
|
||||
|
||||
/* Do not inline the function. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_NOINLINE _GL_ATTRIBUTE_NOINLINE
|
||||
|
||||
/* Always inline the function, and report an error if the compiler
|
||||
cannot inline. */
|
||||
/* Applies to: function. */
|
||||
#define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
|
||||
|
||||
/* It is OK for a compiler to omit duplicate calls with the same arguments.
|
||||
This attribute is safe for a function that neither depends on
|
||||
nor affects observable state, and always returns exactly once -
|
||||
e.g., does not loop forever, and does not call longjmp.
|
||||
(This attribute is stricter than ATTRIBUTE_PURE.) */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
|
||||
|
||||
/* It is OK for a compiler to omit duplicate calls with the same
|
||||
arguments if observable state is not changed between calls.
|
||||
This attribute is safe for a function that does not affect
|
||||
observable state, and always returns exactly once.
|
||||
(This attribute is looser than ATTRIBUTE_CONST.) */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE
|
||||
|
||||
/* The function is rarely executed. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD
|
||||
|
||||
/* If called from some other compilation unit, the function executes
|
||||
code from that unit only by return or by exception handling,
|
||||
letting the compiler optimize that unit more aggressively. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_LEAF _GL_ATTRIBUTE_LEAF
|
||||
|
||||
/* For struct members: The member has the smallest possible alignment.
|
||||
For struct, union, class: All members have the smallest possible alignment,
|
||||
minimizing the memory required. */
|
||||
/* Applies to: struct members, struct, union,
|
||||
in C++ also: class. */
|
||||
#define ATTRIBUTE_PACKED _GL_ATTRIBUTE_PACKED
|
||||
|
||||
|
||||
/* ================ Attributes that make invalid code valid ================ */
|
||||
|
||||
/* Attributes that prevent fatal compiler optimizations for code that is not
|
||||
fully ISO C compliant. */
|
||||
|
||||
/* Pointers to the type may point to the same storage as pointers to
|
||||
other types, thus disabling strict aliasing optimization. */
|
||||
/* Applies to: types. */
|
||||
#define ATTRIBUTE_MAY_ALIAS _GL_ATTRIBUTE_MAY_ALIAS
|
||||
|
||||
|
||||
#endif /* _GL_ATTRIBUTE_H */
|
@ -1,10 +1,10 @@
|
||||
/* backupfile.c -- make Emacs style backup file names
|
||||
|
||||
Copyright 2017-2022 Free Software Foundation, Inc.
|
||||
Copyright 2017-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,23 +1,3 @@
|
||||
/* Backup files.
|
||||
|
||||
Copyright (C) 2017-2022 Free Software Foundation, Inc.
|
||||
|
||||
This file 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 file 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/>. */
|
||||
|
||||
#include "backupfile.h"
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
extern char *backupfile_internal (int, char const *, enum backup_type, bool)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
extern char *backupfile_internal (int, char const *, enum backup_type, bool);
|
||||
|
@ -1,10 +1,10 @@
|
||||
/* Rename a file to a backup name, Emacs style.
|
||||
|
||||
Copyright 2017-2022 Free Software Foundation, Inc.
|
||||
Copyright 2017-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
116
lib/backupfile.c
116
lib/backupfile.c
@ -1,10 +1,10 @@
|
||||
/* backupfile.c -- make Emacs style backup file names
|
||||
|
||||
Copyright (C) 1990-2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990-2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
@ -22,7 +22,11 @@
|
||||
|
||||
#include "backup-internal.h"
|
||||
|
||||
#include <dirent.h>
|
||||
#include "dirname.h"
|
||||
#include "opendirat.h"
|
||||
#include "renameatu.h"
|
||||
#include "xalloc-oversized.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
@ -31,12 +35,13 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "attribute.h"
|
||||
#include "basename-lgpl.h"
|
||||
#include "ialloc.h"
|
||||
#include "intprops.h"
|
||||
#include "opendirat.h"
|
||||
#include "renameatu.h"
|
||||
#ifndef FALLTHROUGH
|
||||
# if __GNUC__ < 7
|
||||
# define FALLTHROUGH ((void) 0)
|
||||
# else
|
||||
# define FALLTHROUGH __attribute__ ((__fallthrough__))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef _D_EXACT_NAMLEN
|
||||
# define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name)
|
||||
@ -44,7 +49,6 @@
|
||||
|
||||
#if ! (HAVE_PATHCONF && defined _PC_NAME_MAX)
|
||||
# define pathconf(file, option) (errno = -1)
|
||||
# define fpathconf(fd, option) (errno = -1)
|
||||
#endif
|
||||
|
||||
#ifndef _POSIX_NAME_MAX
|
||||
@ -91,20 +95,19 @@ set_simple_backup_suffix (char const *s)
|
||||
/* If FILE (which was of length FILELEN before an extension was
|
||||
appended to it) is too long, replace the extension with the single
|
||||
char E. If the result is still too long, remove the char just
|
||||
before E. Return true if the extension was OK already, false
|
||||
if it needed replacement.
|
||||
before E.
|
||||
|
||||
If DIR_FD is nonnegative, it is a file descriptor for FILE's parent.
|
||||
*BASE_MAX is either 0, or the cached result of a previous call for
|
||||
*NAME_MAX is either 0, or the cached result of a previous call for
|
||||
FILE's parent's _PC_NAME_MAX. */
|
||||
|
||||
static bool
|
||||
check_extension (char *file, idx_t filelen, char e,
|
||||
int dir_fd, idx_t *base_max)
|
||||
static void
|
||||
check_extension (char *file, size_t filelen, char e,
|
||||
int dir_fd, size_t *base_max)
|
||||
{
|
||||
char *base = last_component (file);
|
||||
idx_t baselen = base_len (base);
|
||||
idx_t baselen_max = HAVE_LONG_FILE_NAMES ? 255 : NAME_MAX_MINIMUM;
|
||||
size_t baselen = base_len (base);
|
||||
size_t baselen_max = HAVE_LONG_FILE_NAMES ? 255 : NAME_MAX_MINIMUM;
|
||||
|
||||
if (HAVE_DOS_FILE_NAMES || NAME_MAX_MINIMUM < baselen)
|
||||
{
|
||||
@ -154,16 +157,13 @@ check_extension (char *file, idx_t filelen, char e,
|
||||
}
|
||||
}
|
||||
|
||||
if (baselen <= baselen_max)
|
||||
return true;
|
||||
else
|
||||
if (baselen_max < baselen)
|
||||
{
|
||||
baselen = file + filelen - base;
|
||||
if (baselen_max <= baselen)
|
||||
baselen = baselen_max - 1;
|
||||
base[baselen] = e;
|
||||
base[baselen + 1] = '\0';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -191,11 +191,9 @@ enum numbered_backup_result
|
||||
Store into *BUFFER the next backup name for the named file,
|
||||
with a version number greater than all the
|
||||
existing numbered backups. Reallocate *BUFFER as necessary; its
|
||||
initial allocated size is BUFFER_SIZE, which must be at least 5
|
||||
initial allocated size is BUFFER_SIZE, which must be at least 4
|
||||
bytes longer than the file name to make room for the initially
|
||||
appended ".~1~". FILELEN is the length of the original file name.
|
||||
(The original file name is not necessarily null-terminated;
|
||||
FILELEN does not count trailing slashes after a non-slash.)
|
||||
appended ".~1". FILELEN is the length of the original file name.
|
||||
BASE_OFFSET is the offset of the basename in *BUFFER.
|
||||
The returned value indicates what kind of backup was found. If an
|
||||
I/O or other read error occurs, use the highest backup number that
|
||||
@ -206,14 +204,16 @@ enum numbered_backup_result
|
||||
and its file descriptor into *PNEW_FD without closing the stream. */
|
||||
|
||||
static enum numbered_backup_result
|
||||
numbered_backup (int dir_fd, char **buffer, idx_t buffer_size, idx_t filelen,
|
||||
idx_t base_offset, DIR **dirpp, int *pnew_fd)
|
||||
numbered_backup (int dir_fd, char **buffer, size_t buffer_size, size_t filelen,
|
||||
ptrdiff_t base_offset, DIR **dirpp, int *pnew_fd)
|
||||
{
|
||||
enum numbered_backup_result result = BACKUP_IS_NEW;
|
||||
DIR *dirp = *dirpp;
|
||||
struct dirent *dp;
|
||||
char *buf = *buffer;
|
||||
idx_t versionlenmax = 1;
|
||||
idx_t baselen = filelen - base_offset;
|
||||
size_t versionlenmax = 1;
|
||||
char *base = buf + base_offset;
|
||||
size_t baselen = base_len (base);
|
||||
|
||||
if (dirp)
|
||||
rewinddir (dirp);
|
||||
@ -222,7 +222,6 @@ numbered_backup (int dir_fd, char **buffer, idx_t buffer_size, idx_t filelen,
|
||||
/* Temporarily modify the buffer into its parent directory name,
|
||||
open the directory, and then restore the buffer. */
|
||||
char tmp[sizeof "."];
|
||||
char *base = buf + base_offset;
|
||||
memcpy (tmp, base, sizeof ".");
|
||||
strcpy (base, ".");
|
||||
dirp = opendirat (dir_fd, buf, 0, pnew_fd);
|
||||
@ -235,15 +234,20 @@ numbered_backup (int dir_fd, char **buffer, idx_t buffer_size, idx_t filelen,
|
||||
*dirpp = dirp;
|
||||
}
|
||||
|
||||
for (struct dirent *dp; (dp = readdir (dirp)) != NULL; )
|
||||
while ((dp = readdir (dirp)) != NULL)
|
||||
{
|
||||
char const *p;
|
||||
char *q;
|
||||
bool all_9s;
|
||||
size_t versionlen;
|
||||
|
||||
if (_D_EXACT_NAMLEN (dp) < baselen + 4)
|
||||
continue;
|
||||
|
||||
if (memcmp (buf + base_offset, dp->d_name, baselen + 2) != 0)
|
||||
continue;
|
||||
|
||||
char const *p = dp->d_name + baselen + 2;
|
||||
p = dp->d_name + baselen + 2;
|
||||
|
||||
/* Check whether this file has a version number and if so,
|
||||
whether it is larger. Use string operations rather than
|
||||
@ -251,8 +255,7 @@ numbered_backup (int dir_fd, char **buffer, idx_t buffer_size, idx_t filelen,
|
||||
|
||||
if (! ('1' <= *p && *p <= '9'))
|
||||
continue;
|
||||
bool all_9s = (*p == '9');
|
||||
idx_t versionlen;
|
||||
all_9s = (*p == '9');
|
||||
for (versionlen = 1; ISDIGIT (p[versionlen]); versionlen++)
|
||||
all_9s &= (p[versionlen] == '9');
|
||||
|
||||
@ -268,13 +271,12 @@ numbered_backup (int dir_fd, char **buffer, idx_t buffer_size, idx_t filelen,
|
||||
|
||||
versionlenmax = all_9s + versionlen;
|
||||
result = (all_9s ? BACKUP_IS_LONGER : BACKUP_IS_SAME_LENGTH);
|
||||
idx_t new_buffer_size = filelen + 2 + versionlenmax + 2;
|
||||
size_t new_buffer_size = filelen + 2 + versionlenmax + 2;
|
||||
if (buffer_size < new_buffer_size)
|
||||
{
|
||||
idx_t grown;
|
||||
if (! INT_ADD_WRAPV (new_buffer_size, new_buffer_size >> 1, &grown))
|
||||
new_buffer_size = grown;
|
||||
char *new_buf = irealloc (buf, new_buffer_size);
|
||||
if (! xalloc_oversized (new_buffer_size, 2))
|
||||
new_buffer_size *= 2;
|
||||
char *new_buf = realloc (buf, new_buffer_size);
|
||||
if (!new_buf)
|
||||
{
|
||||
*buffer = buf;
|
||||
@ -283,7 +285,7 @@ numbered_backup (int dir_fd, char **buffer, idx_t buffer_size, idx_t filelen,
|
||||
buf = new_buf;
|
||||
buffer_size = new_buffer_size;
|
||||
}
|
||||
char *q = buf + filelen;
|
||||
q = buf + filelen;
|
||||
*q++ = '.';
|
||||
*q++ = '~';
|
||||
*q = '0';
|
||||
@ -312,32 +314,31 @@ char *
|
||||
backupfile_internal (int dir_fd, char const *file,
|
||||
enum backup_type backup_type, bool rename)
|
||||
{
|
||||
idx_t base_offset = last_component (file) - file;
|
||||
idx_t filelen = base_offset + base_len (file + base_offset);
|
||||
ptrdiff_t base_offset = last_component (file) - file;
|
||||
size_t filelen = base_offset + strlen (file + base_offset);
|
||||
|
||||
if (! simple_backup_suffix)
|
||||
set_simple_backup_suffix (NULL);
|
||||
|
||||
/* Allow room for simple or ".~N~" backups. The guess must be at
|
||||
least sizeof ".~1~", but otherwise will be adjusted as needed. */
|
||||
idx_t simple_backup_suffix_size = strlen (simple_backup_suffix) + 1;
|
||||
idx_t backup_suffix_size_guess = simple_backup_suffix_size;
|
||||
size_t simple_backup_suffix_size = strlen (simple_backup_suffix) + 1;
|
||||
size_t backup_suffix_size_guess = simple_backup_suffix_size;
|
||||
enum { GUESS = sizeof ".~12345~" };
|
||||
if (backup_suffix_size_guess < GUESS)
|
||||
backup_suffix_size_guess = GUESS;
|
||||
|
||||
idx_t ssize = filelen + backup_suffix_size_guess + 1;
|
||||
char *s = imalloc (ssize);
|
||||
ssize_t ssize = filelen + backup_suffix_size_guess + 1;
|
||||
char *s = malloc (ssize);
|
||||
if (!s)
|
||||
return s;
|
||||
|
||||
DIR *dirp = NULL;
|
||||
int sdir = AT_FDCWD;
|
||||
idx_t base_max = 0;
|
||||
int sdir = -1;
|
||||
size_t base_max = 0;
|
||||
while (true)
|
||||
{
|
||||
bool extended = true;
|
||||
memcpy (s, file, filelen);
|
||||
memcpy (s, file, filelen + 1);
|
||||
|
||||
if (backup_type == simple_backups)
|
||||
memcpy (s + filelen, simple_backup_suffix, simple_backup_suffix_size);
|
||||
@ -357,7 +358,7 @@ backupfile_internal (int dir_fd, char const *file,
|
||||
}
|
||||
FALLTHROUGH;
|
||||
case BACKUP_IS_LONGER:
|
||||
extended = check_extension (s, filelen, '~', sdir, &base_max);
|
||||
check_extension (s, filelen, '~', sdir, &base_max);
|
||||
break;
|
||||
|
||||
case BACKUP_NOMEM:
|
||||
@ -371,13 +372,16 @@ backupfile_internal (int dir_fd, char const *file,
|
||||
if (! rename)
|
||||
break;
|
||||
|
||||
int olddirfd = sdir < 0 ? dir_fd : sdir;
|
||||
idx_t offset = sdir < 0 ? 0 : base_offset;
|
||||
if (sdir < 0)
|
||||
{
|
||||
sdir = AT_FDCWD;
|
||||
base_offset = 0;
|
||||
}
|
||||
unsigned flags = backup_type == simple_backups ? 0 : RENAME_NOREPLACE;
|
||||
if (renameatu (olddirfd, file + offset, sdir, s + offset, flags) == 0)
|
||||
if (renameatu (AT_FDCWD, file, sdir, s + base_offset, flags) == 0)
|
||||
break;
|
||||
int e = errno;
|
||||
if (! (e == EEXIST && extended))
|
||||
if (e != EEXIST)
|
||||
{
|
||||
if (dirp)
|
||||
closedir (dirp);
|
||||
|
@ -1,11 +1,11 @@
|
||||
/* backupfile.h -- declarations for making Emacs style backup file names
|
||||
|
||||
Copyright (C) 1990-1992, 1997-1999, 2003-2004, 2009-2022 Free Software
|
||||
Copyright (C) 1990-1992, 1997-1999, 2003-2004, 2009-2020 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
@ -19,11 +19,8 @@
|
||||
#ifndef BACKUPFILE_H_
|
||||
#define BACKUPFILE_H_
|
||||
|
||||
/* Get AT_FDCWD, as a convenience for users of this file. */
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@ -52,11 +49,8 @@ enum backup_type
|
||||
extern char const *simple_backup_suffix;
|
||||
|
||||
void set_simple_backup_suffix (char const *);
|
||||
char *backup_file_rename (int, char const *, enum backup_type)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
char *find_backup_file_name (int, char const *, enum backup_type)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
|
||||
_GL_ATTRIBUTE_RETURNS_NONNULL;
|
||||
char *backup_file_rename (int, char const *, enum backup_type);
|
||||
char *find_backup_file_name (int, char const *, enum backup_type);
|
||||
enum backup_type get_version (char const *context, char const *arg);
|
||||
enum backup_type xget_version (char const *context, char const *arg);
|
||||
|
||||
|
77
lib/base32.c
77
lib/base32.c
@ -1,18 +1,18 @@
|
||||
/* base32.c -- Encode binary data using printable characters.
|
||||
Copyright (C) 1999-2001, 2004-2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999-2001, 2004-2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Adapted from Simon Josefsson's base64 code by Gijs van Tulder.
|
||||
*
|
||||
@ -28,7 +28,7 @@
|
||||
* FAIL: memory allocation error
|
||||
* OK: data in OUT/OUTLEN
|
||||
*
|
||||
* idx_t outlen = base32_encode_alloc (in, inlen, &out);
|
||||
* size_t outlen = base32_encode_alloc (in, inlen, &out);
|
||||
* if (out == NULL && outlen == 0 && inlen != 0)
|
||||
* FAIL: input too long
|
||||
* if (out == NULL)
|
||||
@ -42,17 +42,15 @@
|
||||
/* Get prototype. */
|
||||
#include "base32.h"
|
||||
|
||||
/* Get imalloc. */
|
||||
#include <ialloc.h>
|
||||
|
||||
#include <intprops.h>
|
||||
/* Get malloc. */
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Get UCHAR_MAX. */
|
||||
#include <limits.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/* Convert 'char' to 'unsigned char' without casting. */
|
||||
/* C89 compliant way to cast 'char' to 'unsigned char'. */
|
||||
static unsigned char
|
||||
to_uchar (char ch)
|
||||
{
|
||||
@ -64,8 +62,8 @@ to_uchar (char ch)
|
||||
possible. If OUTLEN is larger than BASE32_LENGTH(INLEN), also zero
|
||||
terminate the output buffer. */
|
||||
void
|
||||
base32_encode (const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t outlen)
|
||||
base32_encode (const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t outlen)
|
||||
{
|
||||
static const char b32str[32] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
||||
@ -138,21 +136,24 @@ base32_encode (const char *restrict in, idx_t inlen,
|
||||
memory allocation failed, OUT is set to NULL, and the return value
|
||||
indicates length of the requested memory block, i.e.,
|
||||
BASE32_LENGTH(inlen) + 1. */
|
||||
idx_t
|
||||
base32_encode_alloc (const char *in, idx_t inlen, char **out)
|
||||
size_t
|
||||
base32_encode_alloc (const char *in, size_t inlen, char **out)
|
||||
{
|
||||
size_t outlen = 1 + BASE32_LENGTH (inlen);
|
||||
|
||||
/* Check for overflow in outlen computation.
|
||||
Treat negative INLEN as overflow, for better compatibility with
|
||||
pre-2021-08-27 API, which used size_t. */
|
||||
idx_t in_over_5 = inlen / 5 + (inlen % 5 != 0), outlen;
|
||||
if (! INT_MULTIPLY_OK (in_over_5, 8, &outlen) || inlen < 0)
|
||||
*
|
||||
* If there is no overflow, outlen >= inlen.
|
||||
*
|
||||
* TODO Is this a sufficient check? (See the notes in base64.c.)
|
||||
*/
|
||||
if (inlen > outlen)
|
||||
{
|
||||
*out = NULL;
|
||||
return 0;
|
||||
}
|
||||
outlen++;
|
||||
|
||||
*out = imalloc (outlen);
|
||||
*out = malloc (outlen);
|
||||
if (!*out)
|
||||
return outlen;
|
||||
|
||||
@ -304,7 +305,7 @@ base32_decode_ctx_init (struct base32_decode_context *ctx)
|
||||
static char *
|
||||
get_8 (struct base32_decode_context *ctx,
|
||||
char const *restrict *in, char const *restrict in_end,
|
||||
idx_t *n_non_newline)
|
||||
size_t *n_non_newline)
|
||||
{
|
||||
if (ctx->i == 8)
|
||||
ctx->i = 0;
|
||||
@ -356,14 +357,14 @@ get_8 (struct base32_decode_context *ctx,
|
||||
*OUT to point to the byte after the last one written, and decrement
|
||||
*OUTLEN to reflect the number of bytes remaining in *OUT. */
|
||||
static bool
|
||||
decode_8 (char const *restrict in, idx_t inlen,
|
||||
char *restrict *outp, idx_t *outleft)
|
||||
decode_8 (char const *restrict in, size_t inlen,
|
||||
char *restrict *outp, size_t *outleft)
|
||||
{
|
||||
char *out = *outp;
|
||||
if (inlen < 8)
|
||||
return false;
|
||||
|
||||
if (!isbase32 (in[0]) || !isbase32 (in[1]))
|
||||
if (!isbase32 (in[0]) || !isbase32 (in[1]) )
|
||||
return false;
|
||||
|
||||
if (*outleft)
|
||||
@ -467,10 +468,10 @@ decode_8 (char const *restrict in, idx_t inlen,
|
||||
|
||||
bool
|
||||
base32_decode_ctx (struct base32_decode_context *ctx,
|
||||
const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t *outlen)
|
||||
const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t *outlen)
|
||||
{
|
||||
idx_t outleft = *outlen;
|
||||
size_t outleft = *outlen;
|
||||
bool ignore_newlines = ctx != NULL;
|
||||
bool flush_ctx = false;
|
||||
unsigned int ctx_i = 0;
|
||||
@ -484,7 +485,7 @@ base32_decode_ctx (struct base32_decode_context *ctx,
|
||||
|
||||
while (true)
|
||||
{
|
||||
idx_t outleft_save = outleft;
|
||||
size_t outleft_save = outleft;
|
||||
if (ctx_i == 0 && !flush_ctx)
|
||||
{
|
||||
while (true)
|
||||
@ -558,17 +559,17 @@ base32_decode_ctx (struct base32_decode_context *ctx,
|
||||
undefined. */
|
||||
bool
|
||||
base32_decode_alloc_ctx (struct base32_decode_context *ctx,
|
||||
const char *in, idx_t inlen, char **out,
|
||||
idx_t *outlen)
|
||||
const char *in, size_t inlen, char **out,
|
||||
size_t *outlen)
|
||||
{
|
||||
/* This may allocate a few bytes too many, depending on input,
|
||||
but it's not worth the extra CPU time to compute the exact size.
|
||||
The exact size is 5 * inlen / 8, minus one or more bytes if the
|
||||
input is padded with one or more "=".
|
||||
Shifting before multiplying avoids the possibility of overflow. */
|
||||
idx_t needlen = 5 * ((inlen >> 3) + 1);
|
||||
Dividing before multiplying avoids the possibility of overflow. */
|
||||
size_t needlen = 5 * (inlen / 8) + 5;
|
||||
|
||||
*out = imalloc (needlen);
|
||||
*out = malloc (needlen);
|
||||
if (!*out)
|
||||
return true;
|
||||
|
||||
|
38
lib/base32.h
38
lib/base32.h
@ -1,25 +1,25 @@
|
||||
/* base32.h -- Encode binary data using printable characters.
|
||||
Copyright (C) 2004-2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2004-2006, 2009-2020 Free Software Foundation, Inc.
|
||||
Adapted from Simon Josefsson's base64 code by Gijs van Tulder.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef BASE32_H
|
||||
# define BASE32_H
|
||||
|
||||
/* Get idx_t. */
|
||||
# include <idx.h>
|
||||
/* Get size_t. */
|
||||
# include <stddef.h>
|
||||
|
||||
/* Get bool. */
|
||||
# include <stdbool.h>
|
||||
@ -30,26 +30,26 @@
|
||||
|
||||
struct base32_decode_context
|
||||
{
|
||||
int i;
|
||||
unsigned int i;
|
||||
char buf[8];
|
||||
};
|
||||
|
||||
extern bool isbase32 (char ch) _GL_ATTRIBUTE_CONST;
|
||||
|
||||
extern void base32_encode (const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t outlen);
|
||||
extern void base32_encode (const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t outlen);
|
||||
|
||||
extern idx_t base32_encode_alloc (const char *in, idx_t inlen, char **out);
|
||||
extern size_t base32_encode_alloc (const char *in, size_t inlen, char **out);
|
||||
|
||||
extern void base32_decode_ctx_init (struct base32_decode_context *ctx);
|
||||
|
||||
extern bool base32_decode_ctx (struct base32_decode_context *ctx,
|
||||
const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t *outlen);
|
||||
const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t *outlen);
|
||||
|
||||
extern bool base32_decode_alloc_ctx (struct base32_decode_context *ctx,
|
||||
const char *in, idx_t inlen,
|
||||
char **out, idx_t *outlen);
|
||||
const char *in, size_t inlen,
|
||||
char **out, size_t *outlen);
|
||||
|
||||
#define base32_decode(in, inlen, out, outlen) \
|
||||
base32_decode_ctx (NULL, in, inlen, out, outlen)
|
||||
|
85
lib/base64.c
85
lib/base64.c
@ -1,18 +1,18 @@
|
||||
/* base64.c -- Encode binary data using printable characters.
|
||||
Copyright (C) 1999-2001, 2004-2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999-2001, 2004-2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Simon Josefsson. Partially adapted from GNU MailUtils
|
||||
* (mailbox/filter_trans.c, as of 2004-11-28). Improved by review
|
||||
@ -30,7 +30,7 @@
|
||||
* FAIL: memory allocation error
|
||||
* OK: data in OUT/OUTLEN
|
||||
*
|
||||
* idx_t outlen = base64_encode_alloc (in, inlen, &out);
|
||||
* size_t outlen = base64_encode_alloc (in, inlen, &out);
|
||||
* if (out == NULL && outlen == 0 && inlen != 0)
|
||||
* FAIL: input too long
|
||||
* if (out == NULL)
|
||||
@ -44,17 +44,15 @@
|
||||
/* Get prototype. */
|
||||
#include "base64.h"
|
||||
|
||||
/* Get imalloc. */
|
||||
#include <ialloc.h>
|
||||
|
||||
#include <intprops.h>
|
||||
/* Get malloc. */
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Get UCHAR_MAX. */
|
||||
#include <limits.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/* Convert 'char' to 'unsigned char' without casting. */
|
||||
/* C89 compliant way to cast 'char' to 'unsigned char'. */
|
||||
static unsigned char
|
||||
to_uchar (char ch)
|
||||
{
|
||||
@ -68,7 +66,7 @@ static const char b64c[64] =
|
||||
to be of length >= BASE64_LENGTH(INLEN), and INLEN needs to be
|
||||
a multiple of 3. */
|
||||
static void
|
||||
base64_encode_fast (const char *restrict in, idx_t inlen, char *restrict out)
|
||||
base64_encode_fast (const char *restrict in, size_t inlen, char *restrict out)
|
||||
{
|
||||
while (inlen)
|
||||
{
|
||||
@ -87,8 +85,8 @@ base64_encode_fast (const char *restrict in, idx_t inlen, char *restrict out)
|
||||
possible. If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero
|
||||
terminate the output buffer. */
|
||||
void
|
||||
base64_encode (const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t outlen)
|
||||
base64_encode (const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t outlen)
|
||||
{
|
||||
/* Note this outlen constraint can be enforced at compile time.
|
||||
I.E. that the output buffer is exactly large enough to hold
|
||||
@ -97,7 +95,7 @@ base64_encode (const char *restrict in, idx_t inlen,
|
||||
at the end of input. However the common case when reading
|
||||
large inputs is to have both constraints satisfied, so we depend
|
||||
on both in base_encode_fast(). */
|
||||
if (outlen % 4 == 0 && inlen == (outlen >> 2) * 3)
|
||||
if (outlen % 4 == 0 && inlen == outlen / 4 * 3)
|
||||
{
|
||||
base64_encode_fast (in, inlen, out);
|
||||
return;
|
||||
@ -143,21 +141,30 @@ base64_encode (const char *restrict in, idx_t inlen,
|
||||
memory allocation failed, OUT is set to NULL, and the return value
|
||||
indicates length of the requested memory block, i.e.,
|
||||
BASE64_LENGTH(inlen) + 1. */
|
||||
idx_t
|
||||
base64_encode_alloc (const char *in, idx_t inlen, char **out)
|
||||
size_t
|
||||
base64_encode_alloc (const char *in, size_t inlen, char **out)
|
||||
{
|
||||
size_t outlen = 1 + BASE64_LENGTH (inlen);
|
||||
|
||||
/* Check for overflow in outlen computation.
|
||||
Treat negative INLEN as overflow, for better compatibility with
|
||||
pre-2021-08-27 API, which used size_t. */
|
||||
idx_t in_over_3 = inlen / 3 + (inlen % 3 != 0), outlen;
|
||||
if (! INT_MULTIPLY_OK (in_over_3, 4, &outlen) || inlen < 0)
|
||||
*
|
||||
* If there is no overflow, outlen >= inlen.
|
||||
*
|
||||
* If the operation (inlen + 2) overflows then it yields at most +1, so
|
||||
* outlen is 0.
|
||||
*
|
||||
* If the multiplication overflows, we lose at least half of the
|
||||
* correct value, so the result is < ((inlen + 2) / 3) * 2, which is
|
||||
* less than (inlen + 2) * 0.66667, which is less than inlen as soon as
|
||||
* (inlen > 4).
|
||||
*/
|
||||
if (inlen > outlen)
|
||||
{
|
||||
*out = NULL;
|
||||
return 0;
|
||||
}
|
||||
outlen++;
|
||||
|
||||
*out = imalloc (outlen);
|
||||
*out = malloc (outlen);
|
||||
if (!*out)
|
||||
return outlen;
|
||||
|
||||
@ -341,7 +348,7 @@ base64_decode_ctx_init (struct base64_decode_context *ctx)
|
||||
static char *
|
||||
get_4 (struct base64_decode_context *ctx,
|
||||
char const *restrict *in, char const *restrict in_end,
|
||||
idx_t *n_non_newline)
|
||||
size_t *n_non_newline)
|
||||
{
|
||||
if (ctx->i == 4)
|
||||
ctx->i = 0;
|
||||
@ -393,8 +400,8 @@ get_4 (struct base64_decode_context *ctx,
|
||||
*OUT to point to the byte after the last one written, and decrement
|
||||
*OUTLEN to reflect the number of bytes remaining in *OUT. */
|
||||
static bool
|
||||
decode_4 (char const *restrict in, idx_t inlen,
|
||||
char *restrict *outp, idx_t *outleft)
|
||||
decode_4 (char const *restrict in, size_t inlen,
|
||||
char *restrict *outp, size_t *outleft)
|
||||
{
|
||||
char *out = *outp;
|
||||
if (inlen < 2)
|
||||
@ -479,10 +486,10 @@ decode_4 (char const *restrict in, idx_t inlen,
|
||||
|
||||
bool
|
||||
base64_decode_ctx (struct base64_decode_context *ctx,
|
||||
const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t *outlen)
|
||||
const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t *outlen)
|
||||
{
|
||||
idx_t outleft = *outlen;
|
||||
size_t outleft = *outlen;
|
||||
bool ignore_newlines = ctx != NULL;
|
||||
bool flush_ctx = false;
|
||||
unsigned int ctx_i = 0;
|
||||
@ -496,7 +503,7 @@ base64_decode_ctx (struct base64_decode_context *ctx,
|
||||
|
||||
while (true)
|
||||
{
|
||||
idx_t outleft_save = outleft;
|
||||
size_t outleft_save = outleft;
|
||||
if (ctx_i == 0 && !flush_ctx)
|
||||
{
|
||||
while (true)
|
||||
@ -570,17 +577,17 @@ base64_decode_ctx (struct base64_decode_context *ctx,
|
||||
undefined. */
|
||||
bool
|
||||
base64_decode_alloc_ctx (struct base64_decode_context *ctx,
|
||||
const char *in, idx_t inlen, char **out,
|
||||
idx_t *outlen)
|
||||
const char *in, size_t inlen, char **out,
|
||||
size_t *outlen)
|
||||
{
|
||||
/* This may allocate a few bytes too many, depending on input,
|
||||
but it's not worth the extra CPU time to compute the exact size.
|
||||
The exact size is 3 * (inlen + (ctx ? ctx->i : 0)) / 4, minus 1 if the
|
||||
input ends with "=" and minus another 1 if the input ends with "==".
|
||||
Shifting before multiplying avoids the possibility of overflow. */
|
||||
idx_t needlen = 3 * ((inlen >> 2) + 1);
|
||||
Dividing before multiplying avoids the possibility of overflow. */
|
||||
size_t needlen = 3 * (inlen / 4) + 3;
|
||||
|
||||
*out = imalloc (needlen);
|
||||
*out = malloc (needlen);
|
||||
if (!*out)
|
||||
return true;
|
||||
|
||||
|
38
lib/base64.h
38
lib/base64.h
@ -1,25 +1,25 @@
|
||||
/* base64.h -- Encode binary data using printable characters.
|
||||
Copyright (C) 2004-2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2004-2006, 2009-2020 Free Software Foundation, Inc.
|
||||
Written by Simon Josefsson.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef BASE64_H
|
||||
# define BASE64_H
|
||||
|
||||
/* Get idx_t. */
|
||||
# include <idx.h>
|
||||
/* Get size_t. */
|
||||
# include <stddef.h>
|
||||
|
||||
/* Get bool. */
|
||||
# include <stdbool.h>
|
||||
@ -34,26 +34,26 @@ extern "C" {
|
||||
|
||||
struct base64_decode_context
|
||||
{
|
||||
int i;
|
||||
unsigned int i;
|
||||
char buf[4];
|
||||
};
|
||||
|
||||
extern bool isbase64 (char ch) _GL_ATTRIBUTE_CONST;
|
||||
|
||||
extern void base64_encode (const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t outlen);
|
||||
extern void base64_encode (const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t outlen);
|
||||
|
||||
extern idx_t base64_encode_alloc (const char *in, idx_t inlen, char **out);
|
||||
extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out);
|
||||
|
||||
extern void base64_decode_ctx_init (struct base64_decode_context *ctx);
|
||||
|
||||
extern bool base64_decode_ctx (struct base64_decode_context *ctx,
|
||||
const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t *outlen);
|
||||
const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t *outlen);
|
||||
|
||||
extern bool base64_decode_alloc_ctx (struct base64_decode_context *ctx,
|
||||
const char *in, idx_t inlen,
|
||||
char **out, idx_t *outlen);
|
||||
const char *in, size_t inlen,
|
||||
char **out, size_t *outlen);
|
||||
|
||||
#define base64_decode(in, inlen, out, outlen) \
|
||||
base64_decode_ctx (NULL, in, inlen, out, outlen)
|
||||
|
@ -1,37 +1,37 @@
|
||||
/* basename.c -- return the last element in a file name
|
||||
|
||||
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2022 Free Software
|
||||
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2020 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include "basename-lgpl.h"
|
||||
#include "dirname.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "filename.h"
|
||||
/* Return the address of the last file name component of NAME. If
|
||||
NAME has no relative file name components because it is a file
|
||||
system root, return the empty string. */
|
||||
|
||||
char *
|
||||
last_component (char const *name)
|
||||
{
|
||||
char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
|
||||
char const *p;
|
||||
bool last_was_slash = false;
|
||||
bool saw_slash = false;
|
||||
|
||||
while (ISSLASH (*base))
|
||||
base++;
|
||||
@ -39,17 +39,21 @@ last_component (char const *name)
|
||||
for (p = base; *p; p++)
|
||||
{
|
||||
if (ISSLASH (*p))
|
||||
last_was_slash = true;
|
||||
else if (last_was_slash)
|
||||
saw_slash = true;
|
||||
else if (saw_slash)
|
||||
{
|
||||
base = p;
|
||||
last_was_slash = false;
|
||||
saw_slash = false;
|
||||
}
|
||||
}
|
||||
|
||||
return (char *) base;
|
||||
}
|
||||
|
||||
/* Return the length of the basename NAME. Typically NAME is the
|
||||
value returned by base_name or last_component. Act like strlen
|
||||
(NAME), except omit all trailing slashes. */
|
||||
|
||||
size_t
|
||||
base_len (char const *name)
|
||||
{
|
||||
|
@ -1,78 +0,0 @@
|
||||
/* Extract the last component (base name) of a file name.
|
||||
|
||||
Copyright (C) 1998, 2001, 2003-2006, 2009-2022 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _BASENAME_LGPL_H
|
||||
#define _BASENAME_LGPL_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
|
||||
# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Return the address of the last file name component of FILENAME.
|
||||
If FILENAME has some trailing slash(es), they are considered to be
|
||||
part of the last component.
|
||||
If FILENAME has no relative file name components because it is a file
|
||||
system root, return the empty string.
|
||||
Examples:
|
||||
FILENAME RESULT
|
||||
"foo.c" "foo.c"
|
||||
"foo/bar.c" "bar.c"
|
||||
"/foo/bar.c" "bar.c"
|
||||
"foo/bar/" "bar/"
|
||||
"foo/bar//" "bar//"
|
||||
"/" ""
|
||||
"//" ""
|
||||
"" ""
|
||||
The return value is a tail of the given FILENAME; do NOT free() it! */
|
||||
|
||||
/* This function was traditionally called 'basename', but we avoid this
|
||||
function name because
|
||||
* Various platforms have different functions in their libc.
|
||||
In particular, the glibc basename(), defined in <string.h>, does
|
||||
not consider trailing slashes to be part of the component:
|
||||
FILENAME RESULT
|
||||
"foo/bar/" ""
|
||||
"foo/bar//" ""
|
||||
* The 'basename' command eliminates trailing slashes and for a root
|
||||
produces a non-empty result:
|
||||
FILENAME RESULT
|
||||
"foo/bar/" "bar"
|
||||
"foo/bar//" "bar"
|
||||
"/" "/"
|
||||
"//" "/"
|
||||
*/
|
||||
extern char *last_component (char const *filename) _GL_ATTRIBUTE_PURE;
|
||||
|
||||
/* Return the length of the basename FILENAME.
|
||||
Typically FILENAME is the value returned by base_name or last_component.
|
||||
Act like strlen (FILENAME), except omit all trailing slashes. */
|
||||
extern size_t base_len (char const *filename) _GL_ATTRIBUTE_PURE;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* _BASENAME_LGPL_H */
|
@ -1,11 +1,11 @@
|
||||
/* basename.c -- return the last element in a file name
|
||||
|
||||
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2022 Free Software
|
||||
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2020 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
@ -22,43 +22,37 @@
|
||||
|
||||
#include <string.h>
|
||||
#include "xalloc.h"
|
||||
#include "xstrndup.h"
|
||||
|
||||
char *
|
||||
base_name (char const *name)
|
||||
{
|
||||
char const *base = last_component (name);
|
||||
idx_t length;
|
||||
int dotslash_len;
|
||||
if (*base)
|
||||
{
|
||||
length = base_len (base);
|
||||
size_t length;
|
||||
|
||||
/* Collapse a sequence of trailing slashes into one. */
|
||||
length += ISSLASH (base[length]);
|
||||
/* If there is no last component, then name is a file system root or the
|
||||
empty string. */
|
||||
if (! *base)
|
||||
return xstrndup (name, base_len (name));
|
||||
|
||||
/* On systems with drive letters, "a/b:c" must return "./b:c" rather
|
||||
than "b:c" to avoid confusion with a drive letter. On systems
|
||||
with pure POSIX semantics, this is not an issue. */
|
||||
dotslash_len = FILE_SYSTEM_PREFIX_LEN (base) != 0 ? 2 : 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There is no last component, so NAME is a file system root or
|
||||
the empty string. */
|
||||
base = name;
|
||||
length = base_len (base);
|
||||
dotslash_len = 0;
|
||||
}
|
||||
/* Collapse a sequence of trailing slashes into one. */
|
||||
length = base_len (base);
|
||||
if (ISSLASH (base[length]))
|
||||
length++;
|
||||
|
||||
char *p = ximalloc (dotslash_len + length + 1);
|
||||
if (dotslash_len)
|
||||
/* On systems with drive letters, "a/b:c" must return "./b:c" rather
|
||||
than "b:c" to avoid confusion with a drive letter. On systems
|
||||
with pure POSIX semantics, this is not an issue. */
|
||||
if (FILE_SYSTEM_PREFIX_LEN (base))
|
||||
{
|
||||
char *p = xmalloc (length + 3);
|
||||
p[0] = '.';
|
||||
p[1] = '/';
|
||||
memcpy (p + 2, base, length);
|
||||
p[length + 2] = '\0';
|
||||
return p;
|
||||
}
|
||||
|
||||
/* Finally, copy the basename. */
|
||||
memcpy (p + dotslash_len, base, length);
|
||||
p[dotslash_len + length] = '\0';
|
||||
return p;
|
||||
return xstrndup (base, length);
|
||||
}
|
||||
|
@ -1,17 +1,17 @@
|
||||
/* Binary mode I/O.
|
||||
Copyright 2017-2022 Free Software Foundation, Inc.
|
||||
Copyright 2017-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
@ -1,17 +1,17 @@
|
||||
/* Binary mode I/O.
|
||||
Copyright (C) 2001, 2003, 2005, 2008-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001, 2003, 2005, 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _BINARY_H
|
||||
@ -47,7 +47,7 @@ _GL_INLINE_HEADER_BEGIN
|
||||
/* Use a function rather than a macro, to avoid gcc warnings
|
||||
"warning: statement with no effect". */
|
||||
BINARY_IO_INLINE int
|
||||
__gl_setmode (_GL_UNUSED int fd, _GL_UNUSED int mode)
|
||||
__gl_setmode (int fd _GL_UNUSED, int mode _GL_UNUSED)
|
||||
{
|
||||
return O_BINARY;
|
||||
}
|
||||
@ -56,7 +56,7 @@ __gl_setmode (_GL_UNUSED int fd, _GL_UNUSED int mode)
|
||||
/* Set FD's mode to MODE, which should be either O_TEXT or O_BINARY.
|
||||
Return the old mode if successful, -1 (setting errno) on failure.
|
||||
Ordinarily this function would be called 'setmode', since that is
|
||||
its old name on MS-Windows, but it is called 'set_binary_mode' here
|
||||
its name on MS-Windows, but it is called 'set_binary_mode' here
|
||||
to avoid colliding with a BSD function of another name. */
|
||||
|
||||
#if defined __DJGPP__ || defined __EMX__
|
||||
|
@ -1,21 +1,3 @@
|
||||
/* Rotate bits in integers.
|
||||
|
||||
Copyright (C) 2012-2022 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define BITROTATE_INLINE _GL_EXTERN_INLINE
|
||||
#include "bitrotate.h"
|
||||
|
@ -1,17 +1,17 @@
|
||||
/* bitrotate.h - Rotate bits in integers
|
||||
Copyright (C) 2008-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
|
||||
|
16
lib/btowc.c
16
lib/btowc.c
@ -1,18 +1,18 @@
|
||||
/* Convert unibyte character to wide character.
|
||||
Copyright (C) 2008, 2010-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2008, 2010-2020 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* buffer-lcm.c - compute a good buffer size for dealing with two files
|
||||
|
||||
Copyright (C) 2002-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
|
@ -1,18 +1,18 @@
|
||||
/* byteswap.h - Byte swapping
|
||||
Copyright (C) 2005, 2007, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2005, 2007, 2009-2020 Free Software Foundation, Inc.
|
||||
Written by Oskar Liljeblad <oskar@osk.mine.nu>, 2005.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _GL_BYTESWAP_H
|
||||
|
@ -1,17 +1,17 @@
|
||||
/* C++ compatible function declaration macros.
|
||||
Copyright (C) 2010-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2010-2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License, or
|
||||
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
|
||||
Lesser General Public License for more details.
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _GL_CXXDEFS_H
|
||||
@ -146,16 +146,6 @@
|
||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#endif
|
||||
|
||||
/* _GL_CXXALIAS_MDA (func, rettype, parameters);
|
||||
is to be used when func is a Microsoft deprecated alias, on native Windows.
|
||||
It declares a C++ alias called GNULIB_NAMESPACE::func
|
||||
that redirects to _func, if GNULIB_NAMESPACE is defined.
|
||||
Example:
|
||||
_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
|
||||
*/
|
||||
#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
|
||||
_GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
|
||||
|
||||
/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
|
||||
is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
|
||||
except that the C function rpl_func may have a slightly different
|
||||
@ -181,14 +171,6 @@
|
||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#endif
|
||||
|
||||
/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
|
||||
is like _GL_CXXALIAS_MDA (func, rettype, parameters);
|
||||
except that the C function func may have a slightly different declaration.
|
||||
A cast is used to silence the "invalid conversion" error that would
|
||||
otherwise occur. */
|
||||
#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
|
||||
_GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
|
||||
|
||||
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||
that redirects to the system provided function func, if GNULIB_NAMESPACE
|
||||
@ -286,7 +268,7 @@
|
||||
_GL_CXXALIASWARN_2 (func, namespace)
|
||||
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||
we enable the warning only when not optimizing. */
|
||||
# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
|
||||
# if !__OPTIMIZE__
|
||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||
_GL_WARN_ON_USE (func, \
|
||||
"The symbol ::" #func " refers to the system function. " \
|
||||
@ -314,9 +296,9 @@
|
||||
_GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
|
||||
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||
we enable the warning only when not optimizing. */
|
||||
# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
|
||||
# if !__OPTIMIZE__
|
||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||
_GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
|
||||
_GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
|
||||
"The symbol ::" #func " refers to the system function. " \
|
||||
"Use " #namespace "::" #func " instead.")
|
||||
# else
|
||||
|
@ -1,21 +1,3 @@
|
||||
/* Character handling in C locale.
|
||||
|
||||
Copyright (C) 2003-2022 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define C_CTYPE_INLINE _GL_EXTERN_INLINE
|
||||
#include "c-ctype.h"
|
||||
|
@ -5,20 +5,20 @@
|
||||
<ctype.h> functions' behaviour depends on the current locale set via
|
||||
setlocale.
|
||||
|
||||
Copyright (C) 2000-2003, 2006, 2008-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2000-2003, 2006, 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file 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 Lesser General Public License for more details.
|
||||
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 Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef C_CTYPE_H
|
||||
#define C_CTYPE_H
|
||||
|
@ -1,19 +1,19 @@
|
||||
/* Case-insensitive string comparison functions in C locale.
|
||||
Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2022 Free Software
|
||||
Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2020 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef C_STRCASE_H
|
||||
#define C_STRCASE_H
|
||||
|
@ -1,18 +1,18 @@
|
||||
/* c-strcasecmp.c -- case insensitive string comparator in C locale
|
||||
Copyright (C) 1998-1999, 2005-2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1998-1999, 2005-2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
@ -52,5 +52,5 @@ c_strcasecmp (const char *s1, const char *s2)
|
||||
/* On machines where 'char' and 'int' are types of the same size, the
|
||||
difference of two 'unsigned char' values - including the sign bit -
|
||||
doesn't fit in an 'int'. */
|
||||
return _GL_CMP (c1, c2);
|
||||
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
|
||||
}
|
||||
|
@ -1,17 +1,17 @@
|
||||
/* Optimized case-insensitive string comparison in C locale.
|
||||
Copyright (C) 2001-2002, 2007, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001-2002, 2007, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
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 Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Bruno Haible <bruno@clisp.org>. */
|
||||
@ -27,7 +27,7 @@
|
||||
|
||||
/* Help GCC to generate good code for string comparisons with
|
||||
immediate strings. */
|
||||
#if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__
|
||||
#if defined (__GNUC__) && defined (__OPTIMIZE__)
|
||||
|
||||
/* Case insensitive comparison of ASCII characters. */
|
||||
# if C_CTYPE_ASCII
|
||||
|
@ -1,18 +1,18 @@
|
||||
/* c-strncasecmp.c -- case insensitive string comparator in C locale
|
||||
Copyright (C) 1998-1999, 2005-2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1998-1999, 2005-2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
@ -52,5 +52,5 @@ c_strncasecmp (const char *s1, const char *s2, size_t n)
|
||||
/* On machines where 'char' and 'int' are types of the same size, the
|
||||
difference of two 'unsigned char' values - including the sign bit -
|
||||
doesn't fit in an 'int'. */
|
||||
return _GL_CMP (c1, c2);
|
||||
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
|
||||
}
|
||||
|
@ -1,10 +1,10 @@
|
||||
/* Convert string to double, using the C locale.
|
||||
|
||||
Copyright (C) 2003-2004, 2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003-2004, 2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,10 +1,10 @@
|
||||
/* Convert string to double, using the C locale. -*- coding: utf-8 -*-
|
||||
|
||||
Copyright (C) 2003-2004, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003-2004, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,19 +1,2 @@
|
||||
/* Convert string to 'long double' in C locale.
|
||||
|
||||
Copyright (C) 2004-2022 Free Software Foundation, Inc.
|
||||
|
||||
This file 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 file 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/>. */
|
||||
|
||||
#define LONG 1
|
||||
#include "c-strtod.c"
|
||||
|
56
lib/calloc.c
56
lib/calloc.c
@ -1,52 +1,70 @@
|
||||
/* calloc() function that is glibc compatible.
|
||||
This wrapper function is required at least on Tru64 UNIX 5.1 and mingw.
|
||||
Copyright (C) 2004-2007, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2004-2007, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* written by Jim Meyering and Bruno Haible */
|
||||
|
||||
#include <config.h>
|
||||
/* Only the AC_FUNC_CALLOC macro defines 'calloc' already in config.h. */
|
||||
#ifdef calloc
|
||||
# define NEED_CALLOC_GNU 1
|
||||
# undef calloc
|
||||
/* Whereas the gnulib module 'calloc-gnu' defines HAVE_CALLOC_GNU. */
|
||||
#elif GNULIB_CALLOC_GNU && !HAVE_CALLOC_GNU
|
||||
# define NEED_CALLOC_GNU 1
|
||||
#endif
|
||||
|
||||
/* Specification. */
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include "xalloc-oversized.h"
|
||||
|
||||
/* Call the system's calloc below. */
|
||||
#undef calloc
|
||||
|
||||
/* Allocate and zero-fill an NxS-byte block of memory from the heap,
|
||||
even if N or S is zero. */
|
||||
/* Allocate and zero-fill an NxS-byte block of memory from the heap.
|
||||
If N or S is zero, allocate and zero-fill a 1-byte block. */
|
||||
|
||||
void *
|
||||
rpl_calloc (size_t n, size_t s)
|
||||
{
|
||||
void *result;
|
||||
|
||||
#if NEED_CALLOC_GNU
|
||||
if (n == 0 || s == 0)
|
||||
n = s = 1;
|
||||
|
||||
if (xalloc_oversized (n, s))
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
n = 1;
|
||||
s = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Defend against buggy calloc implementations that mishandle
|
||||
size_t overflow. */
|
||||
size_t bytes = n * s;
|
||||
if (bytes / s != n)
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void *result = calloc (n, s);
|
||||
result = calloc (n, s);
|
||||
|
||||
#if !HAVE_MALLOC_POSIX
|
||||
#if !HAVE_CALLOC_POSIX
|
||||
if (result == NULL)
|
||||
errno = ENOMEM;
|
||||
#endif
|
||||
|
@ -1,20 +1,20 @@
|
||||
/* Host name canonicalization
|
||||
|
||||
Copyright (C) 2005-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2005-2020 Free Software Foundation, Inc.
|
||||
|
||||
Written by Derek Price <derek@ximbiot.com>.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser 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 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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
@ -1,31 +1,27 @@
|
||||
/* Host name canonicalization
|
||||
|
||||
Copyright (C) 2005, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2005, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
Written by Derek Price <derek@ximbiot.com>
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser 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 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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef CANON_HOST_H
|
||||
# define CANON_HOST_H 1
|
||||
|
||||
# include <stdlib.h>
|
||||
|
||||
char *canon_host (char const *host)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
char *canon_host_r (char const *host, int *cherror)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
char *canon_host (char const *host) _GL_ATTRIBUTE_MALLOC;
|
||||
char *canon_host_r (char const *host, int *cherror) _GL_ATTRIBUTE_MALLOC;
|
||||
|
||||
const char *ch_strerror (void);
|
||||
# define ch_strerror_r(cherror) gai_strerror (cherror);
|
||||
|
@ -1,9 +1,9 @@
|
||||
/* Return the canonical absolute name of a given file.
|
||||
Copyright (C) 1996-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
@ -19,31 +19,29 @@
|
||||
#include "canonicalize.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <filename.h>
|
||||
#include <idx.h>
|
||||
#include <intprops.h>
|
||||
#include <scratch_buffer.h>
|
||||
|
||||
#include "attribute.h"
|
||||
#include "areadlink.h"
|
||||
#include "file-set.h"
|
||||
#include "hash-triple.h"
|
||||
#include "pathmax.h"
|
||||
#include "xalloc.h"
|
||||
#include "xgetcwd.h"
|
||||
#include "dosname.h"
|
||||
|
||||
/* Suppress bogus GCC -Wmaybe-uninitialized warnings. */
|
||||
#if defined GCC_LINT || defined lint
|
||||
# define IF_LINT(Code) Code
|
||||
#else
|
||||
# define IF_LINT(Code) /* empty */
|
||||
#define MULTIPLE_BITS_SET(i) (((i) & ((i) - 1)) != 0)
|
||||
|
||||
/* In this file, we cannot handle file names longer than PATH_MAX.
|
||||
On systems with no file name length limit, use a fallback. */
|
||||
#ifndef PATH_MAX
|
||||
# define PATH_MAX 8192
|
||||
#endif
|
||||
|
||||
#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
|
||||
# define DOUBLE_SLASH_IS_DISTINCT_ROOT false
|
||||
# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
|
||||
#endif
|
||||
|
||||
#if ISSLASH ('\\')
|
||||
@ -52,73 +50,6 @@
|
||||
# define SLASHES "/"
|
||||
#endif
|
||||
|
||||
/* Return true if FILE's existence can be shown, false (setting errno)
|
||||
otherwise. Follow symbolic links. */
|
||||
static bool
|
||||
file_accessible (char const *file)
|
||||
{
|
||||
# if HAVE_FACCESSAT
|
||||
return faccessat (AT_FDCWD, file, F_OK, AT_EACCESS) == 0;
|
||||
# else
|
||||
struct stat st;
|
||||
return stat (file, &st) == 0 || errno == EOVERFLOW;
|
||||
# endif
|
||||
}
|
||||
|
||||
/* True if concatenating END as a suffix to a file name means that the
|
||||
code needs to check that the file name is that of a searchable
|
||||
directory, since the canonicalize_filename_mode_stk code won't
|
||||
check this later anyway when it checks an ordinary file name
|
||||
component within END. END must either be empty, or start with a
|
||||
slash. */
|
||||
|
||||
static bool _GL_ATTRIBUTE_PURE
|
||||
suffix_requires_dir_check (char const *end)
|
||||
{
|
||||
/* If END does not start with a slash, the suffix is OK. */
|
||||
while (ISSLASH (*end))
|
||||
{
|
||||
/* Two or more slashes act like a single slash. */
|
||||
do
|
||||
end++;
|
||||
while (ISSLASH (*end));
|
||||
|
||||
switch (*end++)
|
||||
{
|
||||
default: return false; /* An ordinary file name component is OK. */
|
||||
case '\0': return true; /* Trailing "/" is trouble. */
|
||||
case '.': break; /* Possibly "." or "..". */
|
||||
}
|
||||
/* Trailing "/.", or "/.." even if not trailing, is trouble. */
|
||||
if (!*end || (*end == '.' && (!end[1] || ISSLASH (end[1]))))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Append this to a file name to test whether it is a searchable directory.
|
||||
On POSIX platforms "/" suffices, but "/./" is sometimes needed on
|
||||
macOS 10.13 <https://bugs.gnu.org/30350>, and should also work on
|
||||
platforms like AIX 7.2 that need at least "/.". */
|
||||
|
||||
#ifdef LSTAT_FOLLOWS_SLASHED_SYMLINK
|
||||
static char const dir_suffix[] = "/";
|
||||
#else
|
||||
static char const dir_suffix[] = "/./";
|
||||
#endif
|
||||
|
||||
/* Return true if DIR is a searchable dir, false (setting errno) otherwise.
|
||||
DIREND points to the NUL byte at the end of the DIR string.
|
||||
Store garbage into DIREND[0 .. strlen (dir_suffix)]. */
|
||||
|
||||
static bool
|
||||
dir_check (char *dir, char *dirend)
|
||||
{
|
||||
strcpy (dirend, dir_suffix);
|
||||
return file_accessible (dir);
|
||||
}
|
||||
|
||||
#if !((HAVE_CANONICALIZE_FILE_NAME && FUNC_REALPATH_WORKS) \
|
||||
|| GNULIB_CANONICALIZE_LGPL)
|
||||
/* Return the canonical absolute name of file NAME. A canonical name
|
||||
@ -133,12 +64,6 @@ canonicalize_file_name (const char *name)
|
||||
}
|
||||
#endif /* !HAVE_CANONICALIZE_FILE_NAME */
|
||||
|
||||
static bool
|
||||
multiple_bits_set (canonicalize_mode_t i)
|
||||
{
|
||||
return (i & (i - 1)) != 0;
|
||||
}
|
||||
|
||||
/* Return true if we've already seen the triple, <FILENAME, dev, ino>.
|
||||
If *HT is not initialized, initialize it. */
|
||||
static bool
|
||||
@ -146,7 +71,7 @@ seen_triple (Hash_table **ht, char const *filename, struct stat const *st)
|
||||
{
|
||||
if (*ht == NULL)
|
||||
{
|
||||
idx_t initial_capacity = 7;
|
||||
size_t initial_capacity = 7;
|
||||
*ht = hash_initialize (initial_capacity,
|
||||
NULL,
|
||||
triple_hash,
|
||||
@ -163,38 +88,30 @@ seen_triple (Hash_table **ht, char const *filename, struct stat const *st)
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Return the canonical absolute name of file NAME, while treating
|
||||
missing elements according to CAN_MODE. A canonical name
|
||||
does not contain any ".", ".." components nor any repeated file name
|
||||
separators ('/') or, depending on other CAN_MODE flags, symlinks.
|
||||
Whether components must exist or not depends on canonicalize mode.
|
||||
The result is malloc'd. */
|
||||
|
||||
/* Act like canonicalize_filename_mode (see below), with an additional argument
|
||||
rname_buf that can be used as temporary storage.
|
||||
|
||||
If GCC_LINT is defined, do not inline this function with GCC 10.1
|
||||
and later, to avoid creating a pointer to the stack that GCC
|
||||
-Wreturn-local-addr incorrectly complains about. See:
|
||||
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644
|
||||
Although the noinline attribute can hurt performance a bit, no better way
|
||||
to pacify GCC is known; even an explicit #pragma does not pacify GCC.
|
||||
When the GCC bug is fixed this workaround should be limited to the
|
||||
broken GCC versions. */
|
||||
#if _GL_GNUC_PREREQ (10, 1)
|
||||
# if defined GCC_LINT || defined lint
|
||||
__attribute__ ((__noinline__))
|
||||
# elif __OPTIMIZE__ && !__NO_INLINE__
|
||||
# define GCC_BOGUS_WRETURN_LOCAL_ADDR
|
||||
# endif
|
||||
#endif
|
||||
static char *
|
||||
canonicalize_filename_mode_stk (const char *name, canonicalize_mode_t can_mode,
|
||||
struct scratch_buffer *rname_buf)
|
||||
char *
|
||||
canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode)
|
||||
{
|
||||
char *dest;
|
||||
char *rname, *dest, *extra_buf = NULL;
|
||||
char const *start;
|
||||
char const *end;
|
||||
char const *rname_limit;
|
||||
size_t extra_len = 0;
|
||||
Hash_table *ht = NULL;
|
||||
bool logical = (can_mode & CAN_NOLINKS) != 0;
|
||||
int num_links = 0;
|
||||
int saved_errno;
|
||||
int can_flags = can_mode & ~CAN_MODE_MASK;
|
||||
bool logical = can_flags & CAN_NOLINKS;
|
||||
size_t prefix_len;
|
||||
|
||||
canonicalize_mode_t can_exist = can_mode & CAN_MODE_MASK;
|
||||
if (multiple_bits_set (can_exist))
|
||||
can_mode &= CAN_MODE_MASK;
|
||||
|
||||
if (MULTIPLE_BITS_SET (can_mode))
|
||||
{
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
@ -212,76 +129,45 @@ canonicalize_filename_mode_stk (const char *name, canonicalize_mode_t can_mode,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct scratch_buffer extra_buffer, link_buffer;
|
||||
scratch_buffer_init (&extra_buffer);
|
||||
scratch_buffer_init (&link_buffer);
|
||||
scratch_buffer_init (rname_buf);
|
||||
char *rname_on_stack = rname_buf->data;
|
||||
char *rname = rname_on_stack;
|
||||
bool end_in_extra_buffer = false;
|
||||
bool failed = true;
|
||||
|
||||
/* This is always zero for Posix hosts, but can be 2 for MS-Windows
|
||||
and MS-DOS X:/foo/bar file names. */
|
||||
idx_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
|
||||
prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
|
||||
|
||||
if (!IS_ABSOLUTE_FILE_NAME (name))
|
||||
{
|
||||
while (!getcwd (rname, rname_buf->length))
|
||||
rname = xgetcwd ();
|
||||
if (!rname)
|
||||
return NULL;
|
||||
dest = strchr (rname, '\0');
|
||||
if (dest - rname < PATH_MAX)
|
||||
{
|
||||
switch (errno)
|
||||
{
|
||||
case ERANGE:
|
||||
if (scratch_buffer_grow (rname_buf))
|
||||
break;
|
||||
FALLTHROUGH;
|
||||
case ENOMEM:
|
||||
xalloc_die ();
|
||||
|
||||
default:
|
||||
dest = rname;
|
||||
goto error;
|
||||
}
|
||||
rname = rname_buf->data;
|
||||
char *p = xrealloc (rname, PATH_MAX);
|
||||
dest = p + (dest - rname);
|
||||
rname = p;
|
||||
rname_limit = rname + PATH_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
rname_limit = dest;
|
||||
}
|
||||
dest = rawmemchr (rname, '\0');
|
||||
start = name;
|
||||
prefix_len = FILE_SYSTEM_PREFIX_LEN (rname);
|
||||
}
|
||||
else
|
||||
{
|
||||
dest = mempcpy (rname, name, prefix_len);
|
||||
rname = xmalloc (PATH_MAX);
|
||||
rname_limit = rname + PATH_MAX;
|
||||
dest = rname;
|
||||
if (prefix_len)
|
||||
{
|
||||
memcpy (rname, name, prefix_len);
|
||||
dest += prefix_len;
|
||||
}
|
||||
*dest++ = '/';
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
|
||||
{
|
||||
if (prefix_len == 0 /* implies ISSLASH (name[0]) */
|
||||
&& ISSLASH (name[1]) && !ISSLASH (name[2]))
|
||||
{
|
||||
*dest++ = '/';
|
||||
#if defined _WIN32 && !defined __CYGWIN__
|
||||
/* For UNC file names '\\server\path\to\file', extend the prefix
|
||||
to include the server: '\\server\'. */
|
||||
{
|
||||
idx_t i;
|
||||
for (i = 2; name[i] != '\0' && !ISSLASH (name[i]); )
|
||||
i++;
|
||||
if (name[i] != '\0' /* implies ISSLASH (name[i]) */
|
||||
&& i + 1 < rname_buf->length)
|
||||
{
|
||||
prefix_len = i;
|
||||
memcpy (dest, name + 2, i - 2 + 1);
|
||||
dest += i - 2 + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Either name = '\\server'; this is an invalid file name.
|
||||
Or name = '\\server\...' and server is more than
|
||||
rname_buf->length - 4 bytes long. In either
|
||||
case, stop the UNC processing. */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (ISSLASH (name[1]) && !ISSLASH (name[2]) && !prefix_len)
|
||||
*dest++ = '/';
|
||||
*dest = '\0';
|
||||
}
|
||||
start = name + prefix_len;
|
||||
@ -297,119 +183,120 @@ canonicalize_filename_mode_stk (const char *name, canonicalize_mode_t can_mode,
|
||||
for (end = start; *end && !ISSLASH (*end); ++end)
|
||||
/* Nothing. */;
|
||||
|
||||
/* Length of this file name component; it can be zero if a file
|
||||
name ends in '/'. */
|
||||
idx_t startlen = end - start;
|
||||
|
||||
if (startlen == 0)
|
||||
if (end - start == 0)
|
||||
break;
|
||||
else if (startlen == 1 && start[0] == '.')
|
||||
else if (end - start == 1 && start[0] == '.')
|
||||
/* nothing */;
|
||||
else if (startlen == 2 && start[0] == '.' && start[1] == '.')
|
||||
else if (end - start == 2 && start[0] == '.' && start[1] == '.')
|
||||
{
|
||||
/* Back up to previous component, ignore if at root already. */
|
||||
if (dest > rname + prefix_len + 1)
|
||||
for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
|
||||
continue;
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT
|
||||
&& dest == rname + 1 && !prefix_len
|
||||
&& ISSLASH (*dest) && !ISSLASH (dest[1]))
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1
|
||||
&& !prefix_len && ISSLASH (*dest) && !ISSLASH (dest[1]))
|
||||
dest++;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct stat st;
|
||||
|
||||
if (!ISSLASH (dest[-1]))
|
||||
*dest++ = '/';
|
||||
|
||||
while (rname + rname_buf->length - dest
|
||||
< startlen + sizeof dir_suffix)
|
||||
if (dest + (end - start) >= rname_limit)
|
||||
{
|
||||
idx_t dest_offset = dest - rname;
|
||||
if (!scratch_buffer_grow_preserve (rname_buf))
|
||||
xalloc_die ();
|
||||
rname = rname_buf->data;
|
||||
ptrdiff_t dest_offset = dest - rname;
|
||||
size_t new_size = rname_limit - rname;
|
||||
|
||||
if (end - start + 1 > PATH_MAX)
|
||||
new_size += end - start + 1;
|
||||
else
|
||||
new_size += PATH_MAX;
|
||||
rname = xrealloc (rname, new_size);
|
||||
rname_limit = rname + new_size;
|
||||
|
||||
dest = rname + dest_offset;
|
||||
}
|
||||
|
||||
dest = mempcpy (dest, start, startlen);
|
||||
dest = memcpy (dest, start, end - start);
|
||||
dest += end - start;
|
||||
*dest = '\0';
|
||||
|
||||
char *buf;
|
||||
ssize_t n = -1;
|
||||
if (!logical)
|
||||
if (logical && (can_mode == CAN_MISSING))
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
buf = link_buffer.data;
|
||||
idx_t bufsize = link_buffer.length;
|
||||
n = readlink (rname, buf, bufsize - 1);
|
||||
if (n < bufsize - 1)
|
||||
break;
|
||||
if (!scratch_buffer_grow (&link_buffer))
|
||||
xalloc_die ();
|
||||
}
|
||||
/* Avoid the stat in this case as it's inconsequential.
|
||||
i.e. we're neither resolving symlinks or testing
|
||||
component existence. */
|
||||
st.st_mode = 0;
|
||||
}
|
||||
if (0 <= n)
|
||||
else if ((logical ? stat (rname, &st) : lstat (rname, &st)) != 0)
|
||||
{
|
||||
/* A physical traversal and RNAME is a symbolic link. */
|
||||
|
||||
if (num_links < 20)
|
||||
num_links++;
|
||||
else if (*start)
|
||||
/* FIXME: If errno == EOVERFLOW here, the entry exists. */
|
||||
saved_errno = errno;
|
||||
if (can_mode == CAN_EXISTING)
|
||||
goto error;
|
||||
if (can_mode == CAN_ALL_BUT_LAST)
|
||||
{
|
||||
/* Enough symlinks have been seen that it is time to
|
||||
worry about being in a symlink cycle.
|
||||
Get the device and inode of the parent directory, as
|
||||
pre-2017 POSIX says this info is not reliable for
|
||||
symlinks. */
|
||||
struct stat st;
|
||||
dest[- startlen] = '\0';
|
||||
if (stat (*rname ? rname : ".", &st) != 0)
|
||||
if (end[strspn (end, SLASHES)] || saved_errno != ENOENT)
|
||||
goto error;
|
||||
dest[- startlen] = *start;
|
||||
|
||||
/* Detect loops. We cannot use the cycle-check module here,
|
||||
since it's possible to encounter the same parent
|
||||
directory more than once in a given traversal. However,
|
||||
encountering the same (parentdir, START) pair twice does
|
||||
indicate a loop. */
|
||||
if (seen_triple (&ht, start, &st))
|
||||
{
|
||||
if (can_exist == CAN_MISSING)
|
||||
continue;
|
||||
errno = ELOOP;
|
||||
goto error;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
st.st_mode = 0;
|
||||
}
|
||||
|
||||
buf[n] = '\0';
|
||||
if (S_ISLNK (st.st_mode))
|
||||
{
|
||||
char *buf;
|
||||
size_t n, len;
|
||||
|
||||
char *extra_buf = extra_buffer.data;
|
||||
idx_t end_idx IF_LINT (= 0);
|
||||
if (end_in_extra_buffer)
|
||||
end_idx = end - extra_buf;
|
||||
size_t len = strlen (end);
|
||||
if (INT_ADD_OVERFLOW (len, n))
|
||||
xalloc_die ();
|
||||
while (extra_buffer.length <= len + n)
|
||||
/* Detect loops. We cannot use the cycle-check module here,
|
||||
since it's actually possible to encounter the same symlink
|
||||
more than once in a given traversal. However, encountering
|
||||
the same symlink,NAME pair twice does indicate a loop. */
|
||||
if (seen_triple (&ht, name, &st))
|
||||
{
|
||||
if (!scratch_buffer_grow_preserve (&extra_buffer))
|
||||
xalloc_die ();
|
||||
extra_buf = extra_buffer.data;
|
||||
if (can_mode == CAN_MISSING)
|
||||
continue;
|
||||
saved_errno = ELOOP;
|
||||
goto error;
|
||||
}
|
||||
|
||||
buf = areadlink_with_size (rname, st.st_size);
|
||||
if (!buf)
|
||||
{
|
||||
if (can_mode == CAN_MISSING && errno != ENOMEM)
|
||||
continue;
|
||||
saved_errno = errno;
|
||||
goto error;
|
||||
}
|
||||
|
||||
n = strlen (buf);
|
||||
len = strlen (end);
|
||||
|
||||
if (!extra_len)
|
||||
{
|
||||
extra_len =
|
||||
((n + len + 1) > PATH_MAX) ? (n + len + 1) : PATH_MAX;
|
||||
extra_buf = xmalloc (extra_len);
|
||||
}
|
||||
else if ((n + len + 1) > extra_len)
|
||||
{
|
||||
extra_len = n + len + 1;
|
||||
extra_buf = xrealloc (extra_buf, extra_len);
|
||||
}
|
||||
if (end_in_extra_buffer)
|
||||
end = extra_buf + end_idx;
|
||||
|
||||
/* Careful here, end may be a pointer into extra_buf... */
|
||||
memmove (&extra_buf[n], end, len + 1);
|
||||
name = end = memcpy (extra_buf, buf, n);
|
||||
end_in_extra_buffer = true;
|
||||
|
||||
if (IS_ABSOLUTE_FILE_NAME (buf))
|
||||
{
|
||||
idx_t pfxlen = FILE_SYSTEM_PREFIX_LEN (buf);
|
||||
size_t pfxlen = FILE_SYSTEM_PREFIX_LEN (buf);
|
||||
|
||||
dest = mempcpy (rname, buf, pfxlen);
|
||||
if (pfxlen)
|
||||
memcpy (rname, buf, pfxlen);
|
||||
dest = rname + pfxlen;
|
||||
*dest++ = '/'; /* It's an absolute symlink */
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
|
||||
{
|
||||
@ -431,17 +318,17 @@ canonicalize_filename_mode_stk (const char *name, canonicalize_mode_t can_mode,
|
||||
&& ISSLASH (*dest) && !ISSLASH (dest[1]) && !prefix_len)
|
||||
dest++;
|
||||
}
|
||||
|
||||
free (buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!S_ISDIR (st.st_mode) && *end && (can_mode != CAN_MISSING))
|
||||
{
|
||||
saved_errno = ENOTDIR;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
else if (! (can_exist == CAN_MISSING
|
||||
|| (suffix_requires_dir_check (end)
|
||||
? dir_check (rname, dest)
|
||||
: !logical
|
||||
? errno == EINVAL
|
||||
: *end || file_accessible (rname))
|
||||
|| (can_exist == CAN_ALL_BUT_LAST
|
||||
&& errno == ENOENT
|
||||
&& !end[strspn (end, SLASHES)])))
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
if (dest > rname + prefix_len + 1 && ISSLASH (dest[-1]))
|
||||
@ -449,41 +336,20 @@ canonicalize_filename_mode_stk (const char *name, canonicalize_mode_t can_mode,
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 && !prefix_len
|
||||
&& ISSLASH (*dest) && !ISSLASH (dest[1]))
|
||||
dest++;
|
||||
failed = false;
|
||||
*dest = '\0';
|
||||
if (rname_limit != dest + 1)
|
||||
rname = xrealloc (rname, dest - rname + 1);
|
||||
|
||||
error:
|
||||
free (extra_buf);
|
||||
if (ht)
|
||||
hash_free (ht);
|
||||
scratch_buffer_free (&extra_buffer);
|
||||
scratch_buffer_free (&link_buffer);
|
||||
return rname;
|
||||
|
||||
if (failed)
|
||||
{
|
||||
scratch_buffer_free (rname_buf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*dest++ = '\0';
|
||||
char *result = scratch_buffer_dupfree (rname_buf, dest - rname);
|
||||
if (!result)
|
||||
xalloc_die ();
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Return the canonical absolute name of file NAME, while treating
|
||||
missing elements according to CAN_MODE. A canonical name
|
||||
does not contain any ".", ".." components nor any repeated file name
|
||||
separators ('/') or, depending on other CAN_MODE flags, symlinks.
|
||||
Whether components must exist or not depends on canonicalize mode.
|
||||
The result is malloc'd. */
|
||||
|
||||
char *
|
||||
canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode)
|
||||
{
|
||||
#ifdef GCC_BOGUS_WRETURN_LOCAL_ADDR
|
||||
#warning "GCC might issue a bogus -Wreturn-local-addr warning here."
|
||||
#warning "See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644>."
|
||||
#endif
|
||||
struct scratch_buffer rname_buffer;
|
||||
return canonicalize_filename_mode_stk (name, can_mode, &rname_buffer);
|
||||
error:
|
||||
free (extra_buf);
|
||||
free (rname);
|
||||
if (ht)
|
||||
hash_free (ht);
|
||||
errno = saved_errno;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
/* Return the canonical absolute name of a given file.
|
||||
Copyright (C) 1996-2007, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996-2007, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
@ -46,10 +46,8 @@ typedef enum canonicalize_mode_t canonicalize_mode_t;
|
||||
does not contain any `.', `..' components nor any repeated file name
|
||||
separators ('/') or, depending on other CAN_MODE flags, symlinks.
|
||||
Whether components must exist or not depends on canonicalize mode.
|
||||
The result is malloc'd.
|
||||
Upon failure, return NULL with errno set. */
|
||||
char *canonicalize_filename_mode (const char *, canonicalize_mode_t)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
The result is malloc'd. */
|
||||
char *canonicalize_filename_mode (const char *, canonicalize_mode_t);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -1,19 +1,19 @@
|
||||
/* Read symbolic links into a buffer without size limitation, relative to fd.
|
||||
|
||||
Copyright (C) 2001, 2003-2004, 2007, 2009-2022 Free Software Foundation,
|
||||
Copyright (C) 2001, 2003-2004, 2007, 2009-2020 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
|
||||
@ -22,9 +22,6 @@
|
||||
|
||||
#include "careadlinkat.h"
|
||||
|
||||
#include "idx.h"
|
||||
#include "minmax.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
@ -41,107 +38,6 @@
|
||||
|
||||
#include "allocator.h"
|
||||
|
||||
enum { STACK_BUF_SIZE = 1024 };
|
||||
|
||||
/* Act like careadlinkat (see below), with an additional argument
|
||||
STACK_BUF that can be used as temporary storage.
|
||||
|
||||
If GCC_LINT is defined, do not inline this function with GCC 10.1
|
||||
and later, to avoid creating a pointer to the stack that GCC
|
||||
-Wreturn-local-addr incorrectly complains about. See:
|
||||
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644
|
||||
Although the noinline attribute can hurt performance a bit, no better way
|
||||
to pacify GCC is known; even an explicit #pragma does not pacify GCC.
|
||||
When the GCC bug is fixed this workaround should be limited to the
|
||||
broken GCC versions. */
|
||||
#if _GL_GNUC_PREREQ (10, 1)
|
||||
# if defined GCC_LINT || defined lint
|
||||
__attribute__ ((__noinline__))
|
||||
# elif __OPTIMIZE__ && !__NO_INLINE__
|
||||
# define GCC_BOGUS_WRETURN_LOCAL_ADDR
|
||||
# endif
|
||||
#endif
|
||||
static char *
|
||||
readlink_stk (int fd, char const *filename,
|
||||
char *buffer, size_t buffer_size,
|
||||
struct allocator const *alloc,
|
||||
ssize_t (*preadlinkat) (int, char const *, char *, size_t),
|
||||
char stack_buf[STACK_BUF_SIZE])
|
||||
{
|
||||
if (! alloc)
|
||||
alloc = &stdlib_allocator;
|
||||
|
||||
if (!buffer)
|
||||
{
|
||||
buffer = stack_buf;
|
||||
buffer_size = STACK_BUF_SIZE;
|
||||
}
|
||||
|
||||
char *buf = buffer;
|
||||
idx_t buf_size_max = MIN (IDX_MAX, MIN (SSIZE_MAX, SIZE_MAX));
|
||||
idx_t buf_size = MIN (buffer_size, buf_size_max);
|
||||
|
||||
while (buf)
|
||||
{
|
||||
/* Attempt to read the link into the current buffer. */
|
||||
idx_t link_length = preadlinkat (fd, filename, buf, buf_size);
|
||||
if (link_length < 0)
|
||||
{
|
||||
if (buf != buffer)
|
||||
{
|
||||
int readlinkat_errno = errno;
|
||||
alloc->free (buf);
|
||||
errno = readlinkat_errno;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
idx_t link_size = link_length;
|
||||
|
||||
if (link_size < buf_size)
|
||||
{
|
||||
buf[link_size++] = '\0';
|
||||
|
||||
if (buf == stack_buf)
|
||||
{
|
||||
char *b = alloc->allocate (link_size);
|
||||
buf_size = link_size;
|
||||
if (! b)
|
||||
break;
|
||||
return memcpy (b, buf, link_size);
|
||||
}
|
||||
|
||||
if (link_size < buf_size && buf != buffer && alloc->reallocate)
|
||||
{
|
||||
/* Shrink BUF before returning it. */
|
||||
char *b = alloc->reallocate (buf, link_size);
|
||||
if (b)
|
||||
return b;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
if (buf != buffer)
|
||||
alloc->free (buf);
|
||||
|
||||
if (buf_size_max / 2 <= buf_size)
|
||||
{
|
||||
errno = ENAMETOOLONG;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buf_size = 2 * buf_size + 1;
|
||||
buf = alloc->allocate (buf_size);
|
||||
}
|
||||
|
||||
if (alloc->die)
|
||||
alloc->die (buf_size);
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Assuming the current directory is FD, get the symbolic link value
|
||||
of FILENAME as a null-terminated string and put it into a buffer.
|
||||
If FD is AT_FDCWD, FILENAME is interpreted relative to the current
|
||||
@ -170,15 +66,95 @@ careadlinkat (int fd, char const *filename,
|
||||
struct allocator const *alloc,
|
||||
ssize_t (*preadlinkat) (int, char const *, char *, size_t))
|
||||
{
|
||||
/* Allocate the initial buffer on the stack. This way, in the
|
||||
common case of a symlink of small size, we get away with a
|
||||
single small malloc instead of a big malloc followed by a
|
||||
shrinking realloc. */
|
||||
#ifdef GCC_BOGUS_WRETURN_LOCAL_ADDR
|
||||
#warning "GCC might issue a bogus -Wreturn-local-addr warning here."
|
||||
#warning "See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644>."
|
||||
#endif
|
||||
char stack_buf[STACK_BUF_SIZE];
|
||||
return readlink_stk (fd, filename, buffer, buffer_size, alloc,
|
||||
preadlinkat, stack_buf);
|
||||
char *buf;
|
||||
size_t buf_size;
|
||||
size_t buf_size_max =
|
||||
SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
|
||||
char stack_buf[1024];
|
||||
|
||||
if (! alloc)
|
||||
alloc = &stdlib_allocator;
|
||||
|
||||
if (! buffer_size)
|
||||
{
|
||||
/* Allocate the initial buffer on the stack. This way, in the
|
||||
common case of a symlink of small size, we get away with a
|
||||
single small malloc() instead of a big malloc() followed by a
|
||||
shrinking realloc(). */
|
||||
buffer = stack_buf;
|
||||
buffer_size = sizeof stack_buf;
|
||||
}
|
||||
|
||||
buf = buffer;
|
||||
buf_size = buffer_size;
|
||||
|
||||
do
|
||||
{
|
||||
/* Attempt to read the link into the current buffer. */
|
||||
ssize_t link_length = preadlinkat (fd, filename, buf, buf_size);
|
||||
size_t link_size;
|
||||
if (link_length < 0)
|
||||
{
|
||||
/* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
|
||||
with errno == ERANGE if the buffer is too small. */
|
||||
int readlinkat_errno = errno;
|
||||
if (readlinkat_errno != ERANGE)
|
||||
{
|
||||
if (buf != buffer)
|
||||
{
|
||||
alloc->free (buf);
|
||||
errno = readlinkat_errno;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
link_size = link_length;
|
||||
|
||||
if (link_size < buf_size)
|
||||
{
|
||||
buf[link_size++] = '\0';
|
||||
|
||||
if (buf == stack_buf)
|
||||
{
|
||||
char *b = (char *) alloc->allocate (link_size);
|
||||
buf_size = link_size;
|
||||
if (! b)
|
||||
break;
|
||||
memcpy (b, buf, link_size);
|
||||
buf = b;
|
||||
}
|
||||
else if (link_size < buf_size && buf != buffer && alloc->reallocate)
|
||||
{
|
||||
/* Shrink BUF before returning it. */
|
||||
char *b = (char *) alloc->reallocate (buf, link_size);
|
||||
if (b)
|
||||
buf = b;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
if (buf != buffer)
|
||||
alloc->free (buf);
|
||||
|
||||
if (buf_size <= buf_size_max / 2)
|
||||
buf_size *= 2;
|
||||
else if (buf_size < buf_size_max)
|
||||
buf_size = buf_size_max;
|
||||
else if (buf_size_max < SIZE_MAX)
|
||||
{
|
||||
errno = ENAMETOOLONG;
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
break;
|
||||
buf = (char *) alloc->allocate (buf_size);
|
||||
}
|
||||
while (buf);
|
||||
|
||||
if (alloc->die)
|
||||
alloc->die (buf_size);
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1,18 +1,18 @@
|
||||
/* Read symbolic links into a buffer without size limitation, relative to fd.
|
||||
|
||||
Copyright (C) 2011-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2011-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
|
||||
|
339
lib/cdefs.h
339
lib/cdefs.h
@ -1,18 +1,17 @@
|
||||
/* Copyright (C) 1992-2022 Free Software Foundation, Inc.
|
||||
Copyright The GNU Toolchain Authors.
|
||||
/* Copyright (C) 1992-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
modify it under the terms of the GNU General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Lesser General Public License for more details.
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
@ -26,7 +25,7 @@
|
||||
|
||||
/* The GNU libc does not support any K&R compilers or the traditional mode
|
||||
of ISO C compilers anymore. Check for some of the combinations not
|
||||
supported anymore. */
|
||||
anymore supported. */
|
||||
#if defined __GNUC__ && !defined __STDC__
|
||||
# error "You need a ISO C conforming compiler to use the glibc headers"
|
||||
#endif
|
||||
@ -35,31 +34,7 @@
|
||||
#undef __P
|
||||
#undef __PMT
|
||||
|
||||
/* Compilers that lack __has_attribute may object to
|
||||
#if defined __has_attribute && __has_attribute (...)
|
||||
even though they do not need to evaluate the right-hand side of the &&.
|
||||
Similarly for __has_builtin, etc. */
|
||||
#if (defined __has_attribute \
|
||||
&& (!defined __clang_minor__ \
|
||||
|| (defined __apple_build_version__ \
|
||||
? 6000000 <= __apple_build_version__ \
|
||||
: 3 < __clang_major__ + (5 <= __clang_minor__))))
|
||||
# define __glibc_has_attribute(attr) __has_attribute (attr)
|
||||
#else
|
||||
# define __glibc_has_attribute(attr) 0
|
||||
#endif
|
||||
#ifdef __has_builtin
|
||||
# define __glibc_has_builtin(name) __has_builtin (name)
|
||||
#else
|
||||
# define __glibc_has_builtin(name) 0
|
||||
#endif
|
||||
#ifdef __has_extension
|
||||
# define __glibc_has_extension(ext) __has_extension (ext)
|
||||
#else
|
||||
# define __glibc_has_extension(ext) 0
|
||||
#endif
|
||||
|
||||
#if defined __GNUC__ || defined __clang__
|
||||
#ifdef __GNUC__
|
||||
|
||||
/* All functions, except those with callbacks or those that
|
||||
synchronize memory, are leaf functions. */
|
||||
@ -72,26 +47,21 @@
|
||||
# endif
|
||||
|
||||
/* GCC can always grok prototypes. For C++ programs we add throw()
|
||||
to help it optimize the function calls. But this only works with
|
||||
gcc 2.8.x and egcs. For gcc 3.4 and up we even mark C functions
|
||||
to help it optimize the function calls. But this works only with
|
||||
gcc 2.8.x and egcs. For gcc 3.2 and up we even mark C functions
|
||||
as non-throwing using a function attribute since programs can use
|
||||
the -fexceptions options for C code as well. */
|
||||
# if !defined __cplusplus \
|
||||
&& (__GNUC_PREREQ (3, 4) || __glibc_has_attribute (__nothrow__))
|
||||
# if !defined __cplusplus && __GNUC_PREREQ (3, 3)
|
||||
# define __THROW __attribute__ ((__nothrow__ __LEAF))
|
||||
# define __THROWNL __attribute__ ((__nothrow__))
|
||||
# define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct
|
||||
# define __NTHNL(fct) __attribute__ ((__nothrow__)) fct
|
||||
# else
|
||||
# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major >= 4)
|
||||
# if __cplusplus >= 201103L
|
||||
# define __THROW noexcept (true)
|
||||
# else
|
||||
# define __THROW throw ()
|
||||
# endif
|
||||
# define __THROWNL __THROW
|
||||
# define __NTH(fct) __LEAF_ATTR fct __THROW
|
||||
# define __NTHNL(fct) fct __THROW
|
||||
# if defined __cplusplus && __GNUC_PREREQ (2,8)
|
||||
# define __THROW throw ()
|
||||
# define __THROWNL throw ()
|
||||
# define __NTH(fct) __LEAF_ATTR fct throw ()
|
||||
# define __NTHNL(fct) fct throw ()
|
||||
# else
|
||||
# define __THROW
|
||||
# define __THROWNL
|
||||
@ -100,7 +70,7 @@
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#else /* Not GCC or clang. */
|
||||
#else /* Not GCC. */
|
||||
|
||||
# if (defined __cplusplus \
|
||||
|| (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
|
||||
@ -113,7 +83,16 @@
|
||||
# define __THROWNL
|
||||
# define __NTH(fct) fct
|
||||
|
||||
#endif /* GCC || clang. */
|
||||
#endif /* GCC. */
|
||||
|
||||
/* Compilers that are not clang may object to
|
||||
#if defined __clang__ && __has_extension(...)
|
||||
even though they do not need to evaluate the right-hand side of the &&. */
|
||||
#if defined __clang__ && defined __has_extension
|
||||
# define __glibc_clang_has_extension(ext) __has_extension (ext)
|
||||
#else
|
||||
# define __glibc_clang_has_extension(ext) 0
|
||||
#endif
|
||||
|
||||
/* These two macros are not used in glibc anymore. They are kept here
|
||||
only because some other projects expect the macros to be defined. */
|
||||
@ -144,68 +123,14 @@
|
||||
#define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1)
|
||||
#define __bos0(ptr) __builtin_object_size (ptr, 0)
|
||||
|
||||
/* Use __builtin_dynamic_object_size at _FORTIFY_SOURCE=3 when available. */
|
||||
#if __USE_FORTIFY_LEVEL == 3 && (__glibc_clang_prereq (9, 0) \
|
||||
|| __GNUC_PREREQ (12, 0))
|
||||
# define __glibc_objsize0(__o) __builtin_dynamic_object_size (__o, 0)
|
||||
# define __glibc_objsize(__o) __builtin_dynamic_object_size (__o, 1)
|
||||
#else
|
||||
# define __glibc_objsize0(__o) __bos0 (__o)
|
||||
# define __glibc_objsize(__o) __bos (__o)
|
||||
#endif
|
||||
|
||||
/* Compile time conditions to choose between the regular, _chk and _chk_warn
|
||||
variants. These conditions should get evaluated to constant and optimized
|
||||
away. */
|
||||
|
||||
#define __glibc_safe_len_cond(__l, __s, __osz) ((__l) <= (__osz) / (__s))
|
||||
#define __glibc_unsigned_or_positive(__l) \
|
||||
((__typeof (__l)) 0 < (__typeof (__l)) -1 \
|
||||
|| (__builtin_constant_p (__l) && (__l) > 0))
|
||||
|
||||
/* Length is known to be safe at compile time if the __L * __S <= __OBJSZ
|
||||
condition can be folded to a constant and if it is true. The -1 check is
|
||||
redundant because since it implies that __glibc_safe_len_cond is true. */
|
||||
#define __glibc_safe_or_unknown_len(__l, __s, __osz) \
|
||||
(__glibc_unsigned_or_positive (__l) \
|
||||
&& __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), \
|
||||
__s, __osz)) \
|
||||
&& __glibc_safe_len_cond ((__SIZE_TYPE__) (__l), __s, __osz))
|
||||
|
||||
/* Conversely, we know at compile time that the length is unsafe if the
|
||||
__L * __S <= __OBJSZ condition can be folded to a constant and if it is
|
||||
false. */
|
||||
#define __glibc_unsafe_len(__l, __s, __osz) \
|
||||
(__glibc_unsigned_or_positive (__l) \
|
||||
&& __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), \
|
||||
__s, __osz)) \
|
||||
&& !__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), __s, __osz))
|
||||
|
||||
/* Fortify function f. __f_alias, __f_chk and __f_chk_warn must be
|
||||
declared. */
|
||||
|
||||
#define __glibc_fortify(f, __l, __s, __osz, ...) \
|
||||
(__glibc_safe_or_unknown_len (__l, __s, __osz) \
|
||||
? __ ## f ## _alias (__VA_ARGS__) \
|
||||
: (__glibc_unsafe_len (__l, __s, __osz) \
|
||||
? __ ## f ## _chk_warn (__VA_ARGS__, __osz) \
|
||||
: __ ## f ## _chk (__VA_ARGS__, __osz))) \
|
||||
|
||||
/* Fortify function f, where object size argument passed to f is the number of
|
||||
elements and not total size. */
|
||||
|
||||
#define __glibc_fortify_n(f, __l, __s, __osz, ...) \
|
||||
(__glibc_safe_or_unknown_len (__l, __s, __osz) \
|
||||
? __ ## f ## _alias (__VA_ARGS__) \
|
||||
: (__glibc_unsafe_len (__l, __s, __osz) \
|
||||
? __ ## f ## _chk_warn (__VA_ARGS__, (__osz) / (__s)) \
|
||||
: __ ## f ## _chk (__VA_ARGS__, (__osz) / (__s)))) \
|
||||
|
||||
#if __GNUC_PREREQ (4,3)
|
||||
# define __warndecl(name, msg) \
|
||||
extern void name (void) __attribute__((__warning__ (msg)))
|
||||
# define __warnattr(msg) __attribute__((__warning__ (msg)))
|
||||
# define __errordecl(name, msg) \
|
||||
extern void name (void) __attribute__((__error__ (msg)))
|
||||
#else
|
||||
# define __warndecl(name, msg) extern void name (void)
|
||||
# define __warnattr(msg)
|
||||
# define __errordecl(name, msg) extern void name (void)
|
||||
#endif
|
||||
@ -217,8 +142,8 @@
|
||||
#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L && !defined __HP_cc
|
||||
# define __flexarr []
|
||||
# define __glibc_c99_flexarr_available 1
|
||||
#elif __GNUC_PREREQ (2,97) || defined __clang__
|
||||
/* GCC 2.97 and clang support C99 flexible array members as an extension,
|
||||
#elif __GNUC_PREREQ (2,97)
|
||||
/* GCC 2.97 supports C99 flexible array members as an extension,
|
||||
even when in C89 mode or compiling C++ (any version). */
|
||||
# define __flexarr []
|
||||
# define __glibc_c99_flexarr_available 1
|
||||
@ -244,7 +169,7 @@
|
||||
Example:
|
||||
int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
|
||||
|
||||
#if (defined __GNUC__ && __GNUC__ >= 2) || (__clang_major__ >= 4)
|
||||
#if defined __GNUC__ && __GNUC__ >= 2
|
||||
|
||||
# define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias))
|
||||
# ifdef __cplusplus
|
||||
@ -269,17 +194,17 @@
|
||||
*/
|
||||
#endif
|
||||
|
||||
/* GCC and clang have various useful declarations that can be made with
|
||||
the '__attribute__' syntax. All of the ways we use this do fine if
|
||||
they are omitted for compilers that don't understand it. */
|
||||
#if !(defined __GNUC__ || defined __clang__)
|
||||
/* GCC has various useful declarations that can be made with the
|
||||
`__attribute__' syntax. All of the ways we use this do fine if
|
||||
they are omitted for compilers that don't understand it. */
|
||||
#if !defined __GNUC__ || __GNUC__ < 2
|
||||
# define __attribute__(xyz) /* Ignore */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 2.96 development the `malloc' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings. */
|
||||
#if __GNUC_PREREQ (2,96) || __glibc_has_attribute (__malloc__)
|
||||
#if __GNUC_PREREQ (2,96)
|
||||
# define __attribute_malloc__ __attribute__ ((__malloc__))
|
||||
#else
|
||||
# define __attribute_malloc__ /* Ignore */
|
||||
@ -294,41 +219,26 @@
|
||||
# define __attribute_alloc_size__(params) /* Ignore. */
|
||||
#endif
|
||||
|
||||
/* Tell the compiler which argument to an allocation function
|
||||
indicates the alignment of the allocation. */
|
||||
#if __GNUC_PREREQ (4, 9) || __glibc_has_attribute (__alloc_align__)
|
||||
# define __attribute_alloc_align__(param) \
|
||||
__attribute__ ((__alloc_align__ param))
|
||||
#else
|
||||
# define __attribute_alloc_align__(param) /* Ignore. */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 2.96 development the `pure' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings. */
|
||||
#if __GNUC_PREREQ (2,96) || __glibc_has_attribute (__pure__)
|
||||
#if __GNUC_PREREQ (2,96)
|
||||
# define __attribute_pure__ __attribute__ ((__pure__))
|
||||
#else
|
||||
# define __attribute_pure__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* This declaration tells the compiler that the value is constant. */
|
||||
#if __GNUC_PREREQ (2,5) || __glibc_has_attribute (__const__)
|
||||
#if __GNUC_PREREQ (2,5)
|
||||
# define __attribute_const__ __attribute__ ((__const__))
|
||||
#else
|
||||
# define __attribute_const__ /* Ignore */
|
||||
#endif
|
||||
|
||||
#if __GNUC_PREREQ (2,7) || __glibc_has_attribute (__unused__)
|
||||
# define __attribute_maybe_unused__ __attribute__ ((__unused__))
|
||||
#else
|
||||
# define __attribute_maybe_unused__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 3.1 development the `used' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings. */
|
||||
#if __GNUC_PREREQ (3,1) || __glibc_has_attribute (__used__)
|
||||
#if __GNUC_PREREQ (3,1)
|
||||
# define __attribute_used__ __attribute__ ((__used__))
|
||||
# define __attribute_noinline__ __attribute__ ((__noinline__))
|
||||
#else
|
||||
@ -337,7 +247,7 @@
|
||||
#endif
|
||||
|
||||
/* Since version 3.2, gcc allows marking deprecated functions. */
|
||||
#if __GNUC_PREREQ (3,2) || __glibc_has_attribute (__deprecated__)
|
||||
#if __GNUC_PREREQ (3,2)
|
||||
# define __attribute_deprecated__ __attribute__ ((__deprecated__))
|
||||
#else
|
||||
# define __attribute_deprecated__ /* Ignore */
|
||||
@ -346,8 +256,8 @@
|
||||
/* Since version 4.5, gcc also allows one to specify the message printed
|
||||
when a deprecated function is used. clang claims to be gcc 4.2, but
|
||||
may also support this feature. */
|
||||
#if __GNUC_PREREQ (4,5) \
|
||||
|| __glibc_has_extension (__attribute_deprecated_with_message__)
|
||||
#if __GNUC_PREREQ (4,5) || \
|
||||
__glibc_clang_has_extension (__attribute_deprecated_with_message__)
|
||||
# define __attribute_deprecated_msg__(msg) \
|
||||
__attribute__ ((__deprecated__ (msg)))
|
||||
#else
|
||||
@ -360,7 +270,7 @@
|
||||
If several `format_arg' attributes are given for the same function, in
|
||||
gcc-3.0 and older, all but the last one are ignored. In newer gccs,
|
||||
all designated arguments are considered. */
|
||||
#if __GNUC_PREREQ (2,8) || __glibc_has_attribute (__format_arg__)
|
||||
#if __GNUC_PREREQ (2,8)
|
||||
# define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
|
||||
#else
|
||||
# define __attribute_format_arg__(x) /* Ignore */
|
||||
@ -370,7 +280,7 @@
|
||||
attribute for functions was introduced. We don't want to use it
|
||||
unconditionally (although this would be possible) since it
|
||||
generates warnings. */
|
||||
#if __GNUC_PREREQ (2,97) || __glibc_has_attribute (__format__)
|
||||
#if __GNUC_PREREQ (2,97)
|
||||
# define __attribute_format_strfmon__(a,b) \
|
||||
__attribute__ ((__format__ (__strfmon__, a, b)))
|
||||
#else
|
||||
@ -378,33 +288,19 @@
|
||||
#endif
|
||||
|
||||
/* The nonnull function attribute marks pointer parameters that
|
||||
must not be NULL. This has the name __nonnull in glibc,
|
||||
and __attribute_nonnull__ in files shared with Gnulib to avoid
|
||||
collision with a different __nonnull in DragonFlyBSD 5.9. */
|
||||
#ifndef __attribute_nonnull__
|
||||
# if __GNUC_PREREQ (3,3) || __glibc_has_attribute (__nonnull__)
|
||||
# define __attribute_nonnull__(params) __attribute__ ((__nonnull__ params))
|
||||
# else
|
||||
# define __attribute_nonnull__(params)
|
||||
# endif
|
||||
#endif
|
||||
must not be NULL. Do not define __nonnull if it is already defined,
|
||||
for portability when this file is used in Gnulib. */
|
||||
#ifndef __nonnull
|
||||
# define __nonnull(params) __attribute_nonnull__ (params)
|
||||
#endif
|
||||
|
||||
/* The returns_nonnull function attribute marks the return type of the function
|
||||
as always being non-null. */
|
||||
#ifndef __returns_nonnull
|
||||
# if __GNUC_PREREQ (4, 9) || __glibc_has_attribute (__returns_nonnull__)
|
||||
# define __returns_nonnull __attribute__ ((__returns_nonnull__))
|
||||
# if __GNUC_PREREQ (3,3)
|
||||
# define __nonnull(params) __attribute__ ((__nonnull__ params))
|
||||
# else
|
||||
# define __returns_nonnull
|
||||
# define __nonnull(params)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* If fortification mode, we warn about unused results of certain
|
||||
function calls which can lead to problems. */
|
||||
#if __GNUC_PREREQ (3,4) || __glibc_has_attribute (__warn_unused_result__)
|
||||
#if __GNUC_PREREQ (3,4)
|
||||
# define __attribute_warn_unused_result__ \
|
||||
__attribute__ ((__warn_unused_result__))
|
||||
# if defined __USE_FORTIFY_LEVEL && __USE_FORTIFY_LEVEL > 0
|
||||
@ -418,7 +314,7 @@
|
||||
#endif
|
||||
|
||||
/* Forces a function to be always inlined. */
|
||||
#if __GNUC_PREREQ (3,2) || __glibc_has_attribute (__always_inline__)
|
||||
#if __GNUC_PREREQ (3,2)
|
||||
/* The Linux kernel defines __always_inline in stddef.h (283d7573), and
|
||||
it conflicts with this definition. Therefore undefine it first to
|
||||
allow either header to be included first. */
|
||||
@ -431,7 +327,7 @@
|
||||
|
||||
/* Associate error messages with the source location of the call site rather
|
||||
than with the source location inside the function. */
|
||||
#if __GNUC_PREREQ (4,3) || __glibc_has_attribute (__artificial__)
|
||||
#if __GNUC_PREREQ (4,3)
|
||||
# define __attribute_artificial__ __attribute__ ((__artificial__))
|
||||
#else
|
||||
# define __attribute_artificial__ /* Ignore */
|
||||
@ -474,14 +370,12 @@
|
||||
run in pedantic mode if the uses are carefully marked using the
|
||||
`__extension__' keyword. But this is not generally available before
|
||||
version 2.8. */
|
||||
#if !(__GNUC_PREREQ (2,8) || defined __clang__)
|
||||
#if !__GNUC_PREREQ (2,8)
|
||||
# define __extension__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* __restrict is known in EGCS 1.2 and above, and in clang.
|
||||
It works also in C++ mode (outside of arrays), but only when spelled
|
||||
as '__restrict', not 'restrict'. */
|
||||
#if !(__GNUC_PREREQ (2,92) || __clang_major__ >= 3)
|
||||
/* __restrict is known in EGCS 1.2 and above. */
|
||||
#if !__GNUC_PREREQ (2,92)
|
||||
# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
|
||||
# define __restrict restrict
|
||||
# else
|
||||
@ -491,9 +385,8 @@
|
||||
|
||||
/* ISO C99 also allows to declare arrays as non-overlapping. The syntax is
|
||||
array_name[restrict]
|
||||
GCC 3.1 and clang support this.
|
||||
This syntax is not usable in C++ mode. */
|
||||
#if (__GNUC_PREREQ (3,1) || __clang_major__ >= 3) && !defined __cplusplus
|
||||
GCC 3.1 supports this. */
|
||||
#if __GNUC_PREREQ (3,1) && !defined __GNUG__
|
||||
# define __restrict_arr __restrict
|
||||
#else
|
||||
# ifdef __GNUC__
|
||||
@ -508,7 +401,7 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if (__GNUC__ >= 3) || __glibc_has_builtin (__builtin_expect)
|
||||
#if __GNUC__ >= 3
|
||||
# define __glibc_unlikely(cond) __builtin_expect ((cond), 0)
|
||||
# define __glibc_likely(cond) __builtin_expect ((cond), 1)
|
||||
#else
|
||||
@ -516,10 +409,15 @@
|
||||
# define __glibc_likely(cond) (cond)
|
||||
#endif
|
||||
|
||||
#ifdef __has_attribute
|
||||
# define __glibc_has_attribute(attr) __has_attribute (attr)
|
||||
#else
|
||||
# define __glibc_has_attribute(attr) 0
|
||||
#endif
|
||||
|
||||
#if (!defined _Noreturn \
|
||||
&& (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
|
||||
&& !(__GNUC_PREREQ (4,7) \
|
||||
|| (3 < __clang_major__ + (5 <= __clang_minor__))))
|
||||
&& !__GNUC_PREREQ (4,7))
|
||||
# if __GNUC_PREREQ (2,8)
|
||||
# define _Noreturn __attribute__ ((__noreturn__))
|
||||
# else
|
||||
@ -536,63 +434,22 @@
|
||||
# define __attribute_nonstring__
|
||||
#endif
|
||||
|
||||
/* Undefine (also defined in libc-symbols.h). */
|
||||
#undef __attribute_copy__
|
||||
#if __GNUC_PREREQ (9, 0)
|
||||
/* Copies attributes from the declaration or type referenced by
|
||||
the argument. */
|
||||
# define __attribute_copy__(arg) __attribute__ ((__copy__ (arg)))
|
||||
#else
|
||||
# define __attribute_copy__(arg)
|
||||
#endif
|
||||
|
||||
#if (!defined _Static_assert && !defined __cplusplus \
|
||||
&& (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
|
||||
&& (!(__GNUC_PREREQ (4, 6) || __clang_major__ >= 4) \
|
||||
|| defined __STRICT_ANSI__))
|
||||
&& (!__GNUC_PREREQ (4, 6) || defined __STRICT_ANSI__))
|
||||
# define _Static_assert(expr, diagnostic) \
|
||||
extern int (*__Static_assert_function (void)) \
|
||||
[!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
|
||||
#endif
|
||||
|
||||
/* Gnulib avoids including these, as they don't work on non-glibc or
|
||||
older glibc platforms. */
|
||||
#ifndef __GNULIB_CDEFS
|
||||
/* The #ifndef lets Gnulib avoid including these on non-glibc
|
||||
platforms, where the includes typically do not exist. */
|
||||
#ifndef __WORDSIZE
|
||||
# include <bits/wordsize.h>
|
||||
# include <bits/long-double.h>
|
||||
#endif
|
||||
|
||||
#if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
|
||||
# ifdef __REDIRECT
|
||||
|
||||
/* Alias name defined automatically. */
|
||||
# define __LDBL_REDIR(name, proto) ... unused__ldbl_redir
|
||||
# define __LDBL_REDIR_DECL(name) \
|
||||
extern __typeof (name) name __asm (__ASMNAME ("__" #name "ieee128"));
|
||||
|
||||
/* Alias name defined automatically, with leading underscores. */
|
||||
# define __LDBL_REDIR2_DECL(name) \
|
||||
extern __typeof (__##name) __##name \
|
||||
__asm (__ASMNAME ("__" #name "ieee128"));
|
||||
|
||||
/* Alias name defined manually. */
|
||||
# define __LDBL_REDIR1(name, proto, alias) ... unused__ldbl_redir1
|
||||
# define __LDBL_REDIR1_DECL(name, alias) \
|
||||
extern __typeof (name) name __asm (__ASMNAME (#alias));
|
||||
|
||||
# define __LDBL_REDIR1_NTH(name, proto, alias) \
|
||||
__REDIRECT_NTH (name, proto, alias)
|
||||
# define __REDIRECT_NTH_LDBL(name, proto, alias) \
|
||||
__LDBL_REDIR1_NTH (name, proto, __##alias##ieee128)
|
||||
|
||||
/* Unused. */
|
||||
# define __REDIRECT_LDBL(name, proto, alias) ... unused__redirect_ldbl
|
||||
# define __LDBL_REDIR_NTH(name, proto) ... unused__ldbl_redir_nth
|
||||
|
||||
# else
|
||||
_Static_assert (0, "IEEE 128-bits long double requires redirection on this platform");
|
||||
# endif
|
||||
#elif defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
|
||||
#if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
|
||||
# define __LDBL_COMPAT 1
|
||||
# ifdef __REDIRECT
|
||||
# define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias)
|
||||
@ -601,8 +458,6 @@ _Static_assert (0, "IEEE 128-bits long double requires redirection on this platf
|
||||
# define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias)
|
||||
# define __LDBL_REDIR_NTH(name, proto) \
|
||||
__LDBL_REDIR1_NTH (name, proto, __nldbl_##name)
|
||||
# define __LDBL_REDIR2_DECL(name) \
|
||||
extern __typeof (__##name) __##name __asm (__ASMNAME ("__nldbl___" #name));
|
||||
# define __LDBL_REDIR1_DECL(name, alias) \
|
||||
extern __typeof (name) name __asm (__ASMNAME (#alias));
|
||||
# define __LDBL_REDIR_DECL(name) \
|
||||
@ -613,13 +468,11 @@ _Static_assert (0, "IEEE 128-bits long double requires redirection on this platf
|
||||
__LDBL_REDIR1_NTH (name, proto, __nldbl_##alias)
|
||||
# endif
|
||||
#endif
|
||||
#if (!defined __LDBL_COMPAT && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0) \
|
||||
|| !defined __REDIRECT
|
||||
#if !defined __LDBL_COMPAT || !defined __REDIRECT
|
||||
# define __LDBL_REDIR1(name, proto, alias) name proto
|
||||
# define __LDBL_REDIR(name, proto) name proto
|
||||
# define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW
|
||||
# define __LDBL_REDIR_NTH(name, proto) name proto __THROW
|
||||
# define __LDBL_REDIR2_DECL(name)
|
||||
# define __LDBL_REDIR_DECL(name)
|
||||
# ifdef __REDIRECT
|
||||
# define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias)
|
||||
@ -650,7 +503,7 @@ _Static_assert (0, "IEEE 128-bits long double requires redirection on this platf
|
||||
check is required to enable the use of generic selection. */
|
||||
#if !defined __cplusplus \
|
||||
&& (__GNUC_PREREQ (4, 9) \
|
||||
|| __glibc_has_extension (c_generic_selections) \
|
||||
|| __glibc_clang_has_extension (c_generic_selections) \
|
||||
|| (!defined __GNUC__ && defined __STDC_VERSION__ \
|
||||
&& __STDC_VERSION__ >= 201112L))
|
||||
# define __HAVE_GENERIC_SELECTION 1
|
||||
@ -658,50 +511,4 @@ _Static_assert (0, "IEEE 128-bits long double requires redirection on this platf
|
||||
# define __HAVE_GENERIC_SELECTION 0
|
||||
#endif
|
||||
|
||||
#if __GNUC_PREREQ (10, 0)
|
||||
/* Designates a 1-based positional argument ref-index of pointer type
|
||||
that can be used to access size-index elements of the pointed-to
|
||||
array according to access mode, or at least one element when
|
||||
size-index is not provided:
|
||||
access (access-mode, <ref-index> [, <size-index>]) */
|
||||
# define __attr_access(x) __attribute__ ((__access__ x))
|
||||
/* For _FORTIFY_SOURCE == 3 we use __builtin_dynamic_object_size, which may
|
||||
use the access attribute to get object sizes from function definition
|
||||
arguments, so we can't use them on functions we fortify. Drop the object
|
||||
size hints for such functions. */
|
||||
# if __USE_FORTIFY_LEVEL == 3
|
||||
# define __fortified_attr_access(a, o, s) __attribute__ ((__access__ (a, o)))
|
||||
# else
|
||||
# define __fortified_attr_access(a, o, s) __attr_access ((a, o, s))
|
||||
# endif
|
||||
# if __GNUC_PREREQ (11, 0)
|
||||
# define __attr_access_none(argno) __attribute__ ((__access__ (__none__, argno)))
|
||||
# else
|
||||
# define __attr_access_none(argno)
|
||||
# endif
|
||||
#else
|
||||
# define __fortified_attr_access(a, o, s)
|
||||
# define __attr_access(x)
|
||||
# define __attr_access_none(argno)
|
||||
#endif
|
||||
|
||||
#if __GNUC_PREREQ (11, 0)
|
||||
/* Designates dealloc as a function to call to deallocate objects
|
||||
allocated by the declared function. */
|
||||
# define __attr_dealloc(dealloc, argno) \
|
||||
__attribute__ ((__malloc__ (dealloc, argno)))
|
||||
# define __attr_dealloc_free __attr_dealloc (__builtin_free, 1)
|
||||
#else
|
||||
# define __attr_dealloc(dealloc, argno)
|
||||
# define __attr_dealloc_free
|
||||
#endif
|
||||
|
||||
/* Specify that a function such as setjmp or vfork may return
|
||||
twice. */
|
||||
#if __GNUC_PREREQ (4, 1)
|
||||
# define __attribute_returns_twice__ __attribute__ ((__returns_twice__))
|
||||
#else
|
||||
# define __attribute_returns_twice__ /* Ignore. */
|
||||
#endif
|
||||
|
||||
#endif /* sys/cdefs.h */
|
||||
|
@ -1,9 +1,9 @@
|
||||
/* provide a chdir function that tries not to fail due to ENAMETOOLONG
|
||||
Copyright (C) 2004-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2004-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,9 +1,9 @@
|
||||
/* provide a chdir function that tries not to fail due to ENAMETOOLONG
|
||||
Copyright (C) 2004-2005, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2004-2005, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,21 +1,3 @@
|
||||
/* Change access permissions of a file at a directory.
|
||||
|
||||
Copyright (C) 2012-2022 Free Software Foundation, Inc.
|
||||
|
||||
This file 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 file 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/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define CHMODAT_INLINE _GL_EXTERN_INLINE
|
||||
#include "openat.h"
|
||||
|
22
lib/chown.c
22
lib/chown.c
@ -1,19 +1,19 @@
|
||||
/* provide consistent interface to chown for systems that don't interpret
|
||||
an ID of -1 as meaning "don't change the corresponding ID".
|
||||
|
||||
Copyright (C) 1997, 2004-2007, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1997, 2004-2007, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* written by Jim Meyering */
|
||||
@ -33,8 +33,8 @@
|
||||
|
||||
/* Simple stub that always fails with ENOSYS, for mingw. */
|
||||
int
|
||||
chown (_GL_UNUSED const char *file, _GL_UNUSED uid_t uid,
|
||||
_GL_UNUSED gid_t gid)
|
||||
chown (const char *file _GL_UNUSED, uid_t uid _GL_UNUSED,
|
||||
gid_t gid _GL_UNUSED)
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
@ -87,7 +87,7 @@ rpl_chown (const char *file, uid_t uid, gid_t gid)
|
||||
on the symlink itself. To work around that, we open the
|
||||
file (but this can fail due to lack of read or write permission) and
|
||||
use fchown on the resulting descriptor. */
|
||||
int open_flags = O_NONBLOCK | O_NOCTTY | O_CLOEXEC;
|
||||
int open_flags = O_NONBLOCK | O_NOCTTY;
|
||||
int fd = open (file, O_RDONLY | open_flags);
|
||||
if (0 <= fd
|
||||
|| (errno == EACCES
|
||||
|
@ -1,21 +1,3 @@
|
||||
/* Change owner of a file at a directory.
|
||||
|
||||
Copyright (C) 2012-2022 Free Software Foundation, Inc.
|
||||
|
||||
This file 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 file 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/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define CHOWNAT_INLINE _GL_EXTERN_INLINE
|
||||
#include "openat.h"
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Convert string to double in the current locale, falling back on the C locale.
|
||||
|
||||
Copyright 2019-2022 Free Software Foundation, Inc.
|
||||
Copyright 2019-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
|
@ -1,4 +1,2 @@
|
||||
double cl_strtod (char const *, char **restrict)
|
||||
_GL_ATTRIBUTE_NONNULL ((1));
|
||||
long double cl_strtold (char const *, char **restrict)
|
||||
_GL_ATTRIBUTE_NONNULL ((1));
|
||||
double cl_strtod (char const *, char **restrict);
|
||||
long double cl_strtold (char const *, char **restrict);
|
||||
|
@ -1,21 +1,21 @@
|
||||
/* cloexec.c - set or clear the close-on-exec descriptor flag
|
||||
|
||||
Copyright (C) 1991, 2004-2006, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991, 2004-2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
/* The code is taken from glibc/manual/llio.texi */
|
||||
The code is taken from glibc/manual/llio.texi */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
@ -1,19 +1,21 @@
|
||||
/* cloexec.c - set or clear the close-on-exec descriptor flag
|
||||
|
||||
Copyright (C) 2004, 2009-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2004, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
/* Close a stream, with nicer error checking than fclose's.
|
||||
|
||||
Copyright (C) 1998-2002, 2004, 2006-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 1998-2002, 2004, 2006-2020 Free Software Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -1,20 +1,2 @@
|
||||
/* Close a stream, with nicer error checking than fclose's.
|
||||
|
||||
Copyright (C) 2006-2022 Free Software Foundation, Inc.
|
||||
|
||||
This file 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 file 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/>. */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int close_stream (FILE *stream);
|
||||
|
24
lib/close.c
24
lib/close.c
@ -1,17 +1,17 @@
|
||||
/* close replacement.
|
||||
Copyright (C) 2008-2022 Free Software Foundation, Inc.
|
||||
Copyright (C) 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
@ -28,8 +28,7 @@
|
||||
|
||||
#undef close
|
||||
|
||||
#if defined _WIN32 && !defined __CYGWIN__
|
||||
# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
|
||||
#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
|
||||
static int
|
||||
close_nothrow (int fd)
|
||||
{
|
||||
@ -37,7 +36,7 @@ close_nothrow (int fd)
|
||||
|
||||
TRY_MSVC_INVAL
|
||||
{
|
||||
result = _close (fd);
|
||||
result = close (fd);
|
||||
}
|
||||
CATCH_MSVC_INVAL
|
||||
{
|
||||
@ -48,9 +47,6 @@ close_nothrow (int fd)
|
||||
|
||||
return result;
|
||||
}
|
||||
# else
|
||||
# define close_nothrow _close
|
||||
# endif
|
||||
#else
|
||||
# define close_nothrow close
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user