Compare commits

..

310 Commits
v6.4 ... v6.9

Author SHA1 Message Date
Jim Meyering
804bdc3001 Version 6.9.
* NEWS: Record release date and new version number.
* configure.ac (AC_INIT): New version number.
2007-03-22 22:20:02 +01:00
Jim Meyering
25cdc8248d * tests/mv/hard-3: Correct the preceding change: $3 -> $2. 2007-03-22 22:11:03 +01:00
Eric Blake
826ff082db * coreutils.texi (md5sum invocation): Document escapes in output
format.  Reported by Armijn Hemel.
2007-03-22 21:46:54 +01:00
Paul Eggert
59e889f0f3 Improve a test script.
* tests/mv/hard-3: Check for 'ls' failure, too.
Generate more-useful debugging output when 'ls' fails.
2007-03-22 21:29:30 +01:00
Jim Meyering
3440b65ecf Fix a test script not to claim an ext2 file system is of type xfs.
* tests/du/slink: When using df --local and df --type=TYPE,
test only the exit code.  Don't bother with stdout.
Prompted by a report by Thomas Schwinge of an inaccurate diagnostic.
2007-03-21 17:19:30 +01:00
Jim Meyering
a59975a3fd Add to .cvsignore and .gitignore files. 2007-03-21 15:41:58 +01:00
Jim Meyering
373c95c45a * gl/lib/savewd.c: Remove this file, since the savewd_save change
is now in gnulib.  The other wasn't useful.
2007-03-21 09:09:34 +01:00
Jim Meyering
c63f4506cc Skip part of this test when "." is not a local file system.
* tests/mkdir/p-3: Likewise.
2007-03-20 16:47:36 +01:00
Jim Meyering
85de525557 * gl/lib/acl.c: Remove this file, now that gnulib's version subsumes it. 2007-03-20 15:51:21 +01:00
Jim Meyering
13e4c87ff6 Fix a typo in the handling of %x and %X.
* vasnprintf.c (VASNPRINTF): When adding 2 to buffer length,
don't double it.
2007-03-20 15:21:08 +01:00
Jim Meyering
de540a76eb Skip part of this test when "." is not a local file system.
* tests/install/basic-1: Otherwise, it would fail on some NFS
file systems.
2007-03-20 13:26:28 +01:00
Paul Eggert
02b2e48b12 * src/Makefile.am (dir_LDADD, ls_LDADD, vdir_LDADD):
Add $(LIB_ACL_TRIVIAL).
2007-03-20 13:21:33 +01:00
Jim Meyering
5bc4b89be8 Fix a generic NFS-related test failure.
* tests/mkdir/p-3: When setting up an unreadable "." in an
inaccessible parent, make the parent inaccessible *after* making "."
unreadable.  Otherwise, running "chmod a-r ." in an already-
inaccessible parent would fail on NFS with "Stale NFS file handle".

Signed-off-by: Jim Meyering <jim@meyering.net>
2007-03-18 22:37:54 +01:00
Jim Meyering
553d347d3e Fix a bug in how pr -m -s works.
* NEWS: Describe how the fix affects pr.
* src/pr.c (init_parameters): The --merge (-m) option does
not imply --expand-tabs (-e), so don't set "untabify_input".
Reported by Wis Macomson.
* tests/misc/pr: New file.  Test for the above fix.
* tests/misc/Makefile.am (TESTS): Add pr.
* THANKS: Update.
2007-03-18 16:21:26 +01:00
Jim Meyering
b1d89070f6 Fix a silly syntax error introduced in last change. 2007-03-17 13:15:17 +01:00
Jim Meyering
20bc0790a7 fix a syntax error 2007-03-17 13:01:56 +01:00
Jim Meyering
7828d1b4e2 Detect use of AC_CONFIG_AUX_DIR also when its argument is quoted.
* bootstrap: Put ""s around use of $build_aux, in case
someone uses a name containing shell meta-characters.
Reported by Alfred M. Szmidt.
2007-03-17 12:54:28 +01:00
Jim Meyering
5b3313c120 * tests/misc/tty-eof: Add shuf to the list of tested commands. 2007-03-17 12:23:14 +01:00
Jim Meyering
0edae5eee6 Avoid test failure on NFS-mounted Solaris ZFS file system.
* tests/du/basic: Skip a test if "." is on a non-local file system.
2007-03-17 11:44:42 +01:00
Jim Meyering
11f43d2e22 Avoid an obscure build failure, prefer waitpid over wait.
* src/install.c (strip): Use waitpid, not wait.  It's equivalent,
but feels less obsolescent.
2007-03-17 10:43:04 +01:00
Jim Meyering
87c54fa0ae * bootstrap: Don't use \> in grep regexp. For HP-UX. 2007-03-17 09:46:54 +01:00
Jim Meyering
3715c01f8e Begin adding support for Solaris ZFS (4 entries per trivial ACL)
* gl/lib/acl.c (ACL_NOT_WELL_SUPPORTED): New macro.
(file_has_acl, copy_acl): Use it, rather than enumerating errno values.
(is_trivial_acl): New function.  Incomplete, for now.
(file_has_acl, copy_acl): Use the new function, rather than
counting the number of entries in an ACL.
2007-03-16 22:24:09 +01:00
Jim Meyering
d2c7d7b58f * bootstrap: Update from gnulib. 2007-03-16 22:06:27 +01:00
Jim Meyering
d1e5a7af56 * .x-sc_prohibit_atoi_atof: Add TODO here, too. 2007-03-16 22:06:04 +01:00
Paul Eggert
369aaf7e5d * src/copy.c: Include filemode.h.
(overwrite_prompt): Say "try to overwrite", not "overwrite", to
make it clearer that the attempt may fail.  Problem reported by
Dan Jacobson in:
http://lists.gnu.org/archive/html/bug-coreutils/2007-03/msg00130.html
Output symbolic mode as well as numeric.
* tests/mv/i-2 (fail): Adjust to new prompt format.
2007-03-16 21:41:50 +01:00
Paul Eggert
39e85b7258 Fix manual in response to bug reports by Dan Jacobson.
* coreutils.texi (sort invocation): Explain numeric sorts better.
Compress self-congratulation into a simple "comparison is exact"
notice; the --general-numeric-sort option already explains the
tradeoffs.
(seq invocation): Add example of -f.
2007-03-16 06:30:32 +01:00
Jim Meyering
487e5317be Enforce policy: don't use *scanf functions.
* Makefile.maint (sc_prohibit_atoi_atof): Add to regexp and diagnostic.
* .x-sc_prohibit_atoi_atof: Give stty a temporary pass.
* TODO: note that stty.c needs this small clean-up.
2007-03-15 09:19:10 +01:00
Jim Meyering
112b9537dd Prepare to work on ACL-related failure when using Solaris ZFS.
* gl/lib/acl.c: New file, copied from gnulib.
2007-03-13 19:52:13 +01:00
Jim Meyering
24045feb85 Work around a failing test due to an NFS-based race condition.
* tests/cp/sparse: Accept a report that the copy is *smaller*.
2007-03-13 19:51:47 +01:00
Jim Meyering
64f972e94b * coreutils.texi (cp invocation): Mention that --preserve=timestamps
doesn't preserve time stamps on symbolic links.
Reported by Polo Talnir in <https://bugzilla.redhat.com/230866>.
2007-03-12 14:26:24 +01:00
Jim Meyering
1e7a0f088b Make bootstrap.conf a tiny bit more generic.
* bootstrap.conf (XGETTEXT_OPTIONS): Exclude gettext-related .m4
files when e.g., AM_GNU_GETTEXT([external] appears in configure.ac.
2007-03-12 09:47:36 +01:00
Jim Meyering
fd6fc97156 Try to fix today's NFS-related failure: Treat ESTALE like EACCES.
* gl/lib/savewd.c: Copy this file from gnulib, then change
"errno != EACCES" to (errno != EACCES && errno != ESTALE).
The symptom was this failure in tests/install/basic-1:
ginstall: cannot create directory `rel/a': Stale NFS file handle
2007-03-10 11:39:50 +01:00
Jim Meyering
04131454e3 The preceding change solved part of the problem. Now ginstall fails.
* tests/install/basic-1: Temporarily, don't redirect ginstall's
stderr to /dev/null, so I can see why the NFS autobuilder's NFS test
is failing.
2007-03-10 10:36:25 +01:00
Jim Meyering
bc86cb44e3 * tests/install/basic-1: When setting up an unreadable "." in an
inaccessible parent, make the parent inaccessible *after* making "."
unreadable.  Otherwise, running "chmod a-r ." in an already-
inaccessible parent would fail on NFS with "Stale NFS file handle".
Reported by Bob Proulx.
2007-03-10 09:53:49 +01:00
Jim Meyering
0a538a2488 remove trailing blanks 2007-03-10 08:17:19 +01:00
Jim Meyering
ca4f28bc83 * Makefile.maint (po-check): Exclude c99-to-c89.diff. 2007-03-10 00:43:50 +01:00
Jim Meyering
36aeb30081 Mention that both Jay Soffian and Charles Randall wrote early versions
of sort's temp-file-compression code.
2007-03-10 00:43:36 +01:00
Jim Meyering
fe3fbf2f54 * tests/chgrp/basic: Also avoid test failures on Darwin 8.8.x (MacOS X 10.4). 2007-03-09 20:09:46 +01:00
Jim Meyering
d9079b12e3 src/fs.h: git-rm a generated but already-ignored file 2007-03-09 15:19:21 +01:00
Jim Meyering
222b7c46bd Avoid test failures on Darwin 7.9.0 (MacOS X 10.3.9)
* tests/chgrp/basic: Don't let failure by chgrp to set the
group of a symlink make this test fail.  Do give a diagnostic.
In the chgrp-no-change-ctime test, add darwin7.9.0 as another
known-failing system.
When failing on some other system, print $host_triplet, too.
Reported by Peter Fales.
2007-03-09 08:47:33 +01:00
Jim Meyering
4bf9fe82c0 * src/c99-to-c89.diff: Reflect the new c99'ism, update offsets. 2007-03-08 22:09:11 +01:00
Jim Meyering
fe068c60fb Add to .cvsignore and .gitignore files. 2007-03-08 22:01:27 +01:00
Jim Meyering
e3864a430e TODO: printf: support %a even when the native *printf(3) is deficient 2007-03-08 22:01:05 +01:00
Jim Meyering
2639ed8208 rm without -f: give a better diagnostic when euidaccess fails.
* src/remove.c (write_protected_non_symlink): Return int, not bool,
so that we can indicate failure too (as a postive error number).
(prompt): If write_protected_non_symlink fails, report that error
number and fail rather than charging ahead and removing the dubious
entry.  Redo the logic of printing a diagnostic so that we need to
invoke quote (full_filename (...)) only once.  More details at:
<http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/9952/focus=9996>
2007-03-08 10:38:59 +01:00
Jim Meyering
09aab8cb41 Generalize a few more cvs-isms.
* bootstrap (checkout_only_file): Rename from CVS_only_file.
Change comments and diagnostics not to say "CVS".
2007-03-08 09:19:39 +01:00
Jim Meyering
9abd8baaaa * bootstrap: Run libtool, if necessary. 2007-03-08 01:06:41 +01:00
Jim Meyering
551bed87fa Make bootstrap a little more general.
* bootstrap (build_aux): Factor out/use this definition.
Formally require a "AC_CONFIG_AUX_DIR($build_aux)" line in configure.ac.
(insert_sorted_if_absent): Move function definition "up", to
precede new first use.
If $build_aux/ doesn't exist initially, create it, and
mark it as ignored.
2007-03-08 00:23:00 +01:00
Jim Meyering
b7a568ece8 * vasnprintf.c (VASNPRINTF): Add missing semicolon. 2007-03-04 13:03:59 +01:00
Andrew Church
2871ad3b45 Fix a bug: cp -x would fail to set mount point permissions.
* NEWS: mention cp -x bug fix
* src/copy.c (copy_internal): Don't return immediately after
copying a mount point that we do not intend to recurse under.
Based on a patch by Andrew Church.
2007-03-03 23:00:18 +01:00
Jim Meyering
f0537a71f1 pwd-unreadable-parent: Skip test on ia64/Linux, too.
* tests/misc/pwd-unreadable-parent: Also skip when $REPLACE_GETCWD.
Reported by Bob Proulx.
2007-03-03 21:38:16 +01:00
Jim Meyering
1187f011d3 Add to .cvsignore and .gitignore files. 2007-03-02 14:54:52 +01:00
Jim Meyering
c872a5f7bb * vasnprintf.c (VASNPRINTF): Remove cast of alloca return value. 2007-03-02 14:33:12 +01:00
Jim Meyering
fe4f1227a5 pwd-unreadable-parent: Skip test on non-Linux/GNU systems.
* tests/misc/pwd-unreadable-parent: Rather than trying to decide
whether this test has a chance of succeeding, run it only when
$(host_os) is linux-gnu.  It was failing on powerpc-apple-darwin8.8.0
* tests/misc/Makefile.am (TESTS_ENVIRONMENT): Add host_os=$(host_os).
2007-03-02 14:25:48 +01:00
Jim Meyering
13a4b23e79 * tests/misc/pwd-long: Also allow "+" in $PWD. 2007-03-02 13:18:43 +01:00
Jim Meyering
b655a2154e * Makefile.maint (my-distcheck): Skip the c99/c89 check if there's no such .diff file. 2007-03-02 11:13:54 +01:00
Jim Meyering
272d99e7a3 Remove another coreutils-ism. Formatting cleanup.
* Makefile.maint (my-distcheck): Update an outdated comment.
(emit_upload_commands): Use $(PACKAGE) rather than "coreutils".
2007-03-02 10:57:08 +01:00
Jim Meyering
262963212b * Makefile.maint (warn_cflags): Hoist, adding "-Dlint -O".
(my-distcheck): Use the new variable, instead of too-long literal.
2007-03-01 11:06:58 +01:00
Jim Meyering
ea42025c70 Make "make syntax-check" rules less coreutils-specific.
* Makefile.maint (sc_cast_of_x_alloc_return_value): Use CVS_LIST_EXCEPT.
(sc_cast_of_alloca_return_value): Likewise.
(sc_root_tests): Do nothing if there is no check-root target
in tests/Makefile.am.
2007-03-01 11:05:35 +01:00
Jim Meyering
7daf29845b Run the writable-files check only for release-building targets.
* Makefile.maint (local-checks-available): Remove writable-files.
(alpha beta major): Put it here, instead.
2007-03-01 11:02:25 +01:00
Jim Meyering
5703f662b7 "make syntax-check" now runs only Makefile.cfg-selected tests
* Makefile.maint (syntax-check-rules): Hoist this definition so that
it precedes the indirect use in the definition of $(local-check).
(local-check): Use :=, not just "=".
(syntax-check): Depend on $(local-check), not $(syntax-check-rules).
2007-03-01 11:00:12 +01:00
Jim Meyering
b3b6f52fad Merge in changes from gnulib:
* vasnprintf.c: Add a comment explaining why coreutils has its own
version of this file.
Include <stdint.h>.
(SIZE_MAX): Remove definition (now, stdint.h covers that).
(EOVERFLOW): Remove definition (now done via the eoverflow module).
Update some #ifdef to #if.
Use HAVE_LONG_LONG_INT, not HAVE_LONG_LONG.
* printf-parse.c: Likewise.
2007-03-01 10:41:48 +01:00
Bruno Haible
f6f2846bd8 * bootstrap.conf (gnulib_modules): Replace xreadlink with
xreadlink-with-size. Add xreadlink.
* src/copy.c (copy_internal): Update.
* src/ls.c (is_directory): Update.
* src/stat.c (print_stat): Update.
* src/readlink.c (main): Use the one-argument xreadlink function.
2007-03-01 08:06:24 +01:00
Paul Eggert
e5dbc71841 * doc/coreutils.texi (Common options): --si outputs "M", not "MB".
Problem reported by Philip Rowlands in
<http://lists.gnu.org/archive/html/bug-coreutils/2007-02/msg00283.html>.
2007-02-28 22:25:53 +01:00
Jim Meyering
b2a48ec240 * tsearch.c: Remove unused file. 2007-02-28 21:50:14 +01:00
Jim Meyering
c62a7156c5 * .x-sc_file_system: Add the new test, tests/misc/df-P, to this
list of exceptions, for the "make distcheck" sc_file_system rule.
2007-02-28 13:52:20 +01:00
Jim Meyering
195108489b * Makefile.maint (gnulib_snapshot_date): Remove now-unused definition. 2007-02-28 10:27:31 +01:00
Jim Meyering
55bc95b4d3 * tests/misc/df-P: This script *is* executable. 2007-02-28 08:11:41 +01:00
Jim Meyering
d480544281 Add a test for today's df -P fix.
* tests/misc/df-P: New file.
* tests/misc/Makefile.am (TESTS): Add df-P.
2007-02-27 19:35:27 +01:00
Paul Eggert
817d0261eb Make df -P immune to effects of e.g., the BLOCK_SIZE envvar.
* NEWS: With -P, the default block size and output format is not
affected by DF_BLOCK_SIZE, BLOCK_SIZE, or BLOCKSIZE.
* src/df.c (main): Implement this.
* doc/coreutils.texi (df invocation): With -P, the default block size
and output format is not affected by DF_BLOCK_SIZE, BLOCK_SIZE, or
BLOCKSIZE.
2007-02-27 19:33:03 +01:00
Jim Meyering
898d3df2f8 * Makefile.maint (announcement): Adjust so that it works with
announce-gen's --gnulib-snapshot-time-stamp option.
Indent one of the command lines using TAB, not 8 spaces.
2007-02-25 01:11:32 +01:00
Jim Meyering
9317cccb8f Post-release version change.
* NEWS: Add a line for 6.8+.
* configure.ac (AC_INIT): Set new version string.
2007-02-25 01:10:07 +01:00
Jim Meyering
cc2d4f6c46 Version 6.8.
* NEWS: Record release date and new version number.
* configure.ac (AC_INIT): New version number.
2007-02-24 21:16:52 +01:00
Jim Meyering
471eca0dd6 Don't skip this test on new-enough Linux/GNU systems.
* tests/misc/pwd-unreadable-parent: Test $REPLACE_GETCWD = 0,
rather than for __GETCWD_PREFIX in config.h (the latter is no
longer defined, ever, due to gnulib changes).
* tests/misc/Makefile.am (TESTS_ENVIRONMENT): Define REPLACE_GETCWD.
2007-02-24 20:57:14 +01:00
Jim Meyering
e98137ddd4 Remove the "gnits" option; it prohibits my using "+" as a version
string suffix, and all it does (beyond the default "gnu" option)
is to _require_ the THANKS file.
* configure.ac (AM_INIT_AUTOMAKE): Remove it.

Remove all AUTOMAKE_OPTIONS settings in Makefile.am files.
* tests/chgrp/Makefile.am, tests/chmod/Makefile.am:
* tests/chown/Makefile.am, tests/cp/Makefile.am:
* tests/du/Makefile.am, tests/expr/Makefile.am:
* tests/factor/Makefile.am, tests/general/Makefile.am:
* tests/install/Makefile.am, tests/ln/Makefile.am:
* tests/ls/Makefile.am, tests/mkdir/Makefile.am:
* tests/mv/Makefile.am, tests/readlink/Makefile.am:
* tests/rm/Makefile.am, tests/rmdir/Makefile.am:
* tests/seq/Makefile.am, tests/stty/Makefile.am:
* tests/tee/Makefile.am, tests/touch/Makefile.am:
2007-02-24 13:57:51 +01:00
Jim Meyering
1b2056c435 * README: Document the OSF/1 4.0d build failure and work-around.
Reported by Bruno Haible.
2007-02-24 13:49:20 +01:00
Jim Meyering
f92a08e171 * NEWS: Use a simple "+" suffix to denote pre-release, not "-dirty".
Nicer connotations.
* configure.ac: Use 6.7+, not 6.7-dirty.
2007-02-24 13:13:45 +01:00
Paul Eggert
3ea177e3fa * NEWS: sort no longer compresses temporaries by default.
* bootstrap.conf: Remove findprog.
* doc/coreutils.texi (sort invocation): The default is to not
compress.  Don't treat "" specially.
* src/sort.c: Don't include findprog.h.
(create_temp): Compress only if the user specified --compress-program.
* tests/misc/sort-compress: Adjusts tests to match new behavior.
2007-02-24 12:24:27 +01:00
Jim Meyering
75460e090c Avoid a shell syntax error, when building with an inadequate Perl.
* man/Makefile.am (.x.1): Add quotes around $(PERL) in case, since
it can expand to "/.../missing perl".
2007-02-24 09:26:56 +01:00
Jim Meyering
90390c6a92 * man/Makefile.am (.x.1): Warn when unable to update a man page.
Suggestion from Bruno Haible.
2007-02-24 09:14:56 +01:00
Bruno Haible
63813d0950 Handle better the combination of old Perl and a pre-c99 compiler.
* man/Makefile.am (.x.1): If the autoconf test has determined that
perl is missing or not a sufficient version, do nothing.
2007-02-24 08:51:19 +01:00
Bruno Haible
2e140cfb42 * tests/readlink/can-e: Put the closing double-quote at the end of a
backquoted word, not in the middle. Works around a bug in sh on
OSF/1 4.0d.
* tests/readlink/can-f: Likewise.
* tests/readlink/can-m: Likewise.
2007-02-24 08:22:08 +01:00
Bruno Haible
33176a7269 * tests/du/slink: Skip the test if executing on an nfsv3 file system.
This avoids a test failure at least on OSF/1 4.0d.
2007-02-24 08:20:37 +01:00
Jim Meyering
813de08e50 * randperm.c (randperm_new): Comment: say that this function
returns a pointer to malloc'd storage.
2007-02-23 22:16:12 +01:00
Jim Meyering
5a8a00e16e * src/date.c (usage): Split a diagnostic that had grown to be
longer than the C89 maximum of 509 bytes.
2007-02-23 17:50:40 +01:00
Ed Santiago
54bdcc09ae * src/date.c (usage): Mention that --rfc-3339 uses space, not 'T',
for a separator.  Include sample RFC 2822 and 3339 output.
2007-02-23 16:11:01 +01:00
Jim Meyering
cb121d8f36 With -Dlint, make shuf free all heap-allocated storage.
* src/shuf.c (main): Move declaration of input_lines to
function scope, and initialize to NULL, so we can free it.
[lint]: Free all malloc'd memory.
* tests/misc/shuf: Also test shuf's -e and -i options.
2007-02-23 15:18:16 +01:00
Jim Meyering
3a9070dce7 Correct typo in ChangeLog entry. 2007-02-22 23:51:43 +01:00
Jim Meyering
93f9b9be84 Merge in a change from some other incarnation of this file (gzip?)
* bootstrap (gnulib_tool): Skip get_translations if there is no po/ dir.
2007-02-22 23:37:19 +01:00
Paul Eggert
4e73fea3e3 Honor dd's noatime flag if possible, even if not supported on build fs
* doc/coreutils.texi (dd invocation): Warn that noatime might not be
reliable.
* src/dd.c (flags, usage): Look at O_NOATIME, not
HAVE_WORKING_O_NOATIME, to decide whether to support the noatime
flag, so that dd attempts O_NOATIME even if the build file system
does not support it.  Problem reported by Jim Meyering today in
bug-coreutils.
* tests/dd/misc: Generate a warning, not a failure, if noatime
exists but fails.
2007-02-22 19:09:35 +01:00
Jim Meyering
c450b625b4 Adjust preceding change not to perform an unaligned access.
* src/copy.c (copy_reg): Undo previous change.  Instead, make
it clearer that we're using a single-byte sentinel, and
[lint]: Initialize uintptr_t-1 bytes after the sentinel.
Reported by Andreas Schwab.
2007-02-22 16:32:45 +01:00
Jim Meyering
f48ca7f500 Placate valgrind, wrt ./cp --sparse=always
* src/copy.c (copy_reg): Place the sentinel by setting a
full word's worth of bits, not just a single byte's worth.
This avoids a harmless (but distracting) case of memory being
used-uninitialized.
2007-02-22 12:50:36 +01:00
Jim Meyering
c25841e0d4 Add to .cvsignore and .gitignore files. 2007-02-21 22:45:09 +01:00
Jim Meyering
45a35825dc * tests/misc/date: Remove vestigial use of Data::Dumper. 2007-02-21 17:26:32 +01:00
Paul Eggert
cc388d140c * src/copy.c (cached_umask): Cast -1 to mode_t to avoid a warning
about out-of-range initializer with Sun C 5.8.
2007-02-21 17:23:05 +01:00
Jim Meyering
c46549dc38 * bootstrap (CVS_only_file): Use README-hacking. 2007-02-20 22:44:15 +01:00
Jim Meyering
2d2255272d * README-hacking: Update to reflect that we now use git. 2007-02-20 22:42:56 +01:00
Jim Meyering
4cf919bcdf Now that we use GIT, not cvs, rename README-cvs.
* README-hacking: Renamed from...
* README-cvs: ...this.
2007-02-20 22:37:18 +01:00
Jim Meyering
d7226387a9 * src/env.c (main): When invoked with no arguments (i.e. when printing
the environment), use a local variable to iterate through the global
"environ" array, rather than "environ" itself.  This is solely to
avoid changing the environment for an LD_PRELOAD-substituted "puts"
or "exit" function.  Tiny patch by Harvey Eneman.  See
<http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/9735>.
* THANKS: Update.
2007-02-20 17:23:51 +01:00
Jim Meyering
dd99d05b4a * bootstrap: Move definitions of temporary directory names and the
new bt_regex "up" to precede all uses, so it's clearer what their
scope is.  Also, use [.], rather than \\., since the former works
even if eval'd.
2007-02-20 17:20:22 +01:00
Jim Meyering
fd32ffb4da * bootstrap: Remove occurrences of $bt (._bootmp) from lib/Makefile.
Based on the bison 2007-02-19 change by Joel E. Denny.
2007-02-20 17:08:10 +01:00
Paul Eggert
c363fcb9f0 * NEWS: sort now uses a --compress-program option rather than
an environment variable.
* doc/coreutils.texi (sort invocation): Document this.
* src/sort.c (usage): Likewise.
(COMPRESS_PROGRAM_OPTION): New const.
(long_options, create_temp, main): Support new option.
* tests/misc/sort-compress: Test it.
2007-02-19 22:11:18 +01:00
Jim Meyering
e189deb855 * bootstrap: Fix typo s/dowloading/downloading/ in --help output. 2007-02-19 18:44:21 +01:00
Jim Meyering
aeb892e592 Add to .cvsignore and .gitignore files. 2007-02-18 22:40:52 +01:00
Jim Meyering
6819756293 Rely on gnulib-generated stdlib.h, not exit.h.
* src/system.h: Don't include exit.h, now that it's subsumed
by the gnulib-generated stdlib.h.
* lib/xfts.c: Include <stdlib.h> rather than exit.h, now that stdlib.h
2007-02-18 22:34:37 +01:00
Jim Meyering
c95bb0c6f0 * tests/rm/fail-eacces: Skip this test when running as root.
Reported by Matthew Woehlke.
2007-02-18 17:40:06 +01:00
Jim Meyering
d07d81df27 * bootstrap: Use "._bootmp" as the temporary directory name,
not ".#bootmp".  The latter's "#" caused trouble with the new,
gnulib-added "LINK_WARNING_H = $(top_srcdir)/.#bootmp/..." line.
2007-02-18 12:06:01 +01:00
Paul Eggert
516f42ab40 * bootstrap.conf (gnulib_modules): Add c-strcase. Remove strcase.
* src/dircolors.c: Include c-strcase.h.
(dc_parse_stream): Use c_strcasecmp rather than
strcasecmp to avoid unreliable results in locales like Turkish
where strcasecmp is incompatible with the C locale.
2007-02-15 08:16:30 +01:00
Jim Meyering
d163cd681a Also check for and print stderr output, in case a program fails.
* tests/misc/tty-eof: Occasionally (not reproducible), this
test would fail, with one or more programs exiting nonzero, e.g.,
tty-eof: sha224sum exited with status 1 (expected 0)
Now, maybe we'll get a clue, the next time that happens.
2007-02-13 22:27:27 +01:00
Jim Meyering
0d8ca457b3 * .x-sc_useless_cpp_parens: Ignore a false-positive in a shell script. 2007-02-12 20:09:12 +01:00
Jim Meyering
e152d05d82 * tests/misc/pwd-unreadable-parent: Skip the test if we're
definitely using the replacement.
* tests/misc/Makefile.am (TESTS_ENVIRONMENT): Define CONFIG_HEADER.
2007-02-12 01:20:20 +01:00
Jim Meyering
a09b047947 Remove excess leading spaces that would make help2man misbehave.
* src/printf.c (usage): Remove excess spaces on 2nd line of %b desc.
* src/nl.c (usage): Remove excess spaces on 2nd line of pBRE desc.
* src/dd.c (usage): Remove excess spaces on 2nd line of sync desc.
* src/date.c (usage): Use two spaces after each optional flag, not one.
Reported by Thomas Huriaux in <http://bugs.debian.org/410407>.
2007-02-10 22:30:18 +01:00
Jim Meyering
bbb61fa617 * Makefile.maint (longopt_re): Relax the regexp, making square
brackets optional, so it matches the newly reported violations, too.
2007-02-10 16:17:41 +01:00
Jim Meyering
0c2d21d3f2 * src/csplit.c (usage): Use two spaces (not one) to separate
each option string from its description, so help2man formats
the derived man page properly.  Reported by Thomas Huriaux in
<http://bugs.debian.org/410407>.
* src/df.c (usage): Likewise.
* src/du.c (usage): Likewise.
* src/install.c (usage): Likewise.
* src/ls.c (usage): Likewise.
2007-02-10 16:15:34 +01:00
Jim Meyering
d282370566 Test for today's gnulib/lib/getcwd.c fix affecting pwd and readlink
* NEWS: Mention the bug fix.
* tests/misc/pwd-unreadable-parent: New file.
* tests/misc/Makefile.am (TESTS): Ad pwd-unreadable-parent.
2007-02-03 20:02:48 +01:00
Paul Eggert
b28a8851ed * NEWS: Document fix for cp --preserve=mode.
* src/copy.c (copy_internal): Omit the group- or other-writeable
permissions when creating a directory, to avoid a race condition
if the special mode bits aren't right just after the directory is
created.
* src/cp.c (make_dir_parents_private): Likewise.
* tests/cp/parent-perm-race: Test for the "cp --preserve=mode"
race fix in copy.c.
2007-02-03 18:45:46 +01:00
Paul Eggert
1c73876f5f * NEWS: Document fix for cp --parents.
* src/cp.c (make_dir_parents_private): Report the error sooner with
"cp --parents DIR/FILE DEST" when DIR is a non-directory, thus not
creating the directory, DEST/DIR.
* tests/cp/cp-parents: Test for the non-race-condition bug fixed
by the above change.
2007-02-03 18:12:11 +01:00
Jim Meyering
251f774621 * src/nl.c (proc_text): Use "NULL", not "(struct re_registers *) 0". 2007-02-02 08:57:47 +01:00
Jim Meyering
1d72903faf * src/c99-to-c89.diff: Make shred.c Index: and a/b prefixes
consistent, so this can be applied with patch -p0.
Reported by Matthew Woehlke.

* Makefile.maint (patch-check): Use patch with its -p2 option,
since that makes this check slightly more strict.
2007-02-02 01:22:58 +01:00
Jim Meyering
82276cbd2e * vc-list-files: Select column 2, not 3 (hg-0.9.3's manifest format
now has only two columns).
2007-01-30 23:07:38 +01:00
Paul Eggert
c5d2da8ac8 * coreutils.texi: @item -> @itemx to fix some typos. 2007-01-30 22:56:48 +01:00
Paul Eggert
31bb8a431a * coreutils.texi (mkdir invocation): Say how to set the file
permission bits of a parent directory with mkdir -p.
2007-01-30 22:54:34 +01:00
Jim Meyering
c544a36826 Document new syntax: "chown +0:+287 file", "chgrp +99 file"
* coreutils.texi (Disambiguating names and IDs): New section.
(chown invocation, chgrp invocation): Mention the new syntax
with an xref to the new section.
2007-01-29 18:09:57 +01:00
Jim Meyering
bbe4be0c9a Regenerate .cvsignore and .gitignore files. 2007-01-29 15:38:50 +01:00
Jim Meyering
449a3751d1 Plug a leak in ls.
* src/ls.c (print_dir): Don't leak a "DIR"+fd upon failure to
determine dev/inode or upon detecting a symlink loop.
2007-01-29 14:18:28 +01:00
Jim Meyering
e4eaba04dd * src/ls.c: Rename three global variables.
(cwd_file): Rename from 'files'.
(cwd_n_alloc): Rename from 'nfiles'.
(cwd_n_used): Rename from 'files_index'.
2007-01-29 14:06:45 +01:00
Jim Meyering
fc9b328ab4 Shave 8 bytes off the size of "struct fileinfo".
* src/ls.c (fileinfo): Put all members of type "bool" together.
2007-01-29 12:25:01 +01:00
Paul Eggert
c1f8d48387 Modify "ls" to sort its data faster, using the new gnulib mpsort
module rather than qsort.  This is particularly a win in
environments where strcoll is slow, since mpsort typically calls
strcoll less often than qsort does.
* bootstrap.conf (gnulib_modules): Add mpsort.
* src/ls.c: Include mpsort.h.
(sorted_file, sorted_file_alloc): New vars, for a new vector of
pointers to the file info, for speed.
(clear_files, extract_dirs_from_files, sort_files, print_current_files):
(print_many_per_line, print_horizontal, print_with_commas):
(calculate_columns): Set and use new vector.
(initialize_ordering_vector): New function.
2007-01-29 12:08:52 +01:00
Jim Meyering
e7420f9781 Regenerate .cvsignore and .gitignore files, and reflect recent removal
of string.h-related lib/*.h files
2007-01-27 00:09:28 +01:00
Paul Eggert
2b0483aa03 Adjust to today's change to gnulib, which added a module for
string.h to replace the little include files like strcase.h.
* src/dircolors.c: Don't include strcase.h.
* src/system.h: Don't include mempcpy.h, memrchr.h, stpcpy.h, strpbrk.h.
2007-01-26 23:58:37 +01:00
Jim Meyering
9140950afb * src/dd.c (advance_input_after_read_error): Change diagnostic to
say "invalid file offset" rather than "screwy file offset".
2007-01-26 16:37:37 +01:00
Jim Meyering
e0b3b059b2 * .x-sc_cast_of_argument_to_free: Remove this file.
* Makefile.am (EXTRA_DIST): Likewise.
2007-01-26 11:11:15 +01:00
Dan Hipschman
2d2a0c8311 * src/sort.c (create_temp): Remove superfluous access-X_OK
check.  find_in_path does this for us.
2007-01-25 21:56:32 +01:00
Jim Meyering
11b626c20f Remove usually-skipped test.
* tests/cp/open-perm-race: Remove this file.  It is subsumed
by parent-perm-race.
* tests/cp/Makefile.am (TESTS): Remove open-perm-race.
* tests/sort/Makefile.am: Regenerate.
2007-01-24 10:36:02 +01:00
Jim Meyering
a16f807d7e Pass "make distcheck" again.
* src/sort.c (usage): Split a diagnostic that had grown to be
longer than the C89 maximum of 509 bytes.
* .x-sc_cast_of_argument_to_free: New file.  Allow a cast in sort.c.
FIXME: this is just temporary, while we wait to remove the offending
access-calling code.
* Makefile.am (EXTRA_DIST): Add .x-sc_cast_of_argument_to_free.
* Makefile.maint (sc_cast_of_argument_to_free): Use the
canonical, $$($(CVS_LIST_EXCEPT)).
* m4/.gitignore, m4/.cvsignore, lib/.gitignore, lib/.cvsignore: Update.
2007-01-24 09:32:56 +01:00
Paul Eggert
a0b2bc8de7 * NEWS: New option sort -C, proposed by XCU ERN 127, which looks
like it will be approved.  Also add --check=quiet, --check=silent
as long aliases, and --check=diagnose-first as an alias for -c.
* doc/coreutils.texi (sort invocation): Document this.
Also, mention that sort -c can take at most one file.
* src/sort.c: Implement this.
Include argmatch.h.
(usage): Document the change.
(CHECK_OPTION): New constant.
(long_options): --check now takes an optional argument, and is now
treated differently from 'c'.
(check_args, check_types): New constant arrays.
(check): New arg CHECKONLY, which suppresses diagnostic if -C.
(main): Parse the new options.
* tests/sort/Test.pm (02d, 02d, incompat5, incompat6):
New tests for -C.
2007-01-24 09:06:57 +01:00
Jim Meyering
a0d74a99b7 Fix a typo.
* tests/misc/sort-compress: Use $abs_top_builddir, not $top_builddir.
* tests/misc/Makefile.am (TESTS_ENVIRONMENT): Likewise.
2007-01-24 08:54:51 +01:00
Jim Meyering
124adb3a19 Don't depend on "which".
* tests/misc/sort-compress (SORT): Use $abs_builddir, now which.
* tests/misc/Makefile.am (TESTS_ENVIRONMENT): Export top_builddir.
2007-01-24 00:34:54 +01:00
Dan Hipschman
054defae19 Test sort compression.
* tests/misc/Makefile.am: Add the test.
* tests/misc/sort-compress: New file containing the tests.
2007-01-24 00:27:01 +01:00
Jim Meyering
1f7d56fda5 * NEWS: sort temp file compression: tweak wording.
* src/sort.c (struct sortfile) [name]: Declare member to be const.
2007-01-24 00:22:45 +01:00
Dan Hipschman
f33168da95 * src/sort.c (MAX_FORK_RETRIES_COMPRESS, MAX_FORK_RETRIES_DECOMPRESS):
In pipe_fork callers, use these named constants, not "2" and "8".
(proctab, nprocs): Declare to be "static".
(pipe_fork) [lint]: Initialize local, pid,
to avoid unwarranted may-be-used-uninitialized warning.
(create_temp): Use the active voice.  Describe parameters, too.

2007-01-21  James Youngman  <jay@gnu.org>

Centralize all the uses of sigprocmask().  Don't restore an invalid
saved mask.
* src/sort.c (enter_cs, leave_cs): New functions for protecting
code sequences against signal delivery.
* (exit_cleanup): Use enter_cs and leave_cs instead of
calling sigprocmask directly.
(create_temp_file, pipe_fork, zaptemp): Likewise

2007-01-21  Dan Hipschman  <dsh@linux.ucla.edu>

Add compression of temp files to sort.
* NEWS: Mention this.
* bootstrap.conf: Import findprog.
* configure.ac: Add AC_FUNC_FORK.
* doc/coreutils.texi: Document GNUSORT_COMPRESSOR environment
variable.
* src/sort.c (compress_program): New global, holds the name of the
external compression program.
(struct sortfile): New type used by mergepfs and friends instead
of filenames to hold PIDs of compressor processes.
(proctab): New global, holds compressor PIDs on which to wait.
(enum procstate, struct procnode): New types used by proctab.
(proctab_hasher, proctab_comparator): New functions for proctab.
(nprocs): New global, number of forked but unreaped children.
(reap, reap_some): New function, wait for/cleanup forked processes.
(register_proc, update_proc, wait_proc): New functions for adding,
modifying and removing proctab entries.
(create_temp_file): Change parameter type to pointer to file
descriptor, and return type to pointer to struct tempnode.
(dup2_or_die): New function used in create_temp and open_temp.
(pipe_fork): New function, creates a pipe and child process.
(create_temp): Creates a temp file and possibly a compression
program to which we filter output.
(open_temp): Opens a compressed temp file and creates a
decompression process through which to filter the input.
(mergefps): Change FILES parameter type to struct sortfile array
and update access accordingly.  Use open_temp and reap_some.
(avoid_trashing_input, merge): Change FILES parameter like
mergefps and call create_temp instead of create_temp_file.
(sort): Call create_temp instead of create_temp_file.
Use reap_some.
(avoid_trashing_input, merge, sort, main): Adapt to mergefps.
2007-01-24 00:00:21 +01:00
Jim Meyering
590a3f5b08 * tests/misc/pwd-long: Work properly even when run from the
wrong one of two or more bind-mounted sibling directories.
Suggestion from Mike Stone in <http://bugs.debian.org/380552>.
2007-01-20 21:58:31 +01:00
Paul Eggert
bdbd5d31f8 Standardize on list of signals when an app catches signals.
* src/csplit.c (main): Also catch SIGALRM, SIGPIPE, SIGPOLL,
SIGPROF, SIGVTALRM, SIGXCPU, SIGXFSZ.
* src/ls.c (main): Likewise (except SIGPIPE was already caught).
Note that ls.c is special, as it also catches SIGTSTP.
* src/sort.c (main): Likewise.  Also catch SIGQUIT.  More details in
<http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/9510>.
2007-01-20 09:54:20 +01:00
Jim Meyering
3d63c453d5 [lib/ChangeLog]
* .cvsignore, .gitignore: Add sys, as well as more
bootstrap-inserted file names.
[m4/ChangeLog]
* .cvsignore, .gitignore: Add more bootstrap-inserted file names.
2007-01-19 23:28:03 +01:00
Dan Hipschman
e175f0d5b2 * src/sort.c (cleanup): Clear temphead at the end.
(exit_cleanup): New function.
(main): Don't invoke atexit until we're ready.
Invoke it with exit_cleanup, not with cleanup and close_stdout,
to avoid a race condition with cleanup and signal handling.  More
details: http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/9508
2007-01-19 23:03:18 +01:00
Jim Meyering
fd77348fef * coreutils.texi (ls: General output formatting): Mention the
workarounds to accommodate the Apple Terminal bug.
2007-01-19 12:10:04 +01:00
Jim Meyering
03b1e07ae0 * src/c99-to-c89.diff: Adjust remove.c offsets. 2007-01-18 10:18:02 +01:00
Jim Meyering
0928c2414a Make "rm --interactive=never ..." never prompt.
* NEWS: Mention this.
* src/remove.h (enum rm_interactive): New ternary type.
(struct rm_options) [interactive]: Use it, here -- rather than bool.
* src/remove.c (prompt): Reflect type change.
* src/mv.c (rm_option_init): Initialize to RMI_NEVER now.
* src/rm.c (main): Add a FIXME comment for '-d' option.
Adapt to type change of rm_options.interactive.

* tests/rm/i-never: New file.  Test for the above fix.
* tests/rm/Makefile.am (TESTS): Add i-never.
2007-01-17 17:15:20 +01:00
Jim Meyering
d1ad73e0bf * bootstrap (gnulib_tool): When adding to .cvsignore and .gitignore,
emit foo.h, for each foo_.h.  This yields one false-positive, fts.h,
but that's ok, since fts_.h will eventually be renamed.
2007-01-15 11:31:51 +01:00
Jim Meyering
1e23a1785a * src/remove.c (remove_dir): Don't use errno in diagnostic.
Root-only test failure reported by Alex van Hout and Jon Grosshart in
<http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/9415/focus=9415>.
2007-01-15 10:39:32 +01:00
Jim Meyering
54050ea91d * bootstrap.conf (avoided_gnulib_modules): Fix my typo:
s/--avoid=canonicalize-lgpl/--avoid=canonicalize-gpl/
2007-01-15 10:32:09 +01:00
Jim Meyering
aa5a4fc172 * fchdir-stub.c: Remove file. No longer needed. 2007-01-14 17:18:51 +01:00
Bruno Haible
bb4112b407 Enable use of gnulib's new fchdir module.
* bootstrap.conf (avoided_gnulib_modules): Avoid canonicalize-lgpl,
since we use canonicalize.
(gnulib_modules): Add fchdir.
* m4/jm-macros.m4 (coreutils_MACROS): Remove fchdir-stub.
2007-01-14 17:15:49 +01:00
Jim Meyering
9c88531fb0 Put CU_TEST_NAME in the environment for each test run by "make check".
* Transform all Makefile.am files so that when running "make check",
CU_TEST_NAME is set to the name of the test.  This is so that when I
run valgrind-enabled (--log-file-qualifier=CU_TEST_NAME) "make check"
on the entire package it is more convenient to map a leak or error
found in a valgrind log file back to the offending test.
Use this command:
(echo tests/Makefile.am.in; find tests -name Makefile.am) \
 |xargs perl -pi -e '/^(\s*)PATH=...VG_PATH_PREFIX/ and ' \
   -e 'print $1,q|CU_TEST_NAME=`basename $(abs_srcdir)`,$$tst |,"\\\n"'
2007-01-13 11:32:19 +01:00
Jim Meyering
9afcb30571 Regenerate .cvsignore and .gitignore files. 2007-01-13 11:22:01 +01:00
Jim Meyering
4e2fd4cca6 Avoid a leak in expr's implementation of the ":" (match) operator.
* src/expr.c (docolon): Free the regexp buffer using regfree, rather
than doing it manually, being careful to set fastmap to NULL first.
Free any re_regs.start and .end members, if necessary.
2007-01-11 19:31:27 +01:00
Jim Meyering
c6357f0cab * tests/misc/test-diag: Work also when libc's error function
reports the entire program name ("../../src/test"), rather than
just the final component.
2007-01-11 18:59:24 +01:00
Jim Meyering
fbcbba4b94 Merge branch 'master' of /cu 2007-01-11 14:50:09 +01:00
Jim Meyering
48545b5756 trivial merge 2007-01-11 14:49:19 +01:00
Jim Meyering
b5f1873022 Don't use fts_statp uninitialized for "chown -RLh --preserve-root ...".
* src/chown-core.c (FTSENT_IS_DIRECTORY): New macro.
(change_file_owner): Perform the ROOT_DEV_INO_CHECK only for a
directory.  Non-directory entries lack fts_statp data when using
the FTS_NOSTAT option.
2007-01-10 22:00:44 +01:00
Jim Meyering
dad7d86d57 * tests/sample-test: Update copyright date to 2007.
* Makefile.maint (copyright-check): Also check the copyright date
in tests/sample-test.
2007-01-07 18:38:56 +01:00
Jim Meyering
bce110cdd5 * tests/fmt/basic (pfx-only, pfx-of-pfx): New tests,
based on examples from G.P. Halkes in
<http://article.gmane.org/gmane.comp.gnu.core-utils.bugs/9388>.
2007-01-06 10:42:17 +01:00
G.P. Halkes
37bcc27707 * src/fmt.c (copy_rest): Correct prefix handling.
Don't elide a line with the prefix followed by only white space.
(get_line): Move EOF-check to loop-termination condition.
* tests/fmt/basic (pfx-1): Adjust test to expect desired result.
(pfx-2): Remove test; its premise was contrary to the documentation.
2007-01-06 09:49:47 +01:00
Jim Meyering
ab58de37e6 Avoid a used-uninitialized bug for invalid input, i.e., when the size
of the input, not counting newlines, is 1 % 4.
* gl/lib/base64.c (base64_decode): Don't hard-code inlen==4.
It may be smaller when flushing.
2007-01-05 12:30:51 +01:00
Mike Frysinger
4082e3be7c * src/dircolors.hin: Add a TERM directive for cons25. 2007-01-05 09:52:10 +01:00
Jim Meyering
11bcfcc72a Use the release year, not the current year.
* src/groups.sh (version): Use a better name: @RELEASE_YEAR@.
* src/Makefile.am (RELEASE_YEAR): Define it.
(.sh): Use it.
Thanks to a prod from Eric Blake.
2007-01-04 15:34:29 +01:00
Jim Meyering
aa6a5547b3 Ensure that "group --version" always prints the current year.
* src/groups.sh (version): Use @CURRENT_YEAR@, rather than 2006.
* src/Makefile.am (.sh): Also substitute for @CURRENT_YEAR@.
Suggestion from Eric Blake.
2007-01-04 14:55:42 +01:00
Jim Meyering
c8e51ae68a * Makefile.cfg (local-checks-to-skip): Skip strftime-check, in
case you don't have convenient access to glibc info documentation.
2007-01-04 12:08:36 +01:00
Jim Meyering
2ed0544df4 .cvsignore, .gitignore: Add fchownat.c and wctype-related files. 2007-01-04 12:01:48 +01:00
Jim Meyering
3b933f1e33 [ChangeLog]
When decoding, always allow newlines in input, with almost no
performance impact.
* src/base64.c (do_decode): Initialize decode context.
Call base64_decode one more time, after all input is processed.
(usage): When decoding, newlines are always accepted.

* tests/misc/base64: Add a bunch of tests, for the above.
* gl/lib/base64.c: Include <string.h>.
(base64_decode_ctx_init, get_4, decode_4): New functions.
(base64_decode): Efficiently handle interspersed newlines.
(base64_decode_alloc): Update signature.
* gl/lib/base64.h (struct base64_decode_context): Define.
(base64_decode_ctx_init): Add prototype.
(base64_decode, base64_decode_alloc): Update prototypes.
[doc/ChangeLog]
* coreutils.texi (base64 invocation): When decoding, newlines
are always accepted.
2007-01-04 11:52:52 +01:00
Jim Meyering
99d9e13b9c * gl/lib/base64.c: Copied from gnulib.
* gl/lib/base64.h: Likewise.
2007-01-04 11:36:54 +01:00
Evan Hunt
419aa62c46 [oops] Document what the ".0" in e.g., "-k 2,3.0" means, and...
* coreutils.texi (sort invocation): ... that it can be applied to the
field-end spec, but not the field-start one.  Patch from Evan Hunt.

Signed-off-by: Jim Meyering <jim@meyering.net>
2007-01-03 12:24:35 +01:00
Evan Hunt
482366105a Document what the ".0" in e.g., "-k 2,3.0" means, and...
* coreutils.texi (sort invocation): ... that it can be applied to the
field-end spec, but not the field-start one.  Patch from Evan Hunt.

Signed-off-by: Jim Meyering <jim@meyering.net>
2007-01-03 12:04:24 +01:00
Bruno Haible
f28e07f81d Avoid spurious test failures on MacOS X 10.3.9, in a German locale.
* tests/chown/deref: Apply lang-default.
* tests/misc/split-a: Likewise.
* tests/mv/reply-no: Likewise.

Signed-off-by: Jim Meyering <jim@meyering.net>
2007-01-03 10:51:37 +01:00
Bruno Haible
8563b4c051 * src/copy.c (copy_internal): Use mkfifo as a fallback if mknod fails.
Needed on MacOS X.

Signed-off-by: Jim Meyering <jim@meyering.net>
2007-01-03 10:46:25 +01:00
Paul Eggert
f0b5e513d9 Now, "ls -FRL" always follows symbolic links on Linux.
* NEWS: Mention this bug fix.
* src/ls.c (gobble_file): Fix bug reported by
Nobuyuki Tsuchimura in
http://lists.gnu.org/archive/html/bug-coreutils/2006-12/msg00152.html
where "ls -FRL" didn't follow a symbolic link in some cases on Linux.
* tests/ls/follow-slink: Add a test for this case.

Signed-off-by: Jim Meyering <jim@meyering.net>
2007-01-02 07:27:22 +01:00
Jim Meyering
3b8560a637 * tests/rm/fail-eperm: Instead, simply transform the actual output diagnostic.
Test failure reported by Bob Proulx.
2007-01-01 10:56:01 +01:00
Jim Meyering
b5ef9617c4 * tests/rm/fail-eperm: Revert last change. The PATH=... setting
is not honored at least on HP-UX 11.23 systems.
2007-01-01 09:51:43 +01:00
Jim Meyering
747e7a8da8 * bootstrap (gnulib_extra_files): Remove announce-gen.
* bootstrap.conf (gnulib_modules): Add it here instead, now that
it's a module.
2006-12-30 22:16:35 +01:00
Jim Meyering
d2ec687c1c * tests/misc/base64: Factor a long, repetitive string. 2006-12-30 17:46:09 +01:00
Jim Meyering
457b4e69f5 * src/c99-to-c89.diff: Adjust remove.c offsets. 2006-12-30 16:19:26 +01:00
Jim Meyering
d08d66ebc6 Clean up after the change of 2006-12-28.
* src/remove.c (AD_pop_and_chdir): Change **DIRP parameter to *DIRP,
now that this function never modifies the pointer.  Adjust comments
and code accordingly.
(remove_dir): Set "dirp" to NULL right after AD_pop_and_chdir call,
now that AD_pop_and_chdir no longer does that.
2006-12-30 16:12:23 +01:00
Jim Meyering
5017d1b4e1 * tests/rm/fail-eperm: Avoid spurious differences (the error function
from latest glibc no longer prints the full program_name): so don't
invoke rm via ../../src/rm.  Instead, invoke it via "PATH=../../src rm".
2006-12-30 12:50:43 +01:00
Jim Meyering
841d9a7d5d * tests/mv/acl (skip): Skip this test also if the destination
directory, which is on a different file system, lacks ACL support.
2006-12-30 11:49:04 +01:00
Jim Meyering
67b9752cd1 * src/copy.c (copy_reg): Rewrite a comment that was rendered
inaccurate by the 2006-10-18 change.
2006-12-30 09:34:31 +01:00
Jim Meyering
88891aef7e When moving "up" the hierarchy, be careful to remove a just-emptied
directory before opening ".", to avoid trouble with file system
implementations that cache readdir results at opendir-time.
* src/remove.c (AD_pop_and_chdir): Add a file descriptor parameter.
Don't update **DIRP.  Don't call fdopendir here.
(remove_dir): Call fdopendir here instead.
Report and patch from Mikulas Patocka:
<http://lists.gnu.org/archive/html/bug-coreutils/2006-12/msg00170.html>
2006-12-28 19:37:07 +01:00
Jim Meyering
bbcfef38a3 Remove 2006-12-24 entry (the corresponding change was never committed).
The underlying problem was fixed on 2006-12-26, by requiring a new-enough
version of autoconf.
2006-12-28 09:25:26 +01:00
Jim Meyering
2eea35fcf2 * src/tail.c (usage): Mention +N for --bytes and --lines.
Suggestion from Evan Hunt.
2006-12-27 16:00:15 +01:00
Jim Meyering
f20cd37e51 * configure.ac: Require autoconf-2.61 and automake-1.10.
Without the former (even with autoconf-2.60), "make distcheck"
would fail (without the 2006-09-26 autoconf AC_CHECK_DECL fix),
due to an inttypes.h generated with CFLAGS including -pedantic.
With the old decl check, @HAVE_DECL_STRTOUMAX@ would be 0.
2006-12-27 11:27:54 +01:00
Jim Meyering
4b9e987554 * Makefile.maint (VC-tag): Define, so as to gpg-sign each release
tag, using the release version number as the message.
(vc-dist): Use $(VC-tag), rather than "$(VC) tag".

2006-12-24  Jim Meyering  <jim@meyering.net>

* Makefile.maint (my-distcheck): Don't *configure* with
restrictive CFLAGS ('-Werror -ansi -pedantic -Wno-long-long'),
since it ends up provoking errors in generation of inttypes.h
on an Ubuntu edgy-based system.  That leads to compilation
failure due to e.g., imaxabs redefinition.
Instead, configure with default CFLAGS, and compile the
package with restrictive CFLAGS.
2006-12-26 16:42:33 +01:00
Paul Eggert
f24ff8f42b * NEWS: dd bs= operands now silently override later ibs= and obs=,
as POSIX requires.
* src/dd.c (scanargs): Implement it.
* tests/dd/misc (outbytes): Test it.
* doc/coreutils.texi (dd invocation): Specify that bs=N
overrides later ibs and obs, undoing part of the
previous change.  (The behavior was wrong.)
2006-12-22 10:09:37 +01:00
Jim Meyering
699188aa87 * coreutils.texi (dd invocation): Specify that bs=N overrides only any
_preceding_ ibs and obs settings.  Spotted by Andreas Schwab.
2006-12-21 11:13:48 +01:00
Jim Meyering
a828a78563 * Makefile.maint (patch-check): Fix shell quoting. 2006-12-21 11:05:16 +01:00
Jim Meyering
2d4cd37758 * coreutils.texi (dd invocation): Add to the description of cbs. 2006-12-21 10:24:51 +01:00
Jim Meyering
f0ee72aa01 * coreutils.texi (dd invocation): Improve the documentation
for bs, ibs, obs, and cbs.  Suggestion from Dan Jacobson.
Patch by Olivier Delhomme.
2006-12-21 10:18:58 +01:00
Jim Meyering
c8ef95eaed "rm -rf /etc/motd" (run by non-root) now prints a diagnostic.
* src/remove.c (remove_entry): Handle EACCES for a non-directory, too.
Karl Berry reported that a cross-partition "mv /etc/issue ~"
failed with the um,... suboptimal diagnostic,
"mv: cannot remove `/etc/issue': Not a directory".
* tests/rm/Makefile.am (TESTS): Add fail-eacces.
* tests/rm/fail-eacces: New file.
* NEWS: Mention that both mv and rm are affected.
2006-12-21 08:58:11 +01:00
Jim Meyering
d69fc66d81 "cut -f 2- A B" no longer triggers a double-free bug
* src/cut.c (cut_fields): Set file-scoped global to NULL after
freeing it.  This avoids a double-free (and core dump on some systems)
for this usage: "echo 1>a; echo 2>b; cut -f2- a b".  Reported by
James Hunt in <http://bugzilla.redhat.com/220312>.
* NEWS: List this bug fix.
* THANKS: Mention him.
* tests/misc/cut: New file.
* tests/misc/Makefile.am (TESTS): Add cut.
2006-12-20 14:25:55 +01:00
Jim Meyering
4e48b4ce33 * tests/cp/open-perm-race: Correct the gdb-existence check.
Don't run either subsequent gdb command in a sub-shell.
Reported by Thomas Schwinge.
* THANKS: bring up to date.
2006-12-15 10:43:20 +01:00
Paul Eggert
6f005c8491 Make sure cp -p isn't too generous with file permissions.
* tests/cp/Makefile.am (TESTS): Add file-perm-race.
* tests/cp/file-perm-race: New file.
Signed-off-by: Jim Meyering <jim@meyering.net>
2006-12-15 09:50:40 +01:00
Paul Eggert
6f3efa15eb Ensure cp -pR --parents isn't too generous with parent permissions.
* tests/cp/Makefile.am (TESTS): Add parent-perm-race.
* tests/cp/parent-perm-race: New file.
Signed-off-by: Jim Meyering <jim@meyering.net>
2006-12-15 09:44:58 +01:00
Jim Meyering
33de42f2a8 * tests/chgrp/default-no-deref: Don't assume that files are created
with the primary group by default.  That's not true in a directory
with the set-GID bit set.
2006-12-14 21:07:49 +01:00
Jim Meyering
c97742932a Don't hang when there's no input tty.
* tests/cp/open-perm-race: Skip this test if there is no
controlling input `terminal'.
2006-12-14 19:32:10 +01:00
Jim Meyering
a6a1e73c0a Test for a hard-to-detect race fix, using gdb.
* tests/cp/open-perm-race: New file, to test for the
cp --preserve=ownership fix of 2006-12-06.
* tests/cp/Makefile.am (TESTS_ENVIRONMENT): Define abs_top_builddir.
(TESTS): Add open-perm-race.
2006-12-14 17:17:31 +01:00
Jim Meyering
c3154b2947 chgrp, chown: Don't prohibit -RLh, aka -RL with --no-dereference.
* src/chgrp.c (main): Don't prohibit -RLh, aka -RL with --no-dereference.
* src/chown.c (main): Likewise.
* src/chown-core.c (change_file_owner): Add to a comment.
* tests/chown/preserve-root: Add tests.
* doc/coreutils.texi (Treating / specially): With --preserve-root,
chgrp and chown will not modify "/", even through a symlink.
2006-12-14 15:41:50 +01:00
Jim Meyering
24852bf5b5 * NEWS: --preserve-root now works with chgrp, chmod, and chown.
* src/chmod.c (process_file): Do honor the --preserve-root option.
* src/chown-core.c (change_file_owner): Likewise, but here, also
handle the case in which a traversal would go "through" a symlink
to root.  Reported by Matthew M. Boedicker
* tests/chown/preserve-root: Test for the above.
* tests/chown/Makefile.am (TESTS): Add preserve-root.
2006-12-14 11:14:25 +01:00
Jim Meyering
56007809c3 * coreutils.texi: Remove two doubled words. 2006-12-14 09:15:51 +01:00
Jim Meyering
629214eaf8 * NEWS: Mention the chmod fix induced by the recent change to gnulib's openat.m4. 2006-12-14 00:22:50 +01:00
Andreas Schwab
ae3f43d3eb Don't fail if mv/acl test succeeds.
* tests/mv/acl (skip): Check for acl support in the file system.
* tests/mv/Makefile.am (XFAIL_TESTS): Remove.
(TESTS_ENVIRONMENT): Pass CONFIG_HEADER.
Signed-off-by: Jim Meyering <jim@meyering.net>
2006-12-13 22:26:23 +01:00
Paul Eggert
ec95137cc3 Remove some arbitrary restrictions on size fields,
so that commands like "sort -k 18446744073709551616" no longer fail merely
because 18446744073709551616 doesn't fit in uintmax_t.  The trick is that
these fields can all be treated as effectively infinity;  their exact
values don't matter, since no internal buffer can be that long.
* src/join.c (string_to_join_field): Verify that SIZE_MAX <= ULONG_MAX
if the code assumes this.  Silently truncate too-large values to SIZE_MAX,
as the remaining code will do the right thing in this case.
* src/sort.c (parse_field_count): Likewise.
* src/uniq.c (size_opt, main): Likewise.
* tests/join/Test.pm (bigfield): New test.
* tests/sort/Test.pm (bigfield): New test.
* tests/uniq/Test.pm (121): New test.
Signed-off-by: Jim Meyering <jim@meyering.net>
2006-12-13 22:03:54 +01:00
Jim Meyering
ae3ee95eb8 * tests/chgrp/default-no-deref: New test.
* tests/chgrp/Makefile.am (TESTS): Add default-no-deref.
2006-12-13 13:28:17 +01:00
Jim Meyering
a6895a8da2 * jm-macros.m4: Remove AC_FUNC_SETVBUF_REVERSED, now that it's a no-op. 2006-12-12 14:41:30 +01:00
Jim Meyering
8d550c12b8 * src/system.h (SETVBUF): Remove definition, now that the
autoconf macro, AC_FUNC_SETVBUF_REVERSED, does nothing.
* src/tee.c (tee_files): s/SETVBUF/setvbuf/.
* src/od.c (open_next_file): Likewise.
2006-12-12 14:34:23 +01:00
Jim Meyering
0ee9adb1fa * man/Makefile.am (.x.1): Make help2man use $(PACKAGE_STRING) as the
"source".  I.e. "GNU coreutils 6.7".
2006-12-09 19:20:56 +01:00
Jim Meyering
0473e718e6 * NEWS: With the change from "-pre" to "-dirty" suffix, also change
from NEXT_VER-pre to CUR_VER-dirty.  So, this is 6.7-dirty.
* configure.ac (AC_INIT): s/6.8-dirty/6.7-dirty/.
2006-12-09 15:57:06 +01:00
Jim Meyering
dab023dec1 * tests/uniq/Test.pm (test_vector): Skip the pipe-reading test
whenever uniq is expected to fail.  This should catch the other case
[test #112] in which uniq emits "cat: write error: Broken pipe" on
some systems.
2006-12-09 14:17:00 +01:00
Jim Meyering
939c480a79 Include bootstrap tool version info in the announcement form.
* Makefile.maint (gnulib_snapshot_date): Define.
(announcement): Use two new announce-gen options,
--bootstrap-tools and --gnulib-snapshot-date.
* Makefile.cfg (gnulib_dir): Set.
2006-12-08 10:28:05 +01:00
Jim Meyering
07af816554 Post-release version change.
* NEWS: Add a line for 6.8-dirty.
* configure.ac (AC_INIT): Set new version string.
2006-12-08 08:28:04 +01:00
Jim Meyering
6b49da0dc3 .prev-version: Record previous version: 6.7. 2006-12-08 00:19:29 +01:00
Jim Meyering
f044d2d51c Version 6.7.
* NEWS: Record release date.  Remove '-pre' suffix.
* configure.ac (AC_INIT): Remove version string suffix.
2006-12-08 00:03:00 +01:00
Jim Meyering
565b165115 * tests/touch/empty-file: Use envvar-check, so "make check" doesn't
evoke diagnostics like this when COLUMNS=0 in the environment:
ls: ignoring invalid width in environment variable COLUMNS: 0
* tests/touch/no-rights: Likewise.
* tests/help-version: Likewise.
2006-12-07 10:11:40 +01:00
Jim Meyering
9f1b96313e Make the output of "make check" more reproducible.
* tests/uniq/Test.pm: Don't perform the pipe-reading version of test
118, since it emits "cat: write error: Broken pipe" on some systems.
2006-12-07 10:04:04 +01:00
Paul Eggert
fc92148eac cp -p now clears special bits if it fails to preserve owner or group
* NEWS: Document the cp -p fix for special bits.
* src/copy.c (set_owner): Now returns a three-way result, so
that the caller can clear the special bits.  All callers changed.
(copy_reg): Don't set the special bits if chown failed.
(copy_internal): Likewise.
* tests/cp/special-bits: Test this fix.
Signed-off-by: Jim Meyering <jim@meyering.net>
2006-12-07 08:10:35 +01:00
Paul Eggert
a4f7b723f0 * NEWS: Document the cp --preserve=ownership fix.
* m4/jm-macros.m4 (coreutils_MACROS): Check for fchmod.
* src/copy.c (fchmod_or_lchmod): New function.
(copy_reg): New arg OMITTED_PERMISSIONS.  All uses changed.
Omit confusing and unused ", dst_mode" arg to 'open' without O_CREAT.
When creating a file, use O_EXCL, so we're more likely to detect
funny business by other processes.  At the end, if permissions
were omitted, chmod them back in.
(copy_internal): If the ownership might change, omit some permissions
at first, then restore them after chowning the file.
* src/cp.c (make_dir_parents_private): Likewise.
* src/copy.c (cached_umask): New function.
* src/copy.h (cached_umask): New decl.
2006-12-06 20:44:08 +01:00
Jim Meyering
e7f7dcb9d1 Make the output of "make check" more reproducible.
* tests/misc/date-sec: Don't emit any diagnostic about sleeping.
2006-12-06 16:36:29 +01:00
Jim Meyering
545df07893 NEWS: the du bug affects coreutils-6.4, 6.5 and 6.6. 2006-12-06 13:18:43 +01:00
Paul Eggert
8406e92795 install.c: Preserve time stamps before changing owner or file mode bits,
for consistency with other coreutils programs.
2006-12-04 10:06:11 +01:00
Jim Meyering
1ea616697a * Makefile.am (libcoreutils_a_SOURCES): Remove xmemcoll.c and
xmemcoll.h.  Now, they're handled by the gnulib xmemcoll module.
2006-12-03 19:42:26 +01:00
Jim Meyering
5e585ffe84 * tests/misc/date-sec: Output a fixed string. 2006-12-03 16:01:41 +01:00
Jim Meyering
370370c8e4 Add "Reported by" 2006-12-03 11:32:31 +01:00
Jim Meyering
ba45154d8e * NEWS: du --one-file-system (-x) would skip subdirectories of any
directory listed as second or subsequent command line argument.
* tests/du/one-file-system: New file.  Test for today's fts.c fix.
* tests/du/Makefile.am (TESTS): Add one-file-system.
2006-12-03 11:17:35 +01:00
Jim Meyering
6e7e2709c8 * tests/du/basic: Generate 4KB file simply using printf, rather than
seq+head.  This avoids a spurious "Broken pipe" diagnostic from seq.
2006-12-02 22:04:13 +01:00
Jim Meyering
aa0fb1e032 * perm.texi (Mode Structure): Fix typo: s/setgid/setuid/.
Reported by Georg Neis as Debian bug 400778.
2006-11-28 23:03:08 +01:00
Jim Meyering
1ddf7faf11 * tests/mv/no-target-dir: Detect a buggy rename syscall. If found,
skip this test.  This happens at least on ia64 linux-2.4.19 w/ext3.
Reported by Matthew Woehlke.
2006-11-28 13:36:37 +01:00
Jim Meyering
db7092bed3 * tests/mv/dir2dir: Also accept EBUSY.
Reported by Matthew Woehlke.
2006-11-28 09:21:00 +01:00
Jim Meyering
97136cb93f * Makefile.maint (patch-check): Rewrite to diagnose failure.
* src/c99-to-c89.diff: Adjust shred.c offsets.
2006-11-27 14:38:35 +01:00
Paul Eggert
9b06af3367 Improve the check for departures from C89, and fix the departures
I found.
* Makefile.maint (my-distcheck): Also check for C89 compatibility
as best we can with GCC.
* src/stat.c (PRINTF_OPTION): Omit comma before } in enum
declaration; C89 doesn't allow this.
* src/dcgen: Don't generate string literals longer than
what C89 requires support for.
* src/cut.c (usage): Don't use string literals longer than
what C89 requires support for.
* src/date.c (usage): Likewise.
* src/dd.c (usage): Likewise.
* src/du.c (usage): Likewise.
* src/ls.c (usage): Likewise.
* src/od.c (usage): Likewise.
* src/readlink.c (usage): Likewise.
* src/seq.c (usage): Likewise.
* src/shred.c (usage): Likewise.
2006-11-27 11:27:46 +01:00
Mike Frysinger
a45772d52d recognize new archive, audio, image formats; give audio files a separate color
* src/dircolors.hin: Add comments for common .sh and .csh scripts.
Add .bz2, .tbz2, .tz, .rar, .ace, .zoo, .cpio, .7z, .rz as archive
suffixes.  Add .mng, .pcx, .m2v, .mkv, .ogm, .mp4, .m4v, .mp4v, .vob,
.qt, .nuv, .wmv, .asf, .rm, .rmvb, .flc, .yuv as image formats.
Add .aac, .au, .mid, .midi, .mka, .ra as audio suffixes.  Change
audio color to 00;36 to differentiate from image/video color.
2006-11-27 08:58:40 +01:00
Jim Meyering
a43ee65ee5 * Makefile.maint (patch-check): Compile patched sources with
CFLAGS='-Wdeclaration-after-statement -Werror', to ensure that
no violations remain.
2006-11-26 18:51:27 +01:00
Jim Meyering
549bbdf7b4 * src/c99-to-c89.diff: Remove 3 bogus hunks. 2006-11-26 18:49:55 +01:00
Jim Meyering
5e2f415d17 * src/remove.c (fd_to_subdirp): Remove unused parameter, ds.
Update callers.
2006-11-26 18:47:54 +01:00
Jim Meyering
d6a37dfa3b * src/c99-to-c89.diff: Adjust for changes in rm.c and in remove.c. 2006-11-26 18:42:56 +01:00
Jim Meyering
8ec7811e82 * src/rm.c (main): Remove unnecessary (assuming C99) braces. 2006-11-26 18:35:38 +01:00
Jim Meyering
08dcc35470 Reflect that these are Paul's changes. I've divided them into separate
deltas.

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
2006-11-26 17:41:00 +01:00
Paul Eggert
17a7d2c81b Port parts of the code to C89 to minimize the need for c99-to-c89.diff,
while trying to retain the readability of C99 as much as possible.
* src/remove.c (close_preserve_errno): Remove.
(fd_to_subdirp): Rewrite to avoid the need for decl after statement.

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
2006-11-26 17:40:38 +01:00
Paul Eggert
a23c91026d * src/remove.c (rm): Move cycle_check_init call into callee...
Use an else clause in place of a "continue" statement.

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
2006-11-26 17:40:37 +01:00
Paul Eggert
1ce71652fc * src/remove.c (AD_ensure_initialized): New function.
after statement.

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
2006-11-26 17:40:16 +01:00
Paul Eggert
1b95d5ee81 * src/remove.c (AD_pop_and_chdir): Return prev_dir rather than storing through
a pointer argument.  All uses changed.

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
2006-11-26 17:39:53 +01:00
Paul Eggert
6b7c67ad88 * src/remove.c (cache_stat_init): Return its argument, for convenience.
Update the caller in remove_dir.

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
2006-11-26 17:39:27 +01:00
Paul Eggert
02e24f2593 * src/remove.c (rm_1): Remove decl of local, fd_cwd.
Replace each of two uses with literal AT_FDCWD.

Signed-off-by: Paul Eggert <eggert@cs.ucla.edu>
2006-11-26 17:38:09 +01:00
Jim Meyering
5891b7ce21 * Makefile.am (EXTRA_DIST): Remove announce-gen from here, too. 2006-11-25 19:16:26 +01:00
Theodoros V. Kalamatianos
c8092e5db0 * tests/du/inacc-dest: Skip this test when running as root. 2006-11-24 22:08:33 +01:00
Jim Meyering
8cafe0070a Add announce-gen to build-aux/.*ignore files. 2006-11-23 16:31:18 +01:00
Jim Meyering
d0275e280e * announce-gen: Remove file. It's moving to gnulib.
* bootstrap: Pull it from gnulib/build-aux instead.
* Makefile.maint (announcement): Reflect move to ./build-aux.
2006-11-23 16:28:49 +01:00
Jim Meyering
37012effc9 * tests/du/deref-args: Use "printf %65536s x" to create a 64KB file,
rather than a pipeline that would sometimes evoke a diagnostic
like "seq: write error: Broken pipe".
2006-11-23 09:09:53 +01:00
Jim Meyering
a409011bba * tests/help-version: Suppress dd transfer rate output. 2006-11-23 09:02:36 +01:00
Jim Meyering
a3ae3e8085 * configure.ac (AC_INIT): Bump to 6.7-pre, not 6.6-pre. 2006-11-23 01:12:22 +01:00
Paul Eggert
3ccd02d5b9 * randread.c (__attribute__): Don't define if __attribute__ is already defined.
Otherwise, the code won't conform to C99, since
the macro arg is spelled differently by some include file, and the
compilation fails with pedantic GCC.
2006-11-23 01:06:42 +01:00
Jim Meyering
5272c6daa1 * announce-gen (print_news_deltas): Fix silly, but harmless typo:
change "(:?..." to "(?:..." in regexps.
2006-11-22 16:16:05 +01:00
Jim Meyering
e750c5cac8 Post-release version change.
* NEWS: Add a line for 6.7-pre.
* configure.ac (AC_INIT): Bump to 6.7 and add "-pre" suffix.
2006-11-22 16:15:02 +01:00
Jim Meyering
92210636da .prev-version: Record previous version: 6.6. 2006-11-22 12:52:34 +01:00
Jim Meyering
46710dd82a Version 6.6.
* NEWS: Record release date.  Remove "-pre" suffix.
* configure.ac (AC_INIT): Remove "-pre" suffix from version string.
2006-11-22 12:40:57 +01:00
Jim Meyering
efab0d7989 * Makefile.maint (announcement): Don't use now-removed
--release-archive-directory=... option.
2006-11-22 12:38:16 +01:00
Jim Meyering
659e5f5edc * announce-gen: Remove unused --release-archive-directory option.
(print_news_deltas): Accept new adjective, "Noteworthy", in addition
to the old "Major".
Match version numbers in NEWS using tighter regular expressions.
(main): Require the --gpg-key-id=ID option.
2006-11-22 12:35:02 +01:00
Jim Meyering
b076de8551 * NEWS: Mention the three noteworthy changes, all fixed via gnulib. 2006-11-22 10:14:15 +01:00
Jim Meyering
7719e67e36 * .cvsignore, .gitignore: Add fstat.c. 2006-11-22 10:10:30 +01:00
Jim Meyering
d66091126a * tests/rm/one-file-system: Upon setup failure (e.g., mount failure),
skip the test rather than failing.  Reported by Michael Deutschmann.
2006-11-21 09:32:55 +01:00
Jim Meyering
41b5fe3246 * tests/rm/fail-eperm: Use the "(exit N); exit N" idiom,
rather than just "exit N".
2006-11-21 09:03:27 +01:00
Jim Meyering
e9a8c140da Arrange for "make check-root" to run the new root-only test.
* tests/Makefile.am (t7): New target, to run tests/ls/nameless-uid.
(all_t): Add t7.
2006-11-21 00:37:03 +01:00
Jim Meyering
279c41d79c Add a root-only test for today's lib/idcache.c fix.
* tests/ls/nameless-uid: New file.
* tests/ls/Makefile.am (TESTS): Add nameless-uid.
(TESTS_ENVIRONMENT): Add PERL to the list.
2006-11-20 11:31:05 +01:00
Jim Meyering
81ebd46046 * tests/tail-2/assert-2: Mark as a very-expensive test, because I
find the 7-second sleep annoyingly long.  Besides, this test is
probably far too specific and timing sensitive ever to trigger again.
* tests/tail-2/assert: Likewise.
2006-11-19 23:19:06 +01:00
Jim Meyering
318fb0502d Post-release version change.
* NEWS: Add a line for 6.6-pre.
* configure.ac (AC_INIT): Bump to 6.6 and add "-pre" suffix.
2006-11-19 19:44:23 +01:00
Jim Meyering
ad2a81ce8b .prev-version: Record previous version: 6.5. 2006-11-19 14:10:48 +01:00
Jim Meyering
497a5cf465 Version 6.5.
* NEWS: Record release date.  Remove "-cvs" suffix.
* configure.ac (AC_INIT): Remove "-cvs" suffix from version string.
2006-11-19 10:58:55 +01:00
Jim Meyering
1efc5bda6c "ln --backup f f" now produces a sensible diagnostic 2006-11-18 20:19:16 +01:00
Jim Meyering
0cafba44bb "ln --backup f f" produces a misleading diagnostic:
ln: creating hard link `f' => `f': No such file or directory
* src/ln.c (do_link): Give a better diagnostic in this unusual case.
(do_link): Rename local: s/lstat_ok/dest_lstat_ok/.
* tests/ln/Makefile.am (TESTS): Add hard-backup.
* tests/ln/hard-backup: New test for the above.
2006-11-18 20:00:39 +01:00
Paul Eggert
1a0333565f * bootstrap.conf (gnulib_modules): Add sys_stat, since we use it directly too.
* lib/.cvsignore, lib/.gitignore: Add root-dev-ino.c, root-dev-ino.h.
* m4/.cvsignore, m4/.gitignore: Add root-dev-ino.m4.
* src/ls.c (DIRED_FPUTS_LITERAL, PUSH_CURRENT_DIRED_POS):
Omit unnecessary parenthesization of args.
* src/od.c (EQUAL_BLOCKS): Likewise.
* src/system.h (STREQ, ASSIGN_STRDUPA): Likewise.
2006-11-16 19:51:23 +01:00
Jim Meyering
a73fdeb2ce * tests/tail-2/append-only: If chattr +a fails, exit 77 (to tell
automake we're skipping this test), and give a diagnostic to tell
the user the same thing.  Reported by Mike Grayson.
2006-11-16 10:05:36 +01:00
Jim Meyering
751f6acf54 change log date to be today's 2006-11-16 09:58:49 +01:00
Ralf Wildenhues
8b139ff78c Arrange to install manpages only for tools that are installed.
* man/Makefile.am (dist_man_MANS): Replace all optional manpages
with `$(MAN)', computed at configure time; also, list them ...
(optional_mans): ... in this new variable.
(max_aux, EXTRA_DIST): Ensure that we distribute all manpages.
2006-11-16 09:57:34 +01:00
Jim Meyering
b6b438c45d * src/csplit.c (load_buffer): Plug an inconsequential leak. 2006-11-16 09:16:08 +01:00
Jim Meyering
fc9b802e3d Help valgrind see that there is no leak in dd.c.
* src/dd.c (dd_copy): Declare real_buf and real_obuf to be static,
so we need not free them at all.  This is easier than freeing
both buffers at each of the early "return"s.
2006-11-16 09:15:47 +01:00
Jim Meyering
e189a79efd * .x-po-check: Exclude gl/ files. Otherwise, po-check would
complain that some of gl/lib/*.[ch] are not listed in POTFILES.in.
2006-11-15 10:37:02 +01:00
Jim Meyering
56206ccb80 * gl/m4/root-dev-ino.m4: Now that this is part of a real "module",
remove the now-unnecessary use of AC_LIBSOURCES.
2006-11-14 14:09:34 +01:00
Jim Meyering
3ef2f939f7 Adapt to new version of gnulib-tool.
* gl/modules/root-dev-ino: New file.
* lib/root-dev-ino.c, lib/root-dev-ino.h: Move these files ...
* gl/lib/root-dev-ino.c, gl/lib/root-dev-ino.h: ... to here.
* m4/root-dev-ino.m4: Move this file ...
* gl/m4/root-dev-ino.m4: ... to here.
* bootstrap.conf (gnulib_modules): Add root-dev-ino.
2006-11-14 14:02:18 +01:00
Jim Meyering
1b00a69ff2 * readlink-stub.c, lstat-stub.c: Remove now-unused files. 2006-11-14 09:38:32 +01:00
Jim Meyering
7932d2e2d4 * src/sort.c (insertkey): Use xmemdup, rather than xmalloc+assignment.
From Paul Eggert.
2006-11-13 19:15:43 +01:00
Jim Meyering
2061f04847 Plug another technically-unimportant leak in sort.
* src/sort.c (main): Don't allocate memory for each new key here.
(insertkey): Allocate memory for each key here, instead.
(key_init): Rename from new_key.  Don't allocate.
2006-11-13 15:19:22 +01:00
Jim Meyering
d5d00c7f9f * src/sort.c (main): Plug a tiny memory leak.
Move declaration of local "minus" down to be nearer point of use.
2006-11-13 15:06:15 +01:00
Jim Meyering
84268dae4e More automatically-added ignorables. 2006-11-12 22:45:14 +01:00
Jim Meyering
78a1d22aa0 * tests/du/Makefile.am (TESTS): Add inacc-dest. 2006-11-12 19:58:58 +01:00
Jim Meyering
597bfeb851 * NEWS: Mention this bug fix. 2006-11-12 19:13:32 +01:00
Jim Meyering
c24e93d926 du would exit early, when encountering an inaccessible directory
Reported by Mike Frysinger, in
http://article.gmane.org/gmane.comp.gnu.core-utils.bugs/8831
* tests/du/inacc-dest: New test, based on an example from Mike Frysinger.
* tests/chgrp/no-x: Remove the "fts_read failed: ..."
diagnostic from the expected output when using native fdopendir.
* tests/chmod/no-x: Likewise.
* tests/du/no-x: Likewise.
2006-11-12 18:42:24 +01:00
Jim Meyering
75be540f7d * Makefile.maint (sc_cast_of_x_alloc_return_value): Add an exclusion
for xalloc.h itself.
2006-11-12 18:41:01 +01:00
Jim Meyering
28c7ef509e Avoid false-positive when testing via valgrind.
* tests/mv/atomic: Grep strace output for a more specific pattern
than just "unlink", since that got a false positive when testing
under valgrind: unlink("/tmp/valgrind_proc_9657_cmdline_A51E9991") = 0
* tests/mv/Makefile.am (TESTS_ENVIRONMENT): Define EGREP.
2006-11-12 08:22:46 +01:00
Jim Meyering
7c96936a04 update .cvsignore/.gitignore files 2006-10-30 09:10:56 +01:00
Jim Meyering
e24ce7c58d * Makefile.maint (patch-check): Make it easier to regenerate
the src/c99-to-c89.diff file.  E.g., I do this:
make patch-check REGEN_PATCH=1; ediff src/c99-to-c89.diff new-diff
2006-10-28 18:23:30 +02:00
Jim Meyering
876e46bce7 * src/c99-to-c89.diff: Update to reflect new offsets in rm.c. 2006-10-28 18:21:13 +02:00
Jim Meyering
a0db0def2d * coreutils.texi (wc invocation): When giving the order in which
the various "counts" are listed, also mention "maximum line length".
Prompted by a report from Vincent LeFevre.
2006-10-28 18:19:05 +02:00
Jim Meyering
0766fb8b54 * src/system.h (ftello): Add a compile-time check for the highly
unlikely condition of off_t narrower than long int, rather than
handling it at run time.  Based on a patch from Paul Eggert.
2006-10-26 15:16:41 +02:00
Jim Meyering
b40b5b6917 Avoid a shell bug in Tru64 4.0 sh's handling of double-quoted strings.
[patch by Paul Eggert]

* tests/chmod/c-option: When double-quoting part of a word, prefer
to double-quote the whole word.  This is a bit easier to read (at
least for me), and in some cases it avoids a shell bug with Tru64
4.0 sh reported by Nelson H. F. Beebe.  For example, instead of
"$abs_srcdir"/../setgid-check we now write
"$abs_srcdir/../setgid-check".

* tests/cp/cp-parents: Likewise.
* tests/du/inaccessible-cwd: Likewise.
* tests/du/long-from-unreadable: Likewise.
* tests/install/basic-1: Likewise.
* tests/install/trap: Likewise.
* tests/misc/close-stdout: Likewise.
* tests/mkdir/concurrent-1: Likewise.
* tests/mkdir/p-1: Likewise.
* tests/mkdir/p-3: Likewise.
* tests/mkdir/parents: Likewise.
* tests/mkdir/perm: Likewise.
* tests/readlink/can-e: Likewise.
* tests/readlink/can-f: Likewise.
* tests/readlink/can-m: Likewise.
* tests/rm/inaccessible: Likewise.
* tests/rm/unread3: Likewise.
* tests/touch/no-create-missing: Likewise.

* lib/.cvsignore: Add uinttostr.c.
2006-10-26 11:03:30 +02:00
Jim Meyering
95954ad583 Portability to Tru64 V4.0.
* src/system.h (ftello) [!HAVE_FSEEKO && !defined ftello]:
Define inline replacement function.
This (along with a yesterday's fix for autoconf's
_AC_SYS_LARGEFILE_MACRO_VALUE macro) makes it so coreutils
now builds once more on Tru64 V4.0.  Reported by Nelson Beebe.
2006-10-25 11:47:06 +02:00
Jim Meyering
e81a82b74f * src/cat.c (infile): Add "const" to declaration.
* src/csplit.c (prefix): Likewise.
* src/printf.c (cfcc_msg): Likewise.
* src/tail.c (valid_file_spec): Likewise.
* src/cut.c (cut_file): Likewise, for a parameter.
* src/expr.c (str_value): Likewise.
* src/fold.c (fold_file): Likewise.
* src/pr.c (init_header): Likewise.
* src/dircolors.c (dc_parse_stream): Likewise, for a local.
* src/tr.c (make_printable_str): Likewise.
* src/nl.c (body_type, header_type, footer_type, current_type):
(separator_str, build_type_arg, nl_file): Likewise, for many.
* src/paste.c (main): Don't assign a read-only string to 'optarg'.
* src/tac.c (separator, tac_seekable, copy_to_temp): Likewise.
2006-10-25 01:05:30 +02:00
Jim Meyering
3e9cc76189 * tests/sample-test: Update copyright year list to include only
the current year, since this is what I'll want in any new test.
2006-10-25 00:16:13 +02:00
Jim Meyering
693311a5c3 * src/c99-to-c89.diff: Update to reflect new offsets. 2006-10-25 00:14:51 +02:00
Jim Meyering
5e42576c01 new feature: rm accepts new option: --one-file-system
Suggested by Steve McIntyre in <http://bugs.debian.org/392925>.
* src/remove.h (struct rm_options) [one_file_system]: New member.
* src/rm.c (rm_option_init): Initialize it.
(usage): Document the option.
* src/mv.c (rm_option_init): Likewise.
* src/remove.c (remove_dir): With --one-file-system and --recursive,
for each directory command line argument, do not affect a file system
different from that of the starting directory.  And give a diagnostic.
* src/rm.c (ONE_FILE_SYSTEM): New enum.
(main): Handle new option.
* tests/rm/one-file-system: Test the above.
* tests/rm/Makefile.am (TESTS): Add one-file-system.
* tests/Makefile.am (check-root): Add the rm/one-file-system
test to the list.
(EXTRA_DIST): Add other-fs-tmpdir.

* tests/mv/setup: Removed.  Renamed to...
* tests/other-fs-tmpdir: ...this new file.
* tests/mv/Makefile.am (EXTRA_DIST): Remove setup.
* tests/mv/acl: Reflect renaming: use ../other-fs-tmpdir.
* tests/mv/backup-is-src: Likewise.
* tests/mv/hard-link-1: Likewise.
* tests/mv/leak-fd: Likewise.
* tests/mv/mv-special-1: Likewise.
* tests/mv/part-fail: Likewise.
* tests/mv/part-hardlink: Likewise.
* tests/mv/part-rename: Likewise.
* tests/mv/part-symlink: Likewise.
* tests/mv/partition-perm: Likewise.
* tests/mv/to-symlink: Likewise.
* tests/mv/into-self-2: Likewise.

[doc/ChangeLog]
* coreutils.texi (rm invocation): Describe --one-file-system.
2006-10-25 00:01:33 +02:00
Jim Meyering
ba6b1acefd Don't let a failure in one test stop "make -k".
* tests/Makefile.am (t1 t2 t3 t4 t5): New targets.
(check-root): Depend on them, rather than executing the five
commands in a single rule.  Reported by Greg Schafer.
2006-10-24 08:46:25 +02:00
Jim Meyering
a3c4e0b94c * Makefile.maint (alpha beta major): Use a better log message.
Suggested by Bob Proulx.
2006-10-23 18:51:29 +02:00
Jim Meyering
7e4eef7e40 * tests/misc/pwd-long: Whoops. Don't exec the perl script. Otherwise, the sh-trap-based
clean-up code isn't run.
2006-10-23 12:22:15 +02:00
Jim Meyering
a002111341 * tests/misc/pwd-long: Undo last change, since it made Perl invoke
pwd via a shell.  Instead, ensure that the absolute name of the
pwd binary consists solely of reasonable characters.
2006-10-23 11:52:48 +02:00
Jim Meyering
0fdbf2e8c7 * NEWS: Add a line for 6.5-cvs.
* configure.ac (AC_INIT): Bump to 6.5 and add "-cvs" suffix.
2006-10-23 07:59:04 +02:00
Jim Meyering
9b17e1d7d4 . 2006-10-22 23:55:14 +02:00
231 changed files with 6604 additions and 2646 deletions

View File

@@ -1 +1 @@
6.3
6.7

View File

@@ -1,3 +1,4 @@
ChangeLog(-[0-9]+)?$
^old/
^src/c99-to-c98\.diff$
^gl/.*

View File

@@ -5,3 +5,4 @@ config-log
po/
src/df.c
src/stat.c
tests/misc/df-P

View File

@@ -1,8 +1,11 @@
^configure$
ChangeLog
^TODO$
^lib/mktime\.c$
^lib/getloadavg\.c$
^lib/euidaccess\.c$
^lib/euidaccess-stat\.c$
^lib/group-member\.c$
^Makefile\.maint$
^doc/coreutils.texi$
^src/stty.c$

View File

@@ -10,3 +10,4 @@
^lib/strtod.c
^lib/xstrtol.c
^m4/
^tests/misc/pwd-unreadable-parent

1550
ChangeLog

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
# Make coreutils. -*-Makefile-*-
# Copyright (C) 1990, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
# 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
# Copyright (C) 1990, 1993-2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -33,7 +32,6 @@ EXTRA_DIST = Makefile.cfg Makefile.maint GNUmakefile \
.x-sc_unmarked_diagnostics \
.x-sc_useless_cpp_parens \
ChangeLog-2005 \
announce-gen \
bootstrap \
bootstrap.conf \
build-aux/cvsu \

View File

@@ -1,5 +1,5 @@
# Customize Makefile.maint. -*- makefile -*-
# Copyright (C) 2003-2006 Free Software Foundation, Inc.
# Copyright (C) 2003-2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -33,4 +33,8 @@ gpg_key_ID = D333CBA1
# Exclude changelog-check here so that there's less churn in ChangeLog
# files -- otherwise, you'd need to have the upcoming version number
# at the top of the file for each `make distcheck' run.
local-checks-to-skip = changelog-check
local-checks-to-skip = changelog-check strftime-check
# The local directory containing the checked-out copy of gnulib used in
# this release. Used solely to get a date for the "announcement" target.
gnulib_dir = /gnulib

View File

@@ -2,7 +2,7 @@
# This Makefile fragment is shared between the coreutils,
# CPPI, Bison, and Autoconf.
## Copyright (C) 2001-2006 Free Software Foundation, Inc.
## Copyright (C) 2001-2007 Free Software Foundation, Inc.
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -32,6 +32,7 @@ GZIP_ENV = '--no-name --best $(gzip_rsyncable)'
CVS = cvs
GIT = git
VC = $(GIT)
VC-tag = git-tag -s -m '$(VERSION)'
CVS_LIST = build-aux/vc-list-files
@@ -68,23 +69,23 @@ export LC_ALL = C
# in system.h. E.g. today I removed from tail.c a useless definition of
# ENOSYS. It was useless because system.h ensures it's defined.
# Collect the names of rules starting with `sc_'.
syntax-check-rules := $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(ME))
.PHONY: $(syntax-check-rules)
# Checks that don't require cvs.
# Run `changelog-check' last, as previous test may reveal problems requiring
# new ChangeLog entries.
local-checks-available = \
po-check copyright-check writable-files m4-check author_mark_check \
po-check copyright-check m4-check author_mark_check \
changelog-check patch-check strftime-check $(syntax-check-rules) \
makefile_path_separator_check \
makefile-check check-AUTHORS
.PHONY: $(local-checks-available)
local-check = $(filter-out $(local-checks-to-skip), $(local-checks-available))
local-check := $(filter-out $(local-checks-to-skip), $(local-checks-available))
# Collect the names of rules starting with `sc_'.
syntax-check-rules := $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(ME))
.PHONY: $(syntax-check-rules)
syntax-check: $(syntax-check-rules)
syntax-check: $(local-check)
# @grep -nE '# *include <(limits|std(def|arg|bool))\.h>' \
# $$(find -type f -name '*.[chly]') && \
# { echo '$(ME): found conditional include' 1>&2; \
@@ -97,20 +98,17 @@ syntax-check: $(syntax-check-rules)
# FIXME: don't allow `#include .strings\.h' anywhere
sc_cast_of_argument_to_free:
@grep -nE '\<free \(\(' $(srcdir)/{lib,src}/*.[chly] && \
@grep -nE '\<free \(\(' $$($(CVS_LIST_EXCEPT)) && \
{ echo '$(ME): don'\''t cast free argument' 1>&2; \
exit 1; } || :
sc_cast_of_x_alloc_return_value:
@grep -nE --exclude=$(srcdir)/lib/regex.c \
'\*\) *x(m|c|re)alloc\>' \
$(srcdir)/{lib,src}/*.[chy] && \
@grep -nE '\*\) *x(m|c|re)alloc\>' $$($(CVS_LIST_EXCEPT)) && \
{ echo '$(ME): don'\''t cast x*alloc return value' 1>&2; \
exit 1; } || :
sc_cast_of_alloca_return_value:
@grep -nE '\*\) *alloca\>' \
$(srcdir)/src/*.[chy] && \
@grep -nE '\*\) *alloca\>' $$($(CVS_LIST_EXCEPT)) && \
{ echo '$(ME): don'\''t cast alloca return value' 1>&2; \
exit 1; } || :
@@ -119,18 +117,18 @@ sc_space_tab:
{ echo '$(ME): found SPACE-TAB sequence; remove the SPACE' \
1>&2; exit 1; } || :
# Don't use the old ato* functions in `real' code.
# Don't use *scanf or the old ato* functions in `real' code.
# They provide no error checking mechanism.
# Instead, use strto* functions.
sc_prohibit_atoi_atof:
@grep -nE '\<ato([filq]|ll)\>' $$($(CVS_LIST_EXCEPT)) && \
{ echo '$(ME): do not use ato''f, ato''i, ato''l, ato''ll, or ato''q' \
@grep -nE '\<([fs]?scanf|ato([filq]|ll))\>' $$($(CVS_LIST_EXCEPT)) && \
{ echo '$(ME): do not use *scan''f, ato''f, ato''i, ato''l, ato''ll, or ato''q' \
1>&2; exit 1; } || :
# Using EXIT_SUCCESS as the first argument to error is misleading,
# since when that parameter is 0, error does not exit. Use `0' instead.
sc_error_exit_success:
@grep -nF 'error (EXIT_SUCCESS,' \
@grep -nF 'error (EXIT_SUCCESS,' \
$$(find -type f -name '*.[chly]') && \
{ echo '$(ME): found error (EXIT_SUCCESS' 1>&2; \
exit 1; } || :
@@ -210,7 +208,9 @@ sc_prohibit_jm_in_m4:
1>&2; exit 1; } || :
sc_root_tests:
@t1=sc-root.expected; t2=sc-root.actual; \
@if test -d tests \
&& grep check-root tests/Makefile.am>/dev/null 2>&1; then \
t1=sc-root.expected; t2=sc-root.actual; \
grep -nl '^PRIV_CHECK_ARG=require-root' \
$$($(CVS_LIST) tests) |sed s,tests,., |sort > $$t1; \
sed -n 's, cd \([^ ]*\) .*MAKE..check TESTS=\(.*\),./\1/\2,p' \
@@ -219,7 +219,8 @@ sc_root_tests:
rm -f $$t1 $$t2; \
test "$$diff" \
&& { echo 'tests/Makefile.am: missing check-root action'>&2; \
exit 1; } || :
exit 1; } || :; \
fi
headers_with_interesting_macro_defs = \
exit.h \
@@ -299,7 +300,7 @@ sc_trailing_blank:
# Match lines like the following, but where there is only one space
# between the options and the description:
# -D, --all-repeated[=delimit-method] print all duplicate lines\n
longopt_re = --[a-z][0-9A-Za-z-]*(\[=[0-9A-Za-z-]*\])?
longopt_re = --[a-z][0-9A-Za-z-]*(\[?=[0-9A-Za-z-]*\]?)?
sc_two_space_separator_in_usage:
@grep -nE '^ *(-[A-Za-z],)? $(longopt_re) [^ ].*\\$$' \
$$($(CVS_LIST_EXCEPT)) && \
@@ -327,12 +328,18 @@ sc_useless_cpp_parens:
patch-check:
rm -rf src-c89 $@.1 $@.2
cp -a src src-c89
(cd src-c89; patch -V never --fuzz=0) < src/c99-to-c89.diff \
(cd src-c89; patch -p2 -V never --fuzz=0) < src/c99-to-c89.diff \
> $@.1 2>&1
if test "$${REGEN_PATCH+set}" = set; then \
diff -upr src src-c89 > new-diff || : ; fi
grep -v '^patching file ' $@.1 > $@.2 || :
fail=0; test -s $@.2 && fail=1 || : ; \
rm -rf src-c89 $@.1 $@.2; \
test $$fail = 0
msg=ok; test -s $@.2 && msg='fuzzy patch' || : ; \
rm -f src-c89/*.o || msg='rm failed'; \
$(MAKE) -C src-c89 CFLAGS='-Wdeclaration-after-statement -Werror' \
|| msg='compile failure with extra options'; \
rm -rf src-c89 $@.1 $@.2; \
test "$$msg" = ok && : || echo "$$msg" 1>&2; \
test "$$msg" = ok
# Ensure that date's --help output stays in sync with the info
# documentation for GNU strftime. The only exception is %N,
@@ -360,22 +367,22 @@ makefile-check:
&& { echo 'Makefile.maint: use $$(...), not @...@' 1>&2; exit 1; } || :
news-date-check: NEWS
today=`date +%Y-%m-%d`; \
if head NEWS | grep '^\*.* $(VERSION_REGEXP) ('$$today')' \
>/dev/null; then \
:; \
else \
echo "version or today's date is not in NEWS" 1>&2; \
exit 1; \
today=`date +%Y-%m-%d`; \
if head NEWS | grep '^\*.* $(VERSION_REGEXP) ('$$today')' \
>/dev/null; then \
:; \
else \
echo "version or today's date is not in NEWS" 1>&2; \
exit 1; \
fi
changelog-check:
if head ChangeLog | grep 'Version $(VERSION_REGEXP)\.$$' \
>/dev/null; then \
:; \
else \
echo "$(VERSION) not in ChangeLog" 1>&2; \
exit 1; \
if head ChangeLog | grep 'Version $(VERSION_REGEXP)\.$$' \
>/dev/null; then \
:; \
else \
echo "$(VERSION) not in ChangeLog" 1>&2; \
exit 1; \
fi
m4-check:
@@ -393,6 +400,7 @@ po-check:
for file in $$($(CVS_LIST_EXCEPT)) lib/*.[ch]; do \
case $$file in \
djgpp/* | man/*) continue;; \
*/c99-to-c89.diff) continue;; \
esac; \
case $$file in \
*.[ch]) \
@@ -441,6 +449,7 @@ writable-files:
test "$$fail" && exit 1 || :
v_etc_file = lib/version-etc.c
sample-test = tests/sample-test
# Make sure that the copyright date in $(v_etc_file) is up to date.
copyright-check:
@if test -f $(v_etc_file); then \
@@ -449,13 +458,19 @@ copyright-check:
|| { echo 'out of date copyright in $(v_etc_file); update it' 1>&2; \
exit 1; }; \
fi
@if test -f $(sample-test); then \
grep '# Copyright (C) '$$(date +%Y)' Free' $(sample-test) \
>/dev/null \
|| { echo 'out of date copyright in $(sample-test); update it' 1>&2; \
exit 1; }; \
fi
# Sanity checks with the repository.
# Abort early if this tag has already been used.
vc-tag-check:
used=no; \
if $(VC) --help | grep CVS; then \
if $(VC) --help | grep CVS; then \
$(CVS) -n log -h README|grep -e $(this-vc-tag): >/dev/null \
&& used=yes; \
else \
@@ -487,7 +502,7 @@ maintainer-distcheck:
# checks fail. Also, make sure the NEWS file is up-to-date.
# FIXME: use dist-hook/my-dist like distcheck-hook/my-distcheck.
vc-dist: $(local-check) cvs-check maintainer-distcheck
$(VC) tag $(this-vc-tag)
$(VC-tag) $(this-vc-tag)
$(MAKE) dist
# Use this to make sure we don't run these programs when building
@@ -499,11 +514,11 @@ null_AM_MAKEFLAGS = \
AUTOHEADER=false \
MAKEINFO=false
# Detect format-string/arg-list mismatches that would normally be obscured
# by the use of _(). The --disable-nls effectively defines away that macro,
# and building with CFLAGS='-Wformat -Werror' causes any format warning to be
# treated as a failure. Also, check for shadowing problems with -Wshadow,
# and for pointer arithmetic problems with -Wpointer-arith.
warn_cflags = -Dlint -O -Werror -Wall -Wformat -Wshadow -Wpointer-arith
# Use -Wformat -Werror to detect format-string/arg-list mismatches.
# Also, check for shadowing problems with -Wshadow, and for pointer
# arithmetic problems with -Wpointer-arith.
# These CFLAGS are pretty strict. If you build this target, you probably
# have to have a recent version of gcc and glibc headers.
TMPDIR ?= /tmp
@@ -514,7 +529,7 @@ my-distcheck: $(local-check) $(release_archive_dir)/$(prev-tgz)
GZIP=$(GZIP_ENV) $(AMTAR) -C $(t) -zxf $(distdir).tar.gz
cd $(t)/$(distdir) \
&& ./configure --disable-nls \
&& $(MAKE) CFLAGS='-Werror -Wall -Wformat -Wshadow -Wpointer-arith' \
&& $(MAKE) CFLAGS='$(warn_cflags)' \
AM_MAKEFLAGS='$(null_AM_MAKEFLAGS)' \
&& $(MAKE) dvi \
&& $(MAKE) check \
@@ -522,6 +537,13 @@ my-distcheck: $(local-check) $(release_archive_dir)/$(prev-tgz)
(cd $(t) && mv $(distdir) $(distdir).old \
&& $(AMTAR) -zxf - ) < $(distdir).tar.gz
diff -ur $(t)/$(distdir).old $(t)/$(distdir)
if test -f $(srcdir)/src/c99-to-c89.diff; then \
cd $(t)/$(distdir) \
&& (cd src && patch -V never --fuzz=0 <c99-to-c89.diff) \
&& ./configure --disable-largefile \
CFLAGS='-Werror -ansi -pedantic -Wno-long-long' \
&& $(MAKE); \
fi
-rm -rf $(t)
@echo "========================"; \
echo "$(distdir).tar.gz is ready for distribution"; \
@@ -543,17 +565,22 @@ prev-tgz = $(PACKAGE)-$(PREV_VERSION).tar.gz
xd-delta = $(PACKAGE)-$(PREV_VERSION)-$(VERSION).xdelta
rel-files = $(xd-delta) $(DIST_ARCHIVES)
# Approximate the date of last gnulib "update" by the ChangeLog file's
# mtime, and provide that date in the announcement.
announcement: NEWS ChangeLog $(rel-files)
@./announce-gen \
@cl_date=$$(stat --printf @%Y $(gnulib_dir)/ChangeLog); \
utc_date=$$(date -u --date $$cl_date '+%Y-%m-%d %T %z'); \
./build-aux/announce-gen \
--release-type=$(RELEASE_TYPE) \
--package=$(PACKAGE) \
--prev=$(PREV_VERSION) \
--curr=$(VERSION) \
--release-archive-directory=$(release_archive_dir) \
--gpg-key-id=$(gpg_key_ID) \
--news=NEWS \
$(addprefix --url-dir=, $(url_dir_list)) \
--bootstrap-tools=autoconf,automake,bison,gnulib \
--gnulib-snapshot-time-stamp="$$utc_date" \
$(addprefix --url-dir=, $(url_dir_list))
## ---------------- ##
## Updating files. ##
@@ -569,7 +596,7 @@ emit_upload_commands:
@echo =====================================
@echo =====================================
@echo "$(srcdir)/build-aux/gnupload $(GNUPLOADFLAGS) \\"
@echo " --to $(gnu_rel_host):coreutils \\"
@echo " --to $(gnu_rel_host):$(PACKAGE) \\"
@echo " $(rel-files)"
@echo '# send the /tmp/announcement e-mail'
@echo =====================================
@@ -579,7 +606,7 @@ $(xd-delta): $(release_archive_dir)/$(prev-tgz) $(distdir).tar.gz
xdelta delta -9 $^ $@ || :
.PHONY: alpha beta major
alpha beta major: news-date-check changelog-check $(local-check)
alpha beta major: news-date-check changelog-check $(local-check) writable-files
test $@ = major \
&& { echo $(VERSION) | grep -E '^[0-9]+(\.[0-9]+)+$$' \
|| { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\
@@ -591,4 +618,6 @@ alpha beta major: news-date-check changelog-check $(local-check)
chmod a-w $(rel-files)
$(MAKE) -s emit_upload_commands RELEASE_TYPE=$@
echo $(VERSION) > $(prev_version_file)
$(VC) commit -m. $(prev_version_file)
$(VC) commit -m \
'$(prev_version_file): Record previous version: $(VERSION).' \
$(prev_version_file)

129
NEWS
View File

@@ -1,5 +1,134 @@
GNU coreutils NEWS -*- outline -*-
* Noteworthy changes in release 6.9 (2007-03-22) [stable]
** Bug fixes
cp -x (--one-file-system) would fail to set mount point permissions
The default block size and output format for df -P are now unaffected by
the DF_BLOCK_SIZE, BLOCK_SIZE, and BLOCKSIZE environment variables. It
is still affected by POSIXLY_CORRECT, though.
Using pr -m -s (i.e. merging files, with TAB as the output separator)
no longer inserts extraneous spaces between output columns.
* Noteworthy changes in release 6.8 (2007-02-24) [not-unstable]
** Bug fixes
chgrp, chmod, and chown now honor the --preserve-root option.
Before, they would warn, yet continuing traversing and operating on /.
chmod no longer fails in an environment (e.g., a chroot) with openat
support but with insufficient /proc support.
"cp --parents F/G D" no longer creates a directory D/F when F is not
a directory (and F/G is therefore invalid).
"cp --preserve=mode" would create directories that briefly had
too-generous permissions in some cases. For example, when copying a
directory with permissions 777 the destination directory might
temporarily be setgid on some file systems, which would allow other
users to create subfiles with the same group as the directory. Fix
similar problems with 'install' and 'mv'.
cut no longer dumps core for usage like "cut -f2- f1 f2" with two or
more file arguments. This was due to a double-free bug, introduced
in coreutils-5.3.0.
dd bs= operands now silently override any later ibs= and obs=
operands, as POSIX and tradition require.
"ls -FRL" always follows symbolic links on Linux. Introduced in
coreutils-6.0.
A cross-partition "mv /etc/passwd ~" (by non-root) now prints
a reasonable diagnostic. Before, it would print this:
"mv: cannot remove `/etc/passwd': Not a directory".
pwd and "readlink -e ." no longer fail unnecessarily when a parent
directory is unreadable.
"rm -rf /etc/passwd" (run by non-root) now prints a diagnostic.
Before it would print nothing.
"rm --interactive=never F" no longer prompts for an unwritable F
** New features
sort's new --compress-program=PROG option specifies a compression
program to use when writing and reading temporary files.
This can help save both time and disk space when sorting large inputs.
sort accepts the new option -C, which acts like -c except no diagnostic
is printed. Its --check option now accepts an optional argument, and
--check=quiet and --check=silent are now aliases for -C, while
--check=diagnose-first is an alias for -c or plain --check.
* Noteworthy changes in release 6.7 (2006-12-08) [stable]
** Bug fixes
When cp -p copied a file with special mode bits set, the same bits
were set on the copy even when ownership could not be preserved.
This could result in files that were setuid to the wrong user.
To fix this, special mode bits are now set in the copy only if its
ownership is successfully preserved. Similar problems were fixed
with mv when copying across file system boundaries. This problem
affects all versions of coreutils through 6.6.
cp --preserve=ownership would create output files that temporarily
had too-generous permissions in some cases. For example, when
copying a file with group A and mode 644 into a group-B sticky
directory, the output file was briefly readable by group B.
Fix similar problems with cp options like -p that imply
--preserve=ownership, with install -d when combined with either -o
or -g, and with mv when copying across file system boundaries.
This bug affects coreutils 6.0 through 6.6.
du --one-file-system (-x) would skip subdirectories of any directory
listed as second or subsequent command line argument. This bug affects
coreutils-6.4, 6.5 and 6.6.
* Noteworthy changes in release 6.6 (2006-11-22) [stable]
** Bug fixes
ls would segfault (dereference a NULL pointer) for a file with a
nameless group or owner. This bug was introduced in coreutils-6.5.
A bug in the latest official m4/gettext.m4 (from gettext-0.15)
made configure fail to detect gettext support, due to the unusual
way in which coreutils uses AM_GNU_GETTEXT.
** Improved robustness
Now, du (and the other fts clients: chmod, chgrp, chown) honor a
trailing slash in the name of a symlink-to-directory even on
Solaris 9, by working around its buggy fstatat implementation.
* Major changes in release 6.5 (2006-11-19) [stable]
** Bug fixes
du (and the other fts clients: chmod, chgrp, chown) would exit early
when encountering an inaccessible directory on a system with native
openat support (i.e., linux-2.6.16 or newer along with glibc-2.4
or newer). This bug was introduced with the switch to gnulib's
openat-based variant of fts, for coreutils-6.0.
"ln --backup f f" now produces a sensible diagnostic
** New features
rm accepts a new option: --one-file-system
* Major changes in release 6.4 (2006-10-22) [stable]
** Bug fixes

12
README
View File

@@ -97,6 +97,18 @@ Here is one possible patch to correct the problem:
+#ifndef __LP64__
************************
OSF/1 4.0d build failure
------------------------
If you use /usr/bin/make on an OSF/1 4.0d system, it will fail due
to the presence of the "[" target. That version of make appears to
treat "[" as some syntax relating to locks. To work around that,
the best solution is to use GNU make. Otherwise, simply remove
all mention of "[$(EXEEXT)" from src/Makefile.
**********************
Running tests as root:
----------------------

View File

@@ -1,13 +1,15 @@
-*- outline -*-
These notes intend to help people working on the CVS version of
this package.
These notes intend to help people working on the checked-out sources.
These requirements do not apply when building from a distribution tarball.
* Requirements
Only the sources are installed in the CVS repository (to ease the
maintenance, merges etc.), therefore you will have to get the latest
stable versions of the maintainer tools we depend upon, including:
We've opted to keep only the highest-level sources in the GIT repository.
This eases our maintenance burden, (fewer merges etc.), but imposes more
requirements on anyone wishing to build from the just-checked-out sources.
For example, you have to use the latest stable versions of the maintainer
tools we depend upon, including:
- Automake <http://www.gnu.org/software/automake/>
- Autoconf <http://www.gnu.org/software/autoconf/>
@@ -23,13 +25,13 @@ suggest using test version 1.3.5 (or later, if one becomes available).
Valgrind <http://valgrind.org/> is also highly recommended, if
Valgrind supports your architecture.
Only building the initial full source tree will be a bit painful,
later, a plain `cvs update -P && make' should be sufficient.
Only building the initial full source tree will be a bit painful.
Later, a plain `git-pull && make' should be sufficient.
* First CVS checkout
* First GIT checkout
Obviously, if you are reading these notes, you did manage to check out
this package from CVS. The next step is to get other files needed to
this package from GIT. The next step is to get other files needed to
build, which are extracted from other source packages:
$ ./bootstrap
@@ -41,9 +43,9 @@ And there you are! Just
$ make check
At this point, there should be no difference between your local copy,
and the CVS master copy:
and the GIT master copy:
$ cvs diff
$ git-diff
should output no difference.
@@ -51,8 +53,7 @@ Enjoy!
-----
Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
Inc.
Copyright (C) 2002-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

7
THANKS
View File

@@ -150,6 +150,7 @@ Eric Pemente pemente@northpark.edu
Eric S. Raymond esr@snark.thyrsus.com
Erik Bennett bennett@cvo.oneworld.com
Erik Corry erik@kroete2.freinet.de
Evan Hunt ethanol@armory.com
Felix Lee flee@teleport.com
Felix Rauch Valenti frauch@cse.unsw.edu.au
Ferdinand fw@scenic.mine.nu
@@ -192,6 +193,7 @@ Hans Verkuil hans@wyst.hobby.nl
Harald Dunkel harald.dunkel@t-online.de
Harry Liu rliu@lek.ugcs.caltech.edu
Harti Brandt brandt@fokus.fraunhofer.de
Harvey Eneman Harvey.Eneman@oracle.com
Helen Faulkner helen_ml_faulkner@yahoo.co.uk
Herbert Xu herbert@gondor.apana.org.au
Holger Berger hberger@ess.nec.de
@@ -208,6 +210,7 @@ Ivo Timmermans ivo@debian.org
James james@albion.glarp.com
James Antill jmanti%essex.ac.uk@seralph21.essex.ac.uk
James Lemley James.Lemley@acxiom.com
James Hunt jamesodhunt@hotmail.com
James Sneeringer jvs@ocslink.com
James Tanis jtt@soscorp.com
James Youngman james+usenet@free-lunch.demon.co.uk
@@ -323,11 +326,13 @@ Matt Perry matt@primefactor.com
Matt Schalit mschalit@pacbell.net
Matt Swift swift@alum.mit.edu
Matthew Arnison maffew@cat.org.au
Matthew M. Boedicker matthewm@boedicker.org
Matthew Braun matthew@ans.net
Matthew Clarke Matthew_Clarke@mindlink.bc.ca
Matthew S. Levine mslevine@theory.lcs.mit.edu
Matthew Smith matts@bluesguitar.org
Matthew Swift swift@alum.mit.edu
Matthew Woehlke mw_triad@users.sourceforge.net
Matthias Urlichs smurf@noris.de
Matti Aarnio matti.aarnio@zmailer.org
Mattias Wadenstein maswan@acc.umu.se
@@ -471,6 +476,7 @@ Thomas Hood jdthood@yahoo.co.uk
Thomas Luzat thomas@luzat.com
Thomas M.Ott thmo-13@gmx.de
Thomas Quinot thomas@Cuivre.FR.EU.ORG
Thomas Schwinge tschwinge@gnu.org
Thomas Wolff mined@towo.net
Tim J. Robbins tjr@FreeBSD.org
Tim Mooney mooney@dogbert.cc.ndsu.NoDak.edu
@@ -513,6 +519,7 @@ William Bader william@nscs.fast.net
William Dowling will@franklin.com
William Lewis wiml@omnigroup.com
wiregauze wiregauze@yahoo.com
Wis Macomson wis.macomson@intel.com
Wojciech Purczynski cliph@isec.pl
Wolfram Kleff kleff@cs.uni-bonn.de
Won-kyu Park wkpark@chem.skku.ac.kr

9
TODO
View File

@@ -1,3 +1,12 @@
stty.c:
use xstrtoul, not sscanf
printf:
Now that gnulib supports *printf("%a"), import one of the
*printf-posix modules so that printf(1) will support %a even on
platforms where the native *printf(3) is deficient.
Suggestion form Eric Blake.
strip: add an option to specify the program used to strip binaries.
suggestion from Karl Berry

View File

@@ -1,436 +0,0 @@
#!/usr/bin/perl -w
# Generate an announcement message.
# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
use strict;
use Getopt::Long;
use Digest::MD5;
use Digest::SHA1;
(my $VERSION = '$Revision: 1.25 $ ') =~ tr/[0-9].//cd;
(my $ME = $0) =~ s|.*/||;
my %valid_release_types = map {$_ => 1} qw (alpha beta major);
END
{
# Nobody ever checks the status of print()s. That's okay, because
# if any do fail, we're guaranteed to get an indicator when we close()
# the filehandle.
#
# Close stdout now, and if there were no errors, return happy status.
# If stdout has already been closed by the script, though, do nothing.
defined fileno STDOUT
or return;
close STDOUT
and return;
# Errors closing stdout. Indicate that, and hope stderr is OK.
warn "$ME: closing standard output: $!\n";
# Don't be so arrogant as to assume that we're the first END handler
# defined, and thus the last one invoked. There may be others yet
# to come. $? will be passed on to them, and to the final _exit().
#
# If it isn't already an error, make it one (and if it _is_ an error,
# preserve the value: it might be important).
$? ||= 1;
}
sub usage ($)
{
my ($exit_code) = @_;
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
if ($exit_code != 0)
{
print $STREAM "Try `$ME --help' for more information.\n";
}
else
{
my @types = sort keys %valid_release_types;
print $STREAM <<EOF;
Usage: $ME [OPTIONS]
OPTIONS:
Generate an announcement message.
FIXME: describe the following
--release-type=TYPE TYPE must be one of @types
--package-name=PACKAGE_NAME
--previous-version=VER
--current-version=VER
--gpg-key-id=ID The GnuPG ID of the key used to sign the tarballs
--release-archive-directory=DIR
--url-directory=URL_DIR
--news=NEWS_FILE optional
--help display this help and exit
--version output version information and exit
EOF
}
exit $exit_code;
}
=item C<%size> = C<sizes (@file)>
Compute the sizes of the C<@file> and return them as a hash. Return
C<undef> if one of the computation failed.
=cut
sub sizes (@)
{
my (@file) = @_;
my $fail = 0;
my %res;
foreach my $f (@file)
{
my $cmd = "du --human $f";
my $t = `$cmd`;
# FIXME-someday: give a better diagnostic, a la $PROCESS_STATUS
$@
and (warn "$ME: command failed: `$cmd'\n"), $fail = 1;
chomp $t;
$t =~ s/^([\d.]+[MkK]).*/${1}B/;
$res{$f} = $t;
}
return $fail ? undef : %res;
}
=item C<print_locations ($title, \@url, \%size, @file)
Print a section C<$title> dedicated to the list of <@file>, which
sizes are stored in C<%size>, and which are available from the C<@url>.
=cut
sub print_locations ($\@\%@)
{
my ($title, $url, $size, @file) = @_;
print "Here are the $title:\n";
foreach my $url (@{$url})
{
for my $file (@file)
{
print " $url/$file";
print " (", $$size{$file}, ")"
if exists $$size{$file};
print "\n";
}
}
print "\n";
}
=item C<print_checksums (@file)
Print the MD5 and SHA1 signature section for each C<@file>.
=cut
sub print_checksums (@)
{
my (@file) = @_;
print "Here are the MD5 and SHA1 checksums:\n";
print "\n";
foreach my $meth (qw (md5 sha1))
{
foreach my $f (@file)
{
open IN, '<', $f
or die "$ME: $f: cannot open for reading: $!\n";
binmode IN;
my $dig =
($meth eq 'md5'
? Digest::MD5->new->addfile(*IN)->hexdigest
: Digest::SHA1->new->addfile(*IN)->hexdigest);
close IN;
print "$dig $f\n";
}
}
}
=item C<print_news_deltas ($news_file, $prev_version, $curr_version)
Print the section of the NEWS file C<$news_file> addressing changes
between versions C<$prev_version> and C<$curr_version>.
=cut
sub print_news_deltas ($$$)
{
my ($news_file, $prev_version, $curr_version) = @_;
print "\n$news_file\n\n";
# Print all lines from $news_file, starting with the first one
# that mentions $curr_version up to but not including
# the first occurrence of $prev_version.
my $in_items;
open NEWS, '<', $news_file
or die "$ME: $news_file: cannot open for reading: $!\n";
while (defined (my $line = <NEWS>))
{
if ( ! $in_items)
{
# Match lines like this one:
# * Major changes in release 5.0.1:
# but not any other line that starts with a space, *, or -.
$line =~ /^(\* Major changes.*|[^ *-].*)\Q$curr_version\E/o
or next;
$in_items = 1;
print $line;
}
else
{
# Be careful that this regexp cannot match version numbers
# in NEWS items -- they might well say `introduced in 4.5.5',
# and we don't want that to match.
$line =~ /^(\* Major changes.*|[^ *-].*)\Q$prev_version\E/o
and last;
print $line;
}
}
close NEWS;
$in_items
or die "$ME: $news_file: no matching lines for `$curr_version'\n";
}
sub print_changelog_deltas ($$)
{
my ($package_name, $prev_version) = @_;
# Print new ChangeLog entries.
# First find all CVS-controlled ChangeLog files.
use File::Find;
my @changelog;
find ({wanted => sub {$_ eq 'ChangeLog' && -d 'CVS'
and push @changelog, $File::Find::name}},
'.');
# If there are no ChangeLog files, we're done.
@changelog
or return;
my %changelog = map {$_ => 1} @changelog;
# Reorder the list of files so that if there are ChangeLog
# files in the specified directories, they're listed first,
# in this order:
my @dir = qw ( . src lib m4 config doc );
# A typical @changelog array might look like this:
# ./ChangeLog
# ./po/ChangeLog
# ./m4/ChangeLog
# ./lib/ChangeLog
# ./doc/ChangeLog
# ./config/ChangeLog
my @reordered;
foreach my $d (@dir)
{
my $dot_slash = $d eq '.' ? $d : "./$d";
my $target = "$dot_slash/ChangeLog";
delete $changelog{$target}
and push @reordered, $target;
}
# Append any remaining ChangeLog files.
push @reordered, sort keys %changelog;
# Remove leading `./'.
@reordered = map { s!^\./!!; $_ } @reordered;
print "\nChangeLog entries:\n\n";
# print join ("\n", @reordered), "\n";
$prev_version =~ s/\./_/g;
my $prev_cvs_tag = "\U$package_name\E-$prev_version";
my $cmd = "cvs -n diff -u -r$prev_cvs_tag -rHEAD @reordered";
open DIFF, '-|', $cmd
or die "$ME: cannot run `$cmd': $!\n";
# Print two types of lines, making minor changes:
# Lines starting with `+++ ', e.g.,
# +++ ChangeLog 22 Feb 2003 16:52:51 -0000 1.247
# and those starting with `+'.
# Don't print the others.
my $prev_printed_line_empty = 1;
while (defined (my $line = <DIFF>))
{
if ($line =~ /^\+\+\+ /)
{
my $separator = "*"x70 ."\n";
$line =~ s///;
$line =~ s/\s.*//;
$prev_printed_line_empty
or print "\n";
print $separator, $line, $separator;
}
elsif ($line =~ /^\+/)
{
$line =~ s///;
print $line;
$prev_printed_line_empty = ($line =~ /^$/);
}
}
close DIFF;
# The exit code should be 1.
# Allow in case there are no modified ChangeLog entries.
$? == 256 || $? == 128
or warn "$ME: warning: `cmd' had unexpected exit code or signal ($?)\n";
}
{
# Neutralize the locale, so that, for instance, "du" does not
# issue "1,2" instead of "1.2", what confuses our regexps.
$ENV{LC_ALL} = "C";
my $release_type;
my $package_name;
my $prev_version;
my $curr_version;
my $release_archive_dir;
my $gpg_key_id;
my @url_dir_list;
my @news_file;
GetOptions
(
'release-type=s' => \$release_type,
'package-name=s' => \$package_name,
'previous-version=s' => \$prev_version,
'current-version=s' => \$curr_version,
'gpg-key-id=s' => \$gpg_key_id,
'release-archive-directory=s' => \$release_archive_dir,
'url-directory=s' => \@url_dir_list,
'news=s' => \@news_file,
help => sub { usage 0 },
version => sub { print "$ME version $VERSION\n"; exit },
) or usage 1;
my $fail = 0;
# Ensure that sure each required option is specified.
$release_type
or (warn "$ME: release type not specified\n"), $fail = 1;
$package_name
or (warn "$ME: package name not specified\n"), $fail = 1;
$prev_version
or (warn "$ME: previous version string not specified\n"), $fail = 1;
$curr_version
or (warn "$ME: current version string not specified\n"), $fail = 1;
$release_archive_dir
or (warn "$ME: release directory name not specified\n"), $fail = 1;
@url_dir_list
or (warn "$ME: URL directory name(s) not specified\n"), $fail = 1;
exists $valid_release_types{$release_type}
or (warn "$ME: `$release_type': invalid release type\n"), $fail = 1;
@ARGV
and (warn "$ME: too many arguments\n"), $fail = 1;
$fail
and usage 1;
my $my_distdir = "$package_name-$curr_version";
my $tgz = "$my_distdir.tar.gz";
my $tbz = "$my_distdir.tar.bz2";
my $xd = "$package_name-$prev_version-$curr_version.xdelta";
my %size = sizes ($tgz, $tbz, $xd);
%size
or exit 1;
# The markup is escaped as <\# so that when this script is sent by
# mail (or part of a diff), Gnus is not triggered.
print <<EOF;
Subject: $my_distdir released
<\#secure method=pgpmime mode=sign>
FIXME: put comments here
EOF
print_locations ("compressed sources", @url_dir_list, %size,
$tgz, $tbz);
print_locations ("xdelta-style diffs", @url_dir_list, %size,
$xd);
print_locations ("GPG detached signatures[*]", @url_dir_list, %size,
"$tgz.sig", "$tbz.sig");
print_checksums ($tgz, $tbz, $xd);
print <<EOF;
[*] You can use either of the above signature files to verify that
the corresponding file (without the .sig suffix) is intact. First,
be sure to download both the .sig file and the corresponding tarball.
Then, run a command like this:
gpg --verify $tgz.sig
If that command fails because you don't have the required public key,
then run this command to import it:
gpg --keyserver wwwkeys.pgp.net --recv-keys $gpg_key_id
and rerun the \`gpg --verify' command.
EOF
print_news_deltas ($_, $prev_version, $curr_version)
foreach @news_file;
$release_type eq 'major'
or print_changelog_deltas ($package_name, $prev_version);
exit 0;
}
### Setup "GNU" style for perl-mode and cperl-mode.
## Local Variables:
## perl-indent-level: 2
## perl-continued-statement-offset: 2
## perl-continued-brace-offset: 0
## perl-brace-offset: 0
## perl-brace-imaginary-offset: 0
## perl-label-offset: -2
## cperl-indent-level: 2
## cperl-brace-offset: 0
## cperl-continued-brace-offset: 0
## cperl-label-offset: -2
## cperl-extra-newline-before-brace: t
## cperl-merge-trailing-else: nil
## cperl-continued-statement-offset: 2
## End:

167
bootstrap
View File

@@ -1,8 +1,8 @@
#! /bin/sh
# Bootstrap this package from CVS.
# Bootstrap this package from checked-out sources.
# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
# Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -29,6 +29,11 @@ nl='
LC_ALL=C
export LC_ALL
# Temporary directory names.
bt='._bootmp'
bt_regex=`echo "$bt"| sed 's/\./[.]/g'`
bt2=${bt}2
usage() {
echo >&2 "\
Usage: $0 [OPTION]...
@@ -38,14 +43,14 @@ Options:
--gnulib-srcdir=DIRNAME Specify the local directory where gnulib
sources reside. Use this if you already
have gnulib sources on your machine, and
do not want to waste your bandwidth dowloading
do not want to waste your bandwidth downloading
them again.
--copy Copy files instead of creating symbolic links.
--force Attempt to bootstrap even if the sources seem
not to have been checked out.
--skip-po Do not download po files.
--cvs-user=USERNAME Set the CVS username to be used when accessing
the gnulib repository.
--cvs-user=USERNAME Set the username to use when checking out
sources from the gnulib repository.
If the file .bootstrap.conf exists in the current working directory, its
contents are read as shell variables to configure the bootstrap.
@@ -84,18 +89,20 @@ extract_package_name='
}
'
package=`sed -n "$extract_package_name" configure.ac` || exit
gnulib_name=lib$package
build_aux=build-aux
# Extra files from gnulib, which override files from other sources.
gnulib_extra_files='
build-aux/install-sh
build-aux/missing
build-aux/mdate-sh
build-aux/texinfo.tex
build-aux/depcomp
build-aux/config.guess
build-aux/config.sub
gnulib_extra_files="
$build_aux/install-sh
$build_aux/missing
$build_aux/mdate-sh
$build_aux/texinfo.tex
$build_aux/depcomp
$build_aux/config.guess
$build_aux/config.sub
doc/INSTALL
'
"
# Other locale categories that need message catalogs.
EXTRA_LOCALE_CATEGORIES=
@@ -112,7 +119,7 @@ excluded_files=
# File that should exist in the top directory of a checked out hierarchy,
# but not in a distribution tarball.
CVS_only_file=README-cvs
checkout_only_file=README-hacking
# Whether to use copies instead of symlinks.
copy=false
@@ -137,7 +144,7 @@ do
--skip-po)
SKIP_PO=t;;
--force)
CVS_only_file=;;
checkout_only_file=;;
--copy)
copy=true;;
*)
@@ -146,12 +153,42 @@ do
esac
done
if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
exit 1
fi
echo "$0: Bootstrapping CVS $package..."
# If $STR is not already on a line by itself in $FILE, insert it,
# sorting the new contents of the file and replacing $FILE with the result.
insert_sorted_if_absent() {
file=$1
str=$2
echo "$str" | sort -u - $file | cmp -s - $file \
|| echo "$str" | sort -u - $file -o $file \
|| exit 1
}
# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac.
found_aux_dir=no
grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
>/dev/null && found_aux_dir=yes
grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
>/dev/null && found_aux_dir=yes
if test $found_aux_dir = no; then
echo "$0: expected line not found in configure.ac. Add the following:" >&2
echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2.
fi
# If $build_aux doesn't exist, create it now, otherwise some bits
# below will malfunction. If creating it, also mark it as ignored.
if test ! -d $build_aux; then
mkdir $build_aux
for ig in .cvsignore .gitignore; do
test -f $ig && insert_sorted_if_absent $ig $build_aux
done
fi
echo "$0: Bootstrapping from checked-out $package sources..."
cleanup_gnulib() {
status=$?
@@ -245,7 +282,9 @@ case $SKIP_PO in
WGET_COMMAND='';;
esac
get_translations po $package || exit
if test -d po; then
get_translations po $package || exit
fi
if test -d runtime-po; then
get_translations runtime-po $package-runtime || exit
@@ -314,7 +353,8 @@ cp_mark_as_generated()
if test -z "$c1"; then
cmp -s "$cp_src" "$cp_dst" || {
echo "$0: cp -f $cp_src $cp_dst" &&
cp -f "$cp_src" "$cp_dst"
rm -f "$cp_dst" &&
sed "s!$bt_regex/!!g" "$cp_src" > "$cp_dst"
}
else
# Copy the file first to get proper permissions if it
@@ -323,7 +363,7 @@ cp_mark_as_generated()
(
echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
cat "$cp_src"
sed "s!$bt_regex/!!g" "$cp_src"
) > $cp_dst-t &&
if cmp -s "$cp_dst-t" "$cp_dst"; then
rm -f "$cp_dst-t"
@@ -361,7 +401,7 @@ slurp() {
done
if test $file = Makefile.am; then
copied=$copied${sep}gnulib.mk; sep=$nl
remove_intl='/^[^#].*\/intl/s/^/#/'
remove_intl='/^[^#].*\/intl/s/^/#/;'"s!$bt_regex/!!g"
sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
rm -f $dir/gnulib.mk &&
@@ -392,8 +432,12 @@ slurp() {
for dot_ig in .cvsignore .gitignore; do
ig=$dir/$dot_ig
if test -n "$copied" && test -f $ig; then
echo "$copied" | sort -u - $ig | cmp -s - $ig ||
echo "$copied" | sort -u - $ig -o $ig || exit
insert_sorted_if_absent $ig "$copied"
# If an ignored file name ends with _.h, then also add
# the name with just ".h". Many gnulib headers are generated,
# e.g., stdint_.h -> stdint.h, dirent_.h ->..., etc.
f=`echo "$copied"|sed 's/_\.h$/.h/'`
insert_sorted_if_absent $ig "$f"
fi
done
done
@@ -401,9 +445,6 @@ slurp() {
# Create boot temporary directories to import from gnulib and gettext.
bt='.#bootmp'
bt2=${bt}2
rm -fr $bt $bt2 &&
mkdir $bt $bt2 || exit
@@ -412,9 +453,9 @@ mkdir $bt $bt2 || exit
gnulib_tool_options="\
--import\
--no-changelog\
--aux-dir $bt/build-aux\
--aux-dir $bt/$build_aux\
--doc-base $bt/doc\
--lib lib$package\
--lib $gnulib_name\
--m4-base $bt/m4/\
--source-base $bt/lib/\
--tests-base $bt/tests\
@@ -430,23 +471,34 @@ done
# Import from gettext.
with_gettext=yes
grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
with_gettext=no
echo "$0: (cd $bt2; autopoint) ..."
cp configure.ac $bt2 &&
(cd $bt2 && autopoint && rm configure.ac) &&
slurp $bt2 $bt || exit
if test $with_gettext = yes; then
echo "$0: (cd $bt2; autopoint) ..."
cp configure.ac $bt2 &&
(cd $bt2 && autopoint && rm configure.ac) &&
slurp $bt2 $bt || exit
rm -fr $bt $bt2 || exit
rm -fr $bt $bt2 || exit
fi
# Reconfigure, getting other files.
for command in \
libtool \
'aclocal --force -I m4' \
'autoconf --force' \
'autoheader --force' \
'automake --add-missing --copy --force-missing';
do
if test "$command" = libtool; then
grep '^[ ]*AM_PROG_LIBTOOL\>' configure.ac >/dev/null ||
continue
command='libtoolize -c -f'
fi
echo "$0: $command ..."
$command || exit
done
@@ -462,36 +514,37 @@ for file in $gnulib_extra_files; do
symlink_to_gnulib $file $dst || exit
done
# Create gettext configuration.
echo "$0: Creating po/Makevars from po/Makevars.template ..."
rm -f po/Makevars
sed '
/^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
/^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
/^XGETTEXT_OPTIONS *=/{
s/$/ \\/
a\
'"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
}
' po/Makevars.template >po/Makevars
if test -d runtime-po; then
# Similarly for runtime-po/Makevars, but not quite the same.
rm -f runtime-po/Makevars
if test $with_gettext = yes; then
# Create gettext configuration.
echo "$0: Creating po/Makevars from po/Makevars.template ..."
rm -f po/Makevars
sed '
/^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
/^subdir *=.*/s/=.*/= runtime-po/
/^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
/^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
/^XGETTEXT_OPTIONS *=/{
s/$/ \\/
a\
'"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
'"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
}
' <po/Makevars.template >runtime-po/Makevars
' po/Makevars.template >po/Makevars
# Copy identical files from po to runtime-po.
(cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
if test -d runtime-po; then
# Similarly for runtime-po/Makevars, but not quite the same.
rm -f runtime-po/Makevars
sed '
/^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
/^subdir *=.*/s/=.*/= runtime-po/
/^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
/^XGETTEXT_OPTIONS *=/{
s/$/ \\/
a\
'"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
}
' <po/Makevars.template >runtime-po/Makevars
# Copy identical files from po to runtime-po.
(cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
fi
fi
echo "$0: done. Now you can run './configure'."

View File

@@ -1,6 +1,6 @@
# Bootstrap configuration.
# Copyright (C) 2006 Free Software Foundation, Inc.
# Copyright (C) 2006, 2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -19,11 +19,12 @@
# We don't need these modules, even though gnulib-tool mistakenly
# includes them because of gettext dependencies.
# includes them because of gettext and fchdir dependencies.
avoided_gnulib_modules='
--avoid=lock
--avoid=size_max
--avoid=xsize
--avoid=canonicalize-lgpl
'
# These modules are obsolete and can probably be removed soon,
@@ -37,12 +38,14 @@ obsolete_gnulib_modules='
gnulib_modules="
$avoided_gnulib_modules
$obsolete_gnulib_modules
acl alloca argmatch assert backupfile base64 c-strtod
acl alloca announce-gen argmatch assert backupfile base64
c-strcase c-strtod
c-strtold calloc canon-host canonicalize chown cloexec
config-h configmake
closeout cycle-check d-ino d-type diacrit dirfd dirname dup2
error euidaccess exclude exitfail fcntl fcntl-safer fdl file-type
fileblocks filemode filenamecat fnmatch-gnu fopen-safer
error euidaccess exclude exitfail fchdir fcntl fcntl-safer fdl
file-type fileblocks filemode filenamecat fnmatch-gnu
fopen-safer
fprintftime fsusage ftruncate fts getdate getgroups gethrxtime
getline getloadavg getndelim2 getopt getpagesize getpass-gnu
gettext gettime gettimeofday getugroups getusershell gnupload
@@ -51,18 +54,20 @@ gnulib_modules="
lchmod lchown lib-ignore linebuffer link-follow
long-options lstat malloc mbswidth md5 memcasecmp mempcpy
memrchr mkancesdirs mkdir mkdir-p mkstemp mktime modechange
mountlist obstack pathmax perl physmem posixtm posixver putenv
mountlist mpsort obstack pathmax perl physmem posixtm posixver putenv
quote quotearg raise readlink readtokens readtokens0 readutmp
realloc regex rename-dest-slash rmdir rmdir-errno rpmatch
realloc regex rename-dest-slash rmdir rmdir-errno
root-dev-ino
rpmatch
safe-read same
save-cwd savedir savewd settime sha1 sig2str ssize_t stat-macros
stat-time stdbool stdlib-safer stpcpy strcase strftime
strpbrk strtoimax strtoumax strverscmp timespec tzset
stat-time stdbool stdlib-safer stpcpy strftime
strpbrk strtoimax strtoumax strverscmp sys_stat timespec tzset
unicodeio unistd-safer unlink-busy unlinkdir unlocked-io
uptime userspec utimecmp utimens vasprintf verify version-etc-fsf
wcwidth winsz-ioctl winsz-termios xalloc xgetcwd xgethostname
xmemcoll xnanosleep xreadlink xstrtod xstrtoimax xstrtol
xstrtold xstrtoumax yesno
xmemcoll xnanosleep xreadlink xreadlink-with-size xstrtod xstrtoimax
xstrtol xstrtold xstrtoumax yesno
"
# Other locale categories that need message catalogs.
@@ -76,17 +81,32 @@ XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
--flag=wrapf:1:c-format\\\
'
# Gettext supplies these files, but we don't need them since
# we don't have an intl subdirectory.
excluded_files='
m4/glibc2.m4
m4/intdiv0.m4
m4/lcmessage.m4
m4/lock.m4
m4/printf-posix.m4
m4/size_max.m4
m4/uintmax_t.m4
m4/ulonglong.m4
m4/visibility.m4
m4/xsize.m4
'
# If "AM_GNU_GETTEXT(external" or "AM_GNU_GETTEXT([external]"
# appears in configure.ac, exclude some unnecessary files.
# Without grep's -E option (not portable enough, pre-configure),
# the following test is ugly. Also, this depends on the existence
# of configure.ac, not the obsolescent-named configure.in. But if
# you're using this infrastructure, you should care about such things.
gettext_external=0
grep '^[ ]*AM_GNU_GETTEXT(external\>' configure.ac > /dev/null &&
gettext_external=1
grep '^[ ]*AM_GNU_GETTEXT(\[external\]' configure.ac > /dev/null &&
gettext_external=1
if test $gettext_external = 1; then
# Gettext supplies these files, but we don't need them since
# we don't have an intl subdirectory.
excluded_files='
m4/glibc2.m4
m4/intdiv0.m4
m4/lcmessage.m4
m4/lock.m4
m4/printf-posix.m4
m4/size_max.m4
m4/uintmax_t.m4
m4/ulonglong.m4
m4/visibility.m4
m4/xsize.m4
'
fi

View File

@@ -1,3 +1,4 @@
announce-gen
compile
config.guess
config.rpath
@@ -5,6 +6,7 @@ config.sub
depcomp
gnupload
install-sh
link-warning.h
mdate-sh
missing
mkinstalldirs

View File

@@ -1,3 +1,4 @@
announce-gen
compile
config.guess
config.rpath
@@ -5,6 +6,7 @@ config.sub
depcomp
gnupload
install-sh
link-warning.h
mdate-sh
missing
texinfo.tex

View File

@@ -1,3 +1,8 @@
2007-01-30 Jim Meyering <jim@meyering.net>
* vc-list-files: Select column 2, not 3 (hg-0.9.3's manifest format
now has only two columns).
2006-10-14 Jim Meyering <jim@meyering.net>
* vc-list-files: Don't filter git-ls-files output through cut.

View File

@@ -1,7 +1,7 @@
#!/bin/sh
# List the specified version-controlled files.
# Copyright (C) 2006 Free Software Foundation, Inc.
# Copyright (C) 2006, 2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -43,9 +43,9 @@ if test -d .git; then
fi
elif test -d .hg; then
if test "x$include_prefix" = x; then
hg manifest | cut -d ' ' -f 3
hg manifest | cut -d ' ' -f 2
else
hg manifest | cut -d ' ' -f 3 | grep "^$include_prefix/"
hg manifest | cut -d ' ' -f 2 | grep "^$include_prefix/"
fi
elif test -x build-aux/cvsu; then
build-aux/cvsu --find --types=AFGM $include_prefix

View File

@@ -1,7 +1,7 @@
# -*- autoconf -*-
# Process this file with autoconf to produce a configure script.
# Copyright (C) 1991, 1993-2006 Free Software Foundation, Inc.
# Copyright (C) 1991, 1993-2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -19,15 +19,15 @@
dnl Written by Jim Meyering.
AC_PREREQ(2.60)
AC_INIT([GNU coreutils],[6.4],[bug-coreutils@gnu.org])
AC_PREREQ(2.61)
AC_INIT([GNU coreutils],[6.9],[bug-coreutils@gnu.org])
AC_CONFIG_SRCDIR(src/ls.c)
AC_CONFIG_AUX_DIR(build-aux)
AC_CONFIG_HEADERS([lib/config.h:lib/config.hin])
AB_INIT()
AM_INIT_AUTOMAKE([1.9.6 gnits dist-bzip2])
AM_INIT_AUTOMAKE([1.10 dist-bzip2])
AC_PROG_CC_STDC
AM_PROG_CC_C_O
@@ -39,6 +39,8 @@ gl_EARLY
gl_INIT
coreutils_MACROS
AC_FUNC_FORK
AC_CHECK_FUNCS(uname,
OPTIONAL_BIN_PROGS="$OPTIONAL_BIN_PROGS uname\$(EXEEXT)"
MAN="$MAN uname.1")

View File

@@ -1,3 +1,93 @@
2007-03-21 Eric Blake <ebb9@byu.net>
* coreutils.texi (md5sum invocation): Document escapes in output
format. Reported by Armijn Hemel.
2007-03-15 Paul Eggert <eggert@cs.ucla.edu>
Fix manual in response to bug reports by Dan Jacobson.
* coreutils.texi (sort invocation): Explain numeric sorts better.
Compress self-congratulation into a simple "comparison is exact"
notice; the --general-numeric-sort option already explains the
tradeoffs.
(seq invocation): Add example of -f.
2007-03-12 Jim Meyering <jim@meyering.net>
* coreutils.texi (cp invocation): Mention that --preserve=timestamps
doesn't preserve time stamps on symbolic links.
Reported by Polo Talnir in <https://bugzilla.redhat.com/230866>.
2007-02-27 Paul Eggert <eggert@cs.ucla.edu>
* coreutils.texi (df invocation): With -P, the default block size
and output format is not affected by DF_BLOCK_SIZE, BLOCK_SIZE, or
BLOCKSIZE.
2007-01-30 Paul Eggert <eggert@cs.ucla.edu>
* coreutils.texi
(Input processing in ptx, mkdir invocation, rmdir invocation):
@item -> @itemx to fix some typos.
2007-01-30 Paul Eggert <eggert@cs.ucla.edu>
* coreutils.texi (mkdir invocation): Say how to set the file
permission bits of a parent directory with mkdir -p.
2007-01-29 Jim Meyering <jim@meyering.net>
Document new syntax: "chown +0:+287 file", "chgrp +99 file"
* coreutils.texi (Disambiguating names and IDs): New section.
(chown invocation, chgrp invocation): Mention the new syntax
with an xref to the new section.
2007-01-19 Jim Meyering <jim@meyering.net>
* coreutils.texi (ls: General output formatting): Mention the
workarounds to accommodate the Apple Terminal bug.
2007-01-04 Jim Meyering <jim@meyering.net>
* coreutils.texi (base64 invocation): When decoding, newlines
are always accepted.
2007-01-03 Jim Meyering <jim@meyering.net>
Document what the ".0" in e.g., "-k 2,3.0" means, and...
* coreutils.texi (sort invocation): ... that it can be applied to the
field-end spec, but not the field-start one. Patch from Evan Hunt.
2006-12-21 Jim Meyering <jim@meyering.net>
* coreutils.texi (dd invocation): Improve the documentation
for bs, ibs, obs, and cbs. Suggestion from Dan Jacobson.
Patch by Olivier Delhomme.
(dd invocation): Add to the description of cbs.
(dd invocation): Specify that bs=N overrides only any
_preceding_ ibs and obs settings. Spotted by Andreas Schwab.
2006-12-14 Jim Meyering <jim@meyering.net>
* coreutils.texi: Remove two doubled words.
(Treating / specially): With --preserve-root, chgrp and chown
will not modify "/", even through a symlink.
2006-11-28 Jim Meyering <jim@meyering.net>
* perm.texi (Mode Structure): Fix typo: s/setgid/setuid/.
Reported by Georg Neis as Debian bug 400778.
2006-10-27 Jim Meyering <jim@meyering.net>
* coreutils.texi (wc invocation): When giving the order in which
the various "counts" are listed, also mention "maximum line length".
Prompted by a report from Vincent LeFevre.
2006-10-23 Jim Meyering <jim@meyering.net>
* coreutils.texi (rm invocation): Describe --one-file-system.
2006-09-26 Paul Eggert <eggert@cs.ucla.edu>
* coreutils.texi (groups invocation): "groups" no longer prefixes

View File

@@ -208,6 +208,7 @@ Common Options
* Exit status:: Indicating program success or failure.
* Backup options:: Backup options
* Block size:: Block size
* Disambiguating names and IDs:: chgrp and chown owner and group syntax
* Random sources:: Sources of random data
* Target directory:: Target directory
* Trailing slashes:: Trailing slashes
@@ -557,8 +558,8 @@ symbolic link to a directory. @xref{Target directory}.
@itemx --si
@opindex --si
@cindex SI output
Append an SI-style abbreviation to each size, such as @samp{MB} for
megabytes. Powers of 1000 are used, not 1024; @samp{MB} stands for
Append an SI-style abbreviation to each size, such as @samp{M} for
megabytes. Powers of 1000 are used, not 1024; @samp{M} stands for
1,000,000 bytes. This option is equivalent to
@option{--block-size=si}. Use the @option{-h} or
@option{--human-readable} option if
@@ -644,6 +645,7 @@ name.
* Exit status:: Indicating program success or failure.
* Backup options:: -b -S, in some programs.
* Block size:: BLOCK_SIZE and --block-size, in some programs.
* Disambiguating names and IDs:: chgrp and chown owner and group syntax
* Random sources:: --random-source, in some programs.
* Target directory:: Specifying a target directory, in some programs.
* Trailing slashes:: --strip-trailing-slashes, in some programs.
@@ -924,6 +926,46 @@ set. The @option{-h} or @option{--human-readable} option is equivalent to
@option{--block-size=human-readable}. The @option{--si} option is
equivalent to @option{--block-size=si}.
@node Disambiguating names and IDs
@section chown and chgrp: Disambiguating user names and IDs
@cindex user names, disambiguating
@cindex user IDs, disambiguating
@cindex group names, disambiguating
@cindex group IDs, disambiguating
@cindex disambiguating group names and IDs
Since the @var{owner} and @var{group} arguments to @command{chown} and
@command{chgrp} may be specified as names or numeric IDs, there is an
apparent ambiguity.
What if a user or group @emph{name} is a string of digits?
@footnote{Using a number as a user name is common in some environments.}
Should the command interpret it as a user name or as an ID?
@acronym{POSIX} requires that @command{chown} and @command{chgrp}
first attempt to resolve the specified string as a name, and
only once that fails, then try to interpret it as an ID.
This is troublesome when you want to specify a numeric ID, say 42,
and it must work even in a pathological situation where
@samp{42} is a user name that maps to some other user ID, say 1000.
Simply invoking @code{chown 42 F}, will set @file{F}s owner ID to
1000---not what you intended.
GNU @command{chown} and @command{chgrp} provide a way to work around this,
that at the same time may result in a significant performance improvement
by eliminating a database look-up.
Simply precede each numeric user ID and/or group ID with a @samp{+},
in order to force its interpretation as an integer:
@example
chown +42 F
chgrp +$numeric_group_id another-file
chown +0:+0 /
@end example
GNU @command{chown} and @command{chgrp}
skip the name look-up process for each @samp{+}-prefixed string,
because a string containing @samp{+} is never a valid user or group name.
This syntax is accepted on most common Unix systems, but not on Solaris 10.
@node Random sources
@section Sources of random data
@@ -1158,6 +1200,10 @@ to operate recursively on @file{/}, so they default to
option makes them safer for most purposes. For convenience you can
specify @option{--preserve-root} in an alias or in a shell function.
Note that the @option{--preserve-root} option also ensures
that @command{chgrp} and @command{chown} do not modify @file{/}
even when dereferencing a symlink pointing to @file{/}.
@node Special built-in utilities
@section Special built-in utilities
@@ -1845,7 +1891,8 @@ output will be the original data.
@opindex -i
@opindex --ignore-garbage
@cindex Ignore garbage in base64 stream
During decoding, ignore unrecognized characters (including newline),
When decoding, newlines are always accepted.
During decoding, ignore unrecognized bytes,
to permit distorted data to be decoded.
@end table
@@ -2950,7 +2997,8 @@ wc [@var{option}]@dots{} [@var{file}]@dots{}
given as an argument, it prints the file name following the counts. If
more than one @var{file} is given, @command{wc} prints a final line
containing the cumulative counts, with the file name @file{total}. The
counts are printed in this order: newlines, words, characters, bytes.
counts are printed in this order: newlines, words, characters, bytes,
maximum line length.
Each count is printed right-justified in a field with at least one
space between fields so that the numbers and file names normally line
up nicely in columns. The width of the count fields varies depending
@@ -3155,6 +3203,10 @@ md5sum [@var{option}]@dots{} [@var{file}]@dots{}
For each @var{file}, @samp{md5sum} outputs the MD5 checksum, a flag
indicating a binary or text input file, and the file name.
If @var{file} contains a backslash or newline, the
line is started with a backslash, and each problematic character in
the file name is escaped with a backslash, making the output
unambiguous even in the presence of arbitrary file names.
If @var{file} is omitted or specified as @samp{-}, standard input is read.
The program accepts the following options. Also see @ref{Common options}.
@@ -3336,12 +3388,26 @@ mode:
@item -c
@itemx --check
@itemx --check=diagnose-first
@opindex -c
@opindex --check
@cindex checking for sortedness
Check whether the given files are already sorted: if they are not all
sorted, print an error message and exit with a status of 1.
Check whether the given file is already sorted: if it is not all
sorted, print a diagnostic containing the first out-of-order line and
exit with a status of 1.
Otherwise, exit successfully.
At most one input file can be given.
@item -C
@itemx --check=quiet
@itemx --check=silent
@opindex -c
@opindex --check
@cindex checking for sortedness
Exit successfully if the given file is already sorted, and
exit with status 1 otherwise.
At most one input file can be given.
This is like @option{-c}, except it does not print a diagnostic.
@item -m
@itemx --merge
@@ -3395,7 +3461,7 @@ Exit status:
@display
0 if no error occurred
1 if invoked with @option{-c} and the input is not properly sorted
1 if invoked with @option{-c} or @option{-C} and the input is not sorted
2 if an error occurred
@end display
@@ -3405,7 +3471,6 @@ value as the directory for temporary files instead of @file{/tmp}. The
@option{--temporary-directory} (@option{-T}) option in turn overrides
the environment variable.
The following options affect the ordering of output lines. They may be
specified globally or as part of a specific key field. If no key
fields are specified, global options apply to comparison of entire
@@ -3514,26 +3579,16 @@ can change this.
@opindex --numeric-sort
@cindex numeric sort
@vindex LC_NUMERIC
Sort numerically: the number begins each line; specifically, it consists
Sort numerically. The number begins each line and consists
of optional blanks, an optional @samp{-} sign, and zero or more
digits possibly separated by thousands separators, optionally followed
by a decimal-point character and zero or more digits. A string of
no digits is interpreted as @samp{0}. The @env{LC_NUMERIC}
by a decimal-point character and zero or more digits. An empty
number is treated as @samp{0}. The @env{LC_NUMERIC}
locale specifies the decimal-point character and thousands separator.
By default a blank is a space or a tab, but the @env{LC_CTYPE} locale
can change this.
Numeric sort uses what might be considered an unconventional method to
compare strings representing floating point numbers. Rather than first
converting each string to the C @code{double} type and then comparing
those values, @command{sort} aligns the decimal-point characters in the
two strings and compares the strings a character at a time. One benefit
of using this approach is its speed. In practice this is much more
efficient than performing the two corresponding string-to-double (or
even string-to-integer) conversions and then comparing doubles. In
addition, there is no corresponding loss of precision. Converting each
string to @code{double} before comparison would limit precision to about
16 digits on most systems.
Comparison is exact; there is no rounding error.
Neither a leading @samp{+} nor exponential notation is recognized.
To compare such strings numerically, use the
@@ -3572,6 +3627,18 @@ Other options are:
@table @samp
@item --compress-program=@var{prog}
Compress any temporary files with the program @var{prog}.
With no arguments, @var{prog} must compress standard input to standard
output, and when given the @option{-d} option it must decompress
standard input to standard output.
Terminate with an error if @var{prog} exits with nonzero status.
Whitespace and the backslash character should not appear in
@var{prog}; they are reserved for future use.
@item -k @var{pos1}[,@var{pos2}]
@itemx --key=@var{pos1}[,@var{pos2}]
@opindex -k
@@ -3579,9 +3646,21 @@ Other options are:
@cindex sort field
Specify a sort field that consists of the part of the line between
@var{pos1} and @var{pos2} (or the end of the line, if @var{pos2} is
omitted), @emph{inclusive}. Fields and character positions are numbered
starting with 1. So to sort on the second field, you'd use
@option{--key=2,2} (@option{-k 2,2}). See below for more examples.
omitted), @emph{inclusive}.
Each @var{pos} has the form @samp{@var{f}[.@var{c}][@var{opts}]},
where @var{f} is the number of the field to use, and @var{c} is the number
of the first character from the beginning of the field. Fields and character
positions are numbered starting with 1; a character position of zero in
@var{pos2} indicates the field's last character. If @samp{.@var{c}} is
omitted from @var{pos1}, it defaults to 1 (the beginning of the field);
if omitted from @var{pos2}, it defaults to 0 (the end of the field).
@var{opts} are ordering options, allowing individual keys to be sorted
according to different rules; see below for details. Keys can span
multiple fields.
Example: To sort on the second field, use @option{--key=2,2}
(@option{-k 2,2}). See below for more examples.
@item -o @var{output-file}
@itemx --output=@var{output-file}
@@ -3685,7 +3764,7 @@ disks and controllers.
@cindex uniquifying output
Normally, output only the first of a sequence of lines that compare
equal. For the @option{--check} (@option{-c}) option,
equal. For the @option{--check} (@option{-c} or @option{-C}) option,
check that no pair of consecutive lines compares equal.
This option also disables the default last-resort comparison.
@@ -3720,29 +3799,21 @@ consistency, @option{-M} has been changed in the same way. This may
affect the meaning of character positions in field specifications in
obscure cases. The only fix is to add an explicit @option{-b}.
A position in a sort field specified with the @option{-k}
option has the form @samp{@var{f}.@var{c}}, where @var{f} is the number
of the field to use and @var{c} is the number of the first character
from the beginning of the field. In a start position, an omitted
@samp{.@var{c}} stands for the field's first character. In an end
position, an omitted or zero @samp{.@var{c}} stands for the field's
last character. If the start field falls after the end of the line
or after the end field, the field is empty. If the
@option{-b} option was specified, the @samp{.@var{c}} part of a field
specification is counted from the first nonblank character of the field.
A sort key position may also have any of the option letters @samp{Mbdfinr}
appended to it, in which case the global ordering options are not used
for that particular field. The @option{-b} option may be independently
attached to either or both of the start and
end positions of a field specification, and if it is inherited
from the global options it will be attached to both.
A position in a sort field specified with @option{-k} may have any
of the option letters @samp{Mbdfinr} appended to it, in which case the
global ordering options are not used for that particular field. The
@option{-b} option may be independently attached to either or both of
the start and end positions of a field specification, and if it is
inherited from the global options it will be attached to both.
If input lines can contain leading or adjacent blanks and @option{-t}
is not used, then @option{-k} is typically combined with @option{-b},
@option{-g}, @option{-M}, or @option{-n}; otherwise the varying
numbers of leading blanks in fields can cause confusing results.
Keys can span multiple fields.
If the start position in a sort field specifier falls after the end of
the line or after the end field, the field is empty. If the @option{-b}
option was specified, the @samp{.@var{c}} part of a field specification
is counted from the first nonblank character of the field.
@vindex _POSIX2_VERSION
@vindex POSIXLY_CORRECT
@@ -4488,7 +4559,7 @@ Fold lower case letters to upper case for sorting.
@table @samp
@item -b @var{file}
@item --break-file=@var{file}
@itemx --break-file=@var{file}
This option provides an alternative (to @option{-W}) method of describing
which characters make up words. It introduces the name of a
@@ -6409,6 +6480,13 @@ Assume that each tab stop is @var{cols} columns wide. The default is 8.
@command{ls} uses tabs where possible in the output, for efficiency. If
@var{cols} is zero, do not use tabs at all.
@c FIXME: remove in 2009, if Apple Terminal has been fixed for long enough.
Some terminal emulators (at least Apple Terminal 1.5 (133) from Mac OS X 10.4.8)
do not properly align columns to the right of a TAB following a
non-@acronym{ASCII} byte. If you use such a terminal emulator, use the
@option{-T0} option or put @code{TABSIZE=0} in your environment to tell
@command{ls} to align using spaces, not tabs.
@item -w
@itemx --width=@var{cols}
@opindex -w
@@ -6946,7 +7024,13 @@ and ordinary users
may preserve the group ownership of a file only if they happen to be
a member of the desired group.
@itemx timestamps
Preserve the times of last access and last modification.
Preserve the times of last access and last modification, when possible.
In general, it is not possible to preserve these attributes
when the affected file is a symbolic link.
However, FreeBSD now provides the @code{lutimes} function, which makes
it possibile even for symbolic links. However, this implementation does
not yet take advantage of that.
@c FIXME: once we provide lutimes support, update the above.
@itemx links
Preserve in the destination files
any links between corresponding source files.
@@ -7150,25 +7234,33 @@ bytes (or the size specified with @samp{seek=}).
@opindex ibs
@cindex block size of input
@cindex input block size
Read @var{bytes} bytes at a time.
Set the input block size to @var{bytes}.
This makes @command{dd} read @var{bytes} per block.
@item obs=@var{bytes}
@opindex obs
@cindex block size of output
@cindex output block size
Write @var{bytes} bytes at a time.
Set the output block size to @var{bytes}.
This makes @command{dd} write @var{bytes} per block.
@item bs=@var{bytes}
@opindex bs
@cindex block size
Both read and write @var{bytes} bytes at a time. This overrides
@samp{ibs} and @samp{obs}.
Set both input and output block sizes to @var{bytes}.
This makes @command{dd} read and write @var{bytes} per block,
overriding any @samp{ibs} and @samp{obs} settings.
@item cbs=@var{bytes}
@opindex cbs
@cindex block size of conversion
@cindex conversion block size
Convert @var{bytes} bytes at a time.
@cindex fixed-length records, converting to variable-length
@cindex variable-length records, converting to fixed-length
Set the conversion block size to @var{bytes}.
When converting variable-length records to fixed-length ones
(@option{conv=block}) or the reverse (@option{conv=unblock}),
use @var{bytes} as the fixed record length.
@item skip=@var{blocks}
@opindex skip
@@ -7345,6 +7437,8 @@ Use non-blocking I/O.
@opindex noatime
@cindex access time
Do not update the file's access time.
Some older file systems silently ignore this flag, so it is a good
idea to test it on your files before relying on it.
@item noctty
@opindex noctty
@@ -7772,6 +7866,24 @@ removal is requested. Equivalent to @option{-I}.
Specifying @option{--interactive} and no @var{when} is equivalent to
@option{--interactive=always}.
@itemx --one-file-system
@opindex --one-file-system
@cindex one file system, restricting @command{rm} to
When removing a hierarchy recursively, skip any directory that is on a
file system different from that of the corresponding command line argument.
This option is useful when removing a build ``chroot'' hierarchy,
which normally contains no valuable data. However, it is not uncommon
to bind-mount @file{/home} into such a hierarchy, to make it easier to
use one's start-up file. The catch is that it's easy to forget to
unmount @file{/home}. Then, when you use @command{rm -rf} to remove
your normally throw-away chroot, that command will remove everything
under @file{/home}, too.
Use the @option{--one-file-system} option, and it will
warn about and skip directories on other file systems.
Of course, this will not save your @file{/home} if it and your
chroot happen to be on the same file system.
@itemx --preserve-root
@opindex --preserve-root
@cindex root directory, disallow recursive destruction
@@ -8334,15 +8446,23 @@ overridden in this way.
@opindex -p
@opindex --parents
@cindex parent directories, creating
Make any missing parent directories for each argument. The file permission
bits of parent directories are set to the umask modified by @samp{u+wx}.
@xref{Directory Setuid and Setgid}, for how the set-user-ID and
set-group-ID bits of parent directories are inherited.
Ignore arguments corresponding to existing directories, and do not
change their file mode bits.
Make any missing parent directories for each argument, setting their
file permission bits to the umask modified by @samp{u+wx}. Ignore
existing parent directories, and do not change their file permission
bits.
To set the file permission bits of any newly-created parent
directories to a value that includes @samp{u+wx}, you can set the
umask before invoking @command{mkdir}. For example, if the shell
command @samp{(umask u=rwx,go=rx; mkdir -p P/Q)} creates the parent
@file{P} it sets the parent's permission bits to @samp{u=rwx,go=rx}.
To set a parent's special mode bits as well, you can invoke
@command{chmod} after @command{mkdir}. @xref{Directory Setuid and
Setgid}, for how the set-user-ID and set-group-ID bits of
newly-created parent directories are inherited.
@item -v
@item --verbose
@itemx --verbose
@opindex -v
@opindex --verbose
Print a message for each created directory. This is most useful with
@@ -8589,7 +8709,7 @@ a failure does not evoke a diagnostic and does not cause @command{rmdir} to
exit unsuccessfully.
@item -v
@item --verbose
@itemx --verbose
@opindex -v
@opindex --verbose
@cindex directory deletion, reporting
@@ -8708,6 +8828,10 @@ owner nor the group is changed.
@end table
If @var{owner} or @var{group} is intended to represent a numeric user
or group ID, then you may specify it with a leading @samp{+}.
@xref{Disambiguating names and IDs}.
Some older scripts may still use @samp{.} in place of the @samp{:} separator.
@acronym{POSIX} 1003.1-2001 (@pxref{Standards conformance}) does not
require support for that, but for backward compatibility @acronym{GNU}
@@ -8883,6 +9007,10 @@ or to the group of an existing reference file. Synopsis:
chgrp [@var{option}]@dots{} @{@var{group} | --reference=@var{ref_file}@} @var{file}@dots{}
@end example
If @var{group} is intended to represent a
numeric group ID, then you may specify it with a leading @samp{+}.
@xref{Disambiguating names and IDs}.
The program accepts the following options. Also see @ref{Common options}.
@table @samp
@@ -9132,7 +9260,7 @@ operations, for a user to change the ctime field to a user-specified value.
Time stamps assume the time zone rules specified by the @env{TZ}
environment variable, or by the system default rules if @env{TZ} is
not set. @xref{TZ Variable,, Specifying the Time Zone with @env{TZ},
libc, The GNU C Library}. You can avoid avoid ambiguities during
libc, The GNU C Library}. You can avoid ambiguities during
daylight saving transitions by using @sc{utc} time stamps.
The program accepts the following options. Also see @ref{Common options}.
@@ -9353,6 +9481,13 @@ some network mounts), the columns are misaligned.
@item
The labels in the header output line are changed to conform to @acronym{POSIX}.
@item
The default block size and output format are unaffected by the
@env{DF_BLOCK_SIZE}, @env{BLOCK_SIZE} and @env{BLOCKSIZE} environment
variables. However, the default block size is still affected by
@env{POSIXLY_CORRECT}: it is 512 if @env{POSIXLY_CORRECT} is set, 1024
otherwise. @xref{Block size}.
@end enumerate
@optSi
@@ -9780,7 +9915,7 @@ $ stat --format=%d:%i / /usr
@opindex --printf=@var{format}
@cindex output format
Use @var{format} rather than the default format.
Like like @option{--format}, but interpret backslash escapes,
Like @option{--format}, but interpret backslash escapes,
and do not output a mandatory trailing newline.
If you want a newline, include @samp{\n} in the @var{format}.
Here's how you would use @option{--printf} to print the device
@@ -13798,6 +13933,12 @@ Print all numbers using @var{format}.
@var{format} must contain exactly one of the @samp{printf}-style
floating point conversion specifications @samp{%a}, @samp{%e},
@samp{%f}, @samp{%g}, @samp{%A}, @samp{%E}, @samp{%F}, @samp{%G}.
The @samp{%} may be followed by zero or more flags taken from the set
@samp{-+#0 '}, then an optional width containing one or more digits,
then an optional precision consisting of a @samp{.} followed by zero
or more digits. @var{format} may also contain any number of @samp{%%}
conversion specifications. All conversion specifications have the
same meaning as with @samp{printf}.
The default format is derived from @var{first}, @var{step}, and
@var{last}. If these all use a fixed point decimal representation,
@@ -13820,6 +13961,15 @@ decimal representation.
@end table
You can get finer-grained control over output with @option{-f}:
@example
$ seq -f '(%9.2E)' -9e5 1.1e6 1.3e6
(-9.00E+05)
( 2.00E+05)
( 1.30E+06)
@end example
If you want hexadecimal integer output, you can use @command{printf}
to perform the conversion:

View File

@@ -75,7 +75,7 @@ executable files (programs) and, on most systems, directories:
@cindex set-user-ID
@cindex setuid
Set the process's effective user ID to that of the file upon execution
(called the @dfn{set-user-ID bit}, or sometimes the @dfn{setgid bit}).
(called the @dfn{set-user-ID bit}, or sometimes the @dfn{setuid bit}).
For directories on a few systems, give files created in the directory
the same owner as the directory, no matter who creates them, and set
the set-user-ID bit of newly-created subdirectories.

559
gl/lib/base64.c Normal file
View File

@@ -0,0 +1,559 @@
/* base64.c -- Encode binary data using printable characters.
Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006, 2007 Free Software
Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* Written by Simon Josefsson. Partially adapted from GNU MailUtils
* (mailbox/filter_trans.c, as of 2004-11-28). Improved by review
* from Paul Eggert, Bruno Haible, and Stepan Kasal.
*
* See also RFC 3548 <http://www.ietf.org/rfc/rfc3548.txt>.
*
* Be careful with error checking. Here is how you would typically
* use these functions:
*
* bool ok = base64_decode_alloc (in, inlen, &out, &outlen);
* if (!ok)
* FAIL: input was not valid base64
* if (out == NULL)
* FAIL: memory allocation error
* OK: data in OUT/OUTLEN
*
* size_t outlen = base64_encode_alloc (in, inlen, &out);
* if (out == NULL && outlen == 0 && inlen != 0)
* FAIL: input too long
* if (out == NULL)
* FAIL: memory allocation error
* OK: data in OUT/OUTLEN.
*
*/
#include <config.h>
/* Get prototype. */
#include "base64.h"
/* Get malloc. */
#include <stdlib.h>
/* Get UCHAR_MAX. */
#include <limits.h>
#include <string.h>
/* C89 compliant way to cast 'char' to 'unsigned char'. */
static inline unsigned char
to_uchar (char ch)
{
return ch;
}
/* Base64 encode IN array of size INLEN into OUT array of size OUTLEN.
If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as
possible. If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero
terminate the output buffer. */
void
base64_encode (const char *restrict in, size_t inlen,
char *restrict out, size_t outlen)
{
static const char b64str[64] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
while (inlen && outlen)
{
*out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f];
if (!--outlen)
break;
*out++ = b64str[((to_uchar (in[0]) << 4)
+ (--inlen ? to_uchar (in[1]) >> 4 : 0))
& 0x3f];
if (!--outlen)
break;
*out++ =
(inlen
? b64str[((to_uchar (in[1]) << 2)
+ (--inlen ? to_uchar (in[2]) >> 6 : 0))
& 0x3f]
: '=');
if (!--outlen)
break;
*out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '=';
if (!--outlen)
break;
if (inlen)
inlen--;
if (inlen)
in += 3;
}
if (outlen)
*out = '\0';
}
/* Allocate a buffer and store zero terminated base64 encoded data
from array IN of size INLEN, returning BASE64_LENGTH(INLEN), i.e.,
the length of the encoded data, excluding the terminating zero. On
return, the OUT variable will hold a pointer to newly allocated
memory that must be deallocated by the caller. If output string
length would overflow, 0 is returned and OUT is set to NULL. If
memory allocation failed, OUT is set to NULL, and the return value
indicates length of the requested memory block, i.e.,
BASE64_LENGTH(inlen) + 1. */
size_t
base64_encode_alloc (const char *in, size_t inlen, char **out)
{
size_t outlen = 1 + BASE64_LENGTH (inlen);
/* Check for overflow in outlen computation.
*
* If there is no overflow, outlen >= inlen.
*
* If the operation (inlen + 2) overflows then it yields at most +1, so
* outlen is 0.
*
* If the multiplication overflows, we lose at least half of the
* correct value, so the result is < ((inlen + 2) / 3) * 2, which is
* less than (inlen + 2) * 0.66667, which is less than inlen as soon as
* (inlen > 4).
*/
if (inlen > outlen)
{
*out = NULL;
return 0;
}
*out = malloc (outlen);
if (!*out)
return outlen;
base64_encode (in, inlen, *out, outlen);
return outlen - 1;
}
/* With this approach this file works independent of the charset used
(think EBCDIC). However, it does assume that the characters in the
Base64 alphabet (A-Za-z0-9+/) are encoded in 0..255. POSIX
1003.1-2001 require that char and unsigned char are 8-bit
quantities, though, taking care of that problem. But this may be a
potential problem on non-POSIX C99 platforms.
IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_"
as the formal parameter rather than "x". */
#define B64(_) \
((_) == 'A' ? 0 \
: (_) == 'B' ? 1 \
: (_) == 'C' ? 2 \
: (_) == 'D' ? 3 \
: (_) == 'E' ? 4 \
: (_) == 'F' ? 5 \
: (_) == 'G' ? 6 \
: (_) == 'H' ? 7 \
: (_) == 'I' ? 8 \
: (_) == 'J' ? 9 \
: (_) == 'K' ? 10 \
: (_) == 'L' ? 11 \
: (_) == 'M' ? 12 \
: (_) == 'N' ? 13 \
: (_) == 'O' ? 14 \
: (_) == 'P' ? 15 \
: (_) == 'Q' ? 16 \
: (_) == 'R' ? 17 \
: (_) == 'S' ? 18 \
: (_) == 'T' ? 19 \
: (_) == 'U' ? 20 \
: (_) == 'V' ? 21 \
: (_) == 'W' ? 22 \
: (_) == 'X' ? 23 \
: (_) == 'Y' ? 24 \
: (_) == 'Z' ? 25 \
: (_) == 'a' ? 26 \
: (_) == 'b' ? 27 \
: (_) == 'c' ? 28 \
: (_) == 'd' ? 29 \
: (_) == 'e' ? 30 \
: (_) == 'f' ? 31 \
: (_) == 'g' ? 32 \
: (_) == 'h' ? 33 \
: (_) == 'i' ? 34 \
: (_) == 'j' ? 35 \
: (_) == 'k' ? 36 \
: (_) == 'l' ? 37 \
: (_) == 'm' ? 38 \
: (_) == 'n' ? 39 \
: (_) == 'o' ? 40 \
: (_) == 'p' ? 41 \
: (_) == 'q' ? 42 \
: (_) == 'r' ? 43 \
: (_) == 's' ? 44 \
: (_) == 't' ? 45 \
: (_) == 'u' ? 46 \
: (_) == 'v' ? 47 \
: (_) == 'w' ? 48 \
: (_) == 'x' ? 49 \
: (_) == 'y' ? 50 \
: (_) == 'z' ? 51 \
: (_) == '0' ? 52 \
: (_) == '1' ? 53 \
: (_) == '2' ? 54 \
: (_) == '3' ? 55 \
: (_) == '4' ? 56 \
: (_) == '5' ? 57 \
: (_) == '6' ? 58 \
: (_) == '7' ? 59 \
: (_) == '8' ? 60 \
: (_) == '9' ? 61 \
: (_) == '+' ? 62 \
: (_) == '/' ? 63 \
: -1)
static const signed char b64[0x100] = {
B64 (0), B64 (1), B64 (2), B64 (3),
B64 (4), B64 (5), B64 (6), B64 (7),
B64 (8), B64 (9), B64 (10), B64 (11),
B64 (12), B64 (13), B64 (14), B64 (15),
B64 (16), B64 (17), B64 (18), B64 (19),
B64 (20), B64 (21), B64 (22), B64 (23),
B64 (24), B64 (25), B64 (26), B64 (27),
B64 (28), B64 (29), B64 (30), B64 (31),
B64 (32), B64 (33), B64 (34), B64 (35),
B64 (36), B64 (37), B64 (38), B64 (39),
B64 (40), B64 (41), B64 (42), B64 (43),
B64 (44), B64 (45), B64 (46), B64 (47),
B64 (48), B64 (49), B64 (50), B64 (51),
B64 (52), B64 (53), B64 (54), B64 (55),
B64 (56), B64 (57), B64 (58), B64 (59),
B64 (60), B64 (61), B64 (62), B64 (63),
B64 (64), B64 (65), B64 (66), B64 (67),
B64 (68), B64 (69), B64 (70), B64 (71),
B64 (72), B64 (73), B64 (74), B64 (75),
B64 (76), B64 (77), B64 (78), B64 (79),
B64 (80), B64 (81), B64 (82), B64 (83),
B64 (84), B64 (85), B64 (86), B64 (87),
B64 (88), B64 (89), B64 (90), B64 (91),
B64 (92), B64 (93), B64 (94), B64 (95),
B64 (96), B64 (97), B64 (98), B64 (99),
B64 (100), B64 (101), B64 (102), B64 (103),
B64 (104), B64 (105), B64 (106), B64 (107),
B64 (108), B64 (109), B64 (110), B64 (111),
B64 (112), B64 (113), B64 (114), B64 (115),
B64 (116), B64 (117), B64 (118), B64 (119),
B64 (120), B64 (121), B64 (122), B64 (123),
B64 (124), B64 (125), B64 (126), B64 (127),
B64 (128), B64 (129), B64 (130), B64 (131),
B64 (132), B64 (133), B64 (134), B64 (135),
B64 (136), B64 (137), B64 (138), B64 (139),
B64 (140), B64 (141), B64 (142), B64 (143),
B64 (144), B64 (145), B64 (146), B64 (147),
B64 (148), B64 (149), B64 (150), B64 (151),
B64 (152), B64 (153), B64 (154), B64 (155),
B64 (156), B64 (157), B64 (158), B64 (159),
B64 (160), B64 (161), B64 (162), B64 (163),
B64 (164), B64 (165), B64 (166), B64 (167),
B64 (168), B64 (169), B64 (170), B64 (171),
B64 (172), B64 (173), B64 (174), B64 (175),
B64 (176), B64 (177), B64 (178), B64 (179),
B64 (180), B64 (181), B64 (182), B64 (183),
B64 (184), B64 (185), B64 (186), B64 (187),
B64 (188), B64 (189), B64 (190), B64 (191),
B64 (192), B64 (193), B64 (194), B64 (195),
B64 (196), B64 (197), B64 (198), B64 (199),
B64 (200), B64 (201), B64 (202), B64 (203),
B64 (204), B64 (205), B64 (206), B64 (207),
B64 (208), B64 (209), B64 (210), B64 (211),
B64 (212), B64 (213), B64 (214), B64 (215),
B64 (216), B64 (217), B64 (218), B64 (219),
B64 (220), B64 (221), B64 (222), B64 (223),
B64 (224), B64 (225), B64 (226), B64 (227),
B64 (228), B64 (229), B64 (230), B64 (231),
B64 (232), B64 (233), B64 (234), B64 (235),
B64 (236), B64 (237), B64 (238), B64 (239),
B64 (240), B64 (241), B64 (242), B64 (243),
B64 (244), B64 (245), B64 (246), B64 (247),
B64 (248), B64 (249), B64 (250), B64 (251),
B64 (252), B64 (253), B64 (254), B64 (255)
};
#if UCHAR_MAX == 255
# define uchar_in_range(c) true
#else
# define uchar_in_range(c) ((c) <= 255)
#endif
/* Return true if CH is a character from the Base64 alphabet, and
false otherwise. Note that '=' is padding and not considered to be
part of the alphabet. */
bool
isbase64 (char ch)
{
return uchar_in_range (to_uchar (ch)) && 0 <= b64[to_uchar (ch)];
}
/* Initialize decode-context buffer, CTX. */
void
base64_decode_ctx_init (struct base64_decode_context *ctx)
{
ctx->i = 0;
}
/* If CTX->i is 0 or 4, there are four or more bytes in [*IN..IN_END), and
none of those four is a newline, then return *IN. Otherwise, copy up to
4 - CTX->i non-newline bytes from that range into CTX->buf, starting at
index CTX->i and setting CTX->i to reflect the number of bytes copied,
and return CTX->buf. In either case, advance *IN to point to the byte
after the last one processed, and set *N_NON_NEWLINE to the number of
verified non-newline bytes accessible through the returned pointer. */
static inline char *
get_4 (struct base64_decode_context *ctx,
char const *restrict *in, char const *restrict in_end,
size_t *n_non_newline)
{
if (ctx->i == 4)
ctx->i = 0;
if (ctx->i == 0)
{
char const *t = *in;
if (4 <= in_end - *in && memchr (t, '\n', 4) == NULL)
{
/* This is the common case: no newline. */
*in += 4;
*n_non_newline = 4;
return (char *) t;
}
}
{
/* Copy non-newline bytes into BUF. */
char const *p = *in;
while (p < in_end)
{
char c = *p++;
if (c != '\n')
{
ctx->buf[ctx->i++] = c;
if (ctx->i == 4)
break;
}
}
*in = p;
*n_non_newline = ctx->i;
return ctx->buf;
}
}
#define return_false \
do \
{ \
*outp = out; \
return false; \
} \
while (false)
/* Decode up to four bytes of base64-encoded data, IN, of length INLEN
into the output buffer, *OUT, of size *OUTLEN bytes. Return true if
decoding is successful, false otherwise. If *OUTLEN is too small,
as many bytes as possible are written to *OUT. On return, advance
*OUT to point to the byte after the last one written, and decrement
*OUTLEN to reflect the number of bytes remaining in *OUT. */
static inline bool
decode_4 (char const *restrict in, size_t inlen,
char *restrict *outp, size_t *outleft)
{
char *out = *outp;
if (inlen < 2)
return false;
if (!isbase64 (in[0]) || !isbase64 (in[1]))
return false;
if (*outleft)
{
*out++ = ((b64[to_uchar (in[0])] << 2)
| (b64[to_uchar (in[1])] >> 4));
--*outleft;
}
if (inlen == 2)
return_false;
if (in[2] == '=')
{
if (inlen != 4)
return_false;
if (in[3] != '=')
return_false;
}
else
{
if (!isbase64 (in[2]))
return_false;
if (*outleft)
{
*out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0)
| (b64[to_uchar (in[2])] >> 2));
--*outleft;
}
if (inlen == 3)
return_false;
if (in[3] == '=')
{
if (inlen != 4)
return_false;
}
else
{
if (!isbase64 (in[3]))
return_false;
if (*outleft)
{
*out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0)
| b64[to_uchar (in[3])]);
--*outleft;
}
}
}
*outp = out;
return true;
}
/* Decode base64-encoded input array IN of length INLEN to output array
OUT that can hold *OUTLEN bytes. The input data may be interspersed
with newlines. Return true if decoding was successful, i.e. if the
input was valid base64 data, false otherwise. If *OUTLEN is too
small, as many bytes as possible will be written to OUT. On return,
*OUTLEN holds the length of decoded bytes in OUT. Note that as soon
as any non-alphabet, non-newline character is encountered, decoding
is stopped and false is returned. If INLEN is zero, then process
only whatever data is stored in CTX.
Initially, CTX must have been initialized via base64_decode_ctx_init.
Subsequent calls to this function must reuse whatever state is recorded
in that buffer. It is necessary for when a quadruple of base64 input
bytes spans two input buffers. */
bool
base64_decode (struct base64_decode_context *ctx,
const char *restrict in, size_t inlen,
char *restrict out, size_t *outlen)
{
size_t outleft = *outlen;
bool flush_ctx = inlen == 0;
while (true)
{
size_t outleft_save = outleft;
if (ctx->i == 0 && !flush_ctx)
{
while (true)
{
/* Save a copy of outleft, in case we need to re-parse this
block of four bytes. */
outleft_save = outleft;
if (!decode_4 (in, inlen, &out, &outleft))
break;
in += 4;
inlen -= 4;
}
}
if (inlen == 0 && !flush_ctx)
break;
/* Handle the common case of 72-byte wrapped lines.
This also handles any other multiple-of-4-byte wrapping. */
if (inlen && *in == '\n')
{
++in;
--inlen;
continue;
}
/* Restore OUT and OUTLEFT. */
out -= outleft_save - outleft;
outleft = outleft_save;
{
char const *in_end = in + inlen;
char const *non_nl = get_4 (ctx, &in, in_end, &inlen);
/* If the input is empty or consists solely of newlines (0 non-newlines),
then we're done. Likewise if there are fewer than 4 bytes when not
flushing context. */
if (inlen == 0 || (inlen < 4 && !flush_ctx))
{
inlen = 0;
break;
}
if (!decode_4 (non_nl, inlen, &out, &outleft))
break;
inlen = in_end - in;
}
}
*outlen -= outleft;
return inlen == 0;
}
/* Allocate an output buffer in *OUT, and decode the base64 encoded
data stored in IN of size INLEN to the *OUT buffer. On return, the
size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL,
if the caller is not interested in the decoded length. *OUT may be
NULL to indicate an out of memory error, in which case *OUTLEN
contains the size of the memory block needed. The function returns
true on successful decoding and memory allocation errors. (Use the
*OUT and *OUTLEN parameters to differentiate between successful
decoding and memory error.) The function returns false if the
input was invalid, in which case *OUT is NULL and *OUTLEN is
undefined. */
bool
base64_decode_alloc (struct base64_decode_context *ctx,
const char *in, size_t inlen, char **out,
size_t *outlen)
{
/* This may allocate a few bytes too many, depending on input,
but it's not worth the extra CPU time to compute the exact size.
The exact size is 3 * inlen / 4, minus 1 if the input ends
with "=" and minus another 1 if the input ends with "==".
Dividing before multiplying avoids the possibility of overflow. */
size_t needlen = 3 * (inlen / 4) + 2;
*out = malloc (needlen);
if (!*out)
return true;
if (!base64_decode (ctx, in, inlen, *out, &needlen))
{
free (*out);
*out = NULL;
return false;
}
if (outlen)
*outlen = needlen;
return true;
}

54
gl/lib/base64.h Normal file
View File

@@ -0,0 +1,54 @@
/* base64.h -- Encode binary data using printable characters.
Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
Written by Simon Josefsson.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#ifndef BASE64_H
# define BASE64_H
/* Get size_t. */
# include <stddef.h>
/* Get bool. */
# include <stdbool.h>
/* This uses that the expression (n+(k-1))/k means the smallest
integer >= n/k, i.e., the ceiling of n/k. */
# define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4)
struct base64_decode_context
{
unsigned int i;
char buf[4];
};
extern bool isbase64 (char ch);
extern void base64_encode (const char *restrict in, size_t inlen,
char *restrict out, size_t outlen);
extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out);
extern void base64_decode_ctx_init (struct base64_decode_context *ctx);
extern bool base64_decode (struct base64_decode_context *ctx,
const char *restrict in, size_t inlen,
char *restrict out, size_t *outlen);
extern bool base64_decode_alloc (struct base64_decode_context *ctx,
const char *in, size_t inlen,
char **out, size_t *outlen);
#endif /* BASE64_H */

View File

@@ -1,4 +1,4 @@
#serial 2
#serial 3
dnl Copyright (C) 2005, 2006 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -6,7 +6,6 @@ dnl with or without modifications, as long as this notice is preserved.
AC_DEFUN([gl_ROOT_DEV_INO],
[
AC_LIBSOURCES([root-dev-ino.c, root-dev-ino.h, dev-ino.h, same-inode.h])
AC_LIBOBJ([root-dev-ino])
dnl Prerequisites

25
gl/modules/root-dev-ino Normal file
View File

@@ -0,0 +1,25 @@
Description:
Root device and inode number checking.
Files:
lib/root-dev-ino.h
lib/root-dev-ino.c
m4/root-dev-ino.m4
Depends-on:
dev-ino
same-inode
configure.ac:
gl_ROOT_DEV_INO
Makefile.am:
Include:
"root-dev-ino.h"
License:
GPL
Maintainer:
Jim Meyering

View File

@@ -3,8 +3,10 @@ Makefile
Makefile.in
__fpending.c
__fpending.h
acl-internal.h
acl.c
acl.h
acl_entries.c
alloca.c
alloca.h
alloca_.h
@@ -22,6 +24,11 @@ backupfile.h
base64.c
base64.h
basename.c
c-ctype.c
c-ctype.h
c-strcase.h
c-strcasecmp.c
c-strncasecmp.c
c-strtod.c
c-strtod.h
c-strtold.c
@@ -40,6 +47,7 @@ close-stream.c
close-stream.h
closeout.c
closeout.h
concatpath.c
config.charset
config.h
config.hin
@@ -52,6 +60,8 @@ diacrit.c
diacrit.h
dirchownmod.c
dirchownmod.h
dirent.h
dirent_.h
dirfd.c
dirfd.h
dirname.c
@@ -67,13 +77,16 @@ exclude.h
exit.h
exitfail.c
exitfail.h
fchdir.c
fchmodat.c
fchown-stub.c
fchownat.c
fcntl--.h
fcntl-safer.h
fcntl.h
fcntl_.h
fd-safer.c
file-has-acl.c
file-type.c
file-type.h
fileblocks.c
@@ -81,6 +94,8 @@ filemode.c
filemode.h
filenamecat.c
filenamecat.h
findprog.c
findprog.h
fnmatch.c
fnmatch.h
fnmatch_.h
@@ -89,6 +104,7 @@ fopen-safer.c
fprintftime.c
fprintftime.h
free.c
fstatat.c
fsusage.c
fsusage.h
ftruncate.c
@@ -145,6 +161,8 @@ hash.c
hash.h
human.c
human.h
i-ring.c
i-ring.h
idcache.c
imaxtostr.c
inet_ntop.c
@@ -170,6 +188,7 @@ lstat.h
malloc.c
mbchar.c
mbchar.h
mbscasecmp.c
mbswidth.c
mbswidth.h
mbuiter.h
@@ -184,9 +203,7 @@ memcoll.h
memcpy.c
memmove.c
mempcpy.c
mempcpy.h
memrchr.c
memrchr.h
memset.c
mkancesdirs.c
mkancesdirs.h
@@ -202,7 +219,11 @@ modechange.c
modechange.h
mountlist.c
mountlist.h
mpsort.c
mpsort.h
nanosleep.c
netinet_in.h
netinet_in_.h
obstack.c
obstack.h
offtostr.c
@@ -213,6 +234,7 @@ openat-proc.c
openat.c
openat.h
pathmax.h
pathname.h
physmem.c
physmem.h
pipe-safer.c
@@ -251,6 +273,8 @@ regexec.c
rename-dest-slash.c
rename.c
rmdir.c
root-dev-ino.c
root-dev-ino.h
rpmatch.c
safe-read.c
safe-read.h
@@ -275,10 +299,12 @@ sig2str.c
sig2str.h
snprintf.c
snprintf.h
socket.h
socket_.h
stamp-h1
stat-macros.h
stat-time.h
stat.h
stat_.h
stdbool.h
stdbool_.h
@@ -286,27 +312,27 @@ stdint.h
stdint_.h
stdio--.h
stdio-safer.h
stdio.h
stdio_.h
stdlib--.h
stdlib-safer.h
stdlib.h
stdlib_.h
stpcpy.c
stpcpy.h
strcase.h
strcasecmp.c
strcspn.c
strdup.c
strdup.h
strftime.c
strftime.h
string.h
string_.h
stripslash.c
strncasecmp.c
strndup.c
strndup.h
strnlen.c
strnlen.h
strnlen1.c
strnlen1.h
strpbrk.c
strpbrk.h
strtod.c
strtoimax.c
strtol.c
@@ -316,15 +342,24 @@ strtoull.c
strtoumax.c
strverscmp.c
strverscmp.h
sys
sys_time.h
sys_time_.h
t-fpending
tempname.c
tempname.h
time.h
time_.h
time_r.c
time_r.h
timespec.h
uinttostr.c
umaxtostr.c
unicodeio.h
unistd--.h
unistd-safer.h
unistd.h
unistd_.h
unlinkdir.c
unlinkdir.h
unlocked-io.h
@@ -343,6 +378,10 @@ verify.h
version-etc-fsf.c
version-etc.c
version-etc.h
wchar.h
wchar_.h
wctype.h
wctype_.h
wcwidth.h
xalloc-die.c
xalloc.h
@@ -355,6 +394,7 @@ xmemcoll.c
xmemcoll.h
xnanosleep.c
xnanosleep.h
xreadlink-with-size.c
xreadlink.c
xreadlink.h
xstrndup.c

59
lib/.gitignore vendored
View File

@@ -1,7 +1,9 @@
__fpending.c
__fpending.h
acl-internal.h
acl.c
acl.h
acl_entries.c
alloca.c
alloca.h
alloca_.h
@@ -19,6 +21,11 @@ backupfile.h
base64.c
base64.h
basename.c
c-ctype.c
c-ctype.h
c-strcase.h
c-strcasecmp.c
c-strncasecmp.c
c-strtod.c
c-strtod.h
c-strtold.c
@@ -37,6 +44,7 @@ close-stream.c
close-stream.h
closeout.c
closeout.h
concatpath.c
config.charset
configmake.h
creat-safer.c
@@ -47,6 +55,8 @@ diacrit.c
diacrit.h
dirchownmod.c
dirchownmod.h
dirent.h
dirent_.h
dirfd.c
dirfd.h
dirname.c
@@ -62,13 +72,16 @@ exclude.h
exit.h
exitfail.c
exitfail.h
fchdir.c
fchmodat.c
fchown-stub.c
fchownat.c
fcntl--.h
fcntl-safer.h
fcntl.h
fcntl_.h
fd-safer.c
file-has-acl.c
file-type.c
file-type.h
fileblocks.c
@@ -76,18 +89,23 @@ filemode.c
filemode.h
filenamecat.c
filenamecat.h
findprog.c
findprog.h
fnmatch.c
fnmatch.h
fnmatch_.h
fnmatch_loop.c
fopen-safer.c
fprintftime.c
fprintftime.h
free.c
fstatat.c
fsusage.c
fsusage.h
ftruncate.c
fts-cycle.c
fts.c
fts.h
fts_.h
full-read.c
full-read.h
@@ -113,6 +131,7 @@ getloadavg.c
getndelim2.c
getndelim2.h
getopt.c
getopt.h
getopt1.c
getopt_.h
getopt_int.h
@@ -135,6 +154,8 @@ hash.c
hash.h
human.c
human.h
i-ring.c
i-ring.h
idcache.c
imaxtostr.c
inet_ntop.c
@@ -161,6 +182,7 @@ lstat.h
malloc.c
mbchar.c
mbchar.h
mbscasecmp.c
mbswidth.c
mbswidth.h
mbuiter.h
@@ -175,9 +197,7 @@ memcoll.h
memcpy.c
memmove.c
mempcpy.c
mempcpy.h
memrchr.c
memrchr.h
memset.c
mkancesdirs.c
mkancesdirs.h
@@ -193,7 +213,11 @@ modechange.c
modechange.h
mountlist.c
mountlist.h
mpsort.c
mpsort.h
nanosleep.c
netinet_in.h
netinet_in_.h
obstack.c
obstack.h
offtostr.c
@@ -204,6 +228,7 @@ openat-proc.c
openat.c
openat.h
pathmax.h
pathname.h
physmem.c
physmem.h
pipe-safer.c
@@ -241,6 +266,8 @@ regexec.c
rename-dest-slash.c
rename.c
rmdir.c
root-dev-ino.c
root-dev-ino.h
rpmatch.c
safe-read.c
safe-read.h
@@ -264,36 +291,39 @@ sig2str.c
sig2str.h
snprintf.c
snprintf.h
socket.h
socket_.h
stat-macros.h
stat-time.h
stat.h
stat_.h
stdbool.h
stdbool_.h
stdint.h
stdint_.h
stdio--.h
stdio-safer.h
stdio.h
stdio_.h
stdlib--.h
stdlib-safer.h
stdlib.h
stdlib_.h
stpcpy.c
stpcpy.h
strcase.h
strcasecmp.c
strcspn.c
strdup.c
strdup.h
strftime.c
strftime.h
string.h
string_.h
stripslash.c
strncasecmp.c
strndup.c
strndup.h
strnlen.c
strnlen.h
strnlen1.c
strnlen1.h
strpbrk.c
strpbrk.h
strtod.c
strtoimax.c
strtol.c
@@ -303,8 +333,14 @@ strtoull.c
strtoumax.c
strverscmp.c
strverscmp.h
sys
sys_time.h
sys_time_.h
t-fpending
tempname.c
tempname.h
time.h
time_.h
time_r.c
time_r.h
timespec.h
@@ -313,6 +349,8 @@ umaxtostr.c
unicodeio.h
unistd--.h
unistd-safer.h
unistd.h
unistd_.h
unlinkdir.c
unlinkdir.h
unlocked-io.h
@@ -331,6 +369,10 @@ verify.h
version-etc-fsf.c
version-etc.c
version-etc.h
wchar.h
wchar_.h
wctype.h
wctype_.h
wcwidth.h
xalloc-die.c
xalloc.h
@@ -343,6 +385,7 @@ xmemcoll.c
xmemcoll.h
xnanosleep.c
xnanosleep.h
xreadlink-with-size.c
xreadlink.c
xreadlink.h
xstrndup.c

View File

@@ -1,3 +1,72 @@
2007-03-20 Jim Meyering <jim@meyering.net>
Fix a typo in the handling of %x and %X.
* vasnprintf.c (VASNPRINTF): When adding 2 to buffer length,
don't double it.
2007-03-04 Jim Meyering <jim@meyering.net>
* vasnprintf.c (VASNPRINTF): Add missing semicolon.
2007-03-02 Jim Meyering <jim@meyering.net>
* vasnprintf.c (VASNPRINTF): Remove cast of alloca return value.
2007-03-01 Jim Meyering <jim@meyering.net>
Merge in changes from gnulib:
* vasnprintf.c: Add a comment explaining why coreutils has its own
version of this file.
Include <stdint.h>.
(SIZE_MAX): Remove definition (now, stdint.h covers that).
(EOVERFLOW): Remove definition (now done via the eoverflow module).
Update some #ifdef to #if.
Use HAVE_LONG_LONG_INT, not HAVE_LONG_LONG.
* printf-parse.c: Likewise.
2007-02-28 Jim Meyering <jim@meyering.net>
* tsearch.c: Remove unused file.
2007-02-23 Jim Meyering <jim@meyering.net>
* randperm.c (randperm_new): Comment: say that this function
returns a pointer to malloc'd storage.
2007-02-18 Jim Meyering <jim@meyering.net>
* xfts.c: Include <stdlib.h> rather than exit.h, now that stdlib.h
is guaranteed to provide a valid definition of EXIT_FAILURE.
2007-01-19 Jim Meyering <jim@meyering.net>
* .cvsignore, .gitignore: Add sys, as well as more
bootstrap-inserted file names.
2007-01-14 Jim Meyering <jim@meyering.net>
* fchdir-stub.c: Remove file. No longer needed.
2006-12-03 Jim Meyering <jim@meyering.net>
* Makefile.am (libcoreutils_a_SOURCES): Remove xmemcoll.c and
xmemcoll.h. Now, they're handled by the gnulib xmemcoll module.
2006-11-22 Paul Eggert <eggert@cs.ucla.edu>
* randread.c (__attribute__): Don't define if __attribute__ is
already defined. Otherwise, the code won't conform to C99, since
the macro arg is spelled differently by some include file, and the
compilation fails with pedantic GCC.
2006-11-22 Jim Meyering <jim@meyering.net>
* .cvsignore, .gitignore: Add fstat.c.
2006-11-14 Jim Meyering <jim@meyering.net>
* readlink-stub.c, lstat-stub.c: Remove now-unused files.
2006-10-14 Paul Eggert <eggert@cs.ucla.edu>
Port sha512sum to hosts where uintmax_t is only 32 bits, e.g.,

View File

@@ -26,7 +26,6 @@ LDADD = $(noinst_LIBRARIES)
libcoreutils_a_SOURCES += \
buffer-lcm.c buffer-lcm.h \
xmemcoll.c xmemcoll.h \
xmemxfrm.c xmemxfrm.h
libcoreutils_a_LIBADD += $(LIBOBJS)

View File

@@ -1,14 +0,0 @@
#include <config.h>
#include <sys/types.h>
#include <errno.h>
/* A trivial substitute for `fchdir'.
DJGPP 2.03 and earlier don't have `fchdir'. */
int
fchdir (int fd)
{
errno = ENOSYS;
return -1;
}

View File

@@ -1,13 +0,0 @@
#include <config.h>
#include <sys/stat.h>
/* A trivial substitute for `lstat'.
DJGPP 2.03 and earlier don't have `lstat' and don't support
symlinks. */
int
lstat (const char *fname, struct stat *st_buf)
{
return stat (fname, st_buf);
}

View File

@@ -1,5 +1,8 @@
/* Formatted output to strings.
Copyright (C) 1999-2000, 2002-2004, 2006 Free Software Foundation, Inc.
This file is intended to provide exactly the same functionality
as the version in gnulib, but without the need for the xsize module.
Copyright (C) 1999-2000, 2002-2003, 2006-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -27,21 +30,12 @@
/* Get size_t, NULL. */
#include <stddef.h>
/* Get intmax_t. */
#if HAVE_STDINT_H_WITH_UINTMAX
# include <stdint.h>
#endif
#if HAVE_INTTYPES_H_WITH_UINTMAX
# include <inttypes.h>
#endif
/* Get intmax_t, SIZE_MAX. */
#include <stdint.h>
/* malloc(), realloc(), free(). */
#include <stdlib.h>
#ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1)
#endif
#if WIDE_CHAR_VERSION
# define PRINTF_PARSE wprintf_parse
# define CHAR_T wchar_t
@@ -329,7 +323,7 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
flags += 8;
cp++;
}
#ifdef HAVE_INTMAX_T
#if HAVE_INTMAX_T
else if (*cp == 'j')
{
if (sizeof (intmax_t) > sizeof (long))
@@ -385,11 +379,14 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
switch (c)
{
case 'd': case 'i':
#ifdef HAVE_LONG_LONG
#if HAVE_LONG_LONG_INT
/* If 'long long' exists and is larger than 'long': */
if (flags >= 16 || (flags & 4))
type = TYPE_LONGLONGINT;
else
#endif
/* If 'long long' exists and is the same as 'long', we parse
"lld" into TYPE_LONGINT. */
if (flags >= 8)
type = TYPE_LONGINT;
else if (flags & 2)
@@ -400,11 +397,14 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
type = TYPE_INT;
break;
case 'o': case 'u': case 'x': case 'X':
#ifdef HAVE_LONG_LONG
#if HAVE_LONG_LONG_INT
/* If 'long long' exists and is larger than 'long': */
if (flags >= 16 || (flags & 4))
type = TYPE_ULONGLONGINT;
else
#endif
/* If 'unsigned long long' exists and is the same as
'unsigned long', we parse "llu" into TYPE_ULONGINT. */
if (flags >= 8)
type = TYPE_ULONGINT;
else if (flags & 2)
@@ -416,7 +416,7 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
break;
case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
case 'a': case 'A':
#ifdef HAVE_LONG_DOUBLE
#if HAVE_LONG_DOUBLE
if (flags >= 16 || (flags & 4))
type = TYPE_LONGDOUBLE;
else
@@ -425,7 +425,7 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
break;
case 'c':
if (flags >= 8)
#ifdef HAVE_WINT_T
#if HAVE_WINT_T
type = TYPE_WIDE_CHAR;
#else
goto error;
@@ -433,7 +433,7 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
else
type = TYPE_CHAR;
break;
#ifdef HAVE_WINT_T
#if HAVE_WINT_T
case 'C':
type = TYPE_WIDE_CHAR;
c = 'c';
@@ -441,7 +441,7 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
#endif
case 's':
if (flags >= 8)
#ifdef HAVE_WCHAR_T
#if HAVE_WCHAR_T
type = TYPE_WIDE_STRING;
#else
goto error;
@@ -449,7 +449,7 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
else
type = TYPE_STRING;
break;
#ifdef HAVE_WCHAR_T
#if HAVE_WCHAR_T
case 'S':
type = TYPE_WIDE_STRING;
c = 's';
@@ -459,11 +459,14 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
type = TYPE_POINTER;
break;
case 'n':
#ifdef HAVE_LONG_LONG
#if HAVE_LONG_LONG_INT
/* If 'long long' exists and is larger than 'long': */
if (flags >= 16 || (flags & 4))
type = TYPE_COUNT_LONGLONGINT_POINTER;
else
#endif
/* If 'long long' exists and is the same as 'long', we parse
"lln" into TYPE_COUNT_LONGINT_POINTER. */
if (flags >= 8)
type = TYPE_COUNT_LONGINT_POINTER;
else if (flags & 2)

View File

@@ -1,6 +1,6 @@
/* Generate random permutations.
Copyright (C) 2006 Free Software Foundation, Inc.
Copyright (C) 2006, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -58,9 +58,9 @@ randperm_bound (size_t h, size_t n)
return bound;
}
/* From R, allocate and return the first H elements of a random
permutation of N elements. H must not exceed N. Return NULL if H
is zero. */
/* From R, allocate and return a malloc'd array of the first H elements
of a random permutation of N elements. H must not exceed N.
Return NULL if H is zero. */
size_t *
randperm_new (struct randint_source *r, size_t h, size_t n)

View File

@@ -44,8 +44,10 @@
# define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
# define __attribute__(x)
#ifndef __attribute__
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
# define __attribute__(x)
# endif
#endif
#ifndef ATTRIBUTE_UNUSED

View File

@@ -1,15 +0,0 @@
#include <config.h>
#include <stddef.h>
#include <errno.h>
/* A trivial substitute for `readlink'.
DJGPP 2.03 and earlier don't have `readlink' and don't support
symlinks. */
int
readlink (const char *file, char *buffer, size_t size)
{
errno = EINVAL;
return -1;
}

View File

@@ -1,698 +0,0 @@
/* Copyright (C) 1995, 1996, 1997, 2000, 2005, 2006 Free Software
Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA. */
/* Tree search for red/black trees.
The algorithm for adding nodes is taken from one of the many "Algorithms"
books by Robert Sedgewick, although the implementation differs.
The algorithm for deleting nodes can probably be found in a book named
"Introduction to Algorithms" by Cormen/Leiserson/Rivest. At least that's
the book that my professor took most algorithms from during the "Data
Structures" course...
Totally public domain. */
/* Red/black trees are binary trees in which the edges are colored either red
or black. They have the following properties:
1. The number of black edges on every path from the root to a leaf is
constant.
2. No two red edges are adjacent.
Therefore there is an upper bound on the length of every path, it's
O(log n) where n is the number of nodes in the tree. No path can be longer
than 1+2*P where P is the length of the shortest path in the tree.
Useful for the implementation:
3. If one of the children of a node is NULL, then the other one is red
(if it exists).
In the implementation, not the edges are colored, but the nodes. The color
interpreted as the color of the edge leading to this node. The color is
meaningless for the root node, but we color the root node black for
convenience. All added nodes are red initially.
Adding to a red/black tree is rather easy. The right place is searched
with a usual binary tree search. Additionally, whenever a node N is
reached that has two red successors, the successors are colored black and
the node itself colored red. This moves red edges up the tree where they
pose less of a problem once we get to really insert the new node. Changing
N's color to red may violate rule 2, however, so rotations may become
necessary to restore the invariants. Adding a new red leaf may violate
the same rule, so afterwards an additional check is run and the tree
possibly rotated.
Deleting is hairy. There are mainly two nodes involved: the node to be
deleted (n1), and another node that is to be unchained from the tree (n2).
If n1 has a successor (the node with a smallest key that is larger than
n1), then the successor becomes n2 and its contents are copied into n1,
otherwise n1 becomes n2.
Unchaining a node may violate rule 1: if n2 is black, one subtree is
missing one black edge afterwards. The algorithm must try to move this
error upwards towards the root, so that the subtree that does not have
enough black edges becomes the whole tree. Once that happens, the error
has disappeared. It may not be necessary to go all the way up, since it
is possible that rotations and recoloring can fix the error before that.
Although the deletion algorithm must walk upwards through the tree, we
do not store parent pointers in the nodes. Instead, delete allocates a
small array of parent pointers and fills it while descending the tree.
Since we know that the length of a path is O(log n), where n is the number
of nodes, this is likely to use less memory. */
/* Tree rotations look like this:
A C
/ \ / \
B C A G
/ \ / \ --> / \
D E F G B F
/ \
D E
In this case, A has been rotated left. This preserves the ordering of the
binary tree. */
#include <config.h>
#if __GNUC__
# define alloca __builtin_alloca
#else
# if HAVE_ALLOCA_H
# include <alloca.h>
# else
# ifdef _AIX
# pragma alloca
# else
char *alloca ();
# endif
# endif
#endif
#include <stdlib.h>
#include <string.h>
#include <search.h>
#ifndef weak_alias
# define __tsearch tsearch
# define __tfind tfind
# define __tdelete tdelete
# define __twalk twalk
# define __tdestroy tdestroy
#endif
#ifndef _LIBC
# define weak_alias(f,g)
# define internal_function
#endif
typedef struct node_t
{
/* Callers expect this to be the first element in the structure - do not
move! */
const void *key;
struct node_t *left;
struct node_t *right;
unsigned int red:1;
} *node;
typedef const struct node_t *const_node;
#undef DEBUGGING
#ifdef DEBUGGING
/* Routines to check tree invariants. */
# include <assert.h>
# define CHECK_TREE(a) check_tree(a)
static void
check_tree_recurse (node p, int d_sofar, int d_total)
{
if (p == NULL)
{
assert (d_sofar == d_total);
return;
}
check_tree_recurse (p->left, d_sofar + (p->left && !p->left->red), d_total);
check_tree_recurse (p->right, d_sofar + (p->right && !p->right->red), d_total);
if (p->left)
assert (!(p->left->red && p->red));
if (p->right)
assert (!(p->right->red && p->red));
}
static void
check_tree (node root)
{
int cnt = 0;
node p;
if (root == NULL)
return;
root->red = 0;
for(p = root->left; p; p = p->left)
cnt += !p->red;
check_tree_recurse (root, 0, cnt);
}
#else
# define CHECK_TREE(a)
#endif
/* Possibly "split" a node with two red successors, and/or fix up two red
edges in a row. ROOTP is a pointer to the lowest node we visited, PARENTP
and GPARENTP pointers to its parent/grandparent. P_R and GP_R contain the
comparison values that determined which way was taken in the tree to reach
ROOTP. MODE is 1 if we need not do the split, but must check for two red
edges between GPARENTP and ROOTP. */
static void
maybe_split_for_insert (node *rootp, node *parentp, node *gparentp,
int p_r, int gp_r, int mode)
{
node root = *rootp;
node *rp, *lp;
rp = &(*rootp)->right;
lp = &(*rootp)->left;
/* See if we have to split this node (both successors red). */
if (mode == 1
|| ((*rp) != NULL && (*lp) != NULL && (*rp)->red && (*lp)->red))
{
/* This node becomes red, its successors black. */
root->red = 1;
if (*rp)
(*rp)->red = 0;
if (*lp)
(*lp)->red = 0;
/* If the parent of this node is also red, we have to do
rotations. */
if (parentp != NULL && (*parentp)->red)
{
node gp = *gparentp;
node p = *parentp;
/* There are two main cases:
1. The edge types (left or right) of the two red edges differ.
2. Both red edges are of the same type.
There exist two symmetries of each case, so there is a total of
4 cases. */
if ((p_r > 0) != (gp_r > 0))
{
/* Put the child at the top of the tree, with its parent
and grandparent as successors. */
p->red = 1;
gp->red = 1;
root->red = 0;
if (p_r < 0)
{
/* Child is left of parent. */
p->left = *rp;
*rp = p;
gp->right = *lp;
*lp = gp;
}
else
{
/* Child is right of parent. */
p->right = *lp;
*lp = p;
gp->left = *rp;
*rp = gp;
}
*gparentp = root;
}
else
{
*gparentp = *parentp;
/* Parent becomes the top of the tree, grandparent and
child are its successors. */
p->red = 0;
gp->red = 1;
if (p_r < 0)
{
/* Left edges. */
gp->left = p->right;
p->right = gp;
}
else
{
/* Right edges. */
gp->right = p->left;
p->left = gp;
}
}
}
}
}
/* Find or insert datum into search tree.
KEY is the key to be located, ROOTP is the address of tree root,
COMPAR the ordering function. */
void *
__tsearch (const void *key, void **vrootp, __compar_fn_t compar)
{
node q;
node *parentp = NULL, *gparentp = NULL;
node *rootp = (node *) vrootp;
node *nextp;
int r = 0, p_r = 0, gp_r = 0; /* No they might not, Mr Compiler. */
if (rootp == NULL)
return NULL;
/* This saves some additional tests below. */
if (*rootp != NULL)
(*rootp)->red = 0;
CHECK_TREE (*rootp);
nextp = rootp;
while (*nextp != NULL)
{
node root = *rootp;
r = (*compar) (key, root->key);
if (r == 0)
return root;
maybe_split_for_insert (rootp, parentp, gparentp, p_r, gp_r, 0);
/* If that did any rotations, parentp and gparentp are now garbage.
That doesn't matter, because the values they contain are never
used again in that case. */
nextp = r < 0 ? &root->left : &root->right;
if (*nextp == NULL)
break;
gparentp = parentp;
parentp = rootp;
rootp = nextp;
gp_r = p_r;
p_r = r;
}
q = (struct node_t *) malloc (sizeof (struct node_t));
if (q != NULL)
{
*nextp = q; /* link new node to old */
q->key = key; /* initialize new node */
q->red = 1;
q->left = q->right = NULL;
}
if (nextp != rootp)
/* There may be two red edges in a row now, which we must avoid by
rotating the tree. */
maybe_split_for_insert (nextp, rootp, parentp, r, p_r, 1);
return q;
}
#ifdef weak_alias
weak_alias (__tsearch, tsearch)
#endif
/* Find datum in search tree.
KEY is the key to be located, ROOTP is the address of tree root,
COMPAR the ordering function. */
void *
__tfind (key, vrootp, compar)
const void *key;
void *const *vrootp;
__compar_fn_t compar;
{
node *rootp = (node *) vrootp;
if (rootp == NULL)
return NULL;
CHECK_TREE (*rootp);
while (*rootp != NULL)
{
node root = *rootp;
int r;
r = (*compar) (key, root->key);
if (r == 0)
return root;
rootp = r < 0 ? &root->left : &root->right;
}
return NULL;
}
#ifdef weak_alias
weak_alias (__tfind, tfind)
#endif
/* Delete node with given key.
KEY is the key to be deleted, ROOTP is the address of the root of tree,
COMPAR the comparison function. */
void *
__tdelete (const void *key, void **vrootp, __compar_fn_t compar)
{
node p, q, r, retval;
int cmp;
node *rootp = (node *) vrootp;
node root, unchained;
/* Stack of nodes so we remember the parents without recursion. It's
_very_ unlikely that there are paths longer than 40 nodes. The tree
would need to have around 250.000 nodes. */
int stacksize = 40;
int sp = 0;
node **nodestack = (node **) alloca (sizeof (node *) * stacksize);
if (rootp == NULL)
return NULL;
p = *rootp;
if (p == NULL)
return NULL;
CHECK_TREE (p);
while ((cmp = (*compar) (key, (*rootp)->key)) != 0)
{
if (sp == stacksize)
{
node **newstack;
stacksize += 20;
newstack = (node **) alloca (sizeof (node *) * stacksize);
nodestack = memcpy (newstack, nodestack, sp * sizeof (node *));
}
nodestack[sp++] = rootp;
p = *rootp;
rootp = ((cmp < 0)
? &(*rootp)->left
: &(*rootp)->right);
if (*rootp == NULL)
return NULL;
}
/* This is bogus if the node to be deleted is the root... this routine
really should return an integer with 0 for success, -1 for failure
and errno = ESRCH or something. */
retval = p;
/* We don't unchain the node we want to delete. Instead, we overwrite
it with its successor and unchain the successor. If there is no
successor, we really unchain the node to be deleted. */
root = *rootp;
r = root->right;
q = root->left;
if (q == NULL || r == NULL)
unchained = root;
else
{
node *parent = rootp, *up = &root->right;
for (;;)
{
if (sp == stacksize)
{
node **newstack;
stacksize += 20;
newstack = (node **) alloca (sizeof (node *) * stacksize);
nodestack = memcpy (newstack, nodestack, sp * sizeof (node *));
}
nodestack[sp++] = parent;
parent = up;
if ((*up)->left == NULL)
break;
up = &(*up)->left;
}
unchained = *up;
}
/* We know that either the left or right successor of UNCHAINED is NULL.
R becomes the other one, it is chained into the parent of UNCHAINED. */
r = unchained->left;
if (r == NULL)
r = unchained->right;
if (sp == 0)
*rootp = r;
else
{
q = *nodestack[sp-1];
if (unchained == q->right)
q->right = r;
else
q->left = r;
}
if (unchained != root)
root->key = unchained->key;
if (!unchained->red)
{
/* Now we lost a black edge, which means that the number of black
edges on every path is no longer constant. We must balance the
tree. */
/* NODESTACK now contains all parents of R. R is likely to be NULL
in the first iteration. */
/* NULL nodes are considered black throughout - this is necessary for
correctness. */
while (sp > 0 && (r == NULL || !r->red))
{
node *pp = nodestack[sp - 1];
p = *pp;
/* Two symmetric cases. */
if (r == p->left)
{
/* Q is R's brother, P is R's parent. The subtree with root
R has one black edge less than the subtree with root Q. */
q = p->right;
if (q != NULL && q->red)
{
/* If Q is red, we know that P is black. We rotate P left
so that Q becomes the top node in the tree, with P below
it. P is colored red, Q is colored black.
This action does not change the black edge count for any
leaf in the tree, but we will be able to recognize one
of the following situations, which all require that Q
is black. */
q->red = 0;
p->red = 1;
/* Left rotate p. */
p->right = q->left;
q->left = p;
*pp = q;
/* Make sure pp is right if the case below tries to use
it. */
nodestack[sp++] = pp = &q->left;
q = p->right;
}
/* We know that Q can't be NULL here. We also know that Q is
black. */
if ((q->left == NULL || !q->left->red)
&& (q->right == NULL || !q->right->red))
{
/* Q has two black successors. We can simply color Q red.
The whole subtree with root P is now missing one black
edge. Note that this action can temporarily make the
tree invalid (if P is red). But we will exit the loop
in that case and set P black, which both makes the tree
valid and also makes the black edge count come out
right. If P is black, we are at least one step closer
to the root and we'll try again the next iteration. */
q->red = 1;
r = p;
}
else
{
/* Q is black, one of Q's successors is red. We can
repair the tree with one operation and will exit the
loop afterwards. */
if (q->right == NULL || !q->right->red)
{
/* The left one is red. We perform the same action as
in maybe_split_for_insert where two red edges are
adjacent but point in different directions:
Q's left successor (let's call it Q2) becomes the
top of the subtree we are looking at, its parent (Q)
and grandparent (P) become its successors. The former
successors of Q2 are placed below P and Q.
P becomes black, and Q2 gets the color that P had.
This changes the black edge count only for node R and
its successors. */
node q2 = q->left;
q2->red = p->red;
p->right = q2->left;
q->left = q2->right;
q2->right = q;
q2->left = p;
*pp = q2;
p->red = 0;
}
else
{
/* It's the right one. Rotate P left. P becomes black,
and Q gets the color that P had. Q's right successor
also becomes black. This changes the black edge
count only for node R and its successors. */
q->red = p->red;
p->red = 0;
q->right->red = 0;
/* left rotate p */
p->right = q->left;
q->left = p;
*pp = q;
}
/* We're done. */
sp = 1;
r = NULL;
}
}
else
{
/* Comments: see above. */
q = p->left;
if (q != NULL && q->red)
{
q->red = 0;
p->red = 1;
p->left = q->right;
q->right = p;
*pp = q;
nodestack[sp++] = pp = &q->right;
q = p->left;
}
if ((q->right == NULL || !q->right->red)
&& (q->left == NULL || !q->left->red))
{
q->red = 1;
r = p;
}
else
{
if (q->left == NULL || !q->left->red)
{
node q2 = q->right;
q2->red = p->red;
p->left = q2->right;
q->right = q2->left;
q2->left = q;
q2->right = p;
*pp = q2;
p->red = 0;
}
else
{
q->red = p->red;
p->red = 0;
q->left->red = 0;
p->left = q->right;
q->right = p;
*pp = q;
}
sp = 1;
r = NULL;
}
}
--sp;
}
if (r != NULL)
r->red = 0;
}
free (unchained);
return retval;
}
#ifdef weak_alias
weak_alias (__tdelete, tdelete)
#endif
/* Walk the nodes of a tree.
ROOT is the root of the tree to be walked, ACTION the function to be
called at each node. LEVEL is the level of ROOT in the whole tree. */
static void
internal_function
trecurse (const void *vroot, __action_fn_t action, int level)
{
const_node root = (const_node) vroot;
if (root->left == NULL && root->right == NULL)
(*action) (root, leaf, level);
else
{
(*action) (root, preorder, level);
if (root->left != NULL)
trecurse (root->left, action, level + 1);
(*action) (root, postorder, level);
if (root->right != NULL)
trecurse (root->right, action, level + 1);
(*action) (root, endorder, level);
}
}
/* Walk the nodes of a tree.
ROOT is the root of the tree to be walked, ACTION the function to be
called at each node. */
void
__twalk (const void *vroot, __action_fn_t action)
{
const_node root = (const_node) vroot;
CHECK_TREE (root);
if (root != NULL && action != NULL)
trecurse (root, action, 0);
}
#ifdef weak_alias
weak_alias (__twalk, twalk)
#endif
/* The standardized functions miss an important functionality: the
tree cannot be removed easily. We provide a function to do this. */
static void
internal_function
tdestroy_recurse (node root, void (*freefct)(void *))
{
if (root->left != NULL)
tdestroy_recurse (root->left, freefct);
if (root->right != NULL)
tdestroy_recurse (root->right, freefct);
(*freefct) ((void *) root->key);
/* Free the node itself. */
free (root);
}
void
__tdestroy (void *vroot, void (*freefct)(void *))
{
node root = (node) vroot;
CHECK_TREE (root);
if (root != NULL)
tdestroy_recurse (root, freefct);
}
#ifdef weak_alias
weak_alias (__tdestroy, tdestroy)
#endif

View File

@@ -1,5 +1,8 @@
/* vsprintf with automatic memory allocation.
Copyright (C) 1999, 2002-2006 Free Software Foundation, Inc.
This file is intended to provide exactly the same functionality
as the version in gnulib, but without the need for the xsize module.
Copyright (C) 1999, 2002-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -23,7 +26,6 @@
#endif
#include <config.h>
#ifndef IN_LIBINTL
# include <alloca.h>
#endif
@@ -37,6 +39,7 @@
#include <stdio.h> /* snprintf(), sprintf() */
#include <stdlib.h> /* abort(), malloc(), realloc(), free() */
#include <stdint.h> /* SIZE_MAX */
#include <string.h> /* memcpy(), strlen() */
#include <errno.h> /* errno */
#include <limits.h> /* CHAR_BIT, INT_MAX */
@@ -47,17 +50,8 @@
# include "printf-parse.h"
#endif
#ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1)
#endif
/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW. */
#ifndef EOVERFLOW
# define EOVERFLOW E2BIG
#endif
#ifdef HAVE_WCHAR_T
# ifdef HAVE_WCSLEN
#if HAVE_WCHAR_T
# if HAVE_WCSLEN
# define local_wcslen wcslen
# else
/* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
@@ -152,7 +146,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
#if HAVE_ALLOCA
if (buf_neededlength < 4000 / sizeof (CHAR_T))
{
buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T));
buf = alloca (buf_neededlength * sizeof (CHAR_T));
buf_malloced = NULL;
}
else
@@ -254,7 +248,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
case TYPE_COUNT_LONGINT_POINTER:
*a.arg[dp->arg_index].a.a_count_longint_pointer = length;
break;
#ifdef HAVE_LONG_LONG
#if HAVE_LONG_LONG_INT
case TYPE_COUNT_LONGLONGINT_POINTER:
*a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
break;
@@ -338,7 +332,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
{
case 'd': case 'i': case 'u':
# ifdef HAVE_LONG_LONG
# if HAVE_LONG_LONG_INT
if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
tmp_length =
(unsigned int) (sizeof (unsigned long long) * CHAR_BIT
@@ -369,7 +363,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
break;
case 'o':
# ifdef HAVE_LONG_LONG
# if HAVE_LONG_LONG_INT
if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
tmp_length =
(unsigned int) (sizeof (unsigned long long) * CHAR_BIT
@@ -397,7 +391,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
break;
case 'x': case 'X':
# ifdef HAVE_LONG_LONG
# if HAVE_LONG_LONG_INT
if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
tmp_length =
(unsigned int) (sizeof (unsigned long long) * CHAR_BIT
@@ -421,12 +415,13 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
if (tmp_length < precision)
tmp_length = precision;
/* Add 2, to account for a leading sign or alternate form. */
if (tmp_length <= SIZE_MAX / 2)
tmp_length *= 2;
tmp_length += 2;
if (tmp_length < 2)
goto out_of_memory;
break;
case 'f': case 'F':
# ifdef HAVE_LONG_DOUBLE
# if HAVE_LONG_DOUBLE
if (type == TYPE_LONGDOUBLE)
tmp_length =
(unsigned int) (LDBL_MAX_EXP
@@ -450,7 +445,6 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
break;
case 'e': case 'E': case 'g': case 'G':
case 'a': case 'A':
tmp_length =
12; /* sign, decimal point, exponent etc. */
tmp_length += precision;
@@ -458,8 +452,31 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
goto out_of_memory;
break;
case 'a': case 'A':
# if HAVE_LONG_DOUBLE
if (type == TYPE_LONGDOUBLE)
tmp_length =
(unsigned int) (LDBL_DIG
* 0.831 /* decimal -> hexadecimal */
)
+ 1; /* turn floor into ceil */
else
# endif
tmp_length =
(unsigned int) (DBL_DIG
* 0.831 /* decimal -> hexadecimal */
)
+ 1; /* turn floor into ceil */
if (tmp_length < precision)
tmp_length = precision;
/* Account for sign, decimal point etc. */
tmp_length += 12;
if (tmp_length < 12)
goto out_of_memory;
break;
case 'c':
# if defined HAVE_WINT_T && !WIDE_CHAR_VERSION
# if HAVE_WINT_T && !WIDE_CHAR_VERSION
if (type == TYPE_WIDE_CHAR)
tmp_length = MB_CUR_MAX;
else
@@ -468,7 +485,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
break;
case 's':
# ifdef HAVE_WCHAR_T
# if HAVE_WCHAR_T
if (type == TYPE_WIDE_STRING)
{
tmp_length =
@@ -551,7 +568,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
switch (type)
{
#ifdef HAVE_LONG_LONG
#if HAVE_LONG_LONG_INT
case TYPE_LONGLONGINT:
case TYPE_ULONGLONGINT:
*p++ = 'l';
@@ -559,15 +576,15 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
#endif
case TYPE_LONGINT:
case TYPE_ULONGINT:
#ifdef HAVE_WINT_T
#if HAVE_WINT_T
case TYPE_WIDE_CHAR:
#endif
#ifdef HAVE_WCHAR_T
#if HAVE_WCHAR_T
case TYPE_WIDE_STRING:
#endif
*p++ = 'l';
break;
#ifdef HAVE_LONG_DOUBLE
#if HAVE_LONG_DOUBLE
case TYPE_LONGDOUBLE:
*p++ = 'L';
break;
@@ -705,7 +722,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
SNPRINTF_BUF (arg);
}
break;
#ifdef HAVE_LONG_LONG
#if HAVE_LONG_LONG_INT
case TYPE_LONGLONGINT:
{
long long int arg = a.arg[dp->arg_index].a.a_longlongint;
@@ -725,7 +742,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
SNPRINTF_BUF (arg);
}
break;
#ifdef HAVE_LONG_DOUBLE
#if HAVE_LONG_DOUBLE
case TYPE_LONGDOUBLE:
{
long double arg = a.arg[dp->arg_index].a.a_longdouble;
@@ -739,7 +756,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
SNPRINTF_BUF (arg);
}
break;
#ifdef HAVE_WINT_T
#if HAVE_WINT_T
case TYPE_WIDE_CHAR:
{
wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
@@ -753,7 +770,7 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
SNPRINTF_BUF (arg);
}
break;
#ifdef HAVE_WCHAR_T
#if HAVE_WCHAR_T
case TYPE_WIDE_STRING:
{
const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;

View File

@@ -1,6 +1,6 @@
/* xfts.c -- a wrapper for fts_open
Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc.
Copyright (C) 2003, 2005-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -21,8 +21,8 @@
#include <config.h>
#include <stdbool.h>
#include <stdlib.h>
#include "exit.h"
#include "error.h"
#include "gettext.h"

View File

@@ -30,6 +30,7 @@ dirname.m4
dos.m4
double-slash-root.m4
dup2.m4
eaccess.m4
eealloc.m4
eoverflow.m4
error.m4
@@ -37,12 +38,15 @@ euidaccess.m4
exclude.m4
exitfail.m4
extensions.m4
fchdir.m4
fcntl-safer.m4
fcntl_h.m4
file-type.m4
fileblocks.m4
filemode.m4
filenamecat.m4
findprog.m4
flexmember.m4
fnmatch.m4
fpending.m4
fprintftime.m4
@@ -74,6 +78,7 @@ getusershell.m4
glibc2.m4
glibc21.m4
gnulib-cache.m4
gnulib-common.m4
gnulib-comp.m4
gnulib-tool.m4
group-member.m4
@@ -81,11 +86,15 @@ hard-locale.m4
hash.m4
host-os.m4
human.m4
i-ring.m4
iconv.m4
idcache.m4
include_next.m4
inet_ntop.m4
inline.m4
intdiv0.m4
intl.m4
intldir.m4
intmax.m4
intmax_t.m4
inttostr.m4
@@ -114,6 +123,7 @@ lstat.m4
mbchar.m4
mbiter.m4
mbrtowc.m4
mbscasecmp.m4
mbstate_t.m4
mbswidth.m4
md5.m4
@@ -133,6 +143,7 @@ mkstemp.m4
mktime.m4
modechange.m4
mountlist.m4
mpsort.m4
nanosleep.m4
netinet_in_h.m4
nls.m4
@@ -156,6 +167,7 @@ rename-dest-slash.m4
rename.m4
rmdir-errno.m4
rmdir.m4
root-dev-ino.m4
rpmatch.m4
safe-read.m4
safe-write.m4
@@ -181,12 +193,15 @@ stdbool.m4
stdint.m4
stdint_h.m4
stdio-safer.m4
stdio_h.m4
stdlib-safer.m4
stdlib_h.m4
stpcpy.m4
strcase.m4
strcspn.m4
strdup.m4
strftime.m4
string_h.m4
strndup.m4
strnlen.m4
strpbrk.m4
@@ -200,6 +215,9 @@ strtoumax.m4
strverscmp.m4
sys_socket_h.m4
sys_stat_h.m4
sys_time_h.m4
tempname.m4
time_h.m4
time_r.m4
timespec.m4
tm_gmtoff.m4
@@ -223,7 +241,9 @@ utimes.m4
vasnprintf.m4
vasprintf.m4
visibility.m4
wchar.m4
wchar_t.m4
wctype.m4
wcwidth.m4
wint_t.m4
xalloc.m4

20
m4/.gitignore vendored
View File

@@ -29,6 +29,7 @@ dirname.m4
dos.m4
double-slash-root.m4
dup2.m4
eaccess.m4
eealloc.m4
eoverflow.m4
error.m4
@@ -36,12 +37,15 @@ euidaccess.m4
exclude.m4
exitfail.m4
extensions.m4
fchdir.m4
fcntl-safer.m4
fcntl_h.m4
file-type.m4
fileblocks.m4
filemode.m4
filenamecat.m4
findprog.m4
flexmember.m4
fnmatch.m4
fpending.m4
fprintftime.m4
@@ -72,6 +76,7 @@ getugroups.m4
getusershell.m4
glibc21.m4
gnulib-cache.m4
gnulib-common.m4
gnulib-comp.m4
gnulib-tool.m4
group-member.m4
@@ -79,9 +84,13 @@ hard-locale.m4
hash.m4
host-os.m4
human.m4
i-ring.m4
iconv.m4
idcache.m4
inet_ntop.m4
inline.m4
intl.m4
intldir.m4
intmax.m4
intmax_t.m4
inttostr.m4
@@ -108,6 +117,7 @@ lstat.m4
mbchar.m4
mbiter.m4
mbrtowc.m4
mbscasecmp.m4
mbstate_t.m4
mbswidth.m4
md5.m4
@@ -127,6 +137,7 @@ mkstemp.m4
mktime.m4
modechange.m4
mountlist.m4
mpsort.m4
nanosleep.m4
netinet_in_h.m4
nls.m4
@@ -149,6 +160,7 @@ rename-dest-slash.m4
rename.m4
rmdir-errno.m4
rmdir.m4
root-dev-ino.m4
rpmatch.m4
safe-read.m4
safe-write.m4
@@ -173,12 +185,15 @@ stdbool.m4
stdint.m4
stdint_h.m4
stdio-safer.m4
stdio_h.m4
stdlib-safer.m4
stdlib_h.m4
stpcpy.m4
strcase.m4
strcspn.m4
strdup.m4
strftime.m4
string_h.m4
strndup.m4
strnlen.m4
strpbrk.m4
@@ -192,6 +207,9 @@ strtoumax.m4
strverscmp.m4
sys_socket_h.m4
sys_stat_h.m4
sys_time_h.m4
tempname.m4
time_h.m4
time_r.m4
timespec.m4
tm_gmtoff.m4
@@ -212,7 +230,9 @@ utimes-null.m4
utimes.m4
vasnprintf.m4
vasprintf.m4
wchar.m4
wchar_t.m4
wctype.m4
wcwidth.m4
wint_t.m4
xalloc.m4

View File

@@ -1,3 +1,11 @@
2007-01-19 Jim Meyering <jim@meyering.net>
* .cvsignore, .gitignore: Add more bootstrap-inserted file names.
2006-12-12 Jim Meyering <jim@meyering.net>
* jm-macros.m4: Remove AC_FUNC_SETVBUF_REVERSED, now that it's a no-op.
2006-10-14 Paul Eggert <eggert@cs.ucla.edu>
* sha512.m4 (gl_SHA512): Add u64.h to AC_LIBSOURCES.

View File

@@ -1,4 +1,4 @@
#serial 104 -*- autoconf -*-
#serial 105 -*- autoconf -*-
dnl Misc type-related macros for coreutils.
@@ -50,9 +50,6 @@ AC_DEFUN([coreutils_MACROS],
AC_DEFINE(ARGMATCH_DIE_DECL, [extern void usage ()],
[Define to the declaration of the xargmatch failure function.])
dnl Used to define SETVBUF in ../src/system.h.
AC_FUNC_SETVBUF_REVERSED
# used by ls
AC_REQUIRE([gl_CLOCK_TIME])
# used by shred
@@ -62,6 +59,7 @@ AC_DEFUN([coreutils_MACROS],
endgrent \
endpwent \
fchown \
fchmod \
ftruncate \
iswspace \
mkfifo \
@@ -111,10 +109,6 @@ AC_DEFUN([coreutils_MACROS],
if test $gl_cv_list_mounted_fs = yes && test $gl_cv_fs_space = yes; then
DF_PROG='df$(EXEEXT)'
fi
# If any of these functions don't exist (e.g. DJGPP 2.03),
# use the corresponding stub.
AC_CHECK_FUNC([fchdir], , [AC_LIBOBJ(fchdir-stub)])
])
AC_DEFUN([gl_CHECK_ALL_HEADERS],

View File

@@ -1,7 +1,6 @@
# Make coreutils man pages. -*-Makefile-*-
# Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software
# Foundation, Inc.
# Copyright (C) 2002-2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -19,22 +18,25 @@
# 02110-1301, USA.
dist_man_MANS = \
base64.1 basename.1 cat.1 chgrp.1 chmod.1 chown.1 chroot.1 cksum.1 comm.1 \
base64.1 basename.1 cat.1 chgrp.1 chmod.1 chown.1 cksum.1 comm.1 \
cp.1 csplit.1 cut.1 date.1 dd.1 df.1 dir.1 dircolors.1 dirname.1 du.1 \
echo.1 env.1 expand.1 expr.1 factor.1 false.1 fmt.1 fold.1 groups.1 \
head.1 hostid.1 hostname.1 id.1 install.1 join.1 kill.1 \
head.1 hostname.1 id.1 install.1 join.1 kill.1 \
link.1 ln.1 logname.1 \
ls.1 md5sum.1 mkdir.1 mkfifo.1 mknod.1 mv.1 nice.1 nl.1 nohup.1 od.1 \
paste.1 pathchk.1 pinky.1 pr.1 printenv.1 printf.1 ptx.1 pwd.1 readlink.1 \
ls.1 md5sum.1 mkdir.1 mkfifo.1 mknod.1 mv.1 nl.1 nohup.1 od.1 \
paste.1 pathchk.1 pr.1 printenv.1 printf.1 ptx.1 pwd.1 readlink.1 \
rm.1 rmdir.1 seq.1 sha1sum.1 sha224sum.1 sha256sum.1 sha384sum.1 sha512sum.1 \
shred.1 shuf.1 sleep.1 sort.1 split.1 stat.1 stty.1 \
shred.1 shuf.1 sleep.1 sort.1 split.1 stat.1 \
su.1 sum.1 sync.1 tac.1 tail.1 tee.1 test.1 touch.1 tr.1 true.1 tsort.1 \
tty.1 uname.1 unexpand.1 uniq.1 unlink.1 uptime.1 users.1 vdir.1 wc.1 \
who.1 whoami.1 yes.1
tty.1 unexpand.1 uniq.1 unlink.1 vdir.1 wc.1 \
whoami.1 yes.1 $(MAN)
optional_mans = \
chroot.1 hostid.1 nice.1 pinky.1 stty.1 uname.1 uptime.1 users.1 who.1
man_aux = $(dist_man_MANS:.1=.x)
EXTRA_DIST = $(man_aux) help2man
man_aux = $(dist_man_MANS:.1=.x) $(optional_mans:.1=.x)
EXTRA_DIST = $(man_aux) help2man $(optional_mans)
MAINTAINERCLEANFILES = $(dist_man_MANS)
# Depend on configure.ac to get version number changes.
@@ -151,17 +153,26 @@ mapped_name = `echo $*|sed 's/install/ginstall/; s/test/[/'`
# That is necessary to avoid failures for programs that are also shell built-in
# functions like echo, false, printf, pwd.
.x.1:
@rm -f $@
@echo "Updating man page $@"; \
rm -rf $t; \
mkdir $t; \
(cd $t && $(LN_S) ../../src/$(mapped_name) $*); \
$(PERL) -- $(srcdir)/help2man \
--include=$(srcdir)/$*.x \
--output=$t/$@ $t/$*
@sed 's|$*\.td/||g' $t/$@ > $@
@chmod a-w $@
@rm -rf $t
@case '$(PERL)' in \
*"/missing "*) \
echo 'WARNING: cannot update man page $@ since perl is missing' \
'or inadequate' 1>&2 \
;; \
*) \
rm -f $@ \
&& { echo "Updating man page $@"; \
rm -rf $t; \
mkdir $t; \
(cd $t && $(LN_S) ../../src/$(mapped_name) $*); \
$(PERL) -- $(srcdir)/help2man \
--source='$(PACKAGE_STRING)' \
--include=$(srcdir)/$*.x \
--output=$t/$@ $t/$*; \
} \
&& sed 's|$*\.td/||g' $t/$@ > $@ \
&& chmod a-w $@ \
&& rm -rf $t ;; \
esac
check-local: check-x-vs-1 check-programs-vs-x

View File

@@ -1,7 +1,6 @@
## Process this file with automake to produce Makefile.in -*-Makefile-*-
## Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
## 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
## Copyright (C) 1990, 1991, 1993-2007 Free Software Foundation, Inc.
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -105,9 +104,9 @@ uptime_LDADD = $(LDADD) $(POW_LIB) $(GETLOADAVG_LIBS)
su_LDADD = $(LDADD) $(LIB_CRYPT)
dir_LDADD += $(LIB_ACL)
ls_LDADD += $(LIB_ACL)
vdir_LDADD += $(LIB_ACL)
dir_LDADD += $(LIB_ACL_TRIVIAL) $(LIB_ACL)
ls_LDADD += $(LIB_ACL_TRIVIAL) $(LIB_ACL)
vdir_LDADD += $(LIB_ACL_TRIVIAL) $(LIB_ACL)
cp_LDADD += $(LIB_ACL)
mv_LDADD += $(LIB_ACL)
ginstall_LDADD += $(LIB_ACL)
@@ -116,10 +115,16 @@ $(PROGRAMS): ../lib/libcoreutils.a
SUFFIXES = .sh
# Get the release year from ../lib/version-etc.c.
RELEASE_YEAR = \
`sed -n '/.*COPYRIGHT_YEAR = \([0-9][0-9][0-9][0-9]\) };/s//\1/p' \
$(top_srcdir)/lib/version-etc.c`
.sh:
rm -f $@ $@-t
sed \
-e 's!@''bindir''@!$(bindir)!' \
-e 's/@''RELEASE_YEAR'@/$(RELEASE_YEAR)/ \
-e 's/@''GNU_PACKAGE''@/$(GNU_PACKAGE)/' \
-e 's/@''PACKAGE_BUGREPORT''@/$(PACKAGE_BUGREPORT)/' \
-e 's/@''VERSION''@/$(VERSION)/' $< > $@-t

View File

@@ -1,5 +1,5 @@
/* Base64 encode/decode strings or files.
Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This file is part of Base64.
@@ -83,9 +83,10 @@ With no FILE, or when FILE is -, read standard input.\n"), stdout);
fputs (_("\
\n\
The data are encoded as described for the base64 alphabet in RFC 3548.\n\
Decoding require compliant input by default, use --ignore-garbage to\n\
attempt to recover from non-alphabet characters (such as newlines) in\n\
the encoded stream.\n"), stdout);
When decoding, the input may contain newlines in addition to the bytes of\n\
the formal base64 alphabet. Use --ignore-garbage to attempt to recover\n\
from any other non-alphabet bytes in the encoded stream.\n"),
stdout);
printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
}
@@ -183,11 +184,15 @@ do_decode (FILE *in, FILE *out, bool ignore_garbage)
char inbuf[B64BLOCKSIZE];
char outbuf[BLOCKSIZE];
size_t sum;
struct base64_decode_context ctx;
base64_decode_ctx_init (&ctx);
do
{
bool ok;
size_t n;
unsigned int k;
sum = 0;
do
@@ -211,14 +216,23 @@ do_decode (FILE *in, FILE *out, bool ignore_garbage)
}
while (sum < B64BLOCKSIZE && !feof (in));
n = BLOCKSIZE;
ok = base64_decode (inbuf, sum, outbuf, &n);
/* The following "loop" is usually iterated just once.
However, when it processes the final input buffer, we want
to iterate it one additional time, but with an indicator
telling it to flush what is in CTX. */
for (k = 0; k < 1 + feof (in); k++)
{
if (k == 1 && ctx.i == 0)
break;
n = BLOCKSIZE;
ok = base64_decode (&ctx, inbuf, (k == 0 ? sum : 0), outbuf, &n);
if (fwrite (outbuf, 1, n, out) < n)
error (EXIT_FAILURE, errno, _("write error"));
if (fwrite (outbuf, 1, n, out) < n)
error (EXIT_FAILURE, errno, _("write error"));
if (!ok)
error (EXIT_FAILURE, 0, _("invalid input"));
if (!ok)
error (EXIT_FAILURE, 0, _("invalid input"));
}
}
while (!feof (in));
}

View File

@@ -2,10 +2,11 @@ Index: src/remove.c
===================================================================
RCS file: /fetish/cu/src/remove.c,v
retrieving revision 1.158
diff -u -p -u -r1.158 remove.c
--- src/remove.c 3 Sep 2006 02:54:51 -0000 1.158
+++ src/remove.c 6 Sep 2006 18:57:46 -0000
@@ -245,9 +245,10 @@ pop_dir (Dirstack_state *ds)
diff --git a/src/remove.c b/src/remove.c
index 4728bdd..7477da5 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -236,9 +236,10 @@ pop_dir (Dirstack_state *ds)
{
size_t n_lengths = obstack_object_size (&ds->len_stack) / sizeof (size_t);
size_t *length = obstack_base (&ds->len_stack);
@@ -17,7 +18,7 @@ diff -u -p -u -r1.158 remove.c
assert (top_len >= 2);
/* Pop the specified length of file name. */
@@ -379,10 +380,11 @@ AD_stack_top (Dirstack_state const *ds)
@@ -370,10 +371,11 @@ AD_stack_top (Dirstack_state const *ds)
static void
AD_stack_pop (Dirstack_state *ds)
{
@@ -30,125 +31,83 @@ diff -u -p -u -r1.158 remove.c
if (top->unremovable)
hash_free (top->unremovable);
obstack_blank (&ds->Active_dir, -(int) sizeof (struct AD_ent));
@@ -549,6 +551,7 @@ AD_mark_helper (Hash_table **ht, char *f
if (*ht == NULL)
xalloc_die ();
}
+ {
void *ent = hash_insert (*ht, filename);
if (ent == NULL)
xalloc_die ();
@@ -557,7 +560,7 @@ AD_mark_helper (Hash_table **ht, char *f
if (ent != filename)
free (filename);
}
-
+ }
}
@@ -815,6 +817,7 @@ prompt (int fd_cwd, Dirstack_state const *ds, char const *filename,
/* Mark FILENAME (in current directory) as unremovable. */
@@ -1129,6 +1132,7 @@ fd_to_subdirp (int fd_cwd, char const *f
return NULL;
}
+ {
DIR *subdir_dirp = fdopendir (fd_sub);
if (subdir_dirp == NULL)
if (write_protected || x->interactive == RMI_ALWAYS)
{
@@ -1137,6 +1141,7 @@ fd_to_subdirp (int fd_cwd, char const *f
}
+ char const *quoted_name = quote (full_filename (filename));
if (write_protected <= 0
&& cache_fstatat (fd_cwd, filename, sbuf, AT_SYMLINK_NOFOLLOW) != 0)
{
@@ -832,8 +835,6 @@ prompt (int fd_cwd, Dirstack_state const *ds, char const *filename,
write_protected = EISDIR;
}
return subdir_dirp;
+ }
}
/* Remove entries in the directory open on DIRP
@@ -1372,9 +1377,10 @@ remove_dir (int fd_cwd, Dirstack_state *
/* The name of the directory that we have just processed,
nominally removing all of its contents. */
char *empty_dir;
+ int fd;
AD_pop_and_chdir (&dirp, ds, &empty_dir);
- int fd = (dirp != NULL ? dirfd (dirp) : AT_FDCWD);
+ fd = (dirp != NULL ? dirfd (dirp) : AT_FDCWD);
assert (dirp != NULL || AD_stack_height (ds) == 1);
/* Try to remove EMPTY_DIR only if remove_cwd_entries succeeded. */
@@ -1386,8 +1392,9 @@ remove_dir (int fd_cwd, Dirstack_state *
But that's no big deal since we're interactive. */
struct stat empty_st;
Ternary is_empty;
+ enum RM_status s;
cache_stat_init (&empty_st);
- enum RM_status s = prompt (fd, ds, empty_dir, &empty_st, x,
+ s = prompt (fd, ds, empty_dir, &empty_st, x,
PA_REMOVE_DIR, &is_empty);
if (s != RM_OK)
@@ -1452,6 +1459,7 @@ rm_1 (Dirstack_state *ds, char const *fi
- char const *quoted_name = quote (full_filename (filename));
-
if (0 < write_protected)
{
error (0, write_protected, _("cannot remove %s"), quoted_name);
@@ -1487,6 +1488,7 @@ rm_1 (Dirstack_state *ds, char const *filename,
return RM_ERROR;
}
+ {
struct stat st;
cache_stat_init (&st);
if (x->root_dev_ino)
@@ -1473,6 +1481,7 @@ rm_1 (Dirstack_state *ds, char const *fi
cycle_check_init (&ds->cycle_check_state);
@@ -1509,6 +1511,7 @@ rm_1 (Dirstack_state *ds, char const *filename,
AD_push_initial (ds);
AD_INIT_OTHER_MEMBERS ();
+ {
int fd_cwd = AT_FDCWD;
enum RM_status status = remove_entry (fd_cwd, ds, filename, &st, x, NULL);
enum RM_status status = remove_entry (AT_FDCWD, ds, filename, &st, x, NULL);
if (status == RM_NONEMPTY_DIR)
@@ -1491,6 +1500,8 @@ rm_1 (Dirstack_state *ds, char const *fi
ds_clear (ds);
{
@@ -1525,6 +1528,8 @@ rm_1 (Dirstack_state *ds, char const *filename,
ds_clear (ds);
return status;
+ }
+ }
}
/* Remove all files and/or directories specified by N_FILES and FILE.
@@ -1513,9 +1524,11 @@ rm (size_t n_files, char const *const *f
}
cycle_check_init (&ds->cycle_check_state);
+ {
enum RM_status s = rm_1 (ds, file[i], x, &cwd_errno);
assert (VALID_STATUS (s));
UPDATE_STATUS (status, s);
+ }
}
if (x->require_restore_cwd && cwd_errno)
Index: src/rm.c
===================================================================
RCS file: /fetish/cu/src/rm.c,v
retrieving revision 1.140
diff -u -p -u -r1.140 rm.c
--- src/rm.c 3 Sep 2006 02:53:58 -0000 1.140
+++ src/rm.c 6 Sep 2006 18:57:46 -0000
@@ -357,8 +357,10 @@ main (int argc, char **argv)
if (!yesno ())
exit (EXIT_SUCCESS);
}
+ {
enum RM_status status = rm (n_files, file, &x);
assert (VALID_STATUS (status));
exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);
+ }
}
diff --git a/src/rm.c b/src/rm.c
index 364a21c..7a24014 100644
--- a/src/rm.c
+++ b/src/rm.c
@@ -355,6 +355,7 @@ main (int argc, char **argv)
quote ("/"));
}
+ {
size_t n_files = argc - optind;
char const *const *file = (char const *const *) argv + optind;
@@ -368,7 +369,10 @@ main (int argc, char **argv)
if (!yesno ())
exit (EXIT_SUCCESS);
}
+ {
enum RM_status status = rm (n_files, file, &x);
assert (VALID_STATUS (status));
exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);
+ }
+ }
}
Index: shred.c
Index: src/shred.c
===================================================================
RCS file: /fetish/cu/src/shred.c,v
retrieving revision 1.130
diff -u -p -r1.130 shred.c
--- shred.c 3 Sep 2006 02:53:16 -0000 1.130
+++ shred.c 3 Oct 2006 13:48:24 -0000
@@ -460,7 +460,7 @@ dopass (int fd, char const *qname, off_t
--- a/src/shred.c 3 Sep 2006 02:53:16 -0000 1.130
+++ b/src/shred.c 3 Oct 2006 13:48:24 -0000
@@ -464,7 +464,7 @@ dopass (int fd, char const *qname, off_t
out. Thus, it shouldn't give up on bad blocks. This
code works because lim is always a multiple of
SECTOR_SIZE, except at the end. */

View File

@@ -55,7 +55,7 @@
char *program_name;
/* Name of input file. May be "-". */
static char *infile;
static char const *infile;
/* Descriptor on which input file is open. */
static int input_desc;

View File

@@ -260,20 +260,14 @@ main (int argc, char **argv)
if (dereference == 1)
error (EXIT_FAILURE, 0,
_("-R --dereference requires either -H or -L"));
chopt.affect_symlink_referent = false;
}
else
{
if (dereference == 0)
error (EXIT_FAILURE, 0, _("-R -h requires -P"));
chopt.affect_symlink_referent = true;
dereference = 0;
}
}
else
{
bit_flags = FTS_PHYSICAL;
chopt.affect_symlink_referent = (dereference != 0);
}
chopt.affect_symlink_referent = (dereference != 0);
if (argc - optind < (reference_file ? 1 : 2))
{

View File

@@ -228,6 +228,10 @@ process_file (FTS *fts, FTSENT *ent)
if (ok && ROOT_DEV_INO_CHECK (root_dev_ino, file_stats))
{
ROOT_DEV_INO_WARN (file_full_name);
/* Tell fts not to traverse into this hierarchy. */
fts_set (fts, ent, FTS_SKIP);
/* Ensure that we do not process "/" on the second visit. */
ent = fts_read (fts);
ok = false;
}

View File

@@ -1,5 +1,5 @@
/* chown-core.c -- core functions for changing ownership.
Copyright (C) 2000, 2002, 2003, 2004, 2005, 2006 Free Software Foundation.
Copyright (C) 2000, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation.
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
@@ -32,6 +32,12 @@
#include "root-dev-ino.h"
#include "xfts.h"
#define FTSENT_IS_DIRECTORY(E) \
((E)->fts_info == FTS_D \
|| (E)->fts_info == FTS_DC \
|| (E)->fts_info == FTS_DP \
|| (E)->fts_info == FTS_DNR)
enum RCH_status
{
/* we called fchown and close, and both succeeded */
@@ -258,7 +264,20 @@ change_file_owner (FTS *fts, FTSENT *ent,
{
case FTS_D:
if (chopt->recurse)
return true;
{
if (ROOT_DEV_INO_CHECK (chopt->root_dev_ino, ent->fts_statp))
{
/* This happens e.g., with "chown -R --preserve-root 0 /"
and with "chown -RH --preserve-root 0 symlink-to-root". */
ROOT_DEV_INO_WARN (file_full_name);
/* Tell fts not to traverse into this hierarchy. */
fts_set (fts, ent, FTS_SKIP);
/* Ensure that we do not process "/" on the second visit. */
ent = fts_read (fts);
return false;
}
return true;
}
break;
case FTS_DP:
@@ -337,15 +356,13 @@ change_file_owner (FTS *fts, FTSENT *ent,
|| required_gid == file_stats->st_gid));
}
if (do_chown
/* With FTS_NOSTAT, file_stats is valid only for directories.
Don't need to check for FTS_D, since it is handled above,
and same for FTS_DNR, since then do_chown is false. */
&& (ent->fts_info == FTS_DP || ent->fts_info == FTS_DC)
/* This happens when chown -LR --preserve-root encounters a symlink-to-/. */
if (ok
&& FTSENT_IS_DIRECTORY (ent)
&& ROOT_DEV_INO_CHECK (chopt->root_dev_ino, file_stats))
{
ROOT_DEV_INO_WARN (file_full_name);
ok = do_chown = false;
return false;
}
if (do_chown)

View File

@@ -273,20 +273,14 @@ main (int argc, char **argv)
if (dereference == 1)
error (EXIT_FAILURE, 0,
_("-R --dereference requires either -H or -L"));
chopt.affect_symlink_referent = false;
}
else
{
if (dereference == 0)
error (EXIT_FAILURE, 0, _("-R -h requires -P"));
chopt.affect_symlink_referent = true;
dereference = 0;
}
}
else
{
bit_flags = FTS_PHYSICAL;
chopt.affect_symlink_referent = (dereference != 0);
}
chopt.affect_symlink_referent = (dereference != 0);
if (argc - optind < (reference_file ? 1 : 2))
{

View File

@@ -1,5 +1,5 @@
/* copy.c -- core functions for copying files and directories
Copyright (C) 89, 90, 91, 1995-2006 Free Software Foundation.
Copyright (C) 89, 90, 91, 1995-2007 Free Software Foundation.
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
@@ -38,6 +38,7 @@
#include "euidaccess.h"
#include "error.h"
#include "fcntl--.h"
#include "filemode.h"
#include "filenamecat.h"
#include "full-write.h"
#include "getpagesize.h"
@@ -175,22 +176,22 @@ copy_dir (char const *src_name_in, char const *dst_name_in, bool new_dst,
st_gid fields of SRC_SB. If DEST_DESC is undefined (-1), set
the owner and owning group of DST_NAME instead. DEST_DESC must
refer to the same file as DEST_NAME if defined.
Return true if the syscall succeeds, or if it's ok not to
preserve ownership. */
Return 1 if the syscall succeeds, 0 if it fails but it's OK
not to preserve ownership, -1 otherwise. */
static bool
static int
set_owner (const struct cp_options *x, char const *dst_name, int dest_desc,
uid_t uid, gid_t gid)
{
if (HAVE_FCHOWN && dest_desc != -1)
{
if (fchown (dest_desc, uid, gid) == 0)
return true;
return 1;
}
else
{
if (chown (dst_name, uid, gid) == 0)
return true;
return 1;
}
if (! chown_failure_ok (x))
@@ -198,10 +199,10 @@ set_owner (const struct cp_options *x, char const *dst_name, int dest_desc,
error (0, errno, _("failed to preserve ownership for %s"),
quote (dst_name));
if (x->require_preserve)
return false;
return -1;
}
return true;
return 0;
}
/* Set the st_author field of DEST_DESC to the st_author field of
@@ -230,11 +231,26 @@ set_author (const char *dst_name, int dest_desc, const struct stat *src_sb)
#endif
}
/* Change the file mode bits of the file identified by DESC or NAME to MODE.
Use DESC if DESC is valid and fchmod is available, NAME otherwise. */
static int
fchmod_or_lchmod (int desc, char const *name, mode_t mode)
{
#if HAVE_FCHMOD
if (0 <= desc)
return fchmod (desc, mode);
#endif
return lchmod (name, mode);
}
/* Copy a regular file from SRC_NAME to DST_NAME.
If the source file contains holes, copies holes and blocks of zeros
in the source file as holes in the destination file.
(Holes are read as zeroes by the `read' system call.)
Use DST_MODE as the 3rd argument in the call to open.
When creating the destination, use DST_MODE & ~OMITTED_PERMISSIONS
as the third argument in the call to open, adding
OMITTED_PERMISSIONS after copying as needed.
X provides many option settings.
Return true if successful.
*NEW_DST is as in copy_internal.
@@ -242,13 +258,15 @@ set_author (const char *dst_name, int dest_desc, const struct stat *src_sb)
static bool
copy_reg (char const *src_name, char const *dst_name,
const struct cp_options *x, mode_t dst_mode, bool *new_dst,
const struct cp_options *x,
mode_t dst_mode, mode_t omitted_permissions, bool *new_dst,
struct stat const *src_sb)
{
char *buf;
char *buf_alloc = NULL;
int dest_desc;
int source_desc;
mode_t src_mode = src_sb->st_mode;
struct stat sb;
struct stat src_open_sb;
bool return_val = true;
@@ -278,11 +296,11 @@ copy_reg (char const *src_name, char const *dst_name,
goto close_src_desc;
}
/* These semantics are required for cp.
The if-block will be taken in move_mode. */
/* The semantics of the following open calls are mandated
by the specs for both cp and mv. */
if (! *new_dst)
{
dest_desc = open (dst_name, O_WRONLY | O_TRUNC | O_BINARY, dst_mode);
dest_desc = open (dst_name, O_WRONLY | O_TRUNC | O_BINARY);
if (dest_desc < 0 && x->unlink_dest_after_failed_open)
{
@@ -301,7 +319,10 @@ copy_reg (char const *src_name, char const *dst_name,
}
if (*new_dst)
dest_desc = open (dst_name, O_WRONLY | O_CREAT | O_BINARY, dst_mode);
dest_desc = open (dst_name, O_WRONLY | O_CREAT | O_EXCL | O_BINARY,
dst_mode & ~omitted_permissions);
else
omitted_permissions = 0;
if (dest_desc < 0)
{
@@ -410,7 +431,17 @@ copy_reg (char const *src_name, char const *dst_name,
{
char *cp;
buf[n_read] = 1; /* Sentinel to stop loop. */
/* Sentinel to stop loop. */
buf[n_read] = '\1';
#ifdef lint
/* Usually, buf[n_read] is not the byte just before a "word"
(aka uintptr_t) boundary. In that case, the word-oriented
test below (*wp++ == 0) would read some uninitialized bytes
after the sentinel. To avoid false-positive reports about
this condition (e.g., from a tool like valgrind), set the
remaining bytes -- to any value. */
memset (buf + n_read + 1, 0, sizeof (word) - 1);
#endif
/* Find first nonzero *word*, or the word with the sentinel. */
@@ -500,10 +531,16 @@ copy_reg (char const *src_name, char const *dst_name,
if (x->preserve_ownership && ! SAME_OWNER_AND_GROUP (*src_sb, sb))
{
if (! set_owner (x, dst_name, dest_desc, src_sb->st_uid, src_sb->st_gid))
{
switch (set_owner (x, dst_name, dest_desc,
src_sb->st_uid, src_sb->st_gid))
{
case -1:
return_val = false;
goto close_src_and_dst_desc;
case 0:
src_mode &= ~ (S_ISUID | S_ISGID | S_ISVTX);
break;
}
}
@@ -511,8 +548,8 @@ copy_reg (char const *src_name, char const *dst_name,
if (x->preserve_mode || x->move_mode)
{
if (copy_acl (src_name, source_desc, dst_name, dest_desc,
src_sb->st_mode) != 0 && x->require_preserve)
if (copy_acl (src_name, source_desc, dst_name, dest_desc, src_mode) != 0
&& x->require_preserve)
return_val = false;
}
else if (x->set_mode)
@@ -520,6 +557,18 @@ copy_reg (char const *src_name, char const *dst_name,
if (set_acl (dst_name, dest_desc, x->mode) != 0)
return_val = false;
}
else if (omitted_permissions)
{
omitted_permissions &= ~ cached_umask ();
if (omitted_permissions
&& fchmod_or_lchmod (dest_desc, dst_name, dst_mode) != 0)
{
error (0, errno, _("preserving permissions for %s"),
quote (dst_name));
if (x->require_preserve)
return_val = false;
}
}
close_src_and_dst_desc:
if (close (dest_desc) < 0)
@@ -749,10 +798,14 @@ overwrite_prompt (char const *dst_name, struct stat const *dst_sb)
{
if (euidaccess (dst_name, W_OK) != 0)
{
char perms[12]; /* "-rwxrwxrwx " ls-style modes. */
strmode (dst_sb->st_mode, perms);
perms[10] = '\0';
fprintf (stderr,
_("%s: overwrite %s, overriding mode %04lo? "),
_("%s: try to overwrite %s, overriding mode %04lo (%s)? "),
program_name, quote (dst_name),
(unsigned long int) (dst_sb->st_mode & CHMOD_MODE_BITS));
(unsigned long int) (dst_sb->st_mode & CHMOD_MODE_BITS),
&perms[1]);
}
else
{
@@ -967,6 +1020,8 @@ copy_internal (char const *src_name, char const *dst_name,
struct stat dst_sb;
mode_t src_mode;
mode_t dst_mode IF_LINT (= 0);
mode_t dst_mode_bits;
mode_t omitted_permissions;
bool restore_dst_mode = false;
char *earlier_file = NULL;
char *dst_backup = NULL;
@@ -1465,6 +1520,17 @@ copy_internal (char const *src_name, char const *dst_name,
new_dst = true;
}
/* If the ownership might change, or if it is a directory (whose
special mode bits may change after the directory is created),
omit some permissions at first, so unauthorized users cannot nip
in before the file is ready. */
dst_mode_bits = (x->set_mode ? x->mode : src_mode) & CHMOD_MODE_BITS;
omitted_permissions =
(dst_mode_bits
& (x->preserve_ownership ? S_IRWXG | S_IRWXO
: S_ISDIR (src_mode) ? S_IWGRP | S_IWOTH
: 0));
delayed_ok = true;
/* In certain modes (cp's --symbolic-link), and for certain file types
@@ -1502,7 +1568,7 @@ copy_internal (char const *src_name, char const *dst_name,
(src_mode & ~S_IRWXUGO) != 0. However, common practice is
to ask mkdir to copy all the CHMOD_MODE_BITS, letting mkdir
decide what to do with S_ISUID | S_ISGID | S_ISVTX. */
if (mkdir (dst_name, src_mode & CHMOD_MODE_BITS) != 0)
if (mkdir (dst_name, dst_mode_bits & ~omitted_permissions) != 0)
{
error (0, errno, _("cannot create directory %s"),
quote (dst_name));
@@ -1543,19 +1609,20 @@ copy_internal (char const *src_name, char const *dst_name,
emit_verbose (src_name, dst_name, NULL);
}
/* Are we crossing a file system boundary? */
/* Decide whether to copy the contents of the directory. */
if (x->one_file_system && device != 0 && device != src_sb.st_dev)
return true;
/* Copy the contents of the directory. */
if (! copy_dir (src_name, dst_name, new_dst, &src_sb, dir, x,
copy_into_self))
{
/* Don't just return here -- otherwise, the failure to read a
single file in a source directory would cause the containing
destination directory not to have owner/perms set properly. */
delayed_ok = false;
/* Here, we are crossing a file system boundary and cp's -x option
is in effect: so don't copy the contents of this directory. */
}
else
{
/* Copy the contents of the directory. Don't just return if
this fails -- otherwise, the failure to read a single file
in a source directory would cause the containing destination
directory not to have owner/perms set properly. */
delayed_ok = copy_dir (src_name, dst_name, new_dst, &src_sb, dir, x,
copy_into_self);
}
}
else if (x->symbolic_link)
@@ -1629,23 +1696,28 @@ copy_internal (char const *src_name, char const *dst_name,
practice passed all the source mode bits to 'open', but the extra
bits were ignored, so it should be the same either way. */
if (! copy_reg (src_name, dst_name, x, src_mode & S_IRWXUGO,
&new_dst, &src_sb))
omitted_permissions, &new_dst, &src_sb))
goto un_backup;
}
else if (S_ISFIFO (src_mode))
{
/* Use mknod, rather than mkfifo, because the former preserves
the special mode bits of a fifo on Solaris 10, while mkfifo
does not. */
if (mknod (dst_name, src_mode, 0) != 0)
{
error (0, errno, _("cannot create fifo %s"), quote (dst_name));
goto un_backup;
}
does not. But fall back on mkfifo, because on some BSD systems,
mknod always fails when asked to create a FIFO. */
if (mknod (dst_name, src_mode & ~omitted_permissions, 0) != 0)
#if HAVE_MKFIFO
if (mkfifo (dst_name, src_mode & ~S_IFIFO & ~omitted_permissions) != 0)
#endif
{
error (0, errno, _("cannot create fifo %s"), quote (dst_name));
goto un_backup;
}
}
else if (S_ISBLK (src_mode) || S_ISCHR (src_mode) || S_ISSOCK (src_mode))
{
if (mknod (dst_name, src_mode, src_sb.st_rdev) != 0)
if (mknod (dst_name, src_mode & ~omitted_permissions, src_sb.st_rdev)
!= 0)
{
error (0, errno, _("cannot create special file %s"),
quote (dst_name));
@@ -1654,7 +1726,7 @@ copy_internal (char const *src_name, char const *dst_name,
}
else if (S_ISLNK (src_mode))
{
char *src_link_val = xreadlink (src_name, src_sb.st_size);
char *src_link_val = xreadlink_with_size (src_name, src_sb.st_size);
if (src_link_val == NULL)
{
error (0, errno, _("cannot read symbolic link %s"), quote (src_name));
@@ -1674,7 +1746,8 @@ copy_internal (char const *src_name, char const *dst_name,
FIXME: This behavior isn't documented, and seems wrong
in some cases, e.g., if the destination symlink has the
wrong ownership, permissions, or time stamps. */
char *dest_link_val = xreadlink (dst_name, dst_sb.st_size);
char *dest_link_val =
xreadlink_with_size (dst_name, dst_sb.st_size);
if (STREQ (dest_link_val, src_link_val))
same_link = true;
free (dest_link_val);
@@ -1757,8 +1830,15 @@ copy_internal (char const *src_name, char const *dst_name,
if (x->preserve_ownership
&& (new_dst || !SAME_OWNER_AND_GROUP (src_sb, dst_sb)))
{
if (! set_owner (x, dst_name, -1, src_sb.st_uid, src_sb.st_gid))
return false;
switch (set_owner (x, dst_name, -1, src_sb.st_uid, src_sb.st_gid))
{
case -1:
return false;
case 0:
src_mode &= ~ (S_ISUID | S_ISGID | S_ISVTX);
break;
}
}
set_author (dst_name, -1, &src_sb);
@@ -1774,14 +1854,40 @@ copy_internal (char const *src_name, char const *dst_name,
if (set_acl (dst_name, -1, x->mode) != 0)
return false;
}
else if (restore_dst_mode)
else
{
if (lchmod (dst_name, dst_mode) != 0)
if (omitted_permissions)
{
error (0, errno, _("preserving permissions for %s"),
quote (dst_name));
if (x->require_preserve)
return false;
omitted_permissions &= ~ cached_umask ();
if (omitted_permissions && !restore_dst_mode)
{
/* Permissions were deliberately omitted when the file
was created due to security concerns. See whether
they need to be re-added now. It'd be faster to omit
the lstat, but deducing the current destination mode
is tricky in the presence of implementation-defined
rules for special mode bits. */
if (new_dst && lstat (dst_name, &dst_sb) != 0)
{
error (0, errno, _("cannot stat %s"), quote (dst_name));
return false;
}
dst_mode = dst_sb.st_mode;
if (omitted_permissions & ~dst_mode)
restore_dst_mode = true;
}
}
if (restore_dst_mode)
{
if (lchmod (dst_name, dst_mode | omitted_permissions) != 0)
{
error (0, errno, _("preserving permissions for %s"),
quote (dst_name));
if (x->require_preserve)
return false;
}
}
}
@@ -1885,3 +1991,17 @@ chown_failure_ok (struct cp_options const *x)
return ((errno == EPERM || errno == EINVAL) && !x->chown_privileges);
}
/* Return the user's umask, caching the result. */
extern mode_t
cached_umask (void)
{
static mode_t mask = (mode_t) -1;
if (mask == (mode_t) -1)
{
mask = umask (0);
umask (mask);
}
return mask;
}

View File

@@ -213,5 +213,6 @@ void src_info_init (struct cp_options *);
bool chown_privileges (void);
bool chown_failure_ok (struct cp_options const *);
mode_t cached_umask (void);
#endif

View File

@@ -1,5 +1,5 @@
/* cp.c -- file copying (main routines)
Copyright (C) 89, 90, 91, 1995-2006 Free Software Foundation.
Copyright (C) 89, 90, 91, 1995-2007 Free Software Foundation.
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
@@ -413,6 +413,9 @@ make_dir_parents_private (char const *const_dir, size_t src_offset,
if (XSTAT (x, dir, &stats))
{
mode_t src_mode;
mode_t omitted_permissions;
mode_t mkdir_mode;
int src_errno;
/* This component does not exist. We must set
*new_dst and new->mode inside this loop because,
@@ -420,19 +423,35 @@ make_dir_parents_private (char const *const_dir, size_t src_offset,
make_dir_parents_private creates only e_dir/../a if
./b already exists. */
*new_dst = true;
if (XSTAT (x, src, &stats))
src_errno = (XSTAT (x, src, &stats) != 0
? errno
: S_ISDIR (stats.st_mode)
? 0
: ENOTDIR);
if (src_errno)
{
error (0, errno, _("failed to get attributes of %s"),
error (0, src_errno, _("failed to get attributes of %s"),
quote (src));
return false;
}
src_mode = stats.st_mode;
/* If the ownership or special mode bits might change,
omit some permissions at first, so unauthorized users
cannot nip in before the file is ready. */
omitted_permissions = (src_mode
& (x->preserve_ownership
? S_IRWXG | S_IRWXO
: x->preserve_mode
? S_IWGRP | S_IWOTH
: 0));
/* POSIX says mkdir's behavior is implementation-defined when
(src_mode & ~S_IRWXUGO) != 0. However, common practice is
to ask mkdir to copy all the CHMOD_MODE_BITS, letting mkdir
decide what to do with S_ISUID | S_ISGID | S_ISVTX. */
if (mkdir (dir, src_mode & CHMOD_MODE_BITS) != 0)
mkdir_mode = src_mode & CHMOD_MODE_BITS & ~omitted_permissions;
if (mkdir (dir, mkdir_mode) != 0)
{
error (0, errno, _("cannot make directory %s"),
quote (dir));
@@ -454,28 +473,30 @@ make_dir_parents_private (char const *const_dir, size_t src_offset,
quote (dir));
return false;
}
else
{
if (x->preserve_mode)
{
new->mode = src_mode;
new->restore_mode = (src_mode != stats.st_mode);
}
if ((stats.st_mode & S_IRWXU) != S_IRWXU)
{
/* Make the new directory searchable and writable. The
original permissions will be restored later. */
new->mode = stats.st_mode;
if (! x->preserve_mode)
{
if (omitted_permissions & ~stats.st_mode)
omitted_permissions &= ~ cached_umask ();
if (omitted_permissions & ~stats.st_mode
|| (stats.st_mode & S_IRWXU) != S_IRWXU)
{
new->mode = stats.st_mode | omitted_permissions;
new->restore_mode = true;
}
}
if (lchmod (dir, stats.st_mode | S_IRWXU) != 0)
{
error (0, errno, _("setting permissions for %s"),
quote (dir));
return false;
}
if ((stats.st_mode & S_IRWXU) != S_IRWXU)
{
/* Make the new directory searchable and writable.
The original permissions will be restored later. */
if (lchmod (dir, stats.st_mode | S_IRWXU) != 0)
{
error (0, errno, _("setting permissions for %s"),
quote (dir));
return false;
}
}
}

View File

@@ -1,5 +1,5 @@
/* csplit - split a file into sections determined by context lines
Copyright (C) 91, 1995-2006 Free Software Foundation, Inc.
Copyright (C) 91, 1995-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -149,13 +149,13 @@ static uintmax_t current_line = 0;
static bool have_read_eof = false;
/* Name of output files. */
static char * volatile filename_space = NULL;
static char *volatile filename_space = NULL;
/* Prefix part of output file names. */
static char * volatile prefix = NULL;
static char const *volatile prefix = NULL;
/* Suffix part of output file names. */
static char * volatile suffix = NULL;
static char *volatile suffix = NULL;
/* Number of digits to use in output file names. */
static int volatile digits = 2;
@@ -526,6 +526,8 @@ load_buffer (void)
if (lines_found)
save_buffer (b);
else
free (b);
return lines_found != 0;
}
@@ -1400,7 +1402,26 @@ main (int argc, char **argv)
{
int i;
static int const sig[] = { SIGHUP, SIGINT, SIGQUIT, SIGTERM };
static int const sig[] =
{
/* The usual suspects. */
SIGALRM, SIGHUP, SIGINT, SIGPIPE, SIGQUIT, SIGTERM,
#ifdef SIGPOLL
SIGPOLL,
#endif
#ifdef SIGPROF
SIGPROF,
#endif
#ifdef SIGVTALRM
SIGVTALRM,
#endif
#ifdef SIGXCPU
SIGXCPU,
#endif
#ifdef SIGXFSZ
SIGXFSZ,
#endif
};
enum { nsigs = sizeof sig / sizeof sig[0] };
#if SA_NOCLDSTOP
@@ -1463,7 +1484,7 @@ and output byte counts of each piece to standard output.\n\
Mandatory arguments to long options are mandatory for short options too.\n\
"), stdout);
fputs (_("\
-b, --suffix-format=FORMAT use sprintf FORMAT instead of %02d\n\
-b, --suffix-format=FORMAT use sprintf FORMAT instead of %02d\n\
-f, --prefix=PREFIX use PREFIX instead of `xx'\n\
-k, --keep-files do not remove output files on errors\n\
"), stdout);

View File

@@ -1,5 +1,5 @@
/* cut - remove parts of lines of files
Copyright (C) 1997-2005 Free Software Foundation, Inc.
Copyright (C) 1997-2006 Free Software Foundation, Inc.
Copyright (C) 1984 David M. Ihnat
This program is free software; you can redistribute it and/or modify
@@ -223,6 +223,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
Use one, and only one of -b, -c or -f. Each LIST is made up of one\n\
range, or many ranges separated by commas. Selected input is written\n\
in the same order that it is read, and is written exactly once.\n\
"), stdout);
fputs (_("\
Each range is one of:\n\
\n\
N N'th byte, character or field, counted from 1\n\
@@ -604,6 +606,7 @@ cut_fields (FILE *stream)
if (len < 0)
{
free (field_1_buffer);
field_1_buffer = NULL;
if (ferror (stream) || feof (stream))
break;
xalloc_die ();
@@ -702,7 +705,7 @@ cut_stream (FILE *stream)
Return true if successful. */
static bool
cut_file (char *file)
cut_file (char const *file)
{
FILE *stream;

View File

@@ -1,5 +1,5 @@
/* date - print or set the system date and time
Copyright (C) 1989-2006 Free Software Foundation, Inc.
Copyright (C) 1989-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -142,10 +142,15 @@ Display the current time in the given FORMAT, or set the system date.\n\
"), stdout);
fputs (_("\
-r, --reference=FILE display the last modification time of FILE\n\
-R, --rfc-2822 output date and time in RFC 2822 format\n\
-R, --rfc-2822 output date and time in RFC 2822 format.\n\
Example: Mon, 07 Aug 2006 12:34:56 -0600\n\
"), stdout);
fputs (_("\
--rfc-3339=TIMESPEC output date and time in RFC 3339 format.\n\
TIMESPEC=`date', `seconds', or `ns' for\n\
date and time to the indicated precision.\n\
Date and time components are separated by\n\
a single space: 2006-08-07 12:34:56-06:00\n\
-s, --set=STRING set time described by STRING\n\
-u, --utc, --universal print or set Coordinated Universal Time\n\
"), stdout);
@@ -223,13 +228,15 @@ specifies Coordinated Universal Time. Interpreted sequences are:\n\
%Z alphabetic time zone abbreviation (e.g., EDT)\n\
\n\
By default, date pads numeric fields with zeroes.\n\
"), stdout);
fputs (_("\
The following optional flags may follow `%':\n\
\n\
- (hyphen) do not pad the field\n\
_ (underscore) pad with spaces\n\
0 (zero) pad with zeros\n\
^ use upper case if possible\n\
# use opposite case if possible\n\
- (hyphen) do not pad the field\n\
_ (underscore) pad with spaces\n\
0 (zero) pad with zeros\n\
^ use upper case if possible\n\
# use opposite case if possible\n\
"), stdout);
fputs (_("\
\n\

View File

@@ -1,7 +1,7 @@
#!/usr/bin/perl -w
# dcgen -- convert dircolors.hin to dircolors.h.
# Copyright (C) 1996, 1998, 2004, 2005 Free Software Foundation, Inc.
# Copyright (C) 1996, 1998, 2004, 2005, 2006 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -44,12 +44,14 @@ while (<>)
and push @line, $_;
}
my $last_line = pop @line;
my $indent = ' ';
print "static char const G_line[] =\n";
print "static char const G_line[] =\n{\n";
foreach (@line)
{
print "$indent\"$_\\0\"\n";
s/./'$&',/g;
s/'\\'/'\\\\'/g;
s/'''/'\\''/g;
print "$indent${_}0,\n";
}
print "$indent\"$last_line\";\n";
print "};\n";

View File

@@ -1,5 +1,5 @@
/* dd -- convert a file while copying it.
Copyright (C) 85, 90, 91, 1995-2006 Free Software Foundation, Inc.
Copyright (C) 85, 90, 91, 1995-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -265,7 +265,7 @@ static struct symbol_value const flags[] =
{"direct", O_DIRECT},
{"directory", O_DIRECTORY},
{"dsync", O_DSYNC},
{"noatime", HAVE_WORKING_O_NOATIME ? O_NOATIME : 0},
{"noatime", O_NOATIME},
{"noctty", O_NOCTTY},
{"nofollow", HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0},
{"nolinks", O_NOLINKS},
@@ -448,9 +448,11 @@ Each CONV symbol may be:\n\
notrunc do not truncate the output file\n\
ucase change lower case to upper case\n\
swab swap every pair of input bytes\n\
"), stdout);
fputs (_("\
noerror continue after read errors\n\
sync pad every input block with NULs to ibs-size; when used\n\
with block or unblock, pad with spaces rather than NULs\n\
with block or unblock, pad with spaces rather than NULs\n\
fdatasync physically write output file data before finishing\n\
fsync likewise, but also write metadata\n\
"), stdout);
@@ -470,7 +472,7 @@ Each FLAG symbol may be:\n\
fputs (_(" sync likewise, but also for metadata\n"), stdout);
if (O_NONBLOCK)
fputs (_(" nonblock use non-blocking I/O\n"), stdout);
if (HAVE_WORKING_O_NOATIME)
if (O_NOATIME)
fputs (_(" noatime do not update access time\n"), stdout);
if (O_NOCTTY)
fputs (_(" noctty do not assign controlling terminal from file\n"),
@@ -871,6 +873,7 @@ static void
scanargs (int argc, char **argv)
{
int i;
size_t blocksize = 0;
for (i = optind; i < argc; i++)
{
@@ -921,7 +924,7 @@ scanargs (int argc, char **argv)
else if (STREQ (name, "bs"))
{
invalid |= ! (0 < n && n <= MAX_BLOCKSIZE (INPUT_BLOCK_SLOP));
output_blocksize = input_blocksize = n;
blocksize = n;
}
else if (STREQ (name, "cbs"))
{
@@ -946,6 +949,9 @@ scanargs (int argc, char **argv)
}
}
if (blocksize)
input_blocksize = output_blocksize = blocksize;
/* If bs= was given, both `input_blocksize' and `output_blocksize' will
have been set to positive values. If either has not been set,
bs= was not given, so make sure two buffers are used. */
@@ -1220,7 +1226,7 @@ advance_input_after_read_error (size_t nbytes)
return true;
diff = input_offset - offset;
if (! (0 <= diff && diff <= nbytes))
error (0, 0, _("warning: screwy file offset after failed read"));
error (0, 0, _("warning: invalid file offset after failed read"));
if (0 <= skip_via_lseek (input_file, STDIN_FILENO, diff, SEEK_CUR))
return true;
if (errno == 0)
@@ -1377,8 +1383,10 @@ static int
dd_copy (void)
{
char *ibuf, *bufstart; /* Input buffer. */
char *real_buf; /* real buffer address before alignment */
char *real_obuf;
/* These are declared static so that even though we don't free the
buffers, valgrind will recognize that there is no "real" leak. */
static char *real_buf; /* real buffer address before alignment */
static char *real_obuf;
ssize_t nread; /* Bytes read in the current block. */
/* If nonzero, then the previously read block was partial and
@@ -1598,9 +1606,6 @@ dd_copy (void)
}
}
free (real_buf);
free (real_obuf);
if ((conversions_mask & C_FDATASYNC) && fdatasync (STDOUT_FILENO) != 0)
{
if (errno != ENOSYS && errno != EINVAL)

View File

@@ -1,5 +1,5 @@
/* df - summarize free disk space
Copyright (C) 91, 1995-2006 Free Software Foundation, Inc.
Copyright (C) 91, 1995-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -748,7 +748,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
"), stdout);
fputs (_("\
-a, --all include dummy file systems\n\
-B, --block-size=SIZE use SIZE-byte blocks\n\
-B, --block-size=SIZE use SIZE-byte blocks\n\
-h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)\n\
-H, --si likewise, but use powers of 1000 not 1024\n\
"), stdout);
@@ -796,10 +796,7 @@ main (int argc, char **argv)
inode_format = false;
show_all_fs = false;
show_listed_fs = false;
human_output_opts = human_options (getenv ("DF_BLOCK_SIZE"), false,
&output_block_size);
human_output_opts = -1;
print_type = false;
file_systems_processed = false;
posix_format = false;
@@ -876,6 +873,18 @@ main (int argc, char **argv)
}
}
if (human_output_opts == -1)
{
if (posix_format)
{
human_output_opts = 0;
output_block_size = (getenv ("POSIXLY_CORRECT") ? 512 : 1024);
}
else
human_output_opts = human_options (getenv ("DF_BLOCK_SIZE"), false,
&output_block_size);
}
/* Fail if the same file system type was both selected and excluded. */
{
bool match = false;

View File

@@ -1,5 +1,5 @@
/* dircolors - output commands to set the LS_COLOR environment variable
Copyright (C) 1996-2006 Free Software Foundation, Inc.
Copyright (C) 1996-2007 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000 H. Peter Anvin
This program is free software; you can redistribute it and/or modify
@@ -24,11 +24,11 @@
#include "system.h"
#include "dircolors.h"
#include "c-strcase.h"
#include "error.h"
#include "getline.h"
#include "obstack.h"
#include "quote.h"
#include "strcase.h"
#include "xstrndup.h"
/* The official name of this program (e.g., no `g' prefix). */
@@ -246,7 +246,7 @@ dc_parse_stream (FILE *fp, const char *filename)
char *input_line = NULL;
size_t input_line_size = 0;
char const *line;
char *term;
char const *term;
bool ok = true;
/* State for the parser. */
@@ -296,7 +296,7 @@ dc_parse_stream (FILE *fp, const char *filename)
}
unrecognized = false;
if (strcasecmp (keywd, "TERM") == 0)
if (c_strcasecmp (keywd, "TERM") == 0)
{
if (STREQ (arg, term))
state = ST_TERMSURE;
@@ -325,9 +325,9 @@ dc_parse_stream (FILE *fp, const char *filename)
append_quoted (arg);
APPEND_CHAR (':');
}
else if (strcasecmp (keywd, "OPTIONS") == 0
|| strcasecmp (keywd, "COLOR") == 0
|| strcasecmp (keywd, "EIGHTBIT") == 0)
else if (c_strcasecmp (keywd, "OPTIONS") == 0
|| c_strcasecmp (keywd, "COLOR") == 0
|| c_strcasecmp (keywd, "EIGHTBIT") == 0)
{
/* Ignore. */
}
@@ -336,7 +336,7 @@ dc_parse_stream (FILE *fp, const char *filename)
int i;
for (i = 0; slack_codes[i] != NULL; ++i)
if (strcasecmp (keywd, slack_codes[i]) == 0)
if (c_strcasecmp (keywd, slack_codes[i]) == 0)
break;
if (slack_codes[i] != NULL)

View File

@@ -23,6 +23,7 @@ TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM console
TERM cygwin
TERM dtterm
@@ -86,8 +87,13 @@ EXEC 01;32
#.com 01;32
#.btm 01;32
#.bat 01;32
# Or if you want to colorize scripts even if they do not have the
# executable bit actually set.
#.sh 01;32
#.csh 01;32
.tar 01;31 # archives or compressed (bright red)
# archives or compressed (bright red)
.tar 01;31
.tgz 01;31
.arj 01;31
.taz 01;31
@@ -97,9 +103,18 @@ EXEC 01;32
.Z 01;31
.gz 01;31
.bz2 01;31
.bz 01;31
.tbz2 01;31
.tz 01;31
.deb 01;31
.rpm 01;31
.jar 01;31
.rar 01;31
.ace 01;31
.zoo 01;31
.cpio 01;31
.7z 01;31
.rz 01;31
# image formats
.jpg 01;35
@@ -115,19 +130,42 @@ EXEC 01;32
.tif 01;35
.tiff 01;35
.png 01;35
.mng 01;35
.pcx 01;35
.mov 01;35
.mpg 01;35
.mpeg 01;35
.m2v 01;35
.mkv 01;35
.ogm 01;35
.mp4 01;35
.m4v 01;35
.mp4v 01;35
.vob 01;35
.qt 01;35
.nuv 01;35
.wmv 01;35
.asf 01;35
.rm 01;35
.rmvb 01;35
.flc 01;35
.avi 01;35
.fli 01;35
.gl 01;35
.dl 01;35
.xcf 01;35
.xwd 01;35
.yuv 01;35
# audio formats
.flac 01;35
.mp3 01;35
.mpc 01;35
.ogg 01;35
.wav 01;35
.aac 00;36
.au 00;36
.flac 00;36
.mid 00;36
.midi 00;36
.mka 00;36
.mp3 00;36
.mpc 00;36
.ogg 00;36
.ra 00;36
.wav 00;36

View File

@@ -1,5 +1,5 @@
/* du -- summarize disk usage
Copyright (C) 1988-1991, 1995-2006 Free Software Foundation, Inc.
Copyright (C) 1988-1991, 1995-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -293,7 +293,9 @@ Mandatory arguments to long options are mandatory for short options too.\n\
the apparent size is usually smaller, it may be\n\
larger due to holes in (`sparse') files, internal\n\
fragmentation, indirect blocks, and the like\n\
-B, --block-size=SIZE use SIZE-byte blocks\n\
"), stdout);
fputs (_("\
-B, --block-size=SIZE use SIZE-byte blocks\n\
-b, --bytes equivalent to `--apparent-size --block-size=1'\n\
-c, --total produce a grand total\n\
-D, --dereference-args dereference FILEs that are symbolic links\n\
@@ -305,6 +307,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
change to be equivalent to --dereference-args (-D)\n\
-h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)\n\
--si like -h, but use powers of 1000 not 1024\n\
"), stdout);
fputs (_("\
-k like --block-size=1K\n\
-l, --count-links count sizes many times if hard linked\n\
-m like --block-size=1M\n\
@@ -319,7 +323,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
fputs (_("\
-x, --one-file-system skip directories on different file systems\n\
-X FILE, --exclude-from=FILE Exclude files that match any pattern in FILE.\n\
--exclude=PATTERN Exclude files that match PATTERN.\n\
--exclude=PATTERN Exclude files that match PATTERN.\n\
--max-depth=N print the total for a directory (or file, with --all)\n\
only if it is N or fewer levels below the command\n\
line argument; --max-depth=0 is the same as\n\
@@ -330,7 +334,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
directory, or any of its subdirectories\n\
--time=WORD show time as WORD instead of modification time:\n\
atime, access, use, ctime or status\n\
--time-style=STYLE show times using style STYLE:\n\
--time-style=STYLE show times using style STYLE:\n\
full-iso, long-iso, iso, +FORMAT\n\
FORMAT is interpreted like `date'\n\
"), stdout);

View File

@@ -1,5 +1,5 @@
/* env - run a program in a modified environment
Copyright (C) 1986, 1991-2005 Free Software Foundation, Inc.
Copyright (C) 1986, 1991-2005, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -189,8 +189,9 @@ main (int argc, char **argv)
/* If no program is specified, print the environment and exit. */
if (argc <= optind)
{
while (*environ)
puts (*environ++);
char *const *e = environ;
while (*e)
puts (*e++);
exit (EXIT_SUCCESS);
}

View File

@@ -236,7 +236,7 @@ int_value (intmax_t i)
/* Return a VALUE for S. */
static VALUE *
str_value (char *s)
str_value (char const *s)
{
VALUE *v = xmalloc (sizeof *v);
v->type = string;
@@ -427,6 +427,10 @@ docolon (VALUE *sv, VALUE *pv)
tostring (sv);
tostring (pv);
re_regs.num_regs = 0;
re_regs.start = NULL;
re_regs.end = NULL;
re_buffer.buffer = NULL;
re_buffer.allocated = 0;
re_buffer.fastmap = fastmap;
@@ -463,7 +467,13 @@ docolon (VALUE *sv, VALUE *pv)
(matchlen == -2 ? errno : EOVERFLOW),
_("error in regular expression matcher"));
free (re_buffer.buffer);
if (0 < re_regs.num_regs)
{
free (re_regs.start);
free (re_regs.end);
}
re_buffer.fastmap = NULL;
regfree (&re_buffer);
return v;
}

View File

@@ -607,12 +607,15 @@ copy_rest (FILE *f, int c)
const char *s;
out_column = 0;
if (in_column > next_prefix_indent && c != '\n' && c != EOF)
if (in_column > next_prefix_indent || (c != '\n' && c != EOF))
{
put_space (next_prefix_indent);
for (s = prefix; out_column != in_column && *s; out_column++)
putchar (*s++);
put_space (in_column - out_column);
if (c != EOF && c != '\n')
put_space (in_column - out_column);
if (c == EOF && in_column >= next_prefix_indent + prefix_length)
putchar ('\n');
}
while (c != '\n' && c != EOF)
{
@@ -688,10 +691,8 @@ get_line (FILE *f, int c)
flush_paragraph ();
}
word_limit++;
if (c == EOF)
return EOF;
}
while (c != '\n');
while (c != '\n' && c != EOF);
return get_prefix (f);
}

View File

@@ -1,5 +1,5 @@
/* fold -- wrap each input line to fit in specified width.
Copyright (C) 91, 1995-2005 Free Software Foundation, Inc.
Copyright (C) 91, 1995-2006 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -122,7 +122,7 @@ adjust_column (size_t column, char c)
Return true if successful. */
static bool
fold_file (char *filename, size_t width)
fold_file (char const *filename, size_t width)
{
FILE *istream;
int c;

View File

@@ -1,43 +0,0 @@
/* Define the magic numbers as given by statfs(2).
Please send additions to bug-coreutils@gnu.org and meskes@debian.org.
This file is generated automatically from ./stat.c. */
#if defined __linux__
# define S_MAGIC_AFFS 0xADFF
# define S_MAGIC_DEVPTS 0x1CD1
# define S_MAGIC_EXT 0x137D
# define S_MAGIC_EXT2_OLD 0xEF51
# define S_MAGIC_EXT2 0xEF53
# define S_MAGIC_JFS 0x3153464a
# define S_MAGIC_XFS 0x58465342
# define S_MAGIC_HPFS 0xF995E849
# define S_MAGIC_ISOFS 0x9660
# define S_MAGIC_ISOFS_WIN 0x4000
# define S_MAGIC_ISOFS_R_WIN 0x4004
# define S_MAGIC_MINIX 0x137F
# define S_MAGIC_MINIX_30 0x138F
# define S_MAGIC_MINIX_V2 0x2468
# define S_MAGIC_MINIX_V2_30 0x2478
# define S_MAGIC_MSDOS 0x4d44
# define S_MAGIC_FAT 0x4006
# define S_MAGIC_NCP 0x564c
# define S_MAGIC_NFS 0x6969
# define S_MAGIC_PROC 0x9fa0
# define S_MAGIC_SMB 0x517B
# define S_MAGIC_XENIX 0x012FF7B4
# define S_MAGIC_SYSV4 0x012FF7B5
# define S_MAGIC_SYSV2 0x012FF7B6
# define S_MAGIC_COH 0x012FF7B7
# define S_MAGIC_UFS 0x00011954
# define S_MAGIC_XIAFS 0x012FD16D
# define S_MAGIC_NTFS 0x5346544e
# define S_MAGIC_TMPFS 0x1021994
# define S_MAGIC_REISERFS 0x52654973
# define S_MAGIC_CRAMFS 0x28cd3d45
# define S_MAGIC_ROMFS 0x7275
# define S_MAGIC_RAMFS 0x858458f6
# define S_MAGIC_SQUASHFS 0x73717368
# define S_MAGIC_SYSFS 0x62656572
#elif defined __GNU__
# include <hurd/hurd_types.h>
#endif

View File

@@ -1,6 +1,6 @@
#!/bin/sh
# groups -- print the groups a user is in
# Copyright (C) 1991, 1997, 2000, 2002, 2004, 2006 Free Software Foundation, Inc.
# Copyright (C) 1991, 1997, 2000, 2002, 2004-2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -32,7 +32,7 @@ Same as id -Gn. If no USERNAME, use current process.
Report bugs to <@PACKAGE_BUGREPORT@>."
version='groups (@GNU_PACKAGE@) @VERSION@
Copyright (C) 2006 Free Software Foundation, Inc.
Copyright (C) @RELEASE_YEAR@ Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

View File

@@ -1,5 +1,5 @@
/* install - copy files and set attributes
Copyright (C) 89, 90, 91, 1995-2006 Free Software Foundation, Inc.
Copyright (C) 89, 90, 91, 1995-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -459,11 +459,10 @@ install_file_in_file (const char *from, const char *to,
return false;
if (strip_files)
strip (to);
if (! change_attributes (to))
if (x->preserve_timestamps && (strip_files || ! S_ISREG (from_sb.st_mode))
&& ! change_timestamps (&from_sb, to))
return false;
if (x->preserve_timestamps && (strip_files || ! S_ISREG (from_sb.st_mode)))
return change_timestamps (&from_sb, to);
return true;
return change_attributes (to);
}
/* Copy file FROM into directory TO_DIR, keeping its same name,
@@ -567,11 +566,10 @@ strip (char const *name)
error (EXIT_FAILURE, errno, _("cannot run strip"));
break;
default: /* Parent. */
/* Parent process. */
while (pid != wait (&status)) /* Wait for kid to finish. */
/* Do nothing. */ ;
if (status)
error (EXIT_FAILURE, 0, _("strip failed"));
if (waitpid (pid, &status, 0) < 0)
error (EXIT_FAILURE, errno, _("waiting for strip"));
else if (! WIFEXITED (status) || WEXITSTATUS (status))
error (EXIT_FAILURE, 0, _("strip process terminated abnormally"));
break;
}
}
@@ -684,7 +682,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
-p, --preserve-timestamps apply access/modification times of SOURCE files\n\
to corresponding destination files\n\
-s, --strip strip symbol tables\n\
-S, --suffix=SUFFIX override the usual backup suffix\n\
-S, --suffix=SUFFIX override the usual backup suffix\n\
-t, --target-directory=DIRECTORY copy all SOURCE arguments into DIRECTORY\n\
-T, --no-target-directory treat DEST as a normal file\n\
-v, --verbose print the name of each directory as it is created\n\

View File

@@ -599,7 +599,8 @@ add_field (int file, size_t field)
/* Convert a string of decimal digits, STR (the 1-based join field number),
to an integral value. Upon successful conversion, return one less
(the zero-based field number). If it cannot be converted, give a
(the zero-based field number). Silently convert too-large values
to SIZE_MAX - 1. Otherwise, if a value cannot be converted, give a
diagnostic and exit. */
static size_t
@@ -607,16 +608,12 @@ string_to_join_field (char const *str)
{
size_t result;
unsigned long int val;
verify (SIZE_MAX <= ULONG_MAX);
strtol_error s_err = xstrtoul (str, NULL, 10, &val, "");
if (s_err == LONGINT_OVERFLOW || (s_err == LONGINT_OK && SIZE_MAX < val))
{
error (EXIT_FAILURE, 0,
_("value %s is so large that it is not representable"),
quote (str));
}
if (s_err != LONGINT_OK || val == 0)
val = SIZE_MAX;
else if (s_err != LONGINT_OK || val == 0)
error (EXIT_FAILURE, 0, _("invalid field number: %s"), quote (str));
result = val - 1;

View File

@@ -133,7 +133,7 @@ do_link (const char *source, const char *dest)
struct stat source_stats;
struct stat dest_stats;
char *dest_backup = NULL;
bool lstat_ok = false;
bool dest_lstat_ok = false;
bool source_is_dir = false;
bool ok;
@@ -171,8 +171,8 @@ do_link (const char *source, const char *dest)
if (remove_existing_files || interactive || backup_type != no_backups)
{
lstat_ok = (lstat (dest, &dest_stats) == 0);
if (!lstat_ok && errno != ENOENT)
dest_lstat_ok = (lstat (dest, &dest_stats) == 0);
if (!dest_lstat_ok && errno != ENOENT)
{
error (0, errno, _("accessing %s"), quote (dest));
return false;
@@ -184,8 +184,14 @@ do_link (const char *source, const char *dest)
(with --backup, it just renames any existing destination file)
But if the source and destination are the same, don't remove
anything and fail right here. */
if (remove_existing_files
&& lstat_ok
if ((remove_existing_files
/* Ensure that "ln --backup f f" fails here, with the
"... same file" diagnostic, below. Otherwise, subsequent
code would give a misleading "file not found" diagnostic.
This case is different than the others handled here, since
the command in question doesn't use --force. */
|| (!symbolic_link && backup_type != no_backups))
&& dest_lstat_ok
/* Allow `ln -sf --backup k k' to succeed in creating the
self-referential symlink, but don't allow the hard-linking
equivalent: `ln -f k k' (with or without --backup) to get
@@ -205,7 +211,7 @@ do_link (const char *source, const char *dest)
return false;
}
if (lstat_ok)
if (dest_lstat_ok)
{
if (S_ISDIR (dest_stats.st_mode))
{

262
src/ls.c
View File

@@ -1,5 +1,5 @@
/* `dir', `vdir' and `ls' directory listing programs for GNU.
Copyright (C) 85, 88, 90, 91, 1995-2006 Free Software Foundation, Inc.
Copyright (C) 85, 88, 90, 91, 1995-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -93,6 +93,7 @@
#include "ls.h"
#include "lstat.h"
#include "mbswidth.h"
#include "mpsort.h"
#include "obstack.h"
#include "quote.h"
#include "quotearg.h"
@@ -155,22 +156,23 @@ struct fileinfo
/* The file name. */
char *name;
struct stat stat;
bool stat_ok;
/* For symbolic link, name of the file linked to, otherwise zero. */
char *linkname;
struct stat stat;
enum filetype filetype;
/* For symbolic link and long listing, st_mode of file linked to, otherwise
zero. */
mode_t linkmode;
bool stat_ok;
/* For symbolic link and color printing, true if linked-to file
exists, otherwise false. */
bool linkok;
enum filetype filetype;
#if USE_ACL
/* For long listings, true if the file has an access control list. */
bool have_acl;
@@ -266,18 +268,23 @@ static Hash_table *active_dir_set;
/* The table of files in the current directory:
`files' points to a vector of `struct fileinfo', one per file.
`nfiles' is the number of elements space has been allocated for.
`files_index' is the number actually in use. */
`cwd_file' points to a vector of `struct fileinfo', one per file.
`cwd_n_alloc' is the number of elements space has been allocated for.
`cwd_n_used' is the number actually in use. */
/* Address of block containing the files that are described. */
static struct fileinfo *files; /* FIXME: rename this to e.g. cwd_file */
static struct fileinfo *cwd_file;
/* Length of block that `files' points to, measured in files. */
static size_t nfiles; /* FIXME: rename this to e.g. cwd_n_alloc */
/* Length of block that `cwd_file' points to, measured in files. */
static size_t cwd_n_alloc;
/* Index of first unused in `files'. */
static size_t files_index; /* FIXME: rename this to e.g. cwd_n_used */
/* Index of first unused slot in `cwd_file'. */
static size_t cwd_n_used;
/* Vector of pointers to files, in proper sorted order, and the number
of entries allocated for it. */
static void **sorted_file;
static size_t sorted_file_alloc;
/* When true, in a color listing, color each symlink name according to the
type of file it points to. Otherwise, color them according to the `ln'
@@ -863,11 +870,11 @@ static size_t dired_pos;
/* Write S to STREAM and increment DIRED_POS by S_LEN. */
#define DIRED_FPUTS(s, stream, s_len) \
do {fputs ((s), (stream)); dired_pos += s_len;} while (0)
do {fputs (s, stream); dired_pos += s_len;} while (0)
/* Like DIRED_FPUTS, but for use when S is a literal string. */
#define DIRED_FPUTS_LITERAL(s, stream) \
do {fputs ((s), (stream)); dired_pos += sizeof((s)) - 1;} while (0)
do {fputs (s, stream); dired_pos += sizeof (s) - 1;} while (0)
#define DIRED_INDENT() \
do \
@@ -892,7 +899,7 @@ static struct obstack subdired_obstack;
do \
{ \
if (dired) \
obstack_grow ((obs), &dired_pos, sizeof (dired_pos)); \
obstack_grow (obs, &dired_pos, sizeof (dired_pos)); \
} \
while (0)
@@ -1113,8 +1120,29 @@ main (int argc, char **argv)
int n_files;
/* The signals that are trapped, and the number of such signals. */
static int const sig[] = { SIGHUP, SIGINT, SIGPIPE,
SIGQUIT, SIGTERM, SIGTSTP };
static int const sig[] =
{
/* This one is handled specially. */
SIGTSTP,
/* The usual suspects. */
SIGALRM, SIGHUP, SIGINT, SIGPIPE, SIGQUIT, SIGTERM,
#ifdef SIGPOLL
SIGPOLL,
#endif
#ifdef SIGPROF
SIGPROF,
#endif
#ifdef SIGVTALRM
SIGVTALRM,
#endif
#ifdef SIGXCPU
SIGXCPU,
#endif
#ifdef SIGXFSZ
SIGXFSZ,
#endif
};
enum { nsigs = sizeof sig / sizeof sig[0] };
#if ! SA_NOCLDSTOP
@@ -1231,9 +1259,9 @@ main (int argc, char **argv)
obstack_init (&subdired_obstack);
}
nfiles = 100;
files = xnmalloc (nfiles, sizeof *files);
files_index = 0;
cwd_n_alloc = 100;
cwd_file = xnmalloc (cwd_n_alloc, sizeof *cwd_file);
cwd_n_used = 0;
clear_files ();
@@ -1251,19 +1279,19 @@ main (int argc, char **argv)
gobble_file (argv[i++], unknown, NOT_AN_INODE_NUMBER, true, "");
while (i < argc);
if (files_index)
if (cwd_n_used)
{
sort_files ();
if (!immediate_dirs)
extract_dirs_from_files (NULL, true);
/* `files_index' might be zero now. */
/* `cwd_n_used' might be zero now. */
}
/* In the following if/else blocks, it is sufficient to test `pending_dirs'
(and not pending_dirs->name) because there may be no markers in the queue
at this point. A marker may be enqueued when extract_dirs_from_files is
called with a non-empty string or via print_dir. */
if (files_index)
if (cwd_n_used)
{
print_current_files ();
if (pending_dirs)
@@ -2314,6 +2342,7 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
{
file_failure (command_line_arg,
_("cannot determine device and inode of %s"), name);
closedir (dirp);
return;
}
@@ -2323,13 +2352,14 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
{
error (0, 0, _("%s: not listing already-listed directory"),
quotearg_colon (name));
closedir (dirp);
return;
}
DEV_INO_PUSH (dir_stat.st_dev, dir_stat.st_ino);
}
/* Read the directory entries, and insert the subfiles into the `files'
/* Read the directory entries, and insert the subfiles into the `cwd_file'
table. */
clear_files ();
@@ -2418,7 +2448,7 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
DIRED_PUTCHAR ('\n');
}
if (files_index)
if (cwd_n_used)
print_current_files ();
}
@@ -2472,7 +2502,7 @@ unsigned_file_size (off_t size)
return size + (size < 0) * ((uintmax_t) OFF_T_MAX - OFF_T_MIN + 1);
}
/* Enter and remove entries in the table `files'. */
/* Enter and remove entries in the table `cwd_file'. */
/* Empty the table of files. */
@@ -2481,13 +2511,14 @@ clear_files (void)
{
size_t i;
for (i = 0; i < files_index; i++)
for (i = 0; i < cwd_n_used; i++)
{
free (files[i].name);
free (files[i].linkname);
struct fileinfo *f = sorted_file[i];
free (f->name);
free (f->linkname);
}
files_index = 0;
cwd_n_used = 0;
#if USE_ACL
any_has_acl = false;
#endif
@@ -2517,13 +2548,13 @@ gobble_file (char const *name, enum filetype type, ino_t inode,
which is not used for command line arguments. */
assert (! command_line_arg || inode == NOT_AN_INODE_NUMBER);
if (files_index == nfiles)
if (cwd_n_used == cwd_n_alloc)
{
files = xnrealloc (files, nfiles, 2 * sizeof *files);
nfiles *= 2;
cwd_file = xnrealloc (cwd_file, cwd_n_alloc, 2 * sizeof *cwd_file);
cwd_n_alloc *= 2;
}
f = &files[files_index];
f = &cwd_file[cwd_n_used];
memset (f, '\0', sizeof *f);
f->stat.st_ino = inode;
f->filetype = type;
@@ -2534,14 +2565,15 @@ gobble_file (char const *name, enum filetype type, ino_t inode,
direct.d_type), we have to stat it in order to indicate
sticky and/or other-writable attributes. */
|| (type == directory && print_with_color)
|| (print_inode
&& (inode == NOT_AN_INODE_NUMBER
/* When dereferencing symlinks, the inode must come from
stat, but readdir provides the inode of lstat. Command
line dereferences are already taken care of by the above
assertion that the inode number is not yet known. */
|| (dereference == DEREF_ALWAYS
&& (type == symbolic_link || type == unknown))))
/* When dereferencing symlinks, the inode and type must come from
stat, but readdir provides the inode and type of lstat. */
|| ((print_inode || format_needs_type)
&& (type == symbolic_link || type == unknown)
&& (dereference == DEREF_ALWAYS
|| (command_line_arg && dereference != DEREF_NEVER)))
/* Command line dereferences are already taken care of by the above
assertion that the inode number is not yet known. */
|| (print_inode && inode == NOT_AN_INODE_NUMBER)
|| (format_needs_type
&& (type == unknown || command_line_arg
/* --indicator-style=classify (aka -F)
@@ -2614,7 +2646,7 @@ gobble_file (char const *name, enum filetype type, ino_t inode,
return 0;
f->name = xstrdup (name);
files_index++;
cwd_n_used++;
return 0;
}
@@ -2747,7 +2779,7 @@ gobble_file (char const *name, enum filetype type, ino_t inode,
}
f->name = xstrdup (name);
files_index++;
cwd_n_used++;
return blocks;
}
@@ -2766,7 +2798,7 @@ is_directory (const struct fileinfo *f)
static void
get_link_name (char const *filename, struct fileinfo *f, bool command_line_arg)
{
f->linkname = xreadlink (filename, f->stat.st_size);
f->linkname = xreadlink_with_size (filename, f->stat.st_size);
if (f->linkname == NULL)
file_failure (command_line_arg, _("cannot read symbolic link %s"),
filename);
@@ -2812,7 +2844,7 @@ basename_is_dot_or_dotdot (const char *name)
return dot_or_dotdot (base);
}
/* Remove any entries from FILES that are for directories,
/* Remove any entries from CWD_FILE that are for directories,
and queue them to be listed as directories instead.
DIRNAME is the prefix to prepend to each dirname
to make it correct relative to ls's working dir;
@@ -2837,39 +2869,37 @@ extract_dirs_from_files (char const *dirname, bool command_line_arg)
/* Queue the directories last one first, because queueing reverses the
order. */
for (i = files_index; i-- != 0; )
if (is_directory (&files[i])
&& (! ignore_dot_and_dot_dot
|| ! basename_is_dot_or_dotdot (files[i].name)))
{
if (!dirname || files[i].name[0] == '/')
{
queue_directory (files[i].name, files[i].linkname,
command_line_arg);
}
else
{
char *name = file_name_concat (dirname, files[i].name, NULL);
queue_directory (name, files[i].linkname, command_line_arg);
free (name);
}
if (files[i].filetype == arg_directory)
free (files[i].name);
}
for (i = cwd_n_used; i-- != 0; )
{
struct fileinfo *f = sorted_file[i];
if (is_directory (f)
&& (! ignore_dot_and_dot_dot
|| ! basename_is_dot_or_dotdot (f->name)))
{
if (!dirname || f->name[0] == '/')
queue_directory (f->name, f->linkname, command_line_arg);
else
{
char *name = file_name_concat (dirname, f->name, NULL);
queue_directory (name, f->linkname, command_line_arg);
free (name);
}
if (f->filetype == arg_directory)
free (f->name);
}
}
/* Now delete the directories from the table, compacting all the remaining
entries. */
for (i = 0, j = 0; i < files_index; i++)
for (i = 0, j = 0; i < cwd_n_used; i++)
{
if (files[i].filetype != arg_directory)
{
if (j < i)
files[j] = files[i];
++j;
}
struct fileinfo *f = sorted_file[i];
sorted_file[j] = f;
j += (f->filetype != arg_directory);
}
files_index = j;
cwd_n_used = j;
}
/* Use strcoll to compare strings in this locale. If an error occurs,
@@ -3091,6 +3121,15 @@ static qsortFunc sort_functions[][2][2][2] =
verify (ARRAY_CARDINALITY (sort_functions)
== sort_numtypes + time_numtypes - 1 );
/* Set up SORTED_FILE to point to the in-use entries in CWD_FILE, in order. */
static void
initialize_ordering_vector (void)
{
size_t i;
for (i = 0; i < cwd_n_used; i++)
sorted_file[i] = &cwd_file[i];
}
/* Sort the files now in the table. */
@@ -3099,6 +3138,15 @@ sort_files (void)
{
bool use_strcmp;
if (sorted_file_alloc < cwd_n_used + cwd_n_used / 2)
{
free (sorted_file);
sorted_file = xnmalloc (cwd_n_used, 3 * sizeof *sorted_file);
sorted_file_alloc = 3 * cwd_n_used;
}
initialize_ordering_vector ();
if (sort_type == sort_none)
return;
@@ -3113,13 +3161,14 @@ sort_files (void)
{
use_strcmp = true;
assert (sort_type != sort_version);
initialize_ordering_vector ();
}
/* When sort_type == sort_time, use time_type as subindex. */
qsort (files, files_index, sizeof *files,
sort_functions[sort_type + (sort_type == sort_time ? time_type : 0)]
[use_strcmp][sort_reverse]
[directories_first]);
mpsort ((void const **) sorted_file, cwd_n_used,
sort_functions[sort_type + (sort_type == sort_time ? time_type : 0)]
[use_strcmp][sort_reverse]
[directories_first]);
}
/* List all the files now in the table. */
@@ -3132,9 +3181,9 @@ print_current_files (void)
switch (format)
{
case one_per_line:
for (i = 0; i < files_index; i++)
for (i = 0; i < cwd_n_used; i++)
{
print_file_name_and_frills (files + i);
print_file_name_and_frills (sorted_file[i]);
putchar ('\n');
}
break;
@@ -3152,9 +3201,9 @@ print_current_files (void)
break;
case long_format:
for (i = 0; i < files_index; i++)
for (i = 0; i < cwd_n_used; i++)
{
print_long_format (files + i);
print_long_format (sorted_file[i]);
DIRED_PUTCHAR ('\n');
}
break;
@@ -3947,7 +3996,7 @@ print_many_per_line (void)
/* Calculate the number of rows that will be in each column except possibly
for a short column on the right. */
size_t rows = files_index / cols + (files_index % cols != 0);
size_t rows = cwd_n_used / cols + (cwd_n_used % cols != 0);
for (row = 0; row < rows; row++)
{
@@ -3958,12 +4007,13 @@ print_many_per_line (void)
/* Print the next row. */
while (1)
{
size_t name_length = length_of_file_name_and_frills (files + filesno);
struct fileinfo const *f = sorted_file[filesno];
size_t name_length = length_of_file_name_and_frills (f);
size_t max_name_length = line_fmt->col_arr[col++];
print_file_name_and_frills (files + filesno);
print_file_name_and_frills (f);
filesno += rows;
if (filesno >= files_index)
if (filesno >= cwd_n_used)
break;
indent (pos + name_length, pos + max_name_length);
@@ -3980,15 +4030,16 @@ print_horizontal (void)
size_t pos = 0;
size_t cols = calculate_columns (false);
struct column_info const *line_fmt = &column_info[cols - 1];
size_t name_length = length_of_file_name_and_frills (files);
size_t name_length = length_of_file_name_and_frills (cwd_file);
size_t max_name_length = line_fmt->col_arr[0];
/* Print first entry. */
print_file_name_and_frills (files);
print_file_name_and_frills (cwd_file);
/* Now the rest. */
for (filesno = 1; filesno < files_index; ++filesno)
for (filesno = 1; filesno < cwd_n_used; ++filesno)
{
struct fileinfo const *f;
size_t col = filesno % cols;
if (col == 0)
@@ -4002,9 +4053,10 @@ print_horizontal (void)
pos += max_name_length;
}
print_file_name_and_frills (files + filesno);
f = sorted_file[filesno];
print_file_name_and_frills (f);
name_length = length_of_file_name_and_frills (files + filesno);
name_length = length_of_file_name_and_frills (f);
max_name_length = line_fmt->col_arr[col];
}
putchar ('\n');
@@ -4016,9 +4068,10 @@ print_with_commas (void)
size_t filesno;
size_t pos = 0;
for (filesno = 0; filesno < files_index; filesno++)
for (filesno = 0; filesno < cwd_n_used; filesno++)
{
size_t len = length_of_file_name_and_frills (files + filesno);
struct fileinfo const *f = sorted_file[filesno];
size_t len = length_of_file_name_and_frills (f);
if (filesno != 0)
{
@@ -4039,7 +4092,7 @@ print_with_commas (void)
putchar (separator);
}
print_file_name_and_frills (files + filesno);
print_file_name_and_frills (f);
pos += len;
}
putchar ('\n');
@@ -4097,7 +4150,7 @@ static void
init_column_info (void)
{
size_t i;
size_t max_cols = MIN (max_idx, files_index);
size_t max_cols = MIN (max_idx, cwd_n_used);
/* Currently allocated columns in column_info. */
static size_t column_info_alloc;
@@ -4164,20 +4217,21 @@ init_column_info (void)
static size_t
calculate_columns (bool by_columns)
{
size_t filesno; /* Index into files. */
size_t filesno; /* Index into cwd_file. */
size_t cols; /* Number of files across. */
/* Normally the maximum number of columns is determined by the
screen width. But if few files are available this might limit it
as well. */
size_t max_cols = MIN (max_idx, files_index);
size_t max_cols = MIN (max_idx, cwd_n_used);
init_column_info ();
/* Compute the maximum number of possible columns. */
for (filesno = 0; filesno < files_index; ++filesno)
for (filesno = 0; filesno < cwd_n_used; ++filesno)
{
size_t name_length = length_of_file_name_and_frills (files + filesno);
struct fileinfo const *f = sorted_file[filesno];
size_t name_length = length_of_file_name_and_frills (f);
size_t i;
for (i = 0; i < max_cols; ++i)
@@ -4185,7 +4239,7 @@ calculate_columns (bool by_columns)
if (column_info[i].valid_len)
{
size_t idx = (by_columns
? filesno / ((files_index + i) / (i + 1))
? filesno / ((cwd_n_used + i) / (i + 1))
: filesno % (i + 1));
size_t real_length = name_length + (idx == i ? 0 : 2);
@@ -4270,6 +4324,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
-h, --human-readable with -l, print sizes in human readable format\n\
(e.g., 1K 234M 2G)\n\
--si likewise, but use powers of 1000 not 1024\n\
"), stdout);
fputs (_("\
-H, --dereference-command-line\n\
follow symbolic links listed on the command line\n\
--dereference-command-line-symlink-to-dir\n\
@@ -4279,7 +4335,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
(overridden by -a or -A)\n\
"), stdout);
fputs (_("\
--indicator-style=WORD append indicator with style WORD to entry names:\n\
--indicator-style=WORD append indicator with style WORD to entry names:\n\
none (default), slash (-p),\n\
file-type (--file-type), classify (-F)\n\
-i, --inode print the index number of each file\n\
@@ -4331,6 +4387,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
non-recent files and FORMAT2 to recent files;\n\
if STYLE is prefixed with `posix-', STYLE\n\
takes effect only outside the POSIX locale\n\
"), stdout);
fputs (_("\
-t sort by modification time\n\
-T, --tabsize=COLS assume tab stops at each COLS instead of 8\n\
"), stdout);

View File

@@ -1,5 +1,5 @@
/* mv -- move or rename files
Copyright (C) 86, 89, 90, 91, 1995-2006 Free Software Foundation, Inc.
Copyright (C) 86, 89, 90, 91, 1995-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -94,10 +94,11 @@ rm_option_init (struct rm_options *x)
x->ignore_missing_files = false;
x->root_dev_ino = NULL;
x->recursive = true;
x->one_file_system = false;
/* Should we prompt for removal, too? No. Prompting for the `move'
part is enough. It implies removal. */
x->interactive = 0;
x->interactive = RMI_NEVER;
x->stdin_tty = false;
x->verbose = false;

View File

@@ -1,5 +1,5 @@
/* nl -- number lines of files
Copyright (C) 89, 92, 1995-2006 Free Software Foundation, Inc.
Copyright (C) 89, 92, 1995-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -64,16 +64,16 @@ enum section
char *program_name;
/* Format of body lines (-b). */
static char *body_type = "t";
static char const *body_type = "t";
/* Format of header lines (-h). */
static char *header_type = "n";
static char const *header_type = "n";
/* Format of footer lines (-f). */
static char *footer_type = "n";
static char const *footer_type = "n";
/* Format currently being used (body, header, or footer). */
static char *current_type;
static char const *current_type;
/* Regex for body lines to number (-bp). */
static struct re_pattern_buffer body_regex;
@@ -93,7 +93,7 @@ static char footer_fastmap[UCHAR_MAX + 1];
static struct re_pattern_buffer *current_regex = NULL;
/* Separator string to print after line number (-s). */
static char *separator_str = "\t";
static char const *separator_str = "\t";
/* Input section delimiter string (-d). */
static char const *section_del = DEFAULT_SECTION_DELIMITERS;
@@ -217,7 +217,7 @@ second character implies :. Type \\\\ for \\. STYLE is one of:\n\
t number only nonempty lines\n\
n number no lines\n\
pBRE number only lines that contain a match for the basic regular\n\
expression, BRE\n\
expression, BRE\n\
\n\
FORMAT is one of:\n\
\n\
@@ -235,9 +235,10 @@ FORMAT is one of:\n\
according to `optarg'. */
static bool
build_type_arg (char **typep, struct re_pattern_buffer *regexp, char *fastmap)
build_type_arg (char const **typep,
struct re_pattern_buffer *regexp, char *fastmap)
{
const char *errmsg;
char const *errmsg;
bool rval = true;
switch (*optarg)
@@ -347,7 +348,7 @@ proc_text (void)
break;
case 'p':
switch (re_search (current_regex, line_buf.buffer, line_buf.length - 1,
0, line_buf.length - 1, (struct re_registers *) 0))
0, line_buf.length - 1, NULL))
{
case -2:
error (EXIT_FAILURE, errno, _("error in regular expression search"));
@@ -414,7 +415,7 @@ process_file (FILE *fp)
Return true if successful. */
static bool
nl_file (const char *file)
nl_file (char const *file)
{
FILE *stream;

View File

@@ -358,6 +358,8 @@ An OFFSET operand means -j OFFSET. LABEL is the pseudo-address\n\
at first byte printed, incremented when dump is progressing.\n\
For OFFSET and LABEL, a 0x or 0X prefix indicates hexadecimal;\n\
suffixes may be . for octal and b for multiply by 512.\n\
"), stdout);
fputs (_("\
\n\
TYPE is made up of one or more of these specifications:\n\
\n\
@@ -926,7 +928,7 @@ open_next_file (void)
while (in_stream == NULL);
if (limit_bytes_to_format & !flag_dump_strings)
SETVBUF (in_stream, NULL, _IONBF, 0);
setvbuf (in_stream, NULL, _IONBF, 0);
return ok;
}
@@ -1175,7 +1177,7 @@ write_block (uintmax_t current_offset, size_t n_bytes,
static bool first = true;
static bool prev_pair_equal = false;
#define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
#define EQUAL_BLOCKS(b1, b2) (memcmp (b1, b2, bytes_per_block) == 0)
if (abbreviate_duplicate_blocks
&& !first && n_bytes == bytes_per_block

View File

@@ -463,9 +463,7 @@ main (int argc, char **argv)
{
case 'd':
/* Delimiter character(s). */
if (optarg[0] == '\0')
optarg = "\\0";
delim_arg = optarg;
delim_arg = (optarg[0] == '\0' ? "\\0" : optarg);
break;
case 's':

View File

@@ -1,5 +1,5 @@
/* pr -- convert text files for printing.
Copyright (C) 88, 91, 1995-2006 Free Software Foundation, Inc.
Copyright (C) 88, 91, 1995-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -430,7 +430,7 @@ static void getoptarg (char *arg, char switch_char, char *character,
void usage (int status);
static void print_files (int number_of_files, char **av);
static void init_parameters (int number_of_files);
static void init_header (char *filename, int desc);
static void init_header (char const *filename, int desc);
static bool init_fps (int number_of_files, char **av);
static void init_funcs (void);
static void init_store_cols (void);
@@ -1265,7 +1265,6 @@ init_parameters (int number_of_files)
col_sep_string = column_separator;
truncate_lines = true;
untabify_input = true;
tabify_output = true;
}
else
@@ -1653,7 +1652,7 @@ print_files (int number_of_files, char **av)
FILENAME for reading. */
static void
init_header (char *filename, int desc)
init_header (char const *filename, int desc)
{
char *buf = NULL;
struct stat st;

View File

@@ -1,5 +1,5 @@
/* printf - format and print data
Copyright (C) 1990-2006 Free Software Foundation, Inc.
Copyright (C) 1990-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -76,7 +76,7 @@ static bool posixly_correct;
/* This message appears in N_() here rather than just in _() below because
the sole use would have been in a #define. */
static char *const cfcc_msg =
static char const *const cfcc_msg =
N_("warning: %s: character(s) following character constant have been ignored");
/* The name this program was run with. */
@@ -129,7 +129,7 @@ FORMAT controls the output as in C printf. Interpreted sequences are:\n\
fputs (_("\
%% a single %\n\
%b ARGUMENT as a string with `\\' escapes interpreted,\n\
except that octal escapes are of the form \\0 or \\0NNN\n\
except that octal escapes are of the form \\0 or \\0NNN\n\
\n\
and all C format specifications ending with one of diouxXfeEgGcs, with\n\
ARGUMENTs converted to proper type first. Variable widths are handled.\n\

View File

@@ -1,5 +1,5 @@
/* readlink -- display value of a symbolic link.
Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -74,6 +74,8 @@ usage (int status)
-e, --canonicalize-existing canonicalize by following every symlink in\n\
every component of the given name recursively,\n\
all components must exist\n\
"), stdout);
fputs (_("\
-m, --canonicalize-missing canonicalize by following every symlink in\n\
every component of the given name recursively,\n\
without requirements on components existence\n\
@@ -157,7 +159,7 @@ main (int argc, char **argv)
value = (can_mode != -1
? canonicalize_filename_mode (fname, can_mode)
: xreadlink (fname, 1024));
: xreadlink (fname));
if (value)
{
printf ("%s%s", value, (no_newline ? "" : "\n"));

View File

@@ -1,5 +1,5 @@
/* remove.c -- core functions for removing files and directories
Copyright (C) 88, 90, 91, 1994-2006 Free Software Foundation, Inc.
Copyright (C) 88, 90, 91, 1994-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -148,16 +148,6 @@ struct dirstack_state
};
typedef struct dirstack_state Dirstack_state;
/* Just like close(fd), but don't modify errno. */
static inline int
close_preserve_errno (int fd)
{
int saved_errno = errno;
int result = close (fd);
errno = saved_errno;
return result;
}
/* Like fstatat, but cache the result. If ST->st_size is -1, the
status has not been gotten yet. If less than -1, fstatat failed
with errno == -1 - ST->st_size. Otherwise, the status has already
@@ -173,11 +163,12 @@ cache_fstatat (int fd, char const *file, struct stat *st, int flag)
return -1;
}
/* Initialize a fstatat cache *ST. */
static inline void
/* Initialize a fstatat cache *ST. Return ST for convenience. */
static inline struct stat *
cache_stat_init (struct stat *st)
{
st->st_size = -1;
return st;
}
/* Return true if *ST has been statted. */
@@ -426,22 +417,32 @@ ds_free (Dirstack_state *ds)
free (ds);
}
/* Pop the active directory (AD) stack and move *DIRP `up' one level,
/* Pop the active directory (AD) stack and prepare to move `up' one level,
safely. Moving `up' usually means opening `..', but when we've just
finished recursively processing a command-line directory argument,
there's nothing left on the stack, so set *DIRP to NULL in that case.
The idea is to return with *DIRP opened on the parent directory,
there's nothing left on the stack, so set *FDP to AT_FDCWD in that case.
The idea is to return with *FDP opened on the parent directory,
assuming there are entries in that directory that we need to remove.
Note that we must not call opendir (or fdopendir) just yet, since
the caller must first remove the directory we're coming from.
That is because some file system implementations cache readdir
results at opendir time; so calling opendir, rmdir, readdir would
return an entry for the just-removed directory.
Whenever using chdir '..' (virtually, now, via openat), verify
that the post-chdir dev/ino numbers for `.' match the saved ones.
If any system call fails or if dev/ino don't match then give a
If any system call fails or if dev/ino don't match, then give a
diagnostic and longjump out.
Set *PREV_DIR to the name (in malloc'd storage) of the
Return the name (in malloc'd storage) of the
directory (usually now empty) from which we're coming, and which
corresponds to the input value of *DIRP. */
static void
AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
corresponds to the input value of DIRP.
Finally, note that while this function's name is no longer as
accurate as it once was (it no longer calls chdir), it does open
the destination directory. */
static char *
AD_pop_and_chdir (DIR *dirp, int *fdp, Dirstack_state *ds)
{
struct AD_ent *leaf_dir_ent = AD_stack_top(ds);
struct dev_ino leaf_dev_ino = leaf_dir_ent->dev_ino;
@@ -450,7 +451,7 @@ AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
/* Get the name of the current (but soon to be `previous') directory
from the top of the stack. */
*prev_dir = top_dir (ds);
char *prev_dir = top_dir (ds);
AD_stack_pop (ds);
pop_dir (ds);
@@ -474,15 +475,15 @@ AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
if (1 < AD_stack_height (ds))
{
struct stat sb;
int fd = openat (dirfd (*dirp), "..", O_RDONLY);
if (closedir (*dirp) != 0)
int fd = openat (dirfd (dirp), "..", O_RDONLY);
if (closedir (dirp) != 0)
{
error (0, errno, _("FATAL: failed to close directory %s"),
quote (full_filename (*prev_dir)));
quote (full_filename (prev_dir)));
goto next_cmdline_arg;
}
/* The above fails with EACCES when *DIRP is readable but not
/* The above fails with EACCES when DIRP is readable but not
searchable, when using Solaris' openat. Without this openat
call, tests/rm2 would fail to remove directories a/2 and a/3. */
if (fd < 0)
@@ -491,7 +492,7 @@ AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
if (fd < 0)
{
error (0, errno, _("FATAL: cannot open .. from %s"),
quote (full_filename (*prev_dir)));
quote (full_filename (prev_dir)));
goto next_cmdline_arg;
}
@@ -508,39 +509,32 @@ AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
{
error (0, 0, _("FATAL: directory %s changed dev/ino"),
quote (full_filename (".")));
goto close_and_next;
}
*dirp = fdopendir (fd);
if (*dirp == NULL)
{
error (0, errno, _("FATAL: cannot return to .. from %s"),
quote (full_filename (".")));
close_and_next:;
close (fd);
next_cmdline_arg:;
free (*prev_dir);
free (prev_dir);
longjmp (ds->current_arg_jumpbuf, 1);
}
*fdp = fd;
}
else
{
if (closedir (*dirp) != 0)
if (closedir (dirp) != 0)
{
error (0, errno, _("FATAL: failed to close directory %s"),
quote (full_filename (*prev_dir)));
quote (full_filename (prev_dir)));
goto next_cmdline_arg;
}
*dirp = NULL;
*fdp = AT_FDCWD;
}
return prev_dir;
}
/* Initialize *HT if it is NULL.
Insert FILENAME into HT. */
static void
AD_mark_helper (Hash_table **ht, char *filename)
/* Initialize *HT if it is NULL. Return *HT. */
static Hash_table *
AD_ensure_initialized (Hash_table **ht)
{
if (*ht == NULL)
{
@@ -549,7 +543,16 @@ AD_mark_helper (Hash_table **ht, char *filename)
if (*ht == NULL)
xalloc_die ();
}
void *ent = hash_insert (*ht, filename);
return *ht;
}
/* Initialize *HT if it is NULL.
Insert FILENAME into HT. */
static void
AD_mark_helper (Hash_table **ht, char *filename)
{
void *ent = hash_insert (AD_ensure_initialized (ht), filename);
if (ent == NULL)
xalloc_die ();
else
@@ -557,7 +560,6 @@ AD_mark_helper (Hash_table **ht, char *filename)
if (ent != filename)
free (filename);
}
}
/* Mark FILENAME (in current directory) as unremovable. */
@@ -702,20 +704,21 @@ is_empty_dir (int fd_cwd, char const *dir)
return saved_errno == 0 ? true : false;
}
/* Return true if FILE is determined to be an unwritable non-symlink.
Otherwise, return false (including when lstat'ing it fails).
/* Return -1 if FILE is an unwritable non-symlink,
0 if it is writable or some other type of file,
a positive error number if there is some problem in determining the answer.
Set *BUF to the file status.
This is to avoid calling euidaccess when FILE is a symlink. */
static bool
static int
write_protected_non_symlink (int fd_cwd,
char const *file,
Dirstack_state const *ds,
struct stat *buf)
{
if (cache_fstatat (fd_cwd, file, buf, AT_SYMLINK_NOFOLLOW) != 0)
return false;
return errno;
if (S_ISLNK (buf->st_mode))
return false;
return 0;
/* Here, we know FILE is not a symbolic link. */
/* In order to be reentrant -- i.e., to avoid changing the working
@@ -769,9 +772,16 @@ write_protected_non_symlink (int fd_cwd,
size_t file_name_len
= obstack_object_size (&ds->dir_stack) + strlen (file);
return (file_name_len < MIN (PATH_MAX, 8192)
? euidaccess (full_filename (file), W_OK) != 0 && errno == EACCES
: euidaccess_stat (buf, W_OK) != 0);
if (MIN (PATH_MAX, 8192) <= file_name_len)
return - euidaccess_stat (buf, W_OK);
if (euidaccess (full_filename (file), W_OK) == 0)
return 0;
if (errno == EACCES)
return -1;
/* Perhaps some other process has removed the file, or perhaps this
is a buggy NFS client. */
return errno;
}
}
@@ -792,71 +802,73 @@ prompt (int fd_cwd, Dirstack_state const *ds, char const *filename,
struct rm_options const *x, enum Prompt_action mode,
Ternary *is_empty)
{
bool write_protected = false;
int write_protected = 0;
*is_empty = T_UNKNOWN;
if (((!x->ignore_missing_files & (x->interactive | x->stdin_tty))
&& (write_protected = write_protected_non_symlink (fd_cwd, filename,
ds, sbuf)))
|| x->interactive)
if (x->interactive == RMI_NEVER)
return RM_OK;
if (!x->ignore_missing_files
& ((x->interactive == RMI_ALWAYS) | x->stdin_tty))
write_protected = write_protected_non_symlink (fd_cwd, filename, ds, sbuf);
if (write_protected || x->interactive == RMI_ALWAYS)
{
if (cache_fstatat (fd_cwd, filename, sbuf, AT_SYMLINK_NOFOLLOW) != 0)
if (write_protected <= 0
&& cache_fstatat (fd_cwd, filename, sbuf, AT_SYMLINK_NOFOLLOW) != 0)
{
/* This happens, e.g., with `rm '''. */
error (0, errno, _("cannot remove %s"),
quote (full_filename (filename)));
return RM_ERROR;
write_protected = errno;
}
if (S_ISDIR (sbuf->st_mode) && !x->recursive)
if (write_protected <= 0)
{
error (0, EISDIR, _("cannot remove %s"),
quote (full_filename (filename)));
return RM_ERROR;
}
/* Using permissions doesn't make sense for symlinks. */
if (S_ISLNK (sbuf->st_mode))
{
if ( ! x->interactive)
/* Using permissions doesn't make sense for symlinks. */
if (S_ISLNK (sbuf->st_mode) && x->interactive != RMI_ALWAYS)
return RM_OK;
write_protected = false;
if (S_ISDIR (sbuf->st_mode) && !x->recursive)
write_protected = EISDIR;
}
char const *quoted_name = quote (full_filename (filename));
if (0 < write_protected)
{
error (0, write_protected, _("cannot remove %s"), quoted_name);
return RM_ERROR;
}
/* Issue the prompt. */
{
char const *quoted_name = quote (full_filename (filename));
/* FIXME: use a variant of error (instead of fprintf) that doesn't
append a newline. Then we won't have to declare program_name in
this file. */
if (S_ISDIR (sbuf->st_mode)
&& x->recursive
&& mode == PA_DESCEND_INTO_DIR
&& ((*is_empty = (is_empty_dir (fd_cwd, filename) ? T_YES : T_NO))
== T_NO))
/* FIXME: use a variant of error (instead of fprintf) that doesn't
append a newline. Then we won't have to declare program_name in
this file. */
if (S_ISDIR (sbuf->st_mode)
&& x->recursive
&& mode == PA_DESCEND_INTO_DIR
&& ((*is_empty = (is_empty_dir (fd_cwd, filename) ? T_YES : T_NO))
== T_NO))
fprintf (stderr,
(write_protected
? _("%s: descend into write-protected directory %s? ")
: _("%s: descend into directory %s? ")),
program_name, quoted_name);
else
{
/* TRANSLATORS: You may find it more convenient to translate
the equivalent of _("%s: remove %s (write-protected) %s? ").
It should avoid grammatical problems with the output
of file_type. */
fprintf (stderr,
(write_protected
? _("%s: descend into write-protected directory %s? ")
: _("%s: descend into directory %s? ")),
program_name, quoted_name);
else
{
/* TRANSLATORS: You may find it more convenient to translate
the equivalent of _("%s: remove %s (write-protected) %s? ").
It should avoid grammatical problems with the output
of file_type. */
fprintf (stderr,
(write_protected
? _("%s: remove write-protected %s %s? ")
: _("%s: remove %s %s? ")),
program_name, file_type (sbuf), quoted_name);
}
? _("%s: remove write-protected %s %s? ")
: _("%s: remove %s %s? ")),
program_name, file_type (sbuf), quoted_name);
}
if (!yesno ())
return RM_USER_DECLINED;
}
if (!yesno ())
return RM_USER_DECLINED;
}
return RM_OK;
}
@@ -1016,8 +1028,7 @@ remove_entry (int fd_cwd, Dirstack_state const *ds, char const *filename,
errno = EISDIR;
if (! x->recursive
|| errno == ENOENT || errno == ENOTDIR
|| errno == ELOOP || errno == ENAMETOOLONG)
|| (cache_stat_ok (st) && !S_ISDIR (st->st_mode)))
{
if (ignorable_missing (x, errno))
return RM_OK;
@@ -1028,6 +1039,7 @@ remove_entry (int fd_cwd, Dirstack_state const *ds, char const *filename,
quote (full_filename (filename)));
return RM_ERROR;
}
assert (!cache_stat_ok (st) || S_ISDIR (st->st_mode));
}
else
{
@@ -1106,37 +1118,33 @@ remove_entry (int fd_cwd, Dirstack_state const *ds, char const *filename,
static DIR *
fd_to_subdirp (int fd_cwd, char const *f,
struct rm_options const *x, int prev_errno,
struct stat *subdir_sb, Dirstack_state *ds,
struct stat *subdir_sb,
int *cwd_errno ATTRIBUTE_UNUSED)
{
int open_flags = O_RDONLY | O_NOCTTY | O_NOFOLLOW | O_NONBLOCK;
int fd_sub = openat_permissive (fd_cwd, f, open_flags, 0, cwd_errno);
int saved_errno;
/* Record dev/ino of F. We may compare them against saved values
to thwart any attempt to subvert the traversal. They are also used
to detect directory cycles. */
if (fd_sub < 0 || fstat (fd_sub, subdir_sb) != 0)
if (fd_sub < 0)
return NULL;
else if (fstat (fd_sub, subdir_sb) != 0)
saved_errno = errno;
else if (S_ISDIR (subdir_sb->st_mode))
{
if (0 <= fd_sub)
close_preserve_errno (fd_sub);
return NULL;
DIR *subdir_dirp = fdopendir (fd_sub);
if (subdir_dirp)
return subdir_dirp;
saved_errno = errno;
}
else
saved_errno = (prev_errno ? prev_errno : ENOTDIR);
if (! S_ISDIR (subdir_sb->st_mode))
{
errno = prev_errno ? prev_errno : ENOTDIR;
close_preserve_errno (fd_sub);
return NULL;
}
DIR *subdir_dirp = fdopendir (fd_sub);
if (subdir_dirp == NULL)
{
close_preserve_errno (fd_sub);
return NULL;
}
return subdir_dirp;
close (fd_sub);
errno = saved_errno;
return NULL;
}
/* Remove entries in the directory open on DIRP
@@ -1220,7 +1228,7 @@ remove_cwd_entries (DIR **dirp,
case RM_NONEMPTY_DIR:
{
DIR *subdir_dirp = fd_to_subdirp (dirfd (*dirp), f,
x, errno, subdir_sb, ds, NULL);
x, errno, subdir_sb, NULL);
if (subdir_dirp == NULL)
{
status = RM_ERROR;
@@ -1298,6 +1306,7 @@ remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
struct rm_options const *x, int *cwd_errno)
{
enum RM_status status;
dev_t current_dev = dir_st->st_dev;
/* There is a race condition in that an attacker could replace the nonempty
directory, DIR, with a symlink between the preceding call to rmdir
@@ -1307,7 +1316,7 @@ remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
fd_to_subdirp's fstat, along with the `fstat' and the dev/ino
comparison in AD_push ensure that we detect it and fail. */
DIR *dirp = fd_to_subdirp (fd_cwd, dir, x, 0, dir_st, ds, cwd_errno);
DIR *dirp = fd_to_subdirp (fd_cwd, dir, x, 0, dir_st, cwd_errno);
if (dirp == NULL)
{
@@ -1359,23 +1368,38 @@ remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
}
if (subdir)
{
AD_push (dirfd (dirp), ds, subdir, &subdir_sb);
AD_INIT_OTHER_MEMBERS ();
if ( ! x->one_file_system
|| subdir_sb.st_dev == current_dev)
{
AD_push (dirfd (dirp), ds, subdir, &subdir_sb);
AD_INIT_OTHER_MEMBERS ();
free (subdir);
continue;
}
/* Here, --one-file-system is in effect, and with remove_cwd_entries'
traversal into the current directory, (known as SUBDIR, from ..),
DIRP's device number is different from CURRENT_DEV. Arrange not
to do anything more with this hierarchy. */
error (0, 0, _("skipping %s, since it's on a different device"),
quote (full_filename (subdir)));
free (subdir);
continue;
AD_mark_current_as_unremovable (ds);
tmp_status = RM_ERROR;
UPDATE_STATUS (status, tmp_status);
}
/* Execution reaches this point when we've removed the last
removable entry from the current directory. */
removable entry from the current directory -- or, with
--one-file-system, when the current directory is on a
different file system. */
{
int fd;
/* The name of the directory that we have just processed,
nominally removing all of its contents. */
char *empty_dir;
AD_pop_and_chdir (&dirp, ds, &empty_dir);
int fd = (dirp != NULL ? dirfd (dirp) : AT_FDCWD);
assert (dirp != NULL || AD_stack_height (ds) == 1);
char *empty_dir = AD_pop_and_chdir (dirp, &fd, ds);
dirp = NULL;
assert (fd != AT_FDCWD || AD_stack_height (ds) == 1);
/* Try to remove EMPTY_DIR only if remove_cwd_entries succeeded. */
if (tmp_status == RM_OK)
@@ -1386,14 +1410,16 @@ remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
But that's no big deal since we're interactive. */
struct stat empty_st;
Ternary is_empty;
cache_stat_init (&empty_st);
enum RM_status s = prompt (fd, ds, empty_dir, &empty_st, x,
enum RM_status s = prompt (fd, ds, empty_dir,
cache_stat_init (&empty_st), x,
PA_REMOVE_DIR, &is_empty);
if (s != RM_OK)
{
free (empty_dir);
status = s;
if (fd != AT_FDCWD)
close (fd);
goto closedir_and_return;
}
@@ -1415,8 +1441,17 @@ remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
free (empty_dir);
if (AD_stack_height (ds) == 1)
if (fd == AT_FDCWD)
break;
dirp = fdopendir (fd);
if (dirp == NULL)
{
error (0, errno, _("FATAL: cannot return to .. from %s"),
quote (full_filename (".")));
close (fd);
longjmp (ds->current_arg_jumpbuf, 1);
}
}
}
@@ -1454,6 +1489,7 @@ rm_1 (Dirstack_state *ds, char const *filename,
struct stat st;
cache_stat_init (&st);
cycle_check_init (&ds->cycle_check_state);
if (x->root_dev_ino)
{
if (cache_fstatat (AT_FDCWD, filename, &st, AT_SYMLINK_NOFOLLOW) != 0)
@@ -1473,8 +1509,7 @@ rm_1 (Dirstack_state *ds, char const *filename,
AD_push_initial (ds);
AD_INIT_OTHER_MEMBERS ();
int fd_cwd = AT_FDCWD;
enum RM_status status = remove_entry (fd_cwd, ds, filename, &st, x, NULL);
enum RM_status status = remove_entry (AT_FDCWD, ds, filename, &st, x, NULL);
if (status == RM_NONEMPTY_DIR)
{
/* In the event that remove_dir->remove_cwd_entries detects
@@ -1483,13 +1518,12 @@ rm_1 (Dirstack_state *ds, char const *filename,
if (setjmp (ds->current_arg_jumpbuf))
status = RM_ERROR;
else
status = remove_dir (fd_cwd, ds, filename, &st, x, cwd_errno);
status = remove_dir (AT_FDCWD, ds, filename, &st, x, cwd_errno);
AD_stack_clear (ds);
}
ds_clear (ds);
return status;
}
@@ -1509,13 +1543,13 @@ rm (size_t n_files, char const *const *file, struct rm_options const *x)
{
error (0, 0, _("cannot remove relative-named %s"), quote (file[i]));
status = RM_ERROR;
continue;
}
cycle_check_init (&ds->cycle_check_state);
enum RM_status s = rm_1 (ds, file[i], x, &cwd_errno);
assert (VALID_STATUS (s));
UPDATE_STATUS (status, s);
else
{
enum RM_status s = rm_1 (ds, file[i], x, &cwd_errno);
assert (VALID_STATUS (s));
UPDATE_STATUS (status, s);
}
}
if (x->require_restore_cwd && cwd_errno)

View File

@@ -1,6 +1,6 @@
/* Remove directory entries.
Copyright (C) 1998, 2000, 2002, 2003, 2004, 2005, 2006 Free
Copyright (C) 1998, 2000, 2002, 2003, 2004, 2005, 2006, 2007 Free
Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
@@ -22,13 +22,30 @@
# include "dev-ino.h"
enum rm_interactive
{
/* Start with any number larger than 1, so that any legacy tests
against values of 0 or 1 will fail. */
RMI_ALWAYS = 3,
RMI_SOMETIMES,
RMI_NEVER
};
struct rm_options
{
/* If true, ignore nonexistent files. */
bool ignore_missing_files;
/* If true, query the user about whether to remove each file. */
bool interactive;
enum rm_interactive interactive;
/* If true, do not traverse into (or remove) any directory that is
on a file system (i.e., that has a different device number) other
than that of the corresponding command line argument. Note that
even without this option, rm will fail in the end, due to its
probable inability to remove the mount point. But there, the
diagnostic comes too late -- after removing all contents. */
bool one_file_system;
/* If true, recursively remove directories. */
bool recursive;

View File

@@ -1,5 +1,5 @@
/* `rm' file deletion utility for GNU.
Copyright (C) 88, 90, 91, 1994-2006 Free Software Foundation, Inc.
Copyright (C) 88, 90, 91, 1994-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -72,6 +72,7 @@ char *program_name;
enum
{
INTERACTIVE_OPTION = CHAR_MAX + 1,
ONE_FILE_SYSTEM,
NO_PRESERVE_ROOT,
PRESERVE_ROOT,
PRESUME_INPUT_TTY_OPTION
@@ -90,6 +91,7 @@ static struct option const long_opts[] =
{"force", no_argument, NULL, 'f'},
{"interactive", optional_argument, NULL, INTERACTIVE_OPTION},
{"one-file-system", no_argument, NULL, ONE_FILE_SYSTEM},
{"no-preserve-root", no_argument, NULL, NO_PRESERVE_ROOT},
{"preserve-root", no_argument, NULL, PRESERVE_ROOT},
@@ -168,6 +170,11 @@ Remove (unlink) the FILE(s).\n\
while still giving protection against most mistakes\n\
--interactive[=WHEN] prompt according to WHEN: never, once (-I), or\n\
always (-i). Without WHEN, prompt always\n\
"), stdout);
fputs (_("\
--one-file-system when removing a hierarchy recursively, skip any\n\
directory that is on a file system different from\n\
that of the corresponding command line argument\n\
"), stdout);
fputs (_("\
--no-preserve-root do not treat `/' specially\n\
@@ -206,7 +213,8 @@ static void
rm_option_init (struct rm_options *x)
{
x->ignore_missing_files = false;
x->interactive = false;
x->interactive = RMI_SOMETIMES;
x->one_file_system = false;
x->recursive = false;
x->root_dev_ino = NULL;
x->stdin_tty = isatty (STDIN_FILENO);
@@ -241,25 +249,25 @@ main (int argc, char **argv)
{
case 'd':
/* Ignore this option, for backward compatibility with
coreutils 5.92. Some time after 2005, we'll change this
coreutils 5.92. FIXME: Some time after 2005, change this
to report an error (or perhaps behave like FreeBSD does)
instead of ignoring the option. */
break;
case 'f':
x.interactive = false;
x.interactive = RMI_NEVER;
x.ignore_missing_files = true;
prompt_once = false;
break;
case 'i':
x.interactive = true;
x.interactive = RMI_ALWAYS;
x.ignore_missing_files = false;
prompt_once = false;
break;
case 'I':
x.interactive = false;
x.interactive = RMI_NEVER;
x.ignore_missing_files = false;
prompt_once = true;
break;
@@ -280,18 +288,18 @@ main (int argc, char **argv)
switch (i)
{
case interactive_never:
x.interactive = false;
x.interactive = RMI_NEVER;
prompt_once = false;
break;
case interactive_once:
x.interactive = false;
x.interactive = RMI_SOMETIMES;
x.ignore_missing_files = false;
prompt_once = true;
break;
case interactive_always:
x.interactive = true;
x.interactive = RMI_ALWAYS;
x.ignore_missing_files = false;
prompt_once = false;
break;
@@ -299,6 +307,10 @@ main (int argc, char **argv)
break;
}
case ONE_FILE_SYSTEM:
x.one_file_system = true;
break;
case NO_PRESERVE_ROOT:
preserve_root = false;
break;
@@ -343,22 +355,20 @@ main (int argc, char **argv)
quote ("/"));
}
{
size_t n_files = argc - optind;
char const *const *file = (char const *const *) argv + optind;
size_t n_files = argc - optind;
char const *const *file = (char const *const *) argv + optind;
if (prompt_once && (x.recursive || 3 < n_files))
{
fprintf (stderr,
(x.recursive
? _("%s: remove all arguments recursively? ")
: _("%s: remove all arguments? ")),
program_name);
if (!yesno ())
exit (EXIT_SUCCESS);
}
enum RM_status status = rm (n_files, file, &x);
assert (VALID_STATUS (status));
exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);
}
if (prompt_once && (x.recursive || 3 < n_files))
{
fprintf (stderr,
(x.recursive
? _("%s: remove all arguments recursively? ")
: _("%s: remove all arguments? ")),
program_name);
if (!yesno ())
exit (EXIT_SUCCESS);
}
enum RM_status status = rm (n_files, file, &x);
assert (VALID_STATUS (status));
exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);
}

View File

@@ -92,6 +92,8 @@ omitted INCREMENT defaults to 1 even when LAST is smaller than FIRST.\n\
FIRST, INCREMENT, and LAST are interpreted as floating point values.\n\
INCREMENT is usually positive if FIRST is smaller than LAST, and\n\
INCREMENT is usually negative if FIRST is greater than LAST.\n\
"), stdout);
fputs (_("\
FORMAT must be suitable for printing one argument of type `double';\n\
it defaults to %.PRECf if FIRST, INCREMENT, and LAST are all fixed point\n\
decimal numbers with maximum precision PREC, and to %g otherwise.\n\

View File

@@ -220,6 +220,8 @@ version 3 clients\n\
\n\
* compressed file systems\n\
\n\
"), stdout);
fputs (_("\
In the case of ext3 file systems, the above disclaimer applies\n\
(and shred is thus of limited effectiveness) only in data=journal mode,\n\
which journals file data in addition to just metadata. In both the\n\
@@ -228,6 +230,8 @@ Ext3 journaling modes can be changed by adding the data=something option\n\
to the mount options for a particular file system in the /etc/fstab file,\n\
as documented in the mount man page (man mount).\n\
\n\
"), stdout);
fputs (_("\
In addition, file system backups and remote mirrors may contain copies\n\
of the file that cannot be removed, and that will allow a shredded file\n\
to be recovered later.\n\

View File

@@ -1,6 +1,6 @@
/* Shuffle lines of text.
Copyright (C) 2006 Free Software Foundation, Inc.
Copyright (C) 2006, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -251,6 +251,7 @@ main (int argc, char **argv)
char const *outfile = NULL;
char *random_source = NULL;
char eolbyte = '\n';
char **input_lines = NULL;
int optc;
int n_operands;
@@ -258,7 +259,7 @@ main (int argc, char **argv)
size_t n_lines;
char **line;
struct randint_source *randint_source;
size_t const *permutation;
size_t *permutation;
initialize_main (&argc, &argv);
program_name = argv[0];
@@ -366,8 +367,6 @@ main (int argc, char **argv)
}
else
{
char **input_lines;
switch (n_operands)
{
case 0:
@@ -408,5 +407,15 @@ main (int argc, char **argv)
if (write_permuted_output (head_lines, line, lo_input, permutation) != 0)
error (EXIT_FAILURE, errno, _("write error"));
#ifdef lint
free (permutation);
randint_all_free (randint_source);
if (input_lines)
{
free (input_lines[0]);
free (input_lines);
}
#endif
return EXIT_SUCCESS;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/* stat.c -- display file or file system status
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation.
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation.
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 @@ statfs (char const *filename, struct fs_info *buf)
enum
{
PRINTF_OPTION = CHAR_MAX + 1,
PRINTF_OPTION = CHAR_MAX + 1
};
static struct option const long_options[] = {
@@ -497,7 +497,7 @@ print_stat (char *pformat, size_t prefix_len, char m,
out_string (pformat, prefix_len, quote (filename));
if (S_ISLNK (statbuf->st_mode))
{
char *linkname = xreadlink (filename, statbuf->st_size);
char *linkname = xreadlink_with_size (filename, statbuf->st_size);
if (linkname == NULL)
{
error (0, errno, _("cannot read symbolic link %s"),

View File

@@ -1,5 +1,5 @@
/* system-dependent definitions for coreutils
Copyright (C) 1989, 1991-2006 Free Software Foundation, Inc.
Copyright (C) 1989, 1991-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -97,10 +97,6 @@ you must include <sys/types.h> before including this file
memcpy otherwise. */
#include <string.h>
#include "mempcpy.h"
#include "memrchr.h"
#include "stpcpy.h"
#include "strpbrk.h"
#include <errno.h>
@@ -117,7 +113,6 @@ you must include <sys/types.h> before including this file
#include <stdbool.h>
#include <stdlib.h>
#include <exit.h>
/* Exit statuses for programs like 'env' that exec other programs.
EXIT_FAILURE might not be 1, so use EXIT_FAIL in such programs. */
@@ -293,7 +288,7 @@ select_plural (uintmax_t n)
return (n <= ULONG_MAX ? n : n % PLURAL_REDUCER + PLURAL_REDUCER);
}
#define STREQ(a, b) (strcmp ((a), (b)) == 0)
#define STREQ(a, b) (strcmp (a, b) == 0)
#if !HAVE_DECL_FREE
void free ();
@@ -389,14 +384,6 @@ readdir_ignoring_dot_and_dotdot (DIR *dirp)
}
}
#if SETVBUF_REVERSED
# define SETVBUF(Stream, Buffer, Type, Size) \
setvbuf (Stream, Type, Buffer, Size)
#else
# define SETVBUF(Stream, Buffer, Type, Size) \
setvbuf (Stream, Buffer, Type, Size)
#endif
/* Factor out some of the common --help and --version processing code. */
/* These enum values cannot possibly conflict with the option values
@@ -506,7 +493,7 @@ enum
const char *s_ = (S); \
size_t len_ = strlen (s_) + 1; \
char *tmp_dest_ = alloca (len_); \
DEST = memcpy (tmp_dest_, (s_), len_); \
DEST = memcpy (tmp_dest_, s_, len_); \
} \
while (0)
#endif
@@ -515,10 +502,19 @@ enum
# define EOVERFLOW EINVAL
#endif
#if ! HAVE_FSEEKO && ! defined fseeko
# define fseeko(s, o, w) ((o) == (long int) (o) \
? fseek (s, o, w) \
: (errno = EOVERFLOW, -1))
#if ! HAVE_FSEEKO
# if ! defined fseeko
# define fseeko(s, o, w) ((o) == (long int) (o) \
? fseek (s, o, w) \
: (errno = EOVERFLOW, -1))
# endif
# if ! defined ftello
static inline off_t ftello (FILE *stream)
{
verify (sizeof (long int) <= sizeof (off_t));
return ftell (stream);
}
# endif
#endif
#if ! HAVE_SYNC

View File

@@ -78,7 +78,7 @@ tac -r -s '.\|
char *program_name;
/* The string that separates the records of the file. */
static char *separator;
static char const *separator;
/* True if we have ever read standard input. */
static bool have_read_stdin = false;
@@ -211,7 +211,7 @@ tac_seekable (int input_fd, const char *file)
Only used when the separator is attached to the preceding record. */
bool first_time = true;
char first_char = *separator; /* Speed optimization, non-regexp. */
char *separator1 = separator + 1; /* Speed optimization, non-regexp. */
char const *separator1 = separator + 1; /* Speed optimization, non-regexp. */
size_t match_length1 = match_length - 1; /* Speed optimization, non-regexp. */
struct re_registers regs;
@@ -426,7 +426,7 @@ static bool
copy_to_temp (FILE **g_tmp, char **g_tempfile, int input_fd, char const *file)
{
static char *template = NULL;
static char *tempdir;
static char const *tempdir;
char *tempfile;
FILE *tmp;
int fd;

View File

@@ -231,7 +231,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
inaccessible when tail starts or if it becomes\n\
inaccessible later; useful when following by name,\n\
i.e., with --follow=name\n\
-c, --bytes=N output the last N bytes\n\
-c, --bytes=N output the last N bytes; alternatively, use +N to\n\
output bytes starting with the Nth of each file\n\
"), stdout);
fputs (_("\
-f, --follow[={name|descriptor}]\n\
@@ -241,7 +242,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
-F same as --follow=name --retry\n\
"), stdout);
printf (_("\
-n, --lines=N output the last N lines, instead of the last %d\n\
-n, --lines=N output the last N lines, instead of the last %d;\n\
or use +N to output lines starting with the Nth\n\
--max-unchanged-stats=N\n\
with --follow=name, reopen a FILE which has not\n\
changed size after N (default %d) iterations\n\
@@ -292,7 +294,7 @@ valid_file_spec (struct File_spec const *f)
return ((f->fd == -1) ^ (f->errnum == 0));
}
static char *
static char const *
pretty_name (struct File_spec const *f)
{
return (STREQ (f->name, "-") ? "standard input" : f->name);

View File

@@ -161,7 +161,7 @@ tee_files (int nfiles, const char **files)
the first one correspond to standard output. */
descriptors[0] = stdout;
files[0] = _("standard output");
SETVBUF (stdout, NULL, _IONBF, 0);
setvbuf (stdout, NULL, _IONBF, 0);
for (i = 1; i <= nfiles; i++)
{
@@ -174,7 +174,7 @@ tee_files (int nfiles, const char **files)
ok = false;
}
else
SETVBUF (descriptors[i], NULL, _IONBF, 0);
setvbuf (descriptors[i], NULL, _IONBF, 0);
}
while (1)

View File

@@ -601,7 +601,7 @@ make_printable_str (char const *s, size_t len)
for (i = 0; i < len; i++)
{
char buf[5];
char *tmp = NULL;
char const *tmp = NULL;
unsigned char c = s[i];
switch (c)

View File

@@ -172,17 +172,26 @@ Fields are skipped before chars.\n\
exit (status);
}
/* Convert OPT to size_t, reporting an error using MSGID if it does
not fit. */
/* Convert OPT to size_t, reporting an error using MSGID if OPT is
invalid. Silently convert too-large values to SIZE_MAX. */
static size_t
size_opt (char const *opt, char const *msgid)
{
unsigned long int size;
if (xstrtoul (opt, NULL, 10, &size, "") != LONGINT_OK
|| SIZE_MAX < size)
error (EXIT_FAILURE, 0, "%s: %s", opt, _(msgid));
return size;
verify (SIZE_MAX <= ULONG_MAX);
switch (xstrtoul (opt, NULL, 10, &size, ""))
{
case LONGINT_OK:
case LONGINT_OVERFLOW:
break;
default:
error (EXIT_FAILURE, 0, "%s: %s", opt, _(msgid));
}
return MIN (size, SIZE_MAX);
}
/* Given a linebuffer LINE,
@@ -472,8 +481,8 @@ main (int argc, char **argv)
skip_fields = 0;
if (!DECIMAL_DIGIT_ACCUMULATE (skip_fields, optc - '0', size_t))
error (EXIT_FAILURE, 0, "%s",
_("invalid number of fields to skip"));
skip_fields = SIZE_MAX;
skip_field_option_type = SFO_OBSOLETE;
}
break;

Some files were not shown because too many files have changed in this diff Show More