COMMENT(Should custom macros go here or somewhere else?) DEFINEMACRO(rsubsect)(1)(nsubsect( ARG1)) COMMENT(Variation of verb that macro-expands the text; used for bf() in option listing) DEFINEMACRO(expandverb)(1)(\ XXroffcmd(.nf)()()()\ INTERNALINDEX(verb on)\ ARG1\ +XXroffcmd(.fi)()()()\ INTERNALINDEX(verb off)\ ) mailto(rsync@lists.samba.org) manpage(rsync)(1)(4 Aug 2007)()() COMMENT(New users might not know what rcp is. At least I didn't when I started with rsync.) manpagename(rsync)(a fast, versatile, remote (and local) file-copying tool) manpagesynopsis() verb(Local: rsync [OPTION...] SRC... [DEST] Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST) Usages with just one SRC arg and no DEST arg will list the source files instead of copying. manpagedescription()COMMENT(Or advertisement?) Rsync is a fast and extraordinarily versatile file copying tool. It can copy locally, to/from another host over any remote shell, or to/from a remote rsync daemon. It offers a large number of options that control every aspect of its behavior and permit very flexible specification of the set of files to be copied. It is famous for its delta-transfer algorithm, which reduces the amount of data sent over the network by sending only the differences between the source files and the existing files in the destination. Rsync is widely used for backups and mirroring and as an improved copy command for everyday use. COMMENT( The goals of the man page organization are: 1. Help new users get started quickly. (Examples) 2. Give users a well-organized option listing so they can quickly identify the options they need and then go to learn more about them. 3. Have the full story available in a clear, concise form for when users want it. ) manpagesection(EXAMPLES) TODO: Adapt the examples from "USAGE" of the original man page and add some of my own. COMMENT(manpageoptions()) manpagesection(CONTENTS/QUICK REFERENCE) This man page is organized into a number of sections, each documenting one aspect of rsync and the options that control it. The listing below doubles as a table of contents for the man page and a quick reference sheet for rsync's options and default behaviors. You may find it helpful to read the overview in the "How rsync works" section first, as it defines some terminology and will help you understand how each option or behavior fits into the big picture of rsync's operation. Rsync uses the GNU long options package. Many of the command line options have options have two variants, one long and one short (or shorter). Shorter variants are shown in parentheses. Some options only have a long variant. A parameter to a long option can be attached to the option with an '=' as shown or given in a separate argument, like em(--files-from FILE), but a parameter to a single-letter option must be given in a separate argument. expandverb(bf(How rsync works) bf(General options) --help (when alone, -h) show usage and options --version show version and general information --no-OPTION turn off an implied OPTION (e.g., --no-D) bf(Remote access methods, protocol, and connection) bf(Remote shell) --rsh=COMMAND (-e) specify the remote shell to use --rsync-path=COMMAND specify the rsync to run on remote machine --protect-args (-s) no space-splitting; wildcard chars only --blocking-io use blocking I/O for the remote shell bf(Accessing an rsync daemon) --password-file=FILE read daemon-access password from FILE --address=ADDRESS bind address for outgoing socket to daemon --port=PORT specify double-colon alternate port number --sockopts=OPTIONS specify custom TCP options --ipv4 (-4) prefer IPv4 --ipv6 (-6) prefer IPv6 bf(Single-use daemon via remote shell) bf(Pulling multiple sources from a remote host) bf(Connection options) --protocol=NUM force an older protocol version to be used --bwlimit=KBPS limit connection bandwidth (KBytes/second) --timeout=SECONDS set connection timeout bf(Running an rsync daemon) --daemon run as an rsync daemon --config=FILE specify alternate rsyncd.conf file --no-detach do not detach from the parent --port=PORT listen on alternate port number --log-file=FILE override the "log file" setting --log-file-format=FMT override the "log format" setting --address, --bwlimit, --sockopts -v, -4, -6, -h/--help as usual bf(Internal options) (--server, --sender) bf(Mode of operation) --dry-run (-n) skip actually modifying destination --list-only list source files instead of copying them --super receiver attempts super-user activities --fake-super store/recover privileged attrs using xattrs bf(Source file selection) bf(Directories) default: skip --dirs (-d) transfer directories without recursing --recursive (-r) recurse into directories --inc-recursive (--i-r) allow incremental recursion mode (default) --one-file-system (-x) don't cross filesystem boundaries bf(Other options) --relative (-R) recreate source arg paths in destination --no-implied-dirs don't send source arg parent dirs --prune-empty-dirs (-m) prune empty directory chains from file-list --files-from=FILE read list of source-file names from FILE --from0 (-0) all *from/filter files are delimited by \0 --iconv=CONVERT_SPEC request charset conversion of filenames bf(Attributes) default: don't change any dest attributes explicitly bf(Modification times) --times (-t) preserve modification times --omit-dir-times (-O) don't preserve directory modification times bf(Permissions) default: new files get (source & (def-ACL?:~umask)) --executability (-E) adjust dest perms so executability matches --perms (-p) preserve permissions --chmod=CHMOD affect file and/or directory permissions bf(Others) --owner (-o) preserve file owner (super-user only) --group (-g) preserve file group --numeric-ids don't map uid/gid values by user/group name --archive (-a) archive mode; equals -rlptgoD (no -H,-A,-X) --hard-links (-H) preserve hard links as such --acls (-A) preserve POSIX ACLs (implies -p) --xattrs (-X) preserve extended attributes bf(Non-regular files) default: skip all bf(Symbolic links) --links (-l) copy symlinks as symlinks --safe-links skip symlinks that point outside the tree --copy-links (-L) transform symlink into referent file/dir --copy-dirlinks (-k) transform symlink to dir into referent dir --copy-unsafe-links transform symlinks that point outside tree --keep-dirlinks (-K) treat symlinked dir on receiver as dir bf(Others) --devices preserve device files (super-user only) --specials preserve special files -D same as --devices --specials bf(Quick check) default: assume data is same if size & mtime equal --modify-window=SECONDS treat slightly different mtimes as equal --size-only assume data is same if size equal --checksum (-c) assume data is same if size & checksum eq. --ignore-times (-I) never assume data is same bf(File transfer mechanics) bf(Delta-transfer algorithm) --whole-file (-W) copy files whole (without delta-transfer) --block-size=SIZE (-B) force a fixed size for checksummed blocks --checksum-seed=NUM set block/file checksum seed (advanced) bf(Compression) --compress (-z) compress transferred file data --skip-compress=LIST skip compressing files with suffix in LIST --compress-level=NUM explicitly set compression level bf(Destination file handling) --inplace update destination files in-place --append append data onto shorter files --sparse (-S) handle sparse files efficiently --temp-dir=DIR (-T) create temporary files in directory DIR --partial move partially transferred files into place --partial-dir=DIR keep partially transferred files in DIR --delay-updates move all updated files into place at end bf(Basis files) if no dest file, receiver uses as basis: --copy-dest=DIR - corresponding file under DIR --compare-dest=DIR ...and skips files matched under DIR --link-dest=DIR ...and hard-links matched files from DIR --fuzzy (-y) - similarly named dest file in same dir bf(Deletion) --delete delete extraneous files from dest dirs --delete-during (--del) receiver deletes during transfer (default) --delete-before receiver deletes before xfer, not during --delete-after receiver deletes after xfer, not during --delete-delay find deletions during, perform them after --force OK to empty out dir to overwrite w/ non-dir --max-delete=NUM skip deletions after the NUMth --ignore-errors don't skip deletion because of I/O error --remove-source-files sender removes synchronized files (non-dir) bf(Name-based filter rules)+COMMENT(Organization may need improvement) bf(Options) --filter=RULE add a name-based file exclusion RULE -F same as --filter='dir-merge /.rsync-filter' -F -F ... and --filter='- .rsync-filter' --exclude=PATTERN exclude files whose paths match PATTERN --exclude-from=FILE read exclude patterns from FILE --include=PATTERN don't exclude files matching PATTERN --include-from=FILE read don't-exclude patterns from FILE --cvs-exclude (-C) add rules to exclude the files CVS would --delete-excluded excludes don't stop deletion of dest files bf(Types of filter rules) bf(Include/exclude pattern matching) bf(Merge files) bf(List-clearing rule) bf(Anchoring include/exclude patterns) bf(Per-directory merge files and deletion) bf(Other filtering) --update skip regular files that are newer in dest --ignore-non-existing (--existing) skip creating new files in destination --ignore-existing leave existing dest files alone (not dirs) --min-size=SIZE don't transfer reg. files smaller than SIZE --max-size=SIZE don't transfer reg. files bigger than SIZE bf(Backups) --backup (-b) back up overwritten/deleted dest files --suffix=SUFFIX backup suffix (default ~ w/o --backup-dir) --backup-dir=DIR make backups into hierarchy based in DIR bf(Output) --verbose (-v) increase verbosity --quiet (-q) suppress non-error messages --no-motd don't show daemon's MOTD (see caveat) --out-format=FORMAT output updates using the specified FORMAT --itemize-changes (-i) show what files and which attrs changed --log-file=FILE log what we're doing to the specified FILE --log-file-format=FMT log updates using the specified FMT --progress show progress during each file transfer -P same as --partial --progress --stats print some statistics at the end of the run --8-bit-output (-8) leave high-bit chars unescaped in output --human-readable (-h) output numbers in a human-readable format bf(Batch mode) --write-batch=FILE write batch FILE with src->dest differences --only-write-batch=FILE do so without modifying the destination --read-batch=FILE apply batch FILE to the destination) manpagesection(HOW RSYNC WORKS) The rsync process you run at the command line is the bf(client), and the first thing it does is connect to an rsync bf(server) process on the other host involved in the copy. The server may be an rsync daemon or may be invoked via remote shell or simply forked by the client. Depending on which one of the source or destination is remote (they cannot both be remote), one process becomes the bf(sender) and the other forks into the bf(receiver) and the bf(generator) (collectively known as the bf(receiving side)). The sender is responsible for finding and reading source files and sending their data over the connection; the receiving side is responsible for writing the data to the destination according to your options. The sender begins by scanning all the source arguments you specified (according to any filter rules you may have supplied) and building the bf(file list). Each file rsync is to process has an entry in the file list giving its attributes and the path at which it is to be placed inside the destination (the bf(file-list path)). The sender sends the file list to the receiving side, and all three processes refer to it throughout their operation. Next, the generator acts on each entry in the file list. It creates non-regular files immediately using just the information in the file list. For each regular file, it compares the source attributes from the file list to the attributes of the existing destination file (if any) and uses a bf("quick check") rule to decide whether to assume that the existing destination file already has the same data as the source file. If the check passes, the generator applies any bf(preserved) source attributes to the destination file (bf(tweaks) it) and moves on. Otherwise, the generator tells the sender that the file needs to be transferred, splits the existing destination file (the bf(basis file)) into blocks, and gives the sender the checksum of each block. The sender reads the source file, identifies any regions that match the block checksums, and gives the receiver a combination of bf(literal data) from the source file and instructions to reuse certain blocks of the basis file (bf(matched data)); this is the heart of the bf(delta-transfer algorithm). The receiver reconstructs the source data in a temporary file, applies preserved attributes, and finally moves the temporary file into place. This entire process is a bf(file transfer), and there are several options that change how it is carried out. When the generator visits a source file whose corresponding destination file does not yet exist, it can optionally look in bf(alternate basis directories) for a basis file to use. And when it visits a destination directory, it can optionally delete bf(extraneous) files from it that have no counterparts in the source. Rsync can also back up old destination files before overwriting or deleting them, and it offers a number of possibilities for logging what it does. manpagesection(GENERAL OPTIONS) description( dit(bf(--help)) Print a help page describing the usages and options available in rsync and exit. For backward-compatibility with older versions of rsync, the help will also be output if you use the bf(-h) option without any other args. dit(bf(--version)) Print the rsync version number, protocol number, capabilities, and some other general information and exit. dit(bf(--no-)em(OPTION)) You may turn off one or more implied options by prefixing the option name with "no-". Not all options may be prefixed with a "no-": only options that are implied by other options (e.g., bf(--no-D), bf(--no-perms)) or have different defaults in various circumstances (e.g., bf(--no-whole-file), bf(--no-blocking-io), bf(--no-dirs)). You may specify either the short or the long option name after the "no-" prefix (e.g., bf(--no-R) is the same as bf(--no-relative)). For example: if you want to use bf(-a) (bf(--archive)) but don't want bf(-o) (bf(--owner)), instead of converting bf(-a) into bf(-rlptgD), you could specify bf(-a --no-o) (or bf(-a --no-owner)). The order of the options is important: if you specify bf(--no-r -a), the bf(-r) option would end up being turned on, the opposite of bf(-a --no-r). Note also that the side-effects of the bf(--files-from) option are NOT positional, as it affects the default state of several options and slightly changes the meaning of bf(-a) (see the bf(--files-from) option for more details). ) manpagesection(REMOTE ACCESS METHODS, PROTOCOL, AND CONNECTION) Rsync offers two different ways to contact a remote system for the purpose of pushing to or pulling from a directory on it: itemization( it() If the source or destination begins with a hostname and a single colon (:), rsync uses a remote shell to invoke an rsync server process on that host. it() If the source or destination begins with a hostname and a double colon (::) or is an em(rsync://) URL, rsync connects to an rsync daemon running on the host. ) The hybrid case of a single-use daemon invoked via remote shell is discussed in its own section below. As expected, if no source or destination argument specifies a remote host, the copy occurs locally. One of the most common mistakes users make is to confuse the single and double colon syntaxes. Make sure you use the correct number of colons. rsubsect(Remote shell) To pull or push over a remote shell, give a source or destination (respectively) of the form em([user@]host:path). Rsync uses the default remote shell to log into the given host with the given username (if any) and run an rsync server process. The default remote shell is ssh, but your copy of rsync may have been configured to use a different remote shell by default, such as rsh or remsh. You can specify any remote shell you like by passing the bf(-e)/bf(--rsh) option or setting the RSYNC_RSH environment variable. Note that rsync must be installed on the remote machine and must be in the $PATH unless you specify an bf(--rsync-path). description( dit(bf(-e) em(COMMAND), bf(--rsh=)em(COMMAND)) This option allows you to choose an alternative remote shell program to use for communication between the local and remote copies of rsync. Typically, rsync is configured to use ssh by default, but you may prefer to use rsh on a local network. If this option is used with em([user@]host::module/path), then the remote shell em(COMMAND) will be used to run an rsync daemon on the remote host, and all data will be transmitted through that remote shell connection, rather than through a direct socket connection to a running rsync daemon on the remote host. See the section "Single-use daemon via remote shell" below. Rsync performs a rudimentary word-splitting algorithm on the em(COMMAND) string to allow you to specify initial arguments for the remote shell program. Spaces (not tabs or other whitespace) delimit arguments. Single-quoted and double-quoted strings are recognized to allow you to specify an argument containing a space. Within a single-quoted string, two consecutive single quotes denote a single quote; likewise for double quotes. Be sure to pay attention to which quotes your shell is parsing and which quotes rsync is parsing. Some examples: quote( tt( -e 'ssh -p 2234')nl() tt( -e 'ssh -o "ProxyCommand nohup ssh firewall nc -w1 %h %p"')nl() ) (If you use ssh, you may find it easier to set options in your .ssh/config file than to pass them via bf(--rsh).) You can also choose the remote shell program using the RSYNC_RSH environment variable, which accepts the same range of values as bf(-e). See also the bf(--blocking-io) option which is affected by this option. dit(bf(--rsync-path=)em(PROGRAM)) Use this to specify what program is to be run on the remote machine to start-up rsync. Often used when rsync is not in the default remote-shell's path (e.g., --rsync-path=/usr/local/bin/rsync). Note that PROGRAM is run with the help of a shell, so it can be any program, script, or command sequence you'd care to run, so long as it does not corrupt the standard-in & standard-out that rsync is using to communicate. One tricky example is to reduce the amount of bf(--relative) path information coming from a remote sender. For instance: quote(tt( rsync -avR --rsync-path="cd /a/b && rsync" host:c/d /e/)) If the sender is at least version 2.6.7, the em(./) syntax introduced in that version is preferable to this hack. dit(bf(--protect-args)) TODO! dit(bf(--blocking-io)) This tells rsync to use blocking I/O when launching a remote shell transport. If the remote shell is either rsh or remsh, rsync defaults to using blocking I/O, otherwise it defaults to using non-blocking I/O. (Note that ssh prefers non-blocking I/O.) ) rsubsect(Accessing an rsync daemon) TODO expandverb( --password-file=FILE read daemon-access password from FILE --address=ADDRESS bind address for outgoing socket to daemon --port=PORT specify double-colon alternate port number --sockopts=OPTIONS specify custom TCP options --ipv4 (-4) prefer IPv4 --ipv6 (-6) prefer IPv6 ) rsubsect(Single-use daemon via remote shell) TODO rsubsect(Pulling multiple sources from a remote host) TODO rsubsect(Connection options) Here are some options that affect the rsync connection, no matter how it is established. dit(bf(--protocol=)em(NUM)) Force an older protocol version to be used. This is useful for creating a batch file that is compatible with an older version of rsync. For instance, if rsync 2.6.4 is being used with the bf(--write-batch) option, but rsync 2.6.3 is what will be used to run the bf(--read-batch) option, you should use "--protocol=28" when creating the batch file to force the older protocol version to be used in the batch file (assuming you can't upgrade the rsync on the reading system). dit(bf(--bwlimit=)em(KBPS)) This option allows you to specify a maximum transfer rate in kilobytes per second. This option is most effective when using rsync with large files (several megabytes and up). Due to the nature of rsync transfers, blocks of data are sent, then if rsync determines the transfer was too fast, it will wait before sending the next data block. The result is an average transfer rate equaling the specified limit. A value of zero specifies no limit. dit(bf(--timeout=)em(TIMEOUT)) This option allows you to set a maximum I/O timeout in seconds. If no data is transferred for the specified time then rsync will exit. The default is 0, which means no timeout. rsubsect(Running an rsync daemon) TODO expandverb( --daemon run as an rsync daemon --config=FILE specify alternate rsyncd.conf file --no-detach do not detach from the parent --port=PORT listen on alternate port number --log-file=FILE override the "log file" setting --log-file-format=FMT override the "log format" setting --address, --bwlimit, --sockopts -v, -4, -6, -h/--help as usual ) rsubsect(Internal options) Rsync uses the options bf(--server) and bf(--sender) internally when invoking itself over a remote shell. They should never be typed by an end user under normal circumstances. Some awareness of these options may be needed in certain scenarios, such as when setting up a login that can only run an rsync command. For instance, the support directory of the rsync distribution has an example script named rrsync (for restricted rsync) that can be used with a restricted ssh login. bf(== Empty sections below ==) manpagesection(MODE OF OPERATION) manpagesection(Source file selection) rsubsect(Directories) rsubsect(Other options) manpagesection(ATTRIBUTES) rsubsect(Modification times) rsubsect(Permissions) rsubsect(Others) manpagesection(NON-REGULAR FILES) rsubsect(Symbolic links) rsubsect(Others) manpagesection(QUICK CHECK) manpagesection(FILE TRANSFER MECHANICS) rsubsect(Delta-transfer algorithm) rsubsect(Compression) rsubsect(Destination file handling) manpagesection(BASIS FILES) manpagesection(DELETION) manpagesection(NAME-BASED FILTER RULES) rsubsect(Options) rsubsect(Types of filter rules) rsubsect(Include/exclude pattern matching) rsubsect(Merge files) rsubsect(List-clearing rule) rsubsect(Anchoring include/exclude patterns) rsubsect(Per-directory merge files and deletion) manpagesection(OTHER FILTERING) manpagesection(BACKUPS) manpagesection(OUTPUT) manpagesection(BATCH MODE) manpagediagnostics() Rsync occasionally produces error messages that may seem a little cryptic. The one that seems to cause the most confusion is "protocol version mismatch -- is your shell clean?". This message is usually caused by your startup scripts or remote shell facility producing unwanted garbage on the stream that rsync is using for its transport. The way to diagnose this problem is to run your remote shell like this: quote(tt(ssh remotehost /bin/true > out.dat)) Then look at out.dat. If everything is working correctly then out.dat should be a zero length file. If you are getting the above error from rsync then you will probably find that out.dat contains some text or data. Look at the contents and try to work out what is producing it. The most common cause is incorrectly configured shell startup scripts (such as .cshrc or .profile) that contain output statements for non-interactive logins. If you are having trouble debugging filter patterns, then try specifying the bf(-vv) option. At this level of verbosity rsync will show why each individual file is included or excluded. manpagesection(EXIT VALUES) description( dit(bf(0)) Success dit(bf(1)) Syntax or usage error dit(bf(2)) Protocol incompatibility dit(bf(3)) Errors selecting input/output files, dirs dit(bf(4)) Requested action not supported: an attempt was made to manipulate 64-bit files on a platform that cannot support them; or an option was specified that is supported by the client and not by the server. dit(bf(5)) Error starting client-server protocol dit(bf(6)) Daemon unable to append to log-file dit(bf(10)) Error in socket I/O dit(bf(11)) Error in file I/O dit(bf(12)) Error in rsync protocol data stream dit(bf(13)) Errors with program diagnostics dit(bf(14)) Error in IPC code dit(bf(20)) Received SIGUSR1 or SIGINT dit(bf(21)) Some error returned by code(waitpid()) dit(bf(22)) Error allocating core memory buffers dit(bf(23)) Partial transfer due to error dit(bf(24)) Partial transfer due to vanished source files dit(bf(25)) The --max-delete limit stopped deletions dit(bf(30)) Timeout in data send/receive ) manpagesection(ENVIRONMENT VARIABLES) description( dit(bf(CVSIGNORE)) The CVSIGNORE environment variable supplements any ignore patterns in .cvsignore files. See the bf(--cvs-exclude) option for more details. dit(bf(RSYNC_ICONV)) Specify a default bf(--iconv) setting using this environment variable. dit(bf(RSYNC_RSH)) The RSYNC_RSH environment variable allows you to override the default shell used as the transport for rsync. Command line options are permitted after the command name, just as in the bf(-e) option. dit(bf(RSYNC_PROXY)) The RSYNC_PROXY environment variable allows you to redirect your rsync client to use a web proxy when connecting to a rsync daemon. You should set RSYNC_PROXY to a hostname:port pair. dit(bf(RSYNC_PASSWORD)) Setting RSYNC_PASSWORD to the required password allows you to run authenticated rsync connections to an rsync daemon without user intervention. Note that this does not supply a password to a shell transport such as ssh. dit(bf(USER) or bf(LOGNAME)) The USER or LOGNAME environment variables are used to determine the default username sent to an rsync daemon. If neither is set, the username defaults to "nobody". dit(bf(HOME)) The HOME environment variable is used to find the user's default .cvsignore file. ) manpagefiles() /etc/rsyncd.conf or rsyncd.conf manpageseealso() bf(rsyncd.conf)(5) manpagebugs() times are transferred as *nix time_t values When transferring to FAT filesystems rsync may re-sync unmodified files. See the comments on the bf(--modify-window) option. file permissions, devices, etc. are transferred as native numerical values see also the comments on the bf(--delete) option Please report bugs! See url(http://rsync.samba.org/bugzilla.html)(http://rsync.samba.org/bugzilla.html) for instructions. manpagesection(GENERALITIES) This man page is current for version 2.6.9 of rsync. The rsync Web site is url(http://rsync.samba.org/)(http://rsync.samba.org/) . It includes a FAQ which may cover questions unanswered by this manual page. The primary download site for rsync is url(http://rsync.samba.org/ftp/rsync/)(http://rsync.samba.org/ftp/rsync/) . Mailing lists for support and development are available at url(http://lists.samba.org/)(http://lists.samba.org/) . Rsync is distributed under the GNU General Public License, version 3 or later. See the file COPYING in the source distribution or url(http://www.gnu.org/copyleft/gpl.html)(http://www.gnu.org/copyleft/gpl.html) for details. We would be delighted to hear from you if you like this program. manpageauthor() Rsync was originally written by Andrew Tridgell and Paul Mackerras. Many people have later contributed to it. Thanks to Richard Brent, Brendan Mackay, Bill Waite, Stephen Rothwell and David Bell for helpful suggestions, patches and testing of rsync. I've probably missed some people, my apologies if I have. Especial thanks also to: David Dykstra, Jos Backus, Sebastian Krahmer, Martin Pool, Wayne Davison, J.W. Schultz. Rsync uses the excellent zlib compression library written by Jean-loup Gailly and Mark Adler.