summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* date: diagnose -f read errorsPaul Eggert2023-03-281-1/+3
| | | | * src/date.c (batch_convert): Diagnose read errors, fixing Bug#62497.
* cp: clarify commentaryPaul Eggert2023-03-251-11/+11
| | | | * src/copy.c: Make comments a bit clearer.
* copy: fix --reflink=auto to fallback in more casesPádraig Brady2023-03-241-27/+35
| | | | | | | | | | | | | | | | | On restricted systems like android or some containers, FICLONE could return EPERM, EACCES, or ENOTTY, which would have induced the command to fail to copy rather than falling back to a more standard copy. * src/copy.c (is_terminal_failure): A new function refactored from handle_clone_fail(). (is_CLONENOTSUP): Merge in the handling of EACCES, ENOTTY, EPERM as they also pertain to determination of whether cloning is supported if we ever use this function in that context. (handle_clone_fail): Use is_terminal_failure() in all cases, so that we assume a terminal failure in less errno cases. * NEWS: Mention the bug fix. Addresses https://bugs.gnu.org/62404
* cksum: fix reporting of failed checksPádraig Brady2023-03-231-2/+2
| | | | | | | | | | | | This applies to all checksumming utilities, where we incorrectly report all subsequent files as checking 'OK' once any file has passed a digest check. The exit status was not impacted, only the printed status. * src/digest.c (digest_check): Use the correct state variable to determine if the _current_ file has passed or not. * tests/misc/md5sum.pl: Add a test case. Fixes https://bugs.gnu.org/62403
* stty: ensure arbitrary data is not displayedPádraig Brady2023-03-191-2/+6
| | | | | | | | | | * src/stty.c (main): Use static structures to ensure they're initialized (to zero), so that random data is not displayed, or compared resulting in a inaccurate failure reported to users. This was seen on musl libc where some parts of the termios c_cc array were not initialized by tcgetattr(). Reported by Bruno Haible.
* doc: uniq: revert previous man page adjustmentPádraig Brady2023-03-181-3/+4
| | | | | * src/uniq.c (usage): -D doesn't take an argument so should be separated in the description.
* doc: uniq: use more standard description of -D long optionPádraig Brady2023-03-181-4/+3
| | | | | | * src/uniq.c: Describe -D and --all-repeated together, as with all other long options. Fixes https://bugs.gnu.org/62249
* maint: avoid discarded-qualifiers warnings with SELinux 3.5Bernhard Voelker2023-03-171-2/+2
| | | | | | | | | | | | | | | | | | | | Since SELinux version 3.5, the return value of context_str(3) is declared as const; see: https://github.com/SELinuxProject/selinux/commit/dd98fa322766 Therefore, GCC complains (here with -Werror): src/selinux.c: In function 'defaultcon': src/selinux.c:152:16: error: assignment discards 'const' qualifier \ from pointer target type [-Werror=discarded-qualifiers] 152 | if (!(constr = context_str (tcontext))) | ^ src/selinux.c: In function 'restorecon_private': src/selinux.c:252:16: error: assignment discards 'const' qualifier \ from pointer target type [-Werror=discarded-qualifiers] 252 | if (!(constr = context_str (tcontext))) | ^ * src/selinux.c (defaultcon): Define CONSTR as const. (restorecon_private): Likewise.
* cksum: fix --raw on 64 bit big endian systemsPádraig Brady2023-03-151-2/+4
| | | | | | | | | | * src/sum.c (output_bsd): On sparc64 for example, a crc of 0 was output due to casting an int variable to uint16_t and thus operating on the wrong end of the variable. Instead use explicit assignment to the narrower type to ensure we get the appropriate data. (output_sysv): Likewise. Reported by Bruno Haible.
* build: avoid -Wsometimes-uninitialized on macOS 12Bruno Haible2023-03-152-2/+2
| | | | | * src/pr.c (integer_overflow): Mark as _Noreturn. * src/test.c (beyond): Likewise.
* tee: avoid undefined behavior after fclose()Pádraig Brady2023-03-133-9/+11
| | | | | | | * iopoll.c (fclose_wait): Rename from confusing fclose_nonblock name. Also adjust to do no operations on the stream after fclose() as this is undefined. Instead use fflush() to determine EAGAIN status. (fwrite_wait): Renamed from confusing fwrite_nonblock name.
* doc: dircolors: better separate the sections in the databasePádraig Brady2023-03-131-0/+12
| | | | | | * src/dircolors.hin: Make the separate sections of the self documenting dircolors database more apparent, by adding heading comments, and appropriate separation.
* ls: --color: honor separate sequences for extension casesPádraig Brady2023-03-132-8/+66
| | | | | | | | | | | | | | | | | | | Following on from commit v8.29-45-g24053fbd8 which unconditionally used case insensitive extension matching, support selective case sensitive matching when there are separate extension cases defined with different display sequences. * src/dircolors.hin: Document how file name suffixes are matched. Note this is displayed with `dircolors --print-database` which the texi info recommends to use for details. * src/ls.c (parse_ls_color): Postprocess the list to mark entries for case sensitive matching, and also adjust so that unmatchable entries are more quickly ignored. (get_color_indicator): Use exact matching rather than case insensitive matching if so marked. * tests/ls/color-ext.sh: Add test cases. * NEWS: Mention the change in behavior. Addresses https://bugs.gnu.org/33123
* tee: support non blocking outputsPádraig Brady2023-03-083-24/+119
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Non blocking outputs can be seen for example when piping telnet through tee to a terminal. In that case telnet sets its input to nonblocking mode, which results in tee's output being nonblocking, in which case in may receive an EAGAIN error upon write(). The same issue was seen with mpirun. The following can be used to reproduce this locally at a terminal (in most invocations): $ { dd iflag=nonblock count=0 status=none; dd bs=10K count=10 if=/dev/zero status=none; } | tee || echo fail >/dev/tty * src/iopoll.c (iopoll_internal): A new function refactored from iopoll(), to also support a mode where we check the output descriptor is writeable. (iopoll): Now refactored to just call iopoll_internal(). (fwait_for_nonblocking_write): A new internal function which uses iopoll_internal() to wait for writeable output if an EAGAIN or EWOULDBLOCK was received. (fwrite_nonblock): An fwrite() wrapper which uses fwait_for_nonblocking_write() to handle EAGAIN. (fclose_nonblock): Likewise. src/iopoll.h: Add fclose_nonblock, fwrite_nonblock. src/tee.c: Call fclose_nonblock() and fwrite_nonblock wrappers, instead of the standard functions. * tests/misc/tee.sh: Add a test case. * NEWS: Mention the improvement. The idea was suggested by Kamil Dudka in https://bugzilla.redhat.com/1615467
* split: support split -n on larger pipe inputPaul Eggert2023-03-071-35/+54
| | | | | | | | | * bootstrap.conf (gnulib_modules): Add free-posix, tmpfile. * src/split.c (copy_to_tmpfile): New function. (input_file_size): Use it to split larger files when sizes cannot easily be determined via fstat or lseek. See Bug#61386#235. * tests/split/l-chunk.sh: Mark tests of /dev/zero as very expensive since they exhaust /tmp.
* tee: fix a crash with unwriteable filesPádraig Brady2023-03-071-3/+5
| | | | | | | | This was introduced recently with commit v9.1-166-g6b12e62d9 * src/tee.c (tee_files): Check the return from fopen() before passing to fileno() etc. * tests/misc/tee.sh: Add a test case.
* maint: pacify ‘make syntax-check’Paul Eggert2023-03-061-3/+3
| | | | | | | | Problem reported by Pádraig Brady (Bug#61386#226). * src/split.c (parse_chunk): Use die instead of error. (main): Quote a string. * tests/local.mk (all_root_tests): Move du/apparent.sh from here ... (all_tests): ... to here.
* tail,tee: avoid issues with many files on systems without pollPádraig Brady2023-03-061-0/+6
| | | | | * src/iopoll.c (iopoll): Protect the call to select against passing in a descriptor larger than FD_SETSIZE.
* du: --apparent counts only symlinks and regularPaul Eggert2023-03-041-4/+4
| | | | | | | | Problem reported by Christoph Anton Mitterer (Bug#61884). * src/du.c (process_file): When counting apparent sizes, count only usable st_size members. * tests/du/apparent.sh: New file. * tests/local.mk (all_root_tests): Add it.
* split: tune for when creating output filesPaul Eggert2023-03-041-3/+9
| | | | | | | | * src/split.c (create): Avoid fstat + ftruncate in the usual case where the output file does not already exist, by trying to create it with O_EXCL first. This costs a failed open in the unusual case where the output file already exists, but that’s OK.
* split: style fixPaul Eggert2023-03-041-1/+3
| | | | * src/split.c (ofile_open): Avoid ‘if (! (a = b))’ style.
* split: prefer signed integers to size_tPaul Eggert2023-03-041-53/+52
| | | | | | | | | | | | This allows for better runtime checking with gcc -fsanitize=undefined. * src/split.c: Include idx.h. (open_pipes_alloc, n_open_pipes, suffix_length) (set_suffix_length, input_file_size, sufindex, outbase_length) (outfile_length, addsuf_length, create, cwrite, bytes_split) (lines_split, line_bytes_split, lines_chunk_split) (bytes_chunk_extract, ofile_open, lines_rr, main): Prefer signed integers (typically idx_t) to size_t.
* split: handle large numbers betterPaul Eggert2023-03-041-63/+73
| | | | | | | | | | | | | | | | | | | | | | | Prefer signed types to uintmax_t, as this allows for better runtime checking with gcc -fsanitize=undefined. Also, when an integer overflows just use the maximal value when the code will do the right thing anyway. * src/split.c (set_suffix_length, bytes_split, lines_split) (line_bytes_split, lines_chunk_split, bytes_chunk_extract) (lines_rr, parse_chunk, main): Prefer a signed type (typically intmax_t) to uintmax_t. (strtoint_die): New function. (OVERFLOW_OK): New macro. Use it elsewhere, where we now allow LONGINT_OVERFLOW because the code then does the right thing on all practical platforms (they have int wide enough so that it cannot be practically exhausted). We can do this now that we can safely assume intmax_t has at least 64 bits. (parse_n_units): New function. (parse_chunk, main): Use it. (main): Do not worry about integer overflow when the code will do the right thing anyway with the extreme value. Just use the extreme value. * tests/split/fail.sh: Adjust to match new behavior.
* split: prefer ssize_t for read resultPaul Eggert2023-03-041-14/+15
| | | | | | | * src/split.c (bytes_split, lines_chunk_split) (bytes_chunk_extract, main): Prefer ssize_t to size_t when representing the return value of ‘read’. Use a negative value instead of SIZE_MAX to indicate a missing value.
* split: be more careful about buffer sizesPaul Eggert2023-03-041-28/+31
| | | | | | | | | * src/split.c: Include sys-limits.h, not safe-read.h. (input_file_size, bytes_split, lines_split, line_bytes_split) (lines_chunk_split, bytes_chunk_extract, lines_rr): Call read, not safe_read, since safe_read no longer buys us anything. (main): Reject outlandish buffer sizes right away, rather than allocating huge buffers and never using them.
* split: minor -1 / 0 refactorPaul Eggert2023-03-041-3/+3
| | | | | * src/split.c (create, bytes_split, ofile_open): Prefer comparing to 0 to comparing to -1.
* split: don’t worry about ECHILDPaul Eggert2023-03-041-3/+3
| | | | | | * src/split.c (closeout): There should be no need for a special case for ECHILD, since we never wait for the same child twice. Simplify with this in mind.
* split: don’t assume pid_t fits in intPaul Eggert2023-03-041-2/+2
| | | | | * src/split.c (filter_pid): Now pid_t, not int. (of_t): opid member is now pid_t, not int.
* split: simplify SIGPIPE handlingPaul Eggert2023-03-041-12/+5
| | | | | | | | Ignore and default SIGPIPE, rather than blocking and unblocking it. * src/split.c (default_SIGPIPE): New static var, replacing oldblocked and newblocked. (create): Use it. (main): Set it.
* split: port ‘split -n N /dev/null’ better to macOSPaul Eggert2023-03-041-34/+32
| | | | | | | | | | | | | | | | | * src/split.c (input_file_size): Do not bother with lseek if the initial read probe reaches EOF, since the file size is known then. This works better on macOS, which doesn’t allow lseek on /dev/null. Do not special-case size-zero files, as the issue can occur with any size file (though /proc files are the most common). If the current position is past end of file, treat this as size zero regardless of whether the file has a usable st_size. Pass through lseek -1 return values rather than using ‘return -1’; this makes the code a bit easier to analyze (and a bit faster). Avoid undefined behavior if the size calculation overflows. (lines_chunk_split): Do not bother with lseek if it would have no effect if successful. This works better on macOS, which doesn’t allow lseek on /dev/null. * tests/split/l-chunk.sh: Adjust to match fixed behavior.
* split: split more evenly with -nPaul Eggert2023-03-041-31/+27
| | | | | | | | * src/split.c (bytes_split): New arg REM_BYTES. Use this to split more evenly. All callers changed. (lines_chunk_split, bytes_chunk_extract): Be consistent with new byte_split. * tests/split/b-chunk.sh, tests/split/l-chunk.sh: Test new behavior.
* split: small -n lines simplificationPaul Eggert2023-03-041-2/+3
| | | | | * src/split.c (lines_chunk_split): Rewrite while as if-while for clarity.
* split: refactor lines_chunk_splitPaul Eggert2023-03-041-6/+6
| | | | | | | * src/split.c (lines_chunk_split): Simplify by having chunk_end point to the first byte after the chunk, rather than to the last byte of the chunk. This will reduce confusion once we allow chunks to be empty.
* tee: tune when later -p overrides earlierPaul Eggert2023-03-041-18/+9
| | | | | | | | | * src/tee.c (pipe_check): Make this a local var instead of a static var. This suppresses a -Wmaybe-uninitialized diagnostic with gcc 12.2.1 20221121 (Red Hat 12.2.1-4). (main): Don’t set pipe_check unnecessarily if a later -p option overrides an earlier one that wants pipe_check. Problem discovered when I investigated the GCC warning.
* maint: refactor tail.c to use iopollPádraig Brady2023-03-015-62/+51
| | | | | | | | | | * src/tail.c (check_output_alive): Reuse iopoll() rather than directly calling poll() or select(). * src/iopoll.c (iopoll): Refactor to support non blocking operation, or ignoring descriptors by passing a negative value. * src/iopoll.h (iopoll): Adjust to support a BLOCK parameter. * src/tee.c (tee_files): Adjust iopoll() call to explicitly block. * src/local.mk: Have tail depend on iopoll.c.
* tail: avoid undefined behavior when polling outputsPádraig Brady2023-02-281-2/+2
| | | | | * src/tail.c (check_output_alive): Only check the returned events from poll() when it indicates there are events to check.
* doc: tee -p: clarify operationPádraig Brady2023-02-281-1/+2
| | | | | | | | | | * src/tee.c (usage): Change from describing one (non pipe) aspect to the more general point of being the option to use if working with pipes, and referencing the more detailed info below. * doc/coreutils.texi (tee invocation): s/standard/appropriate/ since the standard operation with pipes is to exit immediately upon write error. s/early/immediately/ as it's ambiguous as to what "early" is in relation to.
* tee: enhance -p mode using iopoll() to detect broken pipe outputsCarl Edquist2023-02-283-16/+89
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If input is intermittent (a tty, pipe, or socket), and all remaining outputs are pipes (eg, >(cmd) process substitutions), exit early when they have all become broken pipes (and thus future writes will fail), without waiting for more input to become available, as future write attempts to these outputs will fail (SIGPIPE/EPIPE). Only provide this enhancement when pipe errors are ignored (-p mode). Note that only one output needs to be monitored at a time with iopoll(), as we only want to exit early if _all_ outputs have been removed. * src/tee.c (pipe_check): New global for iopoll mode. (main): enable pipe_check for -p, as long as output_error ignores EPIPE, and input is suitable for iopoll(). (get_next_out): Helper function for finding next valid output. (fail_output, tee_files): Break out write failure/output removal logic to helper function. (tee_files): Add out_pollable array to track which outputs are suitable for iopoll() (ie, that are pipes); track first output index that is still valid; add iopoll() broken pipe detection before calling read(), removing an output that becomes a broken pipe. * src/local.mk (src_tee_SOURCES): include src/iopoll.c. * NEWS: Mention tee -p enhancement in Improvements. * doc/coreutils.texi: Mention the new early exit behavior in the nopipe modes for the tee -p option. Suggested-by: Arsen Arsenović <arsen@aarsen.me>
* all: add broken pipe detection while waiting for inputCarl Edquist2023-02-283-0/+128
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When a program's output becomes a broken pipe, future attempts to write to that ouput will fail (SIGPIPE/EPIPE). Once it is known that all future write attepts will fail (due to broken pipes), in many cases it becomes pointless to wait for further input for slow devices like ttys. Ideally, a program could use this information to exit early once it is known that future writes will fail. Introduce iopoll() to wait on a pair of fds (input & output) for input to become ready or output to become a broken pipe. This is relevant when input is intermittent (a tty, pipe, or socket); but if input is always ready (a regular file or block device), then a read() will not block, and write failures for a broken pipe will happen normally. Introduce iopoll_input_ok() to check whether an input fd is relevant for iopoll(). Experimentally, broken pipes are only detectable immediately for pipes, but not sockets. Errors for other file types will be detected in the usual way, on write failure. Introduce iopoll_output_ok() to check whether an output fd is suitable for iopoll() -- namely, whether it is a pipe. iopoll() is best implemented with a native poll(2) where possible, but fall back to a select(2)-based implementation platforms where there are portability issues. See also discussion in tail.c. In general, adding a call to iopoll() before a read() in filter programs also allows broken pipes to "propagate" backwards in a shell pipeline. * src/iopoll.c, src/iopoll.h (iopoll): New function implementing broken pipe detection on output while waiting for input. (IOPOLL_BROKEN_OUTPUT, IOPOLL_ERROR): Return codes for iopoll(). (IOPOLL_USES_POLL): Macro for poll() vs select() implementation. (iopoll_input_ok): New function to check whether an input fd is relevant for iopoll(). (iopoll_output_ok): New function to check whether an input fd is suitable for iopoll(). * src/local.mk (noinst_HEADERS): add src/iopoll.h.
* cp,install,mv: --debug: output debug info when reflinkingPádraig Brady2023-02-241-5/+5
| | | | | * src/copy.c (copy_reg): Always check whether to output debug info. (emit_debug): Restrict output with `cp --attributes-only`.
* cp,install,mv: add --debug to explain how a file is copiedPádraig Brady2023-02-245-4/+127
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | How a file is copied is dependent on the sparseness of the file, what file system it is on, what file system the destination is on, the attributes of the file, and whether they're being copied or not. Also the --reflink and --sparse options directly impact the operation. Given it's hard to reason about the combination of all of the above, the --debug option is useful for users to directly identify if copy offloading, reflinking, or sparse detection are being used. It will also be useful for tests to directly query if these operations are supported. The new output looks as follows: $ src/cp --debug src/cp file.sparse 'src/cp' -> 'file.sparse' copy offload: yes, reflink: unsupported, sparse detection: no $ truncate -s+1M file.sparse $ src/cp --debug file.sparse file.sparse.cp 'file.sparse' -> 'file.sparse.cp' copy offload: yes, reflink: unsupported, sparse detection: SEEK_HOLE $ src/cp --reflink=never --debug file.sparse file.sparse.cp 'file.sparse' -> 'file.sparse.cp' copy offload: avoided, reflink: no, sparse detection: SEEK_HOLE * doc/coreutils.texi (cp invocation): Describe the --debug option. (mv invocation): Likewise. (install invocation): Likewise. * src/copy.h: Add a new DEBUG member to cp_options, to control whether to output debug info or not. * src/copy.c (copy_debug): A new global structure to unconditionally store debug into from the last copy_reg operations. (copy_debug_string, emit_debug): New functions to print debug info. * src/cp.c: if ("--debug") x->debug=true; * src/install.c: Likewise. * src/mv.c: Likewise. * tests/cp/debug.sh: Add a new test. * tests/local.mk: Reference the new test. * NEWS: Mention the new feature.
* doc: chgrp,chmod,chown: state --reference always dereferencesPádraig Brady2023-02-233-5/+6
| | | | | | | | * src/chgrp.c (usage): State that --reference always dereferences symbolic links. * src/chmod.c (usage): Likewise. * src/chown.c (usage): Likewise. Fixes https://bugs.gnu.org/61720
* maint: avoid -Wmaybe-uninitialized warning from GCC13Pádraig Brady2023-02-211-1/+3
| | | | | * src/copy.c (infer_scantype): Always set scan_inference.ext_start, as per commit 6c03e8fb which was inadvertently reverted by d374d32c.
* rm: --dir (-d): fix bugs in handling of empty, inaccessible directoriesJim Meyering2023-02-211-5/+20
| | | | | | | | | | | | | | | * src/remove.c (prompt, rm_fts): In the dir-handling code of both of these functions, relax a "get_dir_status (...) == DS_EMPTY" condition to instead test only "get_dir_status (...) != 0", enabling flow control to reach the prompt function also for unreadable directories. However, that function itself also needed special handling for this case: (prompt): Handle empty, inaccessible directories properly, deleting them with -d (--dir), and prompting about whether to delete with -i (--interactive). * tests/rm/empty-inacc.sh: Add tests for the new code. Reported by наб <nabijaczleweli@nabijaczleweli.xyz> in bugs.debian.org/1015273 * NEWS (Bug fixes): Mention this.
* cp: fclonefileat security fix + CLONE_ACL + fixupsPaul Eggert2023-02-161-13/+100
| | | | | | | | | | | | | | | * src/copy.c: Some changes if HAVE_FCLONEFILEAT && !USE_XATTR. (fd_has_acl): New function. (CLONE_ACL): Default to 0. (copy_reg): Use CLONE_NOFOLLOW to avoid races like CVE-2021-30995 <https://www.trendmicro.com/en_us/research/22/a/ analyzing-an-old-bug-and-discovering-cve-2021-30995-.html>. Use CLONE_ACL if available and working, falling back to cloning without it if it fails due to EINVAL. If the only problem with fclonefileat is that it would create the file with the wrong timestamp, or with too few permissions, do that but fix the timestamp and permissions afterwards, rather than falling back on a traditional copy.
* maint: fix some typos in commentsChuanGang Jiang2023-02-102-2/+2
| | | | | | | | | * NEWS: s/commmand/command/ * cfg.mk: Adjust old_NEWS_hash with `make update-NEWS-hash`. * src/expand-common.c: s/specifed/specified/ * src/pr.c: s/e.g/e.g./ * tests/misc/comm.pl: s/ouput/output/ Fixes https://bugs.gnu.org/61405
* cp: simplify infer_scantypePaul Eggert2023-02-091-10/+8
| | | | | | | | | * src/copy.c (infer_scantype): Do not set *SCAN_INFERENCE when returning a value other than LSEEK_SCANTYPE. This is just minor refactoring; it simplifies the code a bit. Callers are uneffected. doc: document --preserve=mode better
* tail: improve --follow=name with single non regular filesPádraig Brady2023-02-061-2/+12
| | | | | | | | * src/tail (tail_forever): Attempt to read() from non blocking single non regular file, which shouldn't block, but also read data even when the mtime doesn't change. * NEWS: Mention the improvement. * THANKS.in: Thanks for detailed testing.
* tail: fix support for -F with non seekable filesPádraig Brady2023-02-061-1/+2
| | | | | | | | | | This was seen to be an issue when following a symlink that was being updated to point to different underlying devices. * src/tail.c (recheck): Guard the lseek() call to only be performed for regular files. * NEWS: Mention the bug fix.
* cksum: add --raw option to output a binary digestPádraig Brady2023-02-065-10/+69
| | | | | | | | | | | | | | | | | | | | | | | | | --raw output is the most composable format, and also is a robust way to discard the file name without parsing (escaped) output. Examples: $ cksum --raw -a crc "$afile" | basenc --base16 4ACFC4F0 $ cksum --raw -a crc "$afile" | basenc --base2msbf 01001010110011111100010011110000 $ cksum --raw -a sha256 "$bfile" | basenc --base32 AAAAAAAADHLGRHAILLQWLAY6SNH7OY5OI2RKNQLSWPY3MCUM4JXQ==== * doc/coreutils.texi (cksum invocation): Describe the new feature. * src/digest.c (output_file): Inspect the new RAW_DIGEST global, and output the bytes directly if set. * src/cksum.c (output_crc): Likewise. * src/sum.c (output_bsd, output_sysv): Likewise. * tests/misc/cksum-raw.sh: A new test. * tests/local.mk: Reference the new test. * NEWS: Mention the new feature.