diff --git a/NEWS.md b/NEWS.md index fb656288..846ed0ac 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,68 @@ +# NEWS for rsync 3.3.0 (6 Apr 2024) + +## Changes in this version: + +### BUG FIXES: + +- Fixed a bug with `--sparse --inplace` where a trailing gap in the source + file would not clear out the trailing data in the destination file. + +- Fixed an buffer overflow in the checksum2 code if SHA1 is being used for + the checksum2 algorithm. + +- Fixed an issue when rsync is compiled using `_FORTIFY_SOURCE` so that the + extra tests don't complain about a strlcpy() limit value (which was too + large, even though it wasn't possible for the larger value to cause an + overflow). + +- Add a backtick to the list of characters that the filename quoting needs to + escape using backslashes. + +- Fixed a string-comparison issue in the internal handling of `--progress` (a + locale such as tr_TR.utf-8 needed the internal triggering of `--info` options + to use upper-case flag names to ensure that they match). + +- Make sure that a local transfer marks the sender side as trusted. + +- Change the argv handling to work with a newer popt library -- one that likes + to free more data than it used to. + +- Rsync now calls `OpenSSL_add_all_algorithms()` when compiled against an older + openssl library. + +- Fixed a problem in the daemon auth for older protocols (29 and before) if the + openssl library is being used to compute MD4 checksums. + +- Fixed `rsync -VV` on Cygwin -- it needed a flush of stdout. + +- Fixed an old stats bug that counted devices as symlinks. + +### ENHANCEMENTS: + +- Enhanced rrsync with the `-no-overwrite` option that allows you to ensure + that existing files on your restricted but writable directory can't be + modified. + +- Enhanced the manpages to mark links with .UR & .UE. If your nroff doesn't + support these idioms, touch the file `.md2man-force` in the source directory + so that `md-convert` gets called with the `--force-link-text` option, and + that should ensure that your manpages are still readable even with the + ignored markup. + +- Some manpage improvements on the handling of [global] modules. + +- Changed the mapfrom & mapto perl scripts (in the support dir) into a single + python script named idmap. Converted a couple more perl scripts into python. + +- Changed the mnt-excl perl script (in the support dir) into a python script. + +### DEVELOPER RELATED: + + - Updated config.guess (timestamp 2023-01-01) and config.sub (timestamp + 2023-01-21). + +------------------------------------------------------------------------------ + # NEWS for rsync 3.2.7 (20 Oct 2022) ## Changes in this version: @@ -50,7 +115,7 @@ - The `--fuzzy` option was optimized a bit to try to cut down on the amount of computations when considering a big pool of files. The simple heuristic from - Kenneth Finnegan resuled in about a 2x speedup. + Kenneth Finnegan resulted in about a 2x speedup. - If rsync is forced to use protocol 29 or before (perhaps due to talking to an rsync before 3.0.0), the modify time of a file is limited to 4-bytes. Rsync @@ -217,9 +282,10 @@ - A new form of arg protection was added that works similarly to the older `--protect-args` ([`-s`](rsync.1#opt)) option but in a way that avoids breaking things like rrsync (the restricted rsync script): rsync now uses - backslash escaping for sending "shell-active" characters to the remote - shell. This includes spaces, so fetching a remote file via a simple quoted - filename value now works by default without any extra quoting: + backslash escaping for sending "shell-active" characters to the remote shell + (such as `$(){}<>#&` and others). This includes spaces, so fetching a remote + file via a quoted filename value now works by default without any extra + quoting: ```shell rsync -aiv host:'a simple file.pdf' . @@ -227,10 +293,14 @@ Wildcards are not escaped in filename args, but they are escaped in options like the [`--suffix`](rsync.1#opt) and [`--usermap`](rsync.1#opt) values. - If your rsync script depends on the old arg-splitting behavior, either run - it with the [`--old-args`](rsync.1#opt) option or `export RSYNC_OLD_ARGS=1` - in the script's environment. See also the [ADVANCED USAGE](rsync.1#) - section of rsync's manpage for how to use a more modern arg style. + + If a script depends on the old arg behavior (perhaps because it quotes or + protects the args already, or perhaps because it expects arg splitting), + there are two easy ways to get things going with a modern rsync: either + `export RSYNC_OLD_ARGS=1` in the script's environment (perhaps in the script + itself) or add the option [`--old-args`](rsync.1#opt) to the rsync commands + that are run. See also the [ADVANCED USAGE](rsync.1#) section of rsync's + manpage for how to use a more modern arg style. - A long-standing bug was preventing rsync from figuring out the current locale's decimal point character, which made rsync always output numbers @@ -4692,6 +4762,7 @@ | RELEASE DATE | VER. | DATE OF COMMIT\* | PROTOCOL | |--------------|--------|------------------|-------------| +| 06 Apr 2024 | 3.3.0 | | 31 | | 20 Oct 2022 | 3.2.7 | | 31 | | 09 Sep 2022 | 3.2.6 | | 31 | | 14 Aug 2022 | 3.2.5 | | 31 | diff --git a/checksum.c b/checksum.c index 60de3655..cb21882c 100644 --- a/checksum.c +++ b/checksum.c @@ -3,7 +3,7 @@ * * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2004-2022 Wayne Davison + * Copyright (C) 2004-2023 Wayne Davison * * 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 @@ -154,7 +154,7 @@ static const EVP_MD *csum_evp_md(struct name_num_item *nni) emd = NULL; else #endif - emd = EVP_get_digestbyname(nni->name); + emd = EVP_get_digestbyname(nni->name); if (emd && !(nni->flags & NNI_EVP_OK)) { /* Make sure it works before we advertise it */ if (!ctx_evp && !(ctx_evp = EVP_MD_CTX_create())) out_of_memory("csum_evp_md"); @@ -300,6 +300,7 @@ uint32 get_checksum1(char *buf1, int32 len) } #endif +/* The "sum" buffer must be at least MAX_DIGEST_LEN bytes! */ void get_checksum2(char *buf, int32 len, char *sum) { #ifdef USE_OPENSSL @@ -787,6 +788,10 @@ void init_checksum_choices() if (initialized_choices) return; +#if defined USE_OPENSSL && OPENSSL_VERSION_NUMBER < 0x10100000L + OpenSSL_add_all_algorithms(); +#endif + #if defined SUPPORT_XXH3 || defined USE_OPENSSL for (nni = valid_checksums.list; nni->name; nni++) verify_digest(nni, True); diff --git a/compat.c b/compat.c index a8a6afe8..4ce8c6d0 100644 --- a/compat.c +++ b/compat.c @@ -834,6 +834,8 @@ void output_daemon_greeting(int f_out, int am_client) char tmpbuf[MAX_NSTR_STRLEN]; int our_sub = get_subprotocol_version(); + init_checksum_choices(); + get_default_nno_list(&valid_auth_checksums, tmpbuf, MAX_NSTR_STRLEN, '\0'); io_printf(f_out, "@RSYNCD: %d.%d %s\n", protocol_version, our_sub, tmpbuf); @@ -873,8 +875,10 @@ void negotiate_daemon_auth(int f_out, int am_client) } } am_server = save_am_server; - if (md4_is_old && valid_auth_checksums.negotiated_nni->num == CSUM_MD4) + if (md4_is_old && valid_auth_checksums.negotiated_nni->num == CSUM_MD4) { valid_auth_checksums.negotiated_nni->num = CSUM_MD4_OLD; + valid_auth_checksums.negotiated_nni->flags = 0; + } } int get_subprotocol_version() diff --git a/config.guess b/config.guess index 92bfc33e..69188da7 100644 --- a/config.guess +++ b/config.guess @@ -1,12 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2020 Free Software Foundation, Inc. +# Copyright 1992-2023 Free Software Foundation, Inc. -timestamp='2020-04-26' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2023-01-01' # 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 +# 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 @@ -27,11 +29,19 @@ timestamp='2020-04-26' # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + me=`echo "$0" | sed -e 's,.*/,,'` usage="\ @@ -50,7 +60,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2020 Free Software Foundation, Inc. +Copyright 1992-2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -84,6 +94,9 @@ if test $# != 0; then exit 1 fi +# Just in case it came from the environment. +GUESS= + # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a @@ -102,7 +115,7 @@ set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" - # shellcheck disable=SC2039 + # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || @@ -112,7 +125,7 @@ set_cc_for_build() { ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD="$driver" + CC_FOR_BUILD=$driver break fi done @@ -133,14 +146,12 @@ fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown -case "$UNAME_SYSTEM" in +case $UNAME_SYSTEM in Linux|GNU|GNU/*) - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - LIBC=gnu + LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" @@ -149,24 +160,37 @@ Linux|GNU|GNU/*) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc - #else + #elif defined(__GLIBC__) LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" - # If ldd exists, use it to detect musl libc. - if command -v ldd >/dev/null && \ - ldd --version 2>&1 | grep -q ^musl - then - LIBC=musl + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. -case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -178,12 +202,12 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ - "/sbin/$sysctl" 2>/dev/null || \ - "/usr/sbin/$sysctl" 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; @@ -192,13 +216,13 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` - machine="${arch}${endian}"-unknown + machine=${arch}${endian}-unknown ;; - *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; @@ -219,7 +243,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in ;; esac # Determine ABI tags. - case "$UNAME_MACHINE_ARCH" in + case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` @@ -230,7 +254,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "$UNAME_VERSION" in + case $UNAME_VERSION in Debian*) release='-gnu' ;; @@ -241,51 +265,57 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "$machine-${os}${release}${abi-}" - exit ;; + GUESS=$machine-${os}${release}${abi-} + ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; *:MidnightBSD:*:*) - echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; *:ekkoBSD:*:*) - echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; *:SolidBSD:*:*) - echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; *:OS108:*:*) - echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; *:MirBSD:*:*) - echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; *:Sortix:*:*) - echo "$UNAME_MACHINE"-unknown-sortix - exit ;; + GUESS=$UNAME_MACHINE-unknown-sortix + ;; *:Twizzler:*:*) - echo "$UNAME_MACHINE"-unknown-twizzler - exit ;; + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; *:Redox:*:*) - echo "$UNAME_MACHINE"-unknown-redox - exit ;; + GUESS=$UNAME_MACHINE-unknown-redox + ;; mips:OSF1:*.*) - echo mips-dec-osf1 - exit ;; + GUESS=mips-dec-osf1 + ;; alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` @@ -299,7 +329,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in + case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") @@ -336,117 +366,121 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; + GUESS=m68k-unknown-sysv4 + ;; *:[Aa]miga[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-amigaos - exit ;; + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; *:[Mm]orph[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-morphos - exit ;; + GUESS=$UNAME_MACHINE-unknown-morphos + ;; *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; + GUESS=i370-ibm-openedition + ;; *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; + GUESS=s390-ibm-zvmoe + ;; *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; + GUESS=powerpc-ibm-os400 + ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix"$UNAME_RELEASE" - exit ;; + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; arm*:riscos:*:*|arm*:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; + GUESS=arm-unknown-riscos + ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; + GUESS=hppa1.1-hitachi-hiuxmpp + ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; + GUESS=pyramid-pyramid-svr4 + ;; DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; + GUESS=sparc-icl-nx6 + ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; s390x:SunOS:*:*) - echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux"$UNAME_RELEASE" - exit ;; + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi - echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in + case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos"$UNAME_RELEASE" - exit ;; + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 - case "`/bin/arch`" in + case `/bin/arch` in sun3) - echo m68k-sun-sunos"$UNAME_RELEASE" + GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) - echo sparc-sun-sunos"$UNAME_RELEASE" + GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac - exit ;; + ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos"$UNAME_RELEASE" - exit ;; + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor @@ -456,41 +490,41 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint"$UNAME_RELEASE" - exit ;; + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; m68k:machten:*:*) - echo m68k-apple-machten"$UNAME_RELEASE" - exit ;; + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; powerpc:machten:*:*) - echo powerpc-apple-machten"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; + GUESS=mips-dec-mach_bsd4.3 + ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix"$UNAME_RELEASE" - exit ;; + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix"$UNAME_RELEASE" - exit ;; + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix"$UNAME_RELEASE" - exit ;; + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" @@ -518,75 +552,76 @@ EOF dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos"$UNAME_RELEASE" - exit ;; + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; + GUESS=powerpc-motorola-powermax + ;; Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; + GUESS=powerpc-harris-powerunix + ;; m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; + GUESS=m88k-harris-cxux7 + ;; m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; + GUESS=m88k-motorola-sysv4 + ;; m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then - if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ - [ "$TARGET_BINARY_INTERFACE"x = x ] + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x then - echo m88k-dg-dgux"$UNAME_RELEASE" + GUESS=m88k-dg-dgux$UNAME_RELEASE else - echo m88k-dg-dguxbcs"$UNAME_RELEASE" + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else - echo i586-dg-dgux"$UNAME_RELEASE" + GUESS=i586-dg-dgux$UNAME_RELEASE fi - exit ;; + ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; + GUESS=m88k-dolphin-sysv3 + ;; M88*:*:R3*:*) # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; + GUESS=m88k-tektronix-sysv3 + ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; + GUESS=m68k-tektronix-bsd + ;; *:IRIX*:*:*) - echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" - exit ;; + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; + GUESS=i386-ibm-aix + ;; ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then + if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" - exit ;; + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build @@ -603,16 +638,16 @@ EOF EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then - echo "$SYSTEM_NAME" + GUESS=$SYSTEM_NAME else - echo rs6000-ibm-aix3.2.5 + GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 + GUESS=rs6000-ibm-aix3.2.4 else - echo rs6000-ibm-aix3.2 + GUESS=rs6000-ibm-aix3.2 fi - exit ;; + ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then @@ -620,56 +655,56 @@ EOF else IBM_ARCH=powerpc fi - if [ -x /usr/bin/lslpp ] ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo "$IBM_ARCH"-ibm-aix"$IBM_REV" - exit ;; + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; + GUESS=rs6000-ibm-aix + ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) - echo romp-ibm-bsd4.4 - exit ;; + GUESS=romp-ibm-bsd4.4 + ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; + GUESS=rs6000-bull-bosx + ;; DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; + GUESS=m68k-bull-sysv3 + ;; 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; + GUESS=m68k-hp-bsd + ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; + GUESS=m68k-hp-bsd4.4 + ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - case "$UNAME_MACHINE" in + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then + if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "$sc_cpu_version" in + case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "$sc_kernel_bits" in + case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi - if [ "$HP_ARCH" = "" ]; then + if test "$HP_ARCH" = ""; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" @@ -708,7 +743,7 @@ EOF test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ "$HP_ARCH" = hppa2.0w ] + if test "$HP_ARCH" = hppa2.0w then set_cc_for_build @@ -729,12 +764,12 @@ EOF HP_ARCH=hppa64 fi fi - echo "$HP_ARCH"-hp-hpux"$HPUX_REV" - exit ;; + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; ia64:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux"$HPUX_REV" - exit ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" @@ -764,36 +799,36 @@ EOF EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; + GUESS=unknown-hitachi-hiuxwe2 + ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) - echo hppa1.1-hp-bsd - exit ;; + GUESS=hppa1.1-hp-bsd + ;; 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; + GUESS=hppa1.0-hp-bsd + ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; + GUESS=hppa1.0-hp-mpeix + ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) - echo hppa1.1-hp-osf - exit ;; + GUESS=hppa1.1-hp-osf + ;; hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; + GUESS=hppa1.0-hp-osf + ;; i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo "$UNAME_MACHINE"-unknown-osf1mk + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk else - echo "$UNAME_MACHINE"-unknown-osf1 + GUESS=$UNAME_MACHINE-unknown-osf1 fi - exit ;; + ;; parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; + GUESS=hppa1.1-hp-lites + ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; + GUESS=c1-convex-bsd + ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd @@ -801,17 +836,18 @@ EOF fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; + GUESS=c34-convex-bsd + ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; + GUESS=c38-convex-bsd + ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; + GUESS=c4-convex-bsd + ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ @@ -819,112 +855,133 @@ EOF -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; *:BSD/OS:*:*) - echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else - echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi - exit ;; + ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` - case "$UNAME_PROCESSOR" in + case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac - echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" - exit ;; + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; i*:CYGWIN*:*) - echo "$UNAME_MACHINE"-pc-cygwin - exit ;; + GUESS=$UNAME_MACHINE-pc-cygwin + ;; *:MINGW64*:*) - echo "$UNAME_MACHINE"-pc-mingw64 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; *:MINGW*:*) - echo "$UNAME_MACHINE"-pc-mingw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; *:MSYS*:*) - echo "$UNAME_MACHINE"-pc-msys - exit ;; + GUESS=$UNAME_MACHINE-pc-msys + ;; i*:PW*:*) - echo "$UNAME_MACHINE"-pc-pw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; *:Interix*:*) - case "$UNAME_MACHINE" in + case $UNAME_MACHINE in x86) - echo i586-pc-interix"$UNAME_RELEASE" - exit ;; + GUESS=i586-pc-interix$UNAME_RELEASE + ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix"$UNAME_RELEASE" - exit ;; + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; IA64) - echo ia64-unknown-interix"$UNAME_RELEASE" - exit ;; + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; esac ;; i*:UWIN*:*) - echo "$UNAME_MACHINE"-pc-uwin - exit ;; + GUESS=$UNAME_MACHINE-pc-uwin + ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-pc-cygwin - exit ;; + GUESS=x86_64-pc-cygwin + ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; *:GNU:*:*) # the GNU system - echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" - exit ;; + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" - exit ;; + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-pc-managarm-mlibc" + ;; + *:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" + ;; *:Minix:*:*) - echo "$UNAME_MACHINE"-unknown-minix - exit ;; + GUESS=$UNAME_MACHINE-unknown-minix + ;; aarch64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; @@ -937,60 +994,63 @@ EOF esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi - exit ;; + ;; avr32*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; cris:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; crisv32:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; e2k:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; frv:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; hexagon:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; ia64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; k1om:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m32r*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m68*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 @@ -1035,123 +1095,135 @@ EOF #endif #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; openrisc*:Linux:*:*) - echo or1k-unknown-linux-"$LIBC" - exit ;; + GUESS=or1k-unknown-linux-$LIBC + ;; or32:Linux:*:* | or1k*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; padre:Linux:*:*) - echo sparc-unknown-linux-"$LIBC" - exit ;; + GUESS=sparc-unknown-linux-$LIBC + ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-"$LIBC" - exit ;; + GUESS=hppa64-unknown-linux-$LIBC + ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; - PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; - *) echo hppa-unknown-linux-"$LIBC" ;; + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; esac - exit ;; + ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc64-unknown-linux-$LIBC + ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc-unknown-linux-$LIBC + ;; ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpc64le-unknown-linux-$LIBC + ;; ppcle:Linux:*:*) - echo powerpcle-unknown-linux-"$LIBC" - exit ;; - riscv32:Linux:*:* | riscv64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; s390:Linux:*:* | s390x:Linux:*:*) - echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; sh64*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sh*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; tile*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; vax:Linux:*:*) - echo "$UNAME_MACHINE"-dec-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; x86_64:Linux:*:*) set_cc_for_build + CPU=$UNAME_MACHINE LIBCABI=$LIBC - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then - if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_X32 >/dev/null - then - LIBCABI="$LIBC"x32 - fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __i386__ + ABI=x86 + #else + #ifdef __ILP32__ + ABI=x32 + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + x86) CPU=i686 ;; + x32) LIBCABI=${LIBC}x32 ;; + esac fi - echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" - exit ;; + GUESS=$CPU-pc-linux-$LIBCABI + ;; xtensa*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; + GUESS=i386-sequent-sysv4 + ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" - exit ;; + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo "$UNAME_MACHINE"-pc-os2-emx - exit ;; + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; i*86:XTS-300:*:STOP) - echo "$UNAME_MACHINE"-unknown-stop - exit ;; + GUESS=$UNAME_MACHINE-unknown-stop + ;; i*86:atheos:*:*) - echo "$UNAME_MACHINE"-unknown-atheos - exit ;; + GUESS=$UNAME_MACHINE-unknown-atheos + ;; i*86:syllable:*:*) - echo "$UNAME_MACHINE"-pc-syllable - exit ;; + GUESS=$UNAME_MACHINE-pc-syllable + ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; i*86:*DOS:*:*) - echo "$UNAME_MACHINE"-pc-msdosdjgpp - exit ;; + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else - echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi - exit ;; + ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in @@ -1159,12 +1231,12 @@ EOF *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" - exit ;; + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1174,11 +1246,11 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else - echo "$UNAME_MACHINE"-pc-sysv32 + GUESS=$UNAME_MACHINE-pc-sysv32 fi - exit ;; + ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about @@ -1186,31 +1258,31 @@ EOF # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; + GUESS=i586-pc-msdosdjgpp + ;; Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; + GUESS=i386-pc-mach3 + ;; paragon:*:*:*) - echo i860-intel-osf1 - exit ;; + GUESS=i860-intel-osf1 + ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi - exit ;; + ;; mini*:CTIX:SYS*5:*) # "miniframe" - echo m68010-convergent-sysv - exit ;; + GUESS=m68010-convergent-sysv + ;; mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; + GUESS=m68k-convergent-sysv + ;; M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; + GUESS=m68k-diab-dnix + ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) @@ -1235,113 +1307,119 @@ EOF /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; + GUESS=m68k-atari-sysv4 + ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv"$UNAME_RELEASE" - exit ;; + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo "$UNAME_MACHINE"-sni-sysv4 + GUESS=$UNAME_MACHINE-sni-sysv4 else - echo ns32k-sni-sysv + GUESS=ns32k-sni-sysv fi - exit ;; + ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says - echo i586-unisys-sysv4 - exit ;; + GUESS=i586-unisys-sysv4 + ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; + GUESS=hppa1.1-stratus-sysv4 + ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; + GUESS=i860-stratus-sysv4 + ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo "$UNAME_MACHINE"-stratus-vos - exit ;; + GUESS=$UNAME_MACHINE-stratus-vos + ;; *:VOS:*:*) # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; + GUESS=hppa1.1-stratus-vos + ;; mc68*:A/UX:*:*) - echo m68k-apple-aux"$UNAME_RELEASE" - exit ;; + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; + GUESS=mips-sony-newsos6 + ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv"$UNAME_RELEASE" + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE else - echo mips-unknown-sysv"$UNAME_RELEASE" + GUESS=mips-unknown-sysv$UNAME_RELEASE fi - exit ;; + ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; + GUESS=powerpc-be-beos + ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; + GUESS=powerpc-apple-beos + ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; + GUESS=i586-pc-beos + ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - x86_64:Haiku:*:*) - echo x86_64-unknown-haiku - exit ;; + GUESS=i586-pc-haiku + ;; + ppc:Haiku:*:*) # Haiku running on Apple PowerPC + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) + GUESS=$UNAME_MACHINE-unknown-haiku + ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; SX-ACE:SUPER-UX:*:*) - echo sxace-nec-superux"$UNAME_RELEASE" - exit ;; + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody"$UNAME_RELEASE" - exit ;; + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; *:Rhapsody:*:*) - echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in @@ -1356,7 +1434,7 @@ EOF else set_cc_for_build fi - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null @@ -1377,109 +1455,119 @@ EOF # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi - echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; *:QNX:*:4*) - echo i386-pc-qnx - exit ;; + GUESS=i386-pc-qnx + ;; NEO-*:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; NSR-*:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; NSV-*:NONSTOP_KERNEL:*:*) - echo nsv-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; NSX-*:NONSTOP_KERNEL:*:*) - echo nsx-tandem-nsk"$UNAME_RELEASE" - exit ;; + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; + GUESS=mips-compaq-nonstopux + ;; BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; + GUESS=bs2000-siemens-sysv + ;; DS/*:UNIX_System_V:*:*) - echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - # shellcheck disable=SC2154 - if test "$cputype" = 386; then + if test "${cputype-}" = 386; then UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype fi - echo "$UNAME_MACHINE"-unknown-plan9 - exit ;; + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; + GUESS=pdp10-unknown-tops10 + ;; *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; + GUESS=pdp10-unknown-tenex + ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; + GUESS=pdp10-dec-tops20 + ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; + GUESS=pdp10-xkl-tops20 + ;; *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; + GUESS=pdp10-unknown-tops20 + ;; *:ITS:*:*) - echo pdp10-unknown-its - exit ;; + GUESS=pdp10-unknown-its + ;; SEI:*:*:SEIUX) - echo mips-sei-seiux"$UNAME_RELEASE" - exit ;; + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; *:DragonFly:*:*) - echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" - exit ;; + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "$UNAME_MACHINE" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; + GUESS=i386-pc-xenix + ;; i*86:skyos:*:*) - echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" - exit ;; + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; i*86:rdos:*:*) - echo "$UNAME_MACHINE"-pc-rdos - exit ;; - i*86:AROS:*:*) - echo "$UNAME_MACHINE"-pc-aros - exit ;; + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; x86_64:VMkernel:*:*) - echo "$UNAME_MACHINE"-unknown-esx - exit ;; + GUESS=$UNAME_MACHINE-unknown-esx + ;; amd64:Isilon\ OneFS:*:*) - echo x86_64-unknown-onefs - exit ;; + GUESS=x86_64-unknown-onefs + ;; *:Unleashed:*:*) - echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" - exit ;; + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; esac +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" </dev/null && SYSTEM_NAME=`$dummy` && +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. @@ -1619,7 +1707,7 @@ test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 -case "$UNAME_MACHINE:$UNAME_SYSTEM" in +case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&2 - exit 1 + # No normalization, but not necessarily accepted, that comes below. ;; esac + else # Here we handle the default operating systems that come with various machines. @@ -1528,6 +1531,7 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. +kernel= case $cpu-$vendor in score-*) os=elf @@ -1539,7 +1543,8 @@ case $cpu-$vendor in os=riscix1.2 ;; arm*-rebel) - os=linux + kernel=linux + os=gnu ;; arm*-semi) os=aout @@ -1705,84 +1710,193 @@ case $cpu-$vendor in os=none ;; esac + fi +# Now, validate our (potentially fixed-up) OS. +case $os in + # Sometimes we do "kernel-libc", so those need to count as OSes. + musl* | newlib* | relibc* | uclibc*) + ;; + # Likewise for "kernel-abi" + eabi* | gnueabi*) + ;; + # VxWorks passes extra cpu info in the 4th filed. + simlinux | simwindows | spe) + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ + | hiux* | abug | nacl* | netware* | windows* \ + | os9* | macos* | osx* | ios* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | mirbsd* | netbsd* | dicos* | openedition* | ose* \ + | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* | serenity* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | mint* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ + | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ + | fiwix* | mlibc* ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + none) + ;; + kernel* ) + # Restricted further below + ;; + *) + echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* ) + ;; + uclinux-uclibc* ) + ;; + managarm-mlibc* | managarm-kernel* ) + ;; + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + -kernel* ) + echo "Invalid configuration \`$1': \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + *-kernel* ) + echo "Invalid configuration \`$1': \`$kernel' does not support \`$os'." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + vxworks-simlinux | vxworks-simwindows | vxworks-spe) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) - case $os in - riscix*) + case $cpu-$os in + *-riscix*) vendor=acorn ;; - sunos*) + *-sunos*) vendor=sun ;; - cnk*|-aix*) + *-cnk* | *-aix*) vendor=ibm ;; - beos*) + *-beos*) vendor=be ;; - hpux*) + *-hpux*) vendor=hp ;; - mpeix*) + *-mpeix*) vendor=hp ;; - hiux*) + *-hiux*) vendor=hitachi ;; - unos*) + *-unos*) vendor=crds ;; - dgux*) + *-dgux*) vendor=dg ;; - luna*) + *-luna*) vendor=omron ;; - genix*) + *-genix*) vendor=ns ;; - clix*) + *-clix*) vendor=intergraph ;; - mvs* | opened*) + *-mvs* | *-opened*) vendor=ibm ;; - os400*) + *-os400*) vendor=ibm ;; - ptx*) + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) vendor=sequent ;; - tpf*) + *-tpf*) vendor=ibm ;; - vxsim* | vxworks* | windiss*) + *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; - aux*) + *-aux*) vendor=apple ;; - hms*) + *-hms*) vendor=hitachi ;; - mpw* | macos*) + *-mpw* | *-macos*) vendor=apple ;; - *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; - vos*) + *-vos*) vendor=stratus ;; esac ;; esac -echo "$cpu-$vendor-$os" +echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: diff --git a/configure.ac b/configure.ac index a2c99558..ccad7f13 100644 --- a/configure.ac +++ b/configure.ac @@ -432,10 +432,10 @@ AH_TEMPLATE([USE_OPENSSL], if test x"$enable_openssl" != x"no"; then if test x"$ac_cv_header_openssl_md4_h" = x"yes" && test x"$ac_cv_header_openssl_md5_h" = x"yes"; then AC_MSG_RESULT(yes) - AC_SEARCH_LIBS(MD5_Init, crypto, + AC_SEARCH_LIBS(EVP_MD_CTX_copy, crypto, [AC_DEFINE(USE_OPENSSL) enable_openssl=yes], - [err_msg="$err_msg$nl- Failed to find MD5_Init function in openssl crypto lib."; + [err_msg="$err_msg$nl- Failed to find EVP_MD_CTX_copy function in openssl crypto lib."; no_lib="$no_lib openssl"]) else AC_MSG_RESULT(no) diff --git a/delete.c b/delete.c index 4a294853..89c1f8d6 100644 --- a/delete.c +++ b/delete.c @@ -4,7 +4,7 @@ * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2002 Martin Pool - * Copyright (C) 2003-2020 Wayne Davison + * Copyright (C) 2003-2024 Wayne Davison * * 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 @@ -188,7 +188,7 @@ enum delret delete_item(char *fbuf, uint16 mode, uint16 flags) stats.deleted_symlinks++; #endif else if (IS_DEVICE(mode)) - stats.deleted_symlinks++; + stats.deleted_devices++; else stats.deleted_specials++; } diff --git a/exclude.c b/exclude.c index ffe55b16..87edbcf7 100644 --- a/exclude.c +++ b/exclude.c @@ -4,7 +4,7 @@ * Copyright (C) 1996-2001 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2002 Martin Pool - * Copyright (C) 2003-2022 Wayne Davison + * Copyright (C) 2003-2024 Wayne Davison * * 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 @@ -720,7 +720,8 @@ static BOOL setup_merge_file(int mergelist_num, filter_rule *ex, parent_dirscan = True; while (*y) { char save[MAXPATHLEN]; - strlcpy(save, y, MAXPATHLEN); + /* copylen is strlen(y) which is < MAXPATHLEN. +1 for \0 */ + size_t copylen = strlcpy(save, y, MAXPATHLEN) + 1; *y = '\0'; dirbuf_len = y - dirbuf; strlcpy(x, ex->pattern, MAXPATHLEN - (x - buf)); @@ -734,7 +735,7 @@ static BOOL setup_merge_file(int mergelist_num, filter_rule *ex, lp->head = NULL; } lp->tail = NULL; - strlcpy(y, save, MAXPATHLEN); + strlcpy(y, save, copylen); while ((*x++ = *y++) != '/') {} } parent_dirscan = False; diff --git a/fileio.c b/fileio.c index f80af19e..69c9a7b4 100644 --- a/fileio.c +++ b/fileio.c @@ -3,7 +3,7 @@ * * Copyright (C) 1998 Andrew Tridgell * Copyright (C) 2002 Martin Pool - * Copyright (C) 2004-2020 Wayne Davison + * Copyright (C) 2004-2023 Wayne Davison * * 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 @@ -40,30 +40,34 @@ OFF_T preallocated_len = 0; static OFF_T sparse_seek = 0; static OFF_T sparse_past_write = 0; -int sparse_end(int f, OFF_T size) +int sparse_end(int f, OFF_T size, int updating_basis_or_equiv) { - int ret; - - sparse_past_write = 0; - - if (!sparse_seek) - return 0; + int ret = 0; + if (updating_basis_or_equiv) { + if (sparse_seek && do_punch_hole(f, sparse_past_write, sparse_seek) < 0) + ret = -1; +#ifdef HAVE_FTRUNCATE /* A compilation formality -- in-place requires ftruncate() */ + else /* Just in case the original file was longer */ + ret = do_ftruncate(f, size); +#endif + } else if (sparse_seek) { #ifdef HAVE_FTRUNCATE - ret = do_ftruncate(f, size); + ret = do_ftruncate(f, size); #else - if (do_lseek(f, sparse_seek-1, SEEK_CUR) != size-1) - ret = -1; - else { - do { - ret = write(f, "", 1); - } while (ret < 0 && errno == EINTR); + if (do_lseek(f, sparse_seek-1, SEEK_CUR) != size-1) + ret = -1; + else { + do { + ret = write(f, "", 1); + } while (ret < 0 && errno == EINTR); - ret = ret <= 0 ? -1 : 0; - } + ret = ret <= 0 ? -1 : 0; + } #endif + } - sparse_seek = 0; + sparse_past_write = sparse_seek = 0; return ret; } diff --git a/flist.c b/flist.c index 65b459b1..464d556e 100644 --- a/flist.c +++ b/flist.c @@ -4,7 +4,7 @@ * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2001, 2002 Martin Pool - * Copyright (C) 2002-2022 Wayne Davison + * Copyright (C) 2002-2023 Wayne Davison * * 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 @@ -2367,7 +2367,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) } dirlen = dir ? strlen(dir) : 0; - if (dirlen != lastdir_len || memcmp(lastdir, dir, dirlen) != 0) { + if (dirlen != lastdir_len || (dirlen && memcmp(lastdir, dir, dirlen) != 0)) { if (!change_pathname(NULL, dir, -dirlen)) goto bad_path; lastdir = pathname; @@ -2659,7 +2659,7 @@ struct file_list *recv_file_list(int f, int dir_ndx) } else if (S_ISLNK(file->mode)) stats.num_symlinks++; else if (IS_DEVICE(file->mode)) - stats.num_symlinks++; + stats.num_devices++; else stats.num_specials++; diff --git a/generator.c b/generator.c index 21c4a595..110db28f 100644 --- a/generator.c +++ b/generator.c @@ -4,7 +4,7 @@ * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2002 Martin Pool - * Copyright (C) 2003-2022 Wayne Davison + * Copyright (C) 2003-2023 Wayne Davison * * 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 @@ -783,7 +783,7 @@ static int generate_and_send_sums(int fd, OFF_T len, int f_out, int f_copy) for (i = 0; i < sum.count; i++) { int32 n1 = (int32)MIN(len, (OFF_T)sum.blength); char *map = map_ptr(mapbuf, offset, n1); - char sum2[SUM_LENGTH]; + char sum2[MAX_DIGEST_LEN]; uint32 sum1; len -= n1; diff --git a/latest-year.h b/latest-year.h index 37e8efbb..f978fb8b 100644 --- a/latest-year.h +++ b/latest-year.h @@ -1 +1 @@ -#define LATEST_YEAR "2022" +#define LATEST_YEAR "2024" diff --git a/main.c b/main.c index d2a7b9b5..0c60b86d 100644 --- a/main.c +++ b/main.c @@ -89,6 +89,8 @@ extern int backup_dir_len; extern int basis_dir_cnt; extern int default_af_hint; extern int stdout_format_has_i; +extern int trust_sender_filter; +extern int trust_sender_args; extern struct stats stats; extern char *stdout_format; extern char *logfile_format; @@ -1381,15 +1383,6 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) return MAX(exit_code, exit_code2); } -static void dup_argv(char *argv[]) -{ - int i; - - for (i = 0; argv[i]; i++) - argv[i] = strdup(argv[i]); -} - - /* Start a client for either type of remote connection. Work out * whether the arguments request a remote shell or rsyncd connection, * and call the appropriate connection function, then run_client. @@ -1405,10 +1398,6 @@ static int start_client(int argc, char *argv[]) int ret; pid_t pid; - /* Don't clobber argv[] so that ps(1) can still show the right - * command line. */ - dup_argv(argv); - if (!read_batch) { /* for read_batch, NO source is specified */ char *path = check_for_hostspec(argv[0], &shell_machine, &rsync_port); if (path) { /* source is remote */ @@ -1484,8 +1473,10 @@ static int start_client(int argc, char *argv[]) } /* A local transfer doesn't unbackslash anything, so leave the args alone. */ - if (local_server) + if (local_server) { old_style_args = 2; + trust_sender_args = trust_sender_filter = 1; + } if (!rsync_port && remote_argc && !**remote_argv) /* Turn an empty arg into a dot dir. */ *remote_argv = "."; diff --git a/match.c b/match.c index 6243994c..cdb30a15 100644 --- a/match.c +++ b/match.c @@ -3,7 +3,7 @@ * * Copyright (C) 1996 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2003-2022 Wayne Davison + * Copyright (C) 2003-2023 Wayne Davison * * 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 @@ -142,7 +142,7 @@ static void hash_search(int f,struct sum_struct *s, { OFF_T offset, aligned_offset, end; int32 k, want_i, aligned_i, backup; - char sum2[SUM_LENGTH]; + char sum2[MAX_DIGEST_LEN]; uint32 s1, s2, sum; int more; schar *map; diff --git a/maybe-make-man b/maybe-make-man index 0dc17305..c7af7393 100755 --- a/maybe-make-man +++ b/maybe-make-man @@ -8,6 +8,7 @@ fi inname="$1" srcdir=`dirname "$0"` flagfile="$srcdir/.md2man-works" +force_flagfile="$srcdir/.md2man-force" if [ ! -f "$flagfile" ]; then # We test our smallest manpage just to see if the python setup works. @@ -32,4 +33,10 @@ if [ ! -f "$flagfile" ]; then fi fi -"$srcdir/md-convert" "$srcdir/$inname" +if [ -f "$force_flagfile" ]; then + opt='--force-link-text' +else + opt='' +fi + +"$srcdir/md-convert" $opt "$srcdir/$inname" diff --git a/md-convert b/md-convert index a48689a7..5fd63a76 100755 --- a/md-convert +++ b/md-convert @@ -276,7 +276,10 @@ class TransformHtml(HTMLParser): bad_hashtags = set(), latest_targets = [ ], opt_prefix = 'opt', + a_href = None, + a_href_external = False, a_txt_start = None, + after_a_tag = False, target_suf = '', ) @@ -315,6 +318,13 @@ class TransformHtml(HTMLParser): for bad in st.referenced_hashtags - st.created_hashtags: warn('Unknown hashtag link in', self.fn + ':', '#' + bad) + def handle_UE(self): + st = self.state + if st.txt.startswith(('.', ',', '!', '?', ';', ':')): + st.man_out[-1] = ".UE " + st.txt[0] + "\n" + st.txt = st.txt[1:] + st.after_a_tag = False + def handle_starttag(self, tag, attrs_list): st = self.state if args.debug: @@ -387,13 +397,20 @@ class TransformHtml(HTMLParser): for var, val in attrs_list: if var == 'href': if val.startswith(('https://', 'http://', 'mailto:', 'ftp:')): - pass # nothing to check + if st.after_a_tag: + self.handle_UE() + st.man_out.append(manify(st.txt.strip()) + "\n") + st.man_out.append(".UR " + val + "\n") + st.txt = '' + st.a_href = val + st.a_href_external = True elif '#' in val: pg, tgt = val.split('#', 1) if pg and pg not in VALID_PAGES or '#' in tgt: st.bad_hashtags.add(val) elif tgt in ('', 'opt', 'dopt'): st.a_href = val + st.a_href_external = False elif pg == '': st.referenced_hashtags.add(tgt) if tgt in st.latest_targets: @@ -409,6 +426,8 @@ class TransformHtml(HTMLParser): st = self.state if args.debug: self.output_debug('END', (tag,)) + if st.after_a_tag: + self.handle_UE() if tag in CONSUMES_TXT or st.dt_from == tag: txt = st.txt.strip() st.txt = '' @@ -473,7 +492,15 @@ class TransformHtml(HTMLParser): elif tag == 'hr': return elif tag == 'a': - if st.a_href: + if st.a_href_external: + st.txt = st.txt.strip() + if args.force_link_text or st.a_href != st.txt: + st.man_out.append(manify(st.txt) + "\n") + st.man_out.append(".UE\n") # This might get replaced with a punctuation version in handle_UE() + st.after_a_tag = True + st.a_href_external = False + st.txt = '' + elif st.a_href: atxt = st.txt[st.a_txt_start:] find = 'href="' + st.a_href + '"' for j in range(len(st.html_out)-1, 0, -1): @@ -612,6 +639,7 @@ if __name__ == '__main__': parser = argparse.ArgumentParser(description="Convert markdown into html and (optionally) nroff. Each input filename must have a .md suffix, which is changed to .html for the output filename. If the input filename ends with .num.md (e.g. foo.1.md) then a nroff file is also output with the input filename's .md suffix removed (e.g. foo.1).", add_help=False) parser.add_argument('--test', action='store_true', help="Just test the parsing without outputting any files.") parser.add_argument('--dest', metavar='DIR', help="Create files in DIR instead of the current directory.") + parser.add_argument('--force-link-text', action='store_true', help="Don't remove the link text if it matches the link href. Useful when nroff doesn't understand .UR and .UE.") parser.add_argument('--debug', '-D', action='count', default=0, help='Output copious info on the html parsing. Repeat for even more.') parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.") parser.add_argument("mdfiles", metavar='FILE.md', nargs='+', help="One or more .md files to convert.") diff --git a/options.c b/options.c index d38bbe8d..fd674754 100644 --- a/options.c +++ b/options.c @@ -3,7 +3,7 @@ * * Copyright (C) 1998-2001 Andrew Tridgell * Copyright (C) 2000, 2001, 2002 Martin Pool - * Copyright (C) 2002-2022 Wayne Davison + * Copyright (C) 2002-2023 Wayne Davison * * 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 @@ -200,6 +200,7 @@ int remote_option_cnt = 0; const char **remote_options = NULL; const char *checksum_choice = NULL; const char *compress_choice = NULL; +static const char *empty_argv[1]; int quiet = 0; int output_motd = 1; @@ -1347,7 +1348,7 @@ char *alt_dest_opt(int type) **/ int parse_arguments(int *argc_p, const char ***argv_p) { - static poptContext pc; + poptContext pc; const char *arg, **argv = *argv_p; int argc = *argc_p; int opt, want_dest_type; @@ -1367,10 +1368,6 @@ int parse_arguments(int *argc_p, const char ***argv_p) /* TODO: Call poptReadDefaultConfig; handle errors. */ - /* The context leaks in case of an error, but if there's a - * problem we always exit anyhow. */ - if (pc) - poptFreeContext(pc); pc = poptGetContext(RSYNC_NAME, argc, argv, long_options, 0); if (!am_server) { poptReadDefaultConfig(pc, 0); @@ -1413,7 +1410,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) strlcpy(err_buf, "Attempt to hack rsync thwarted!\n", sizeof err_buf); - return 0; + goto cleanup; } #ifdef ICONV_OPTION iconv_opt = NULL; @@ -1459,7 +1456,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (tmpdir && strlen(tmpdir) >= MAXPATHLEN - 10) { snprintf(err_buf, sizeof err_buf, "the --temp-dir path is WAY too long.\n"); - return 0; + goto cleanup; } if (!daemon_opt) { @@ -1469,8 +1466,16 @@ int parse_arguments(int *argc_p, const char ***argv_p) exit_cleanup(RERR_SYNTAX); } - *argv_p = argv = poptGetArgs(pc); - *argc_p = argc = count_args(argv); + argv = poptGetArgs(pc); + argc = count_args(argv); + if (!argc) { + *argv_p = empty_argv; + *argc_p = 0; + } else if (poptDupArgv(argc, argv, argc_p, argv_p) != 0) + out_of_memory("parse_arguments"); + argv = *argv_p; + poptFreeContext(pc); + am_starting_up = 0; daemon_opt = 0; am_daemon = 1; @@ -1525,7 +1530,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) case 'a': if (refused_archive_part) { create_refuse_error(refused_archive_part); - return 0; + goto cleanup; } if (!recurse) /* preserve recurse == 2 */ recurse = 1; @@ -1595,7 +1600,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) case 'P': if (refused_partial || refused_progress) { create_refuse_error(refused_partial ? refused_partial : refused_progress); - return 0; + goto cleanup; } do_progress = 1; keep_partial = 1; @@ -1630,7 +1635,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (*arg != '-') { snprintf(err_buf, sizeof err_buf, "Remote option must start with a dash: %s\n", arg); - return 0; + goto cleanup; } if (remote_option_cnt+2 >= remote_option_alloc) { remote_option_alloc += 16; @@ -1672,27 +1677,27 @@ int parse_arguments(int *argc_p, const char ***argv_p) ssize_t size; arg = poptGetOptArg(pc); if ((size = parse_size_arg(arg, 'b', "block-size", 0, max_blength, False)) < 0) - return 0; + goto cleanup; block_size = (int32)size; break; } case OPT_MAX_SIZE: if ((max_size = parse_size_arg(max_size_arg, 'b', "max-size", 0, -1, False)) < 0) - return 0; + goto cleanup; max_size_arg = strdup(do_big_num(max_size, 0, NULL)); break; case OPT_MIN_SIZE: if ((min_size = parse_size_arg(min_size_arg, 'b', "min-size", 0, -1, False)) < 0) - return 0; + goto cleanup; min_size_arg = strdup(do_big_num(min_size, 0, NULL)); break; case OPT_BWLIMIT: { ssize_t size = parse_size_arg(bwlimit_arg, 'K', "bwlimit", 512, -1, True); if (size < 0) - return 0; + goto cleanup; bwlimit_arg = strdup(do_big_num(size, 0, NULL)); bwlimit = (size + 512) / 1024; break; @@ -1721,7 +1726,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) snprintf(err_buf, sizeof err_buf, "ERROR: the %s option conflicts with the %s option\n", alt_dest_opt(want_dest_type), alt_dest_opt(0)); - return 0; + goto cleanup; } alt_dest_type = want_dest_type; @@ -1729,7 +1734,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) snprintf(err_buf, sizeof err_buf, "ERROR: at most %d %s args may be specified\n", MAX_BASIS_DIRS, alt_dest_opt(0)); - return 0; + goto cleanup; } /* We defer sanitizing this arg until we know what * our destination directory is going to be. */ @@ -1742,7 +1747,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) snprintf(err_buf, sizeof err_buf, "Invalid argument passed to --chmod (%s)\n", arg); - return 0; + goto cleanup; } break; @@ -1761,11 +1766,11 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (usermap_via_chown) { snprintf(err_buf, sizeof err_buf, "--usermap conflicts with prior --chown.\n"); - return 0; + goto cleanup; } snprintf(err_buf, sizeof err_buf, "You can only specify --usermap once.\n"); - return 0; + goto cleanup; } usermap = (char *)poptGetOptArg(pc); usermap_via_chown = False; @@ -1777,11 +1782,11 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (groupmap_via_chown) { snprintf(err_buf, sizeof err_buf, "--groupmap conflicts with prior --chown.\n"); - return 0; + goto cleanup; } snprintf(err_buf, sizeof err_buf, "You can only specify --groupmap once.\n"); - return 0; + goto cleanup; } groupmap = (char *)poptGetOptArg(pc); groupmap_via_chown = False; @@ -1800,11 +1805,11 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (!usermap_via_chown) { snprintf(err_buf, sizeof err_buf, "--chown conflicts with prior --usermap.\n"); - return 0; + goto cleanup; } snprintf(err_buf, sizeof err_buf, "You can only specify a user-affecting --chown once.\n"); - return 0; + goto cleanup; } if (asprintf(&usermap, "*:%.*s", len, chown) < 0) out_of_memory("parse_arguments"); @@ -1816,11 +1821,11 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (!groupmap_via_chown) { snprintf(err_buf, sizeof err_buf, "--chown conflicts with prior --groupmap.\n"); - return 0; + goto cleanup; } snprintf(err_buf, sizeof err_buf, "You can only specify a group-affecting --chown once.\n"); - return 0; + goto cleanup; } if (asprintf(&groupmap, "*:%s", arg) < 0) out_of_memory("parse_arguments"); @@ -1848,7 +1853,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) snprintf(err_buf,sizeof(err_buf), "ACLs are not supported on this %s\n", am_server ? "server" : "client"); - return 0; + goto cleanup; #endif case 'X': @@ -1859,7 +1864,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) snprintf(err_buf,sizeof(err_buf), "extended attributes are not supported on this %s\n", am_server ? "server" : "client"); - return 0; + goto cleanup; #endif case OPT_STOP_AFTER: { @@ -1868,7 +1873,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) stop_at_utime = time(NULL); if ((val = atol(arg) * 60) <= 0 || LONG_MAX - val < stop_at_utime || (long)(time_t)val != val) { snprintf(err_buf, sizeof err_buf, "invalid --stop-after value: %s\n", arg); - return 0; + goto cleanup; } stop_at_utime += val; break; @@ -1879,11 +1884,11 @@ int parse_arguments(int *argc_p, const char ***argv_p) arg = poptGetOptArg(pc); if ((stop_at_utime = parse_time(arg)) == (time_t)-1) { snprintf(err_buf, sizeof err_buf, "invalid --stop-at format: %s\n", arg); - return 0; + goto cleanup; } if (stop_at_utime <= time(NULL)) { snprintf(err_buf, sizeof err_buf, "--stop-at time is not in the future: %s\n", arg); - return 0; + goto cleanup; } break; #endif @@ -1901,7 +1906,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) else { snprintf(err_buf, sizeof err_buf, "--stderr mode \"%s\" is not one of errors, all, or client\n", arg); - return 0; + goto cleanup; } saw_stderr_opt = 1; break; @@ -1912,13 +1917,13 @@ int parse_arguments(int *argc_p, const char ***argv_p) * turned this option off. */ if (opt >= OPT_REFUSED_BASE) { create_refuse_error(opt); - return 0; + goto cleanup; } snprintf(err_buf, sizeof err_buf, "%s%s: %s\n", am_server ? "on remote machine: " : "", poptBadOption(pc, POPT_BADOPTION_NOALIAS), poptStrerror(opt)); - return 0; + goto cleanup; } } @@ -1938,9 +1943,11 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (max_alloc_arg) { ssize_t size = parse_size_arg(max_alloc_arg, 'B', "max-alloc", 1024*1024, -1, True); if (size < 0) - return 0; + goto cleanup; max_alloc = size; } + if (!max_alloc) + max_alloc = SIZE_MAX; if (old_style_args < 0) { if (!am_server && protect_args <= 0 && (arg = getenv("RSYNC_OLD_ARGS")) != NULL && *arg) { @@ -1952,7 +1959,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (protect_args > 0) { snprintf(err_buf, sizeof err_buf, "--secluded-args conflicts with --old-args.\n"); - return 0; + goto cleanup; } protect_args = 0; } @@ -1997,7 +2004,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) do_compression = CPRES_AUTO; if (do_compression && refused_compress) { create_refuse_error(refused_compress); - return 0; + goto cleanup; } } @@ -2022,7 +2029,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) default: snprintf(err_buf, sizeof err_buf, "Invalid --outbuf setting -- specify N, L, or B.\n"); - return 0; + goto cleanup; } setvbuf(stdout, (char *)NULL, mode, 0); } @@ -2050,7 +2057,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) } if (refused_no_iconv && !iconv_opt) { create_refuse_error(refused_no_iconv); - return 0; + goto cleanup; } #endif @@ -2061,18 +2068,30 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (orig_protect_args == 2 && am_server) protect_args = orig_protect_args; - if (protect_args == 1 && am_server) + if (protect_args == 1 && am_server) { + poptFreeContext(pc); return 1; + } - *argv_p = argv = poptGetArgs(pc); - *argc_p = argc = count_args(argv); + /* Because popt 1.19 has started to free the returned args data, we now + * make a copy of the array and then do an immediate cleanup. */ + argv = poptGetArgs(pc); + argc = count_args(argv); + if (!argc) { + *argv_p = empty_argv; + *argc_p = 0; + } else if (poptDupArgv(argc, argv, argc_p, argv_p) != 0) + out_of_memory("parse_arguments"); + argv = *argv_p; + poptFreeContext(pc); + pc = NULL; #ifndef SUPPORT_LINKS if (preserve_links && !am_sender) { snprintf(err_buf, sizeof err_buf, "symlinks are not supported on this %s\n", am_server ? "server" : "client"); - return 0; + goto cleanup; } #endif @@ -2081,7 +2100,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) snprintf(err_buf, sizeof err_buf, "hard links are not supported on this %s\n", am_server ? "server" : "client"); - return 0; + goto cleanup; } #endif @@ -2089,20 +2108,20 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (am_root < 0 && preserve_xattrs > 1) { snprintf(err_buf, sizeof err_buf, "--fake-super conflicts with -XX\n"); - return 0; + goto cleanup; } #else if (am_root < 0) { snprintf(err_buf, sizeof err_buf, "--fake-super requires an rsync with extended attributes enabled\n"); - return 0; + goto cleanup; } #endif if (write_batch && read_batch) { snprintf(err_buf, sizeof err_buf, "--write-batch and --read-batch can not be used together\n"); - return 0; + goto cleanup; } if (write_batch > 0 || read_batch) { if (am_server) { @@ -2121,25 +2140,25 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (read_batch && files_from) { snprintf(err_buf, sizeof err_buf, "--read-batch cannot be used with --files-from\n"); - return 0; + goto cleanup; } if (read_batch && remove_source_files) { snprintf(err_buf, sizeof err_buf, "--read-batch cannot be used with --remove-%s-files\n", remove_source_files == 1 ? "source" : "sent"); - return 0; + goto cleanup; } if (batch_name && strlen(batch_name) > MAX_BATCH_NAME_LEN) { snprintf(err_buf, sizeof err_buf, "the batch-file name must be %d characters or less.\n", MAX_BATCH_NAME_LEN); - return 0; + goto cleanup; } if (tmpdir && strlen(tmpdir) >= MAXPATHLEN - 10) { snprintf(err_buf, sizeof err_buf, "the --temp-dir path is WAY too long.\n"); - return 0; + goto cleanup; } if (max_delete < 0 && max_delete != INT_MIN) { @@ -2173,7 +2192,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (delete_before + !!delete_during + delete_after > 1) { snprintf(err_buf, sizeof err_buf, "You may not combine multiple --delete-WHEN options.\n"); - return 0; + goto cleanup; } if (delete_before || delete_during || delete_after) delete_mode = 1; @@ -2184,7 +2203,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) delete_during = 1; else { create_refuse_error(refused_delete_before); - return 0; + goto cleanup; } } else if (refused_delete_during) delete_before = 1; @@ -2193,14 +2212,14 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (!xfer_dirs && delete_mode) { snprintf(err_buf, sizeof err_buf, "--delete does not work without --recursive (-r) or --dirs (-d).\n"); - return 0; + goto cleanup; } if (missing_args == 3) /* simplify if both options were specified */ missing_args = 2; if (refused_delete && (delete_mode || missing_args == 2)) { create_refuse_error(refused_delete); - return 0; + goto cleanup; } if (remove_source_files) { @@ -2209,7 +2228,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) * options. */ if (refused_delete && am_sender) { create_refuse_error(refused_delete); - return 0; + goto cleanup; } need_messages_from_generator = 1; } @@ -2263,7 +2282,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) snprintf(err_buf, sizeof err_buf, "--suffix cannot contain slashes: %s\n", backup_suffix); - return 0; + goto cleanup; } if (backup_dir) { size_t len; @@ -2276,7 +2295,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (len > sizeof backup_dir_buf - 128) { snprintf(err_buf, sizeof err_buf, "the --backup-dir path is WAY too long.\n"); - return 0; + goto cleanup; } backup_dir_len = (int)len; if (!backup_dir_len) { @@ -2295,7 +2314,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) "--suffix cannot be empty %s\n", backup_dir_len < 0 ? "when --backup-dir is the same as the dest dir" : "without a --backup-dir"); - return 0; + goto cleanup; } else if (make_backups && delete_mode && !delete_excluded && !am_server) { snprintf(backup_dir_buf, sizeof backup_dir_buf, "P *%s", backup_suffix); @@ -2323,7 +2342,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (do_progress && !am_server) { if (!log_before_transfer && INFO_EQ(NAME, 0)) parse_output_words(info_words, info_levels, "name", DEFAULT_PRIORITY); - parse_output_words(info_words, info_levels, "flist2,progress", DEFAULT_PRIORITY); + parse_output_words(info_words, info_levels, "FLIST2,PROGRESS", DEFAULT_PRIORITY); } if (dry_run) @@ -2364,11 +2383,11 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (whole_file > 0) { snprintf(err_buf, sizeof err_buf, "--append cannot be used with --whole-file\n"); - return 0; + goto cleanup; } if (refused_inplace) { create_refuse_error(refused_inplace); - return 0; + goto cleanup; } inplace = 1; } @@ -2376,7 +2395,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (write_devices) { if (refused_inplace) { create_refuse_error(refused_inplace); - return 0; + goto cleanup; } inplace = 1; } @@ -2391,13 +2410,13 @@ int parse_arguments(int *argc_p, const char ***argv_p) "--%s cannot be used with --%s\n", append_mode ? "append" : "inplace", delay_updates ? "delay-updates" : "partial-dir"); - return 0; + goto cleanup; } /* --inplace implies --partial for refusal purposes, but we * clear the keep_partial flag for internal logic purposes. */ if (refused_partial) { create_refuse_error(refused_partial); - return 0; + goto cleanup; } keep_partial = 0; #else @@ -2405,7 +2424,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) "--%s is not supported on this %s\n", append_mode ? "append" : "inplace", am_server ? "server" : "client"); - return 0; + goto cleanup; #endif } else { if (keep_partial && !partial_dir && !am_server) { @@ -2419,7 +2438,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) partial_dir = NULL; if (!partial_dir && refused_partial) { create_refuse_error(refused_partial); - return 0; + goto cleanup; } keep_partial = 1; } @@ -2440,14 +2459,14 @@ int parse_arguments(int *argc_p, const char ***argv_p) if (am_server) { snprintf(err_buf, sizeof err_buf, "The --files-from sent to the server cannot specify a host.\n"); - return 0; + goto cleanup; } files_from = p; filesfrom_host = h; if (strcmp(files_from, "-") == 0) { snprintf(err_buf, sizeof err_buf, "Invalid --files-from remote filename\n"); - return 0; + goto cleanup; } } else { if (sanitize_paths) @@ -2466,7 +2485,7 @@ int parse_arguments(int *argc_p, const char ***argv_p) snprintf(err_buf, sizeof err_buf, "failed to open files-from file %s: %s\n", files_from, strerror(errno)); - return 0; + goto cleanup; } } } @@ -2483,6 +2502,9 @@ int parse_arguments(int *argc_p, const char ***argv_p) options_rejected: snprintf(err_buf, sizeof err_buf, "Your options have been rejected by the server.\n"); + cleanup: + if (pc) + poptFreeContext(pc); return 0; } @@ -2498,7 +2520,7 @@ static char SPLIT_ARG_WHEN_OLD[1]; **/ char *safe_arg(const char *opt, const char *arg) { -#define SHELL_CHARS "!#$&;|<>(){}\"' \t\\" +#define SHELL_CHARS "!#$&;|<>(){}\"'` \t\\" #define WILD_CHARS "*?[]" /* We don't allow remote brace expansion */ BOOL is_filename_arg = !opt; char *escapes = is_filename_arg ? SHELL_CHARS : WILD_CHARS SHELL_CHARS; @@ -2510,7 +2532,7 @@ char *safe_arg(const char *opt, const char *arg) char *ret; if (!protect_args && old_style_args < 2 && (!old_style_args || (!is_filename_arg && opt != SPLIT_ARG_WHEN_OLD))) { const char *f; - if (!trust_sender_args && *arg == '~' + if (*arg == '~' && is_filename_arg && !am_sender && !trust_sender_args && ((relative_paths && !strstr(arg, "/./")) || !strchr(arg, '/'))) { extras++; diff --git a/packaging/lsb/rsync.spec b/packaging/lsb/rsync.spec index f2d7aa44..10385a39 100644 --- a/packaging/lsb/rsync.spec +++ b/packaging/lsb/rsync.spec @@ -1,6 +1,6 @@ Summary: A fast, versatile, remote (and local) file-copying tool Name: rsync -Version: 3.2.7 +Version: 3.3.0 %define fullversion %{version} Release: 1 %define srcdir src @@ -79,8 +79,8 @@ rm -rf $RPM_BUILD_ROOT %dir /etc/rsync-ssl/certs %changelog -* Thu Oct 20 2022 Wayne Davison -Released 3.2.7. +* Sat Apr 06 2024 Wayne Davison +Released 3.3.0. * Fri Mar 21 2008 Wayne Davison Added installation of /etc/xinetd.d/rsync file and some commented-out diff --git a/receiver.c b/receiver.c index c9d7e01d..6b4b369e 100644 --- a/receiver.c +++ b/receiver.c @@ -3,7 +3,7 @@ * * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras - * Copyright (C) 2003-2022 Wayne Davison + * Copyright (C) 2003-2023 Wayne Davison * * 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 @@ -372,7 +372,7 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, if (fd != -1 && offset > 0) { if (sparse_files > 0) { - if (sparse_end(fd, offset) != 0) + if (sparse_end(fd, offset, updating_basis_or_equiv) != 0) goto report_write_error; } else if (flush_write_file(fd) < 0) { report_write_error: diff --git a/rsync.1.md b/rsync.1.md index ee0a4f39..2ae6f481 100644 --- a/rsync.1.md +++ b/rsync.1.md @@ -245,7 +245,7 @@ to be copied to different destination directories using more than one copy. While a copy of a case-ignoring filesystem to a case-ignoring filesystem can work out fairly well, if no `--delete-during` or `--delete-before` option is -active, rsync can potentially update an existing file on the receiveing side +active, rsync can potentially update an existing file on the receiving side without noticing that the upper-/lower-case of the filename should be changed to match the sender. @@ -1636,7 +1636,9 @@ expand it. 0. `--crtimes`, `-N,` This tells rsync to set the create times (newness) of the destination - files to the same value as the source files. + files to the same value as the source files. Your OS & filesystem must + support the setting of arbitrary creation (birth) times for this option + to be supported. 0. `--omit-dir-times`, `-O` @@ -2104,7 +2106,8 @@ expand it. See the [`--max-size`](#opt) option for a description of how SIZE can be specified. The default suffix if none is given is bytes. - Beginning in 3.2.3, a value of 0 specifies no limit. + Beginning in 3.2.7, a value of 0 is an easy way to specify SIZE_MAX (the + largest limit possible). You can set a default value using the environment variable [`RSYNC_MAX_ALLOC`](#) using the same SIZE values as supported by this diff --git a/rsyncd.conf.5.md b/rsyncd.conf.5.md index 91aaf6f9..cd10e659 100644 --- a/rsyncd.conf.5.md +++ b/rsyncd.conf.5.md @@ -74,25 +74,7 @@ reread the `rsyncd.conf` file. The file is re-read on each client connection. ## GLOBAL PARAMETERS The first parameters in the file (before a [module] header) are the global -parameters. Rsync also allows for the use of a "[global]" module name to -indicate the start of one or more global-parameter sections (the name must be -lower case). - -You may also include any module parameters in the global part of the config -file in which case the supplied value will override the default for that -parameter. - -You may use references to environment variables in the values of parameters. -String parameters will have %VAR% references expanded as late as possible (when -the string is first used in the program), allowing for the use of variables -that rsync sets at connection time, such as RSYNC_USER_NAME. Non-string -parameters (such as true/false settings) are expanded when read from the config -file. If a variable does not exist in the environment, or if a sequence of -characters is not a valid reference (such as an un-paired percent sign), the -raw characters are passed through unchanged. This helps with backward -compatibility and safety (e.g. expanding a non-existent %VAR% to an empty -string in a path could result in a very unsafe path). The safest way to insert -a literal % into a value is to use %%. +parameters: [comment]: # (An OL starting at 0 is converted into a DL by the parser.) @@ -138,6 +120,22 @@ a literal % into a value is to use %%. You can override the default backlog value when the daemon listens for connections. It defaults to 5. +You may also include any [MODULE PARAMETERS](#) in the global part of the +config file, in which case the supplied value will override the default for +that parameter. + +You may use references to environment variables in the values of parameters. +String parameters will have %VAR% references expanded as late as possible (when +the string is first used in the program), allowing for the use of variables +that rsync sets at connection time, such as RSYNC_USER_NAME. Non-string +parameters (such as true/false settings) are expanded when read from the config +file. If a variable does not exist in the environment, or if a sequence of +characters is not a valid reference (such as an un-paired percent sign), the +raw characters are passed through unchanged. This helps with backward +compatibility and safety (e.g. expanding a non-existent %VAR% to an empty +string in a path could result in a very unsafe path). The safest way to insert +a literal % into a value is to use %%. + ## MODULE PARAMETERS After the global parameters you should define a number of modules, each module @@ -146,11 +144,17 @@ a module name in square brackets [module] followed by the parameters for that module. The module name cannot contain a slash or a closing square bracket. If the name contains whitespace, each internal sequence of whitespace will be changed into a single space, while leading or trailing whitespace will be -discarded. Also, the name cannot be "global" as that exact name indicates that -global parameters follow (see above). +discarded. -As with GLOBAL PARAMETERS, you may use references to environment variables in -the values of parameters. See the GLOBAL PARAMETERS section for more details. +There is also a special module name of "[global]" that does not define a module +but instead switches back to the global settings context where default +parameters can be specified. Because each defined module gets its full set of +parameters as a combination of the default values that are set at that position +in the config file plus its own parameter list, the use of a "[global]" section +can help to maintain shared config values for multiple modules. + +As with [GLOBAL PARAMETERS](#), you may use references to environment variables +in the values of parameters. See that section for details. 0. `comment` @@ -1019,7 +1023,7 @@ the values of parameters. See the GLOBAL PARAMETERS section for more details. _not_ displayed if the script returns success. The other programs cannot send any text to the user. All output except for the `pre-xfer exec` stdout goes to the corresponding daemon's stdout/stderr, which is typically - discarded. See the `--no-detatch` option for a way to see the daemon's + discarded. See the `--no-detach` option for a way to see the daemon's output, which can assist with debugging. Note that the `early exec` command runs before any part of the transfer diff --git a/support/cvs2includes b/support/cvs2includes index fc7f78fb..4a0d1d82 100755 --- a/support/cvs2includes +++ b/support/cvs2includes @@ -1,42 +1,63 @@ -#!/usr/bin/env perl -# +#!/usr/bin/env python3 # This script finds all CVS/Entries files in the current directory and below # and creates a local .cvsinclude file with non-inherited rules including each # checked-in file. Then, use this option whenever using --cvs-exclude (-C): # -# -f ': .cvsinclude' +# -f ': .cvsinclude' # # That ensures that all checked-in files/dirs are included in the transfer. # (You could alternately put ": .cvsinclude" into an .rsync-filter file and # use the -F option, which is easier to type.) # # The downside is that you need to remember to re-run cvs2includes whenever -# you add a new file to the project. -use strict; - -open(FIND, 'find . -name CVS -type d |') or die $!; -while () { - chomp; - s#^\./##; - - my $entries = "$_/Entries"; - s/CVS$/.cvsinclude/; - my $filter = $_; - - open(ENTRIES, $entries) or die "Unable to open $entries: $!\n"; - my @includes; - while () { - push(@includes, $1) if m#/(.+?)/#; - } - close ENTRIES; - if (@includes) { - open(FILTER, ">$filter") or die "Unable to write $filter: $!\n"; - print FILTER map "+ /$_\n", @includes; - close FILTER; - print "Updated $filter\n"; - } elsif (-f $filter) { - unlink($filter); - print "Removed $filter\n"; - } -} -close FIND; +# CVS gets an added or removed file. Maybe just run it before every copy. + +import os, argparse + +INC_NAME = '.cvsinclude' + +def main(): + if args.dir: + os.chdir(args.dir) + + cvs_includes = set() + for root, dirs, files in os.walk('.'): + if INC_NAME in files: + cvs_includes.add((root + '/' + INC_NAME)[2:]) + if root.endswith('/CVS') and 'Entries' in files: + entries = root[2:] + '/Entries' + includes = [ ] + with open(entries) as fh: + for line in fh: + if line.startswith(('/', 'D/')): + includes.append(line.split('/', 2)[1]) + if includes: + inc = root[2:-3] + INC_NAME + cvs_includes.discard(inc) + try: + with open(inc) as fh: + old_txt = fh.read() + except OSError: + old_txt = '' + txt = ''.join(f"+ /{x}\n" for x in includes) + if txt == old_txt: + print("Unchanged", inc) + else: + print("Updating", inc) + with open(inc, 'w') as fh: + fh.write(txt) + dirs.sort() + + for inc in sorted(cvs_includes): + print("Removing", inc) + os.unlink(inc) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=f"Transform CVS/Entries into {INC_NAME} files.", add_help=False) + parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.") + parser.add_argument("dir", nargs='?', help="The top CVS dir. Defaults to the current directory.") + args = parser.parse_args() + main() + +# vim: sw=4 et diff --git a/support/files-to-excludes b/support/files-to-excludes index a28955cb..a47d7f8a 100755 --- a/support/files-to-excludes +++ b/support/files-to-excludes @@ -1,27 +1,37 @@ -#!/usr/bin/env perl -# This script takes an input of filenames and outputs a set of -# include/exclude directives that can be used by rsync to copy -# just the indicated files using an --exclude-from=FILE option. -use strict; +#!/usr/bin/env python3 +# This script takes an input of filenames and outputs a set of include/exclude +# directives that can be used by rsync to copy just the indicated files using +# an --exclude-from=FILE or -f'. FILE' option. To be able to delete files on +# the receiving side, either use --delete-excluded or change the exclude (-) +# rules to hide filter rules (H) that only affect the sending side. -my %hash; +import os, fileinput, argparse -while (<>) { - chomp; - s#^/+##; - my $path = '/'; - while (m#([^/]+/)/*#g) { - $path .= $1; - print "+ $path\n" unless $hash{$path}++; - } - if (m#([^/]+)$#) { - print "+ $path$1\n"; - } else { - delete $hash{$path}; - } -} +def main(): + paths = set() + for line in fileinput.input(args.files): + dirs = line.strip().lstrip('/').split('/') + if not dirs: + continue + for j in range(1, len(dirs)): + if dirs[j] == '': + continue + path = '/' + '/'.join(dirs[:j]) + '/' + if path not in paths: + print('+', path) + paths.add(path) + print('+', '/' + '/'.join(dirs)) -foreach (sort keys %hash) { - print "- $_*\n"; -} -print "- /*\n"; + for path in sorted(paths): + print('-', path + '*') + print('-', '/*') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Transform a list of files into a set of include/exclude rules.", add_help=False) + parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.") + parser.add_argument("files", metavar="FILE", default='-', nargs='*', help="The file(s) that hold the pathnames to translate. Defaults to stdin.") + args = parser.parse_args() + main() + +# vim: sw=4 et diff --git a/support/idmap b/support/idmap new file mode 100755 index 00000000..b212aaf6 --- /dev/null +++ b/support/idmap @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +# This helper script makes it easy to use a passwd or group file to map values +# in a LOCAL transfer. For instance, if you mount a backup that does not have +# the same passwd setup as the local machine, you can do a copy to/from the +# backup area as follows and get the differing ID values mapped just like a +# remote transfer to/from the backed-up machine would do: +# +# rsync -av --usermap=`idmap --to /mnt/backup/etc/passwd` \ +# --groupmap=`idmap --to /mnt/backup/etc/group` \ +# /some/src/ /mnt/backup/some/dest/ +# +# rsync -av --usermap=`idmap --from /mnt/backup/etc/passwd` \ +# --groupmap=`idmap --from /mnt/backup/etc/group` \ +# /mnt/backup/some/src/ /some/dest/ + +import re, fileinput, argparse + +NAME_ID_RE = re.compile(r'^(\w+):[^:]+:(\d+)') + +def main(): + maps = [ ] + for line in fileinput.input(args.files): + m = NAME_ID_RE.match(line) + if not m: + continue + if args.to: + pair = (m[1], m[2]) + else: + pair = (m[2], m[1]) + maps.append(':'.join(pair)) + print(','.join(maps)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Output usermap or groupmap args for rsync.", add_help=False) + action = parser.add_argument_group() + action = parser.add_mutually_exclusive_group(required=True) + action.add_argument("--from", action="store_true", help="Output the map for use on the sending side.") + action.add_argument("--to", action="store_true", help="Output the map for use on the receiving side.") + parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.") + parser.add_argument("files", metavar="FILE", default='-', nargs='*', help="The file(s) that hold the name & id pairs. Defaults to stdin.") + args = parser.parse_args() + main() + +# vim: sw=4 et diff --git a/support/json-rsync-version b/support/json-rsync-version index 31fed7f1..b01e1e49 100755 --- a/support/json-rsync-version +++ b/support/json-rsync-version @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 import sys, argparse, subprocess, json diff --git a/support/mapfrom b/support/mapfrom deleted file mode 100755 index 88946bc0..00000000 --- a/support/mapfrom +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env perl -# This helper script makes it easy to use a passwd or group file to map -# values in a LOCAL transfer. For instance, if you mount a backup that -# does not have the same passwd setup as the local machine, you can do -# a copy FROM the backup area as follows and get the differing ID values -# mapped just like a remote transfer FROM the backed-up machine would do: -# -# rsync -av --usermap=`mapfrom /mnt/backup/etc/passwd` \ -# --groupmap=`mapfrom /mnt/backup/etc/group` \ -# /mnt/backup/some/src/ /some/dest/ - -while (<>) { - push @_, "$2:$1" if /^(\w+):[^:]+:(\d+)/; -} -print join(',', @_), "\n"; diff --git a/support/mapto b/support/mapto deleted file mode 100755 index 95887523..00000000 --- a/support/mapto +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env perl -# This helper script makes it easy to use a passwd or group file to map -# values in a LOCAL transfer. For instance, if you mount a backup that -# does not have the same passwd setup as the local machine, you can do -# a copy TO the backup area as follows and get the differing ID values -# mapped just like a remote transfer TO the backed-up machine would do: -# -# rsync -av --usermap=`mapto /mnt/backup/etc/passwd` \ -# --groupmap=`mapto /mnt/backup/etc/group` \ -# /some/src/ /mnt/backup/some/dest/ - -while (<>) { - push @_, "$1:$2" if /^(\w+):[^:]+:(\d+)/; -} -print join(',', @_), "\n"; diff --git a/support/mnt-excl b/support/mnt-excl index ed7b49ba..bc8b5bcd 100755 --- a/support/mnt-excl +++ b/support/mnt-excl @@ -1,4 +1,4 @@ -#!/usr/bin/env perl +#!/usr/bin/env python3 # This script takes a command-line arg of a source directory # that will be passed to rsync, and generates a set of excludes # that will exclude all mount points from the list. This is @@ -27,23 +27,33 @@ # awk '{print $2}' /proc/mounts | grep -v '^/$' | \ # rsync -avf 'merge,/- -' /dir host:/dest/ -use strict; -use warnings; -use Cwd 'abs_path'; +import os, argparse -my $file = '/proc/mounts'; -my $dir = shift || '/'; -my $trailing_slash = $dir =~ m{./$} ? '/' : ''; -$dir = abs_path($dir) . $trailing_slash; -$dir =~ s{([^/]*)$}{}; -my $trailing = $1; -$trailing = '' if $trailing eq '.' || !-d "$dir$trailing"; -$trailing .= '/' if $trailing ne ''; +MNT_FILE = '/proc/mounts'; -open(IN, $file) or die "Unable to open $file: $!\n"; -while () { - $_ = (split)[1]; - next unless s{^\Q$dir$trailing\E}{}o && $_ ne ''; - print "- /$trailing$_\n"; -} -close IN; +def main(): + trailing_slash = '/' if args.path.endswith(('/', '/.')) and args.path != '/' else '' + args.path = os.path.realpath(args.path) + trailing_slash + parent_dir = os.path.dirname(args.path) + trailing = os.path.basename(args.path) + if not os.path.isdir(args.path): + trailing = '' + elif trailing != '': + trailing += '/' + want_path = os.path.join(parent_dir, trailing) + wp_len = len(want_path) + + with open(MNT_FILE) as fh: + for line in fh: + mnt_path = line.split()[1] + if mnt_path.startswith(want_path) and mnt_path != want_path: + print(f"- /{trailing}{mnt_path[wp_len:]}") + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Output mount points as rsync excludes.", add_help=False) + parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.") + parser.add_argument('path', metavar='PATH', nargs='?', default='/', help="Limit output to those within the PATH hierarchy.") + args = parser.parse_args() + main() + +# vim: sw=4 et diff --git a/support/rrsync b/support/rrsync index 94c85f59..4b4b87c5 100755 --- a/support/rrsync +++ b/support/rrsync @@ -258,6 +258,9 @@ def main(): if args.munge: rsync_opts.append('--munge-links') + + if args.no_overwrite: + rsync_opts.append('--ignore-existing') if not rsync_args: rsync_args = [ '.' ] @@ -364,6 +367,7 @@ if __name__ == '__main__': arg_parser.add_argument('-munge', action='store_true', help="Enable rsync's --munge-links on the server side.") arg_parser.add_argument('-no-del', action='store_true', help="Disable rsync's --delete* and --remove* options.") arg_parser.add_argument('-no-lock', action='store_true', help="Avoid the single-run (per-user) lock check.") + arg_parser.add_argument('-no-overwrite', action='store_true', help="Prevent overwriting existing files by enforcing --ignore-existing") arg_parser.add_argument('-help', '-h', action='help', help="Output this help message and exit.") arg_parser.add_argument('dir', metavar='DIR', help="The restricted directory to use.") args = arg_parser.parse_args() diff --git a/support/rrsync.1.md b/support/rrsync.1.md index 98f2cab0..24892900 100644 --- a/support/rrsync.1.md +++ b/support/rrsync.1.md @@ -5,7 +5,7 @@ rrsync - a script to setup restricted rsync users via ssh logins ## SYNOPSIS ``` -rrsync [-ro|-rw] [-munge] [-no-del] [-no-lock] DIR +rrsync [-ro|-rw] [-munge] [-no-del] [-no-lock] [-no-overwrite] DIR ``` The single non-option argument specifies the restricted _DIR_ to use. It can be @@ -85,6 +85,11 @@ The remainder of this manpage is dedicated to using the rrsync script. Avoid the single-run (per-user) lock check. Useful with [`-munge`](#opt). +0. `-no-overwrite` + + Enforce `--ignore-existing` on the server. Prevents overwriting existing + files when the server is the receiver. + 0. `-help`, `-h` Output this help message and exit. diff --git a/usage.c b/usage.c index a5b59ad8..f346385f 100644 --- a/usage.c +++ b/usage.c @@ -293,6 +293,7 @@ void print_rsync_version(enum logcode f) json_line("license", "GPLv3"); json_line("caveat", "rsync comes with ABSOLUTELY NO WARRANTY"); printf("\n}\n"); + fflush(stdout); return; } diff --git a/util2.c b/util2.c index a8609a5d..b59bff0a 100644 --- a/util2.c +++ b/util2.c @@ -4,7 +4,7 @@ * Copyright (C) 1996-2000 Andrew Tridgell * Copyright (C) 1996 Paul Mackerras * Copyright (C) 2001, 2002 Martin Pool - * Copyright (C) 2003-2020 Wayne Davison + * Copyright (C) 2003-2024 Wayne Davison * * 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 @@ -72,7 +72,7 @@ int msleep(int t) void *my_alloc(void *ptr, size_t num, size_t size, const char *file, int line) { - if (max_alloc && num >= max_alloc/size) { + if (num >= max_alloc/size) { if (!file) return NULL; rprintf(FERROR, "[%s] exceeded --max-alloc=%s setting (file=%s, line=%d)\n", diff --git a/version.h b/version.h index fdfce4c4..b162146e 100644 --- a/version.h +++ b/version.h @@ -1,2 +1,2 @@ -#define RSYNC_VERSION "3.2.7" +#define RSYNC_VERSION "3.3.0" #define MAINTAINER_TZ_OFFSET -7.0 diff -upN a/aclocal.m4 b/aclocal.m4 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -12,6 +12,6 @@ # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) -m4_include([../m4/have_type.m4]) -m4_include([../m4/header_major_fixed.m4]) -m4_include([../m4/socklen_t.m4]) +m4_include([m4/have_type.m4]) +m4_include([m4/header_major_fixed.m4]) +m4_include([m4/socklen_t.m4]) diff -upN a/configure.sh b/configure.sh --- a/configure.sh +++ b/configure.sh @@ -7771,9 +7771,9 @@ if test x"$enable_openssl" != x"no"; the if test x"$ac_cv_header_openssl_md4_h" = x"yes" && test x"$ac_cv_header_openssl_md5_h" = x"yes"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing MD5_Init" >&5 -printf %s "checking for library containing MD5_Init... " >&6; } -if test ${ac_cv_search_MD5_Init+y} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing EVP_MD_CTX_copy" >&5 +printf %s "checking for library containing EVP_MD_CTX_copy... " >&6; } +if test ${ac_cv_search_EVP_MD_CTX_copy+y} then : printf %s "(cached) " >&6 else $as_nop @@ -7784,11 +7784,11 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char MD5_Init (); +char EVP_MD_CTX_copy (); int main (void) { -return MD5_Init (); +return EVP_MD_CTX_copy (); ; return 0; } @@ -7803,27 +7803,27 @@ do fi if ac_fn_c_try_link "$LINENO" then : - ac_cv_search_MD5_Init=$ac_res + ac_cv_search_EVP_MD_CTX_copy=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if test ${ac_cv_search_MD5_Init+y} + if test ${ac_cv_search_EVP_MD_CTX_copy+y} then : break fi done -if test ${ac_cv_search_MD5_Init+y} +if test ${ac_cv_search_EVP_MD_CTX_copy+y} then : else $as_nop - ac_cv_search_MD5_Init=no + ac_cv_search_EVP_MD_CTX_copy=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_MD5_Init" >&5 -printf "%s\n" "$ac_cv_search_MD5_Init" >&6; } -ac_res=$ac_cv_search_MD5_Init +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_EVP_MD_CTX_copy" >&5 +printf "%s\n" "$ac_cv_search_EVP_MD_CTX_copy" >&6; } +ac_res=$ac_cv_search_EVP_MD_CTX_copy if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" @@ -7831,7 +7831,7 @@ then : enable_openssl=yes else $as_nop - err_msg="$err_msg$nl- Failed to find MD5_Init function in openssl crypto lib."; + err_msg="$err_msg$nl- Failed to find EVP_MD_CTX_copy function in openssl crypto lib."; no_lib="$no_lib openssl" fi diff -upN a/rrsync.1 b/rrsync.1 --- a/rrsync.1 +++ b/rrsync.1 @@ -1,4 +1,4 @@ -.TH "rrsync" "1" "20 Oct 2022" "rrsync from rsync 3.2.7" "User Commands" +.TH "rrsync" "1" "6 Apr 2024" "rrsync from rsync 3.3.0" "User Commands" .\" prefix=/usr .P .SH "NAME" @@ -8,14 +8,16 @@ rrsync \- a script to setup restricted r .SH "SYNOPSIS" .P .nf -rrsync [-ro|-rw] [-munge] [-no-del] [-no-lock] DIR +rrsync [-ro|-rw] [-munge] [-no-del] [-no-lock] [-no-overwrite] DIR .fi .P The single non-option argument specifies the restricted \fIDIR\fP to use. It can be relative to the user's home directory or an absolute path. .P The online version of this manpage (that includes cross-linking of topics) -is available at https://download.samba.org/pub/rsync/rrsync.1. +is available at +.UR https://download.samba.org/pub/rsync/rrsync.1 +.UE . .P .SH "DESCRIPTION" .P @@ -84,6 +86,9 @@ Enable rsync's \fB\-\-munge-links\fP on Disable rsync's \fB\-\-delete*\fP and \fB\-\-remove*\fP options. .IP "\fB\-no-lock\fP" Avoid the single-run (per-user) lock check. Useful with \fB\-munge\fP. +.IP "\fB\-no-overwrite\fP" +Enforce \fB\-\-ignore-existing\fP on the server. Prevents overwriting existing +files when the server is the receiver. .IP "\fB\-help\fP, \fB\-h\fP" Output this help message and exit. .P @@ -150,15 +155,20 @@ command="rrsync -ro results" ssh-rsa AAA .P .SH "VERSION" .P -This manpage is current for version 3.2.7 of rsync. +This manpage is current for version 3.3.0 of rsync. .P .SH "CREDITS" .P rsync is distributed under the GNU General Public License. See the file COPYING for details. .P -An rsync web site is available at https://rsync.samba.org/ and its github -project is https://github.com/WayneD/rsync. +An rsync web site is available at +.UR https://rsync.samba.org/ +.UE +and its github +project is +.UR https://github.com/WayneD/rsync +.UE . .P .SH "AUTHOR" .P diff -upN a/rrsync.1.html b/rrsync.1.html --- a/rrsync.1.html +++ b/rrsync.1.html @@ -34,7 +34,7 @@ dd p:first-of-type {

NAME

rrsync -⁠ a script to setup restricted rsync users via ssh logins

SYNOPSIS

-
rrsync [-ro|-rw] [-munge] [-no-del] [-no-lock] DIR
+
rrsync [-ro|-rw] [-munge] [-no-del] [-no-lock] [-no-overwrite]  DIR
 

The single non-option argument specifies the restricted DIR to use. It can be relative to the user's home directory or an absolute path.

@@ -104,6 +104,11 @@ file, each one with its own path setting

Avoid the single-run (per-user) lock check. Useful with -munge.

+
-no-overwrite
+

Enforce --ignore-existing on the server. Prevents overwriting existing +files when the server is the receiver.

+
+
-help, -h

Output this help message and exit.

@@ -151,7 +156,7 @@ command="rrsync -ro results" s

SEE ALSO

rsync(1), rsyncd.conf(5)

VERSION

-

This manpage is current for version 3.2.7 of rsync.

+

This manpage is current for version 3.3.0 of rsync.

CREDITS

rsync is distributed under the GNU General Public License. See the file COPYING for details.

@@ -160,5 +165,5 @@ project is AUTHOR

The original rrsync perl script was written by Joe Smith. Many people have later contributed to it. The python version was created by Wayne Davison.

-

20 Oct 2022

+

6 Apr 2024

diff -upN a/rsync-ssl.1 b/rsync-ssl.1 --- a/rsync-ssl.1 +++ b/rsync-ssl.1 @@ -1,4 +1,4 @@ -.TH "rsync-ssl" "1" "20 Oct 2022" "rsync-ssl from rsync 3.2.7" "User Commands" +.TH "rsync-ssl" "1" "6 Apr 2024" "rsync-ssl from rsync 3.3.0" "User Commands" .\" prefix=/usr .P .SH "NAME" @@ -12,7 +12,9 @@ rsync-ssl [--type=SSL_TYPE] RSYNC_ARGS .fi .P The online version of this manpage (that includes cross-linking of topics) -is available at https://download.samba.org/pub/rsync/rsync-ssl.1. +is available at +.UR https://download.samba.org/pub/rsync/rsync-ssl.1 +.UE . .P .SH "DESCRIPTION" .P @@ -122,18 +124,23 @@ exported RSYNC_SSL_TYPE environment vari .P .SH "BUGS" .P -Please report bugs! See the web site at https://rsync.samba.org/. +Please report bugs! See the web site at +.UR https://rsync.samba.org/ +.UE . .P .SH "VERSION" .P -This manpage is current for version 3.2.7 of rsync. +This manpage is current for version 3.3.0 of rsync. .P .SH "CREDITS" .P Rsync is distributed under the GNU General Public License. See the file COPYING for details. .P -A web site is available at https://rsync.samba.org/. The site includes an +A web site is available at +.UR https://rsync.samba.org/ +.UE . +The site includes an FAQ-O-Matic which may cover questions unanswered by this manual page. .P .SH "AUTHOR" @@ -141,4 +148,5 @@ FAQ-O-Matic which may cover questions un This manpage was written by Wayne Davison. .P Mailing lists for support and development are available at -https://lists.samba.org/. +.UR https://lists.samba.org/ +.UE . diff -upN a/rsync-ssl.1.html b/rsync-ssl.1.html --- a/rsync-ssl.1.html +++ b/rsync-ssl.1.html @@ -140,7 +140,7 @@ exported RSYNC_SSL_TYPE environment vari

BUGS

Please report bugs! See the web site at https://rsync.samba.org/.

VERSION

-

This manpage is current for version 3.2.7 of rsync.

+

This manpage is current for version 3.3.0 of rsync.

CREDITS

Rsync is distributed under the GNU General Public License. See the file COPYING for details.

@@ -150,5 +150,5 @@ FAQ-O-Matic which may cover questions un

This manpage was written by Wayne Davison.

Mailing lists for support and development are available at https://lists.samba.org/.

-

20 Oct 2022

+

6 Apr 2024

diff -upN a/rsync.1 b/rsync.1 --- a/rsync.1 +++ b/rsync.1 @@ -1,4 +1,4 @@ -.TH "rsync" "1" "20 Oct 2022" "rsync 3.2.7" "User Commands" +.TH "rsync" "1" "6 Apr 2024" "rsync 3.3.0" "User Commands" .\" prefix=/usr .P .SH "NAME" @@ -30,7 +30,9 @@ Usages with just one SRC arg and no DEST of copying. .P The online version of this manpage (that includes cross-linking of topics) -is available at https://download.samba.org/pub/rsync/rsync.1. +is available at +.UR https://download.samba.org/pub/rsync/rsync.1 +.UE . .P .SH "DESCRIPTION" .P @@ -306,7 +308,7 @@ to be copied to different destination di .P While a copy of a case-ignoring filesystem to a case-ignoring filesystem can work out fairly well, if no \fB\-\-delete-during\fP or \fB\-\-delete-before\fP option is -active, rsync can potentially update an existing file on the receiveing side +active, rsync can potentially update an existing file on the receiving side without noticing that the upper-/lower-case of the filename should be changed to match the sender. .P @@ -1728,7 +1730,9 @@ mounted to avoid updating the atime on r O_NOATIME flag being set. .IP "\fB\-\-crtimes\fP, \fB\-N,\fP" This tells rsync to set the create times (newness) of the destination -files to the same value as the source files. +files to the same value as the source files. Your OS & filesystem must +support the setting of arbitrary creation (birth) times for this option +to be supported. .IP "\fB\-\-omit-dir-times\fP, \fB\-O\fP" This tells rsync to omit directories when it is preserving modification, access, and create times. If NFS is sharing the directories on the receiving @@ -2153,7 +2157,8 @@ memory. It is a sanity-check value for See the \fB\-\-max-size\fP option for a description of how SIZE can be specified. The default suffix if none is given is bytes. .IP -Beginning in 3.2.3, a value of 0 specifies no limit. +Beginning in 3.2.7, a value of 0 is an easy way to specify SIZE_MAX (the +largest limit possible). .IP You can set a default value using the environment variable \fBRSYNC_MAX_ALLOC\fP using the same SIZE values as supported by this @@ -5000,11 +5005,13 @@ File permissions, devices, etc. are tran .IP o See also the comments on the \fB\-\-delete\fP option. .P -Please report bugs! See the web site at https://rsync.samba.org/. +Please report bugs! See the web site at +.UR https://rsync.samba.org/ +.UE . .P .SH "VERSION" .P -This manpage is current for version 3.2.7 of rsync. +This manpage is current for version 3.3.0 of rsync. .P .SH "INTERNAL OPTIONS" .P @@ -5020,14 +5027,22 @@ that can be used with a restricted ssh l Rsync is distributed under the GNU General Public License. See the file COPYING for details. .P -An rsync web site is available at https://rsync.samba.org/. The site +An rsync web site is available at +.UR https://rsync.samba.org/ +.UE . +The site includes an FAQ-O-Matic which may cover questions unanswered by this manual page. .P -The rsync github project is https://github.com/WayneD/rsync. +The rsync github project is +.UR https://github.com/WayneD/rsync +.UE . .P We would be delighted to hear from you if you like this program. Please -contact the mailing-list at rsync@lists.samba.org. +contact the mailing-list at +.UR mailto:rsync@lists.samba.org +rsync@lists.samba.org +.UE . .P This program uses the excellent zlib compression library written by Jean-loup Gailly and Mark Adler. @@ -5048,4 +5063,5 @@ people have later contributed to it. It Davison. .P Mailing lists for support and development are available at -https://lists.samba.org/. +.UR https://lists.samba.org/ +.UE . diff -upN a/rsync.1.html b/rsync.1.html --- a/rsync.1.html +++ b/rsync.1.html @@ -256,7 +256,7 @@ the --f to be copied to different destination directories using more than one copy.

While a copy of a case-ignoring filesystem to a case-ignoring filesystem can work out fairly well, if no --delete-during or --delete-before option is -active, rsync can potentially update an existing file on the receiveing side +active, rsync can potentially update an existing file on the receiving side without noticing that the upper-/lower-case of the filename should be changed to match the sender.

ADVANCED USAGE

@@ -1555,7 +1555,9 @@ O_NOATIME flag being set.

--crtimes, -N,

This tells rsync to set the create times (newness) of the destination -files to the same value as the source files.

+files to the same value as the source files. Your OS & filesystem must +support the setting of arbitrary creation (birth) times for this option +to be supported.

--omit-dir-times, -O
@@ -1977,7 +1979,8 @@ consume more memory.

memory. It is a sanity-check value for each individual allocation.

See the --max-size option for a description of how SIZE can be specified. The default suffix if none is given is bytes.

-

Beginning in 3.2.3, a value of 0 specifies no limit.

+

Beginning in 3.2.7, a value of 0 is an easy way to specify SIZE_MAX (the +largest limit possible).

You can set a default value using the environment variable RSYNC_MAX_ALLOC using the same SIZE values as supported by this option. If the remote rsync doesn't understand the --max-alloc option, @@ -4476,7 +4479,7 @@ the comments on the https://rsync.samba.org/.

VERSION

-

This manpage is current for version 3.2.7 of rsync.

+

This manpage is current for version 3.3.0 of rsync.

INTERNAL OPTIONS

The options --server and --sender are used internally by rsync, and should never be typed by a user under normal circumstances. Some awareness of these @@ -4507,5 +4510,5 @@ people have later contributed to it. It Davison.

Mailing lists for support and development are available at https://lists.samba.org/.

-

20 Oct 2022

+

6 Apr 2024

diff -upN a/rsyncd.conf.5 b/rsyncd.conf.5 --- a/rsyncd.conf.5 +++ b/rsyncd.conf.5 @@ -1,4 +1,4 @@ -.TH "rsyncd.conf" "5" "20 Oct 2022" "rsyncd.conf from rsync 3.2.7" "User Commands" +.TH "rsyncd.conf" "5" "6 Apr 2024" "rsyncd.conf from rsync 3.3.0" "User Commands" .\" prefix=/usr .P .SH "NAME" @@ -10,7 +10,9 @@ rsyncd.conf \- configuration file for rs rsyncd.conf .P The online version of this manpage (that includes cross-linking of topics) -is available at https://download.samba.org/pub/rsync/rsyncd.conf.5. +is available at +.UR https://download.samba.org/pub/rsync/rsyncd.conf.5 +.UE . .P .SH "DESCRIPTION" .P @@ -85,25 +87,7 @@ reread the \fBrsyncd.conf\fP file. The f .SH "GLOBAL PARAMETERS" .P The first parameters in the file (before a [module] header) are the global -parameters. Rsync also allows for the use of a "[global]" module name to -indicate the start of one or more global-parameter sections (the name must be -lower case). -.P -You may also include any module parameters in the global part of the config -file in which case the supplied value will override the default for that -parameter. -.P -You may use references to environment variables in the values of parameters. -String parameters will have %VAR% references expanded as late as possible (when -the string is first used in the program), allowing for the use of variables -that rsync sets at connection time, such as RSYNC_USER_NAME. Non-string -parameters (such as true/false settings) are expanded when read from the config -file. If a variable does not exist in the environment, or if a sequence of -characters is not a valid reference (such as an un-paired percent sign), the -raw characters are passed through unchanged. This helps with backward -compatibility and safety (e.g. expanding a non-existent %VAR% to an empty -string in a path could result in a very unsafe path). The safest way to insert -a literal % into a value is to use %%. +parameters: .P .IP "\fBmotd\ file\fP" This parameter allows you to specify a "message of the day" (MOTD) to display @@ -136,6 +120,22 @@ can also be specified via the \fB\-\-soc You can override the default backlog value when the daemon listens for connections. It defaults to 5. .P +You may also include any MODULE PARAMETERS in the global part of the +config file, in which case the supplied value will override the default for +that parameter. +.P +You may use references to environment variables in the values of parameters. +String parameters will have %VAR% references expanded as late as possible (when +the string is first used in the program), allowing for the use of variables +that rsync sets at connection time, such as RSYNC_USER_NAME. Non-string +parameters (such as true/false settings) are expanded when read from the config +file. If a variable does not exist in the environment, or if a sequence of +characters is not a valid reference (such as an un-paired percent sign), the +raw characters are passed through unchanged. This helps with backward +compatibility and safety (e.g. expanding a non-existent %VAR% to an empty +string in a path could result in a very unsafe path). The safest way to insert +a literal % into a value is to use %%. +.P .SH "MODULE PARAMETERS" .P After the global parameters you should define a number of modules, each module @@ -144,11 +144,17 @@ a module name in square brackets [module module. The module name cannot contain a slash or a closing square bracket. If the name contains whitespace, each internal sequence of whitespace will be changed into a single space, while leading or trailing whitespace will be -discarded. Also, the name cannot be "global" as that exact name indicates that -global parameters follow (see above). +discarded. +.P +There is also a special module name of "[global]" that does not define a module +but instead switches back to the global settings context where default +parameters can be specified. Because each defined module gets its full set of +parameters as a combination of the default values that are set at that position +in the config file plus its own parameter list, the use of a "[global]" section +can help to maintain shared config values for multiple modules. .P -As with GLOBAL PARAMETERS, you may use references to environment variables in -the values of parameters. See the GLOBAL PARAMETERS section for more details. +As with GLOBAL PARAMETERS, you may use references to environment variables +in the values of parameters. See that section for details. .P .IP "\fBcomment\fP" This parameter specifies a description string that is displayed next to the @@ -1021,7 +1027,7 @@ before it begins. Any output from the \ \fInot\fP displayed if the script returns success. The other programs cannot send any text to the user. All output except for the \fBpre-xfer\ exec\fP stdout goes to the corresponding daemon's stdout/stderr, which is typically -discarded. See the \fB\-\-no-detatch\fP option for a way to see the daemon's +discarded. See the \fB\-\-no-detach\fP option for a way to see the daemon's output, which can assist with debugging. .IP Note that the \fBearly\ exec\fP command runs before any part of the transfer @@ -1284,19 +1290,25 @@ susan:herpass .SH "BUGS" .P Please report bugs! The rsync bug tracking system is online at -https://rsync.samba.org/. +.UR https://rsync.samba.org/ +.UE . .P .SH "VERSION" .P -This manpage is current for version 3.2.7 of rsync. +This manpage is current for version 3.3.0 of rsync. .P .SH "CREDITS" .P Rsync is distributed under the GNU General Public License. See the file COPYING for details. .P -An rsync web site is available at https://rsync.samba.org/ and its github -project is https://github.com/WayneD/rsync. +An rsync web site is available at +.UR https://rsync.samba.org/ +.UE +and its github +project is +.UR https://github.com/WayneD/rsync +.UE . .P .SH "THANKS" .P @@ -1310,4 +1322,5 @@ people have later contributed to it. It Davison. .P Mailing lists for support and development are available at -https://lists.samba.org/. +.UR https://lists.samba.org/ +.UE . diff -upN a/rsyncd.conf.5.html b/rsyncd.conf.5.html --- a/rsyncd.conf.5.html +++ b/rsyncd.conf.5.html @@ -87,23 +87,7 @@ reread its config file.

reread the rsyncd.conf file. The file is re-read on each client connection.

GLOBAL PARAMETERS

The first parameters in the file (before a [module] header) are the global -parameters. Rsync also allows for the use of a "[global]" module name to -indicate the start of one or more global-parameter sections (the name must be -lower case).

-

You may also include any module parameters in the global part of the config -file in which case the supplied value will override the default for that -parameter.

-

You may use references to environment variables in the values of parameters. -String parameters will have %VAR% references expanded as late as possible (when -the string is first used in the program), allowing for the use of variables -that rsync sets at connection time, such as RSYNC_USER_NAME. Non-string -parameters (such as true/false settings) are expanded when read from the config -file. If a variable does not exist in the environment, or if a sequence of -characters is not a valid reference (such as an un-paired percent sign), the -raw characters are passed through unchanged. This helps with backward -compatibility and safety (e.g. expanding a non-existent %VAR% to an empty -string in a path could result in a very unsafe path). The safest way to insert -a literal % into a value is to use %%.

+parameters:

motd file
@@ -147,6 +131,20 @@ can also be specified via the --so connections. It defaults to 5.

+

You may also include any MODULE PARAMETERS in the global part of the +config file, in which case the supplied value will override the default for +that parameter.

+

You may use references to environment variables in the values of parameters. +String parameters will have %VAR% references expanded as late as possible (when +the string is first used in the program), allowing for the use of variables +that rsync sets at connection time, such as RSYNC_USER_NAME. Non-string +parameters (such as true/false settings) are expanded when read from the config +file. If a variable does not exist in the environment, or if a sequence of +characters is not a valid reference (such as an un-paired percent sign), the +raw characters are passed through unchanged. This helps with backward +compatibility and safety (e.g. expanding a non-existent %VAR% to an empty +string in a path could result in a very unsafe path). The safest way to insert +a literal % into a value is to use %%.

MODULE PARAMETERS

After the global parameters you should define a number of modules, each module exports a directory tree as a symbolic name. Modules are exported by specifying @@ -154,10 +152,15 @@ a module name in square brackets [module module. The module name cannot contain a slash or a closing square bracket. If the name contains whitespace, each internal sequence of whitespace will be changed into a single space, while leading or trailing whitespace will be -discarded. Also, the name cannot be "global" as that exact name indicates that -global parameters follow (see above).

-

As with GLOBAL PARAMETERS, you may use references to environment variables in -the values of parameters. See the GLOBAL PARAMETERS section for more details.

+discarded.

+

There is also a special module name of "[global]" that does not define a module +but instead switches back to the global settings context where default +parameters can be specified. Because each defined module gets its full set of +parameters as a combination of the default values that are set at that position +in the config file plus its own parameter list, the use of a "[global]" section +can help to maintain shared config values for multiple modules.

+

As with GLOBAL PARAMETERS, you may use references to environment variables +in the values of parameters. See that section for details.

comment
@@ -981,7 +984,7 @@ before it begins. Any output from the < not displayed if the script returns success. The other programs cannot send any text to the user. All output except for the pre-xfer exec stdout goes to the corresponding daemon's stdout/stderr, which is typically -discarded. See the --no-detatch option for a way to see the daemon's +discarded. See the --no-detach option for a way to see the daemon's output, which can assist with debugging.

Note that the early exec command runs before any part of the transfer request is known except for the module name. This helper script can be @@ -1186,7 +1189,7 @@ susan:herpass

Please report bugs! The rsync bug tracking system is online at https://rsync.samba.org/.

VERSION

-

This manpage is current for version 3.2.7 of rsync.

+

This manpage is current for version 3.3.0 of rsync.

CREDITS

Rsync is distributed under the GNU General Public License. See the file COPYING for details.

@@ -1201,5 +1204,5 @@ people have later contributed to it. It Davison.

Mailing lists for support and development are available at https://lists.samba.org/.

-

20 Oct 2022

+

6 Apr 2024