mirror of
https://git.savannah.gnu.org/git/coreutils.git
synced 2025-09-10 07:59:52 +02:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c935a0554 | ||
|
|
3b7dc2b522 | ||
|
|
aeaa6bf7ae | ||
|
|
82e344ca09 | ||
|
|
2cd1577554 | ||
|
|
41c9e064a6 | ||
|
|
5f303a1293 | ||
|
|
2df272914b | ||
|
|
278109b9f4 | ||
|
|
0f3f7d495c | ||
|
|
4f87cc0364 | ||
|
|
18c5fbd5dc | ||
|
|
cf963e5a54 |
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -5,5 +5,3 @@
|
||||
# # Derived from the regexp in emacs' lisp/add-log.el.
|
||||
# [diff "texinfo"]
|
||||
# funcname = "^@node[ \t][ \t]*\\([^,][^,]*\\)"
|
||||
|
||||
gl/lib/*.diff -whitespace
|
||||
|
||||
85
.github/ISSUE_TEMPLATE.txt
vendored
85
.github/ISSUE_TEMPLATE.txt
vendored
@@ -1,85 +0,0 @@
|
||||
Please **do not** send pull-requests or open new issues on Github.
|
||||
|
||||
Github is a downstream mirror and is not frequently monitored,
|
||||
all development is coordinated upstream on GNU resources.
|
||||
|
||||
* Send general questions or suggestions to: coreutils@gnu.org .
|
||||
* Send bugs reports to: bug-coreutils@gnu.org .
|
||||
|
||||
## Bug reports
|
||||
|
||||
Before reporting a new bug, please check the following resources:
|
||||
|
||||
* Coreutils FAQ: https://www.gnu.org/software/coreutils/faq/coreutils-faq.html
|
||||
|
||||
* Coreutils Gotchas: https://www.pixelbeat.org/docs/coreutils-gotchas.html
|
||||
contains a list of some quirks and unexpected behavior (which are often
|
||||
mistaken for bugs).
|
||||
|
||||
* Online Manual:
|
||||
https://www.gnu.org/software/coreutils/manual/html_node/index.html
|
||||
|
||||
* Search the archives for previous questions and answers:
|
||||
|
||||
* Coreutils Mailing list (General usage and advice):
|
||||
https://lists.gnu.org/archive/html/coreutils/
|
||||
|
||||
* Bug reports Mailing List:
|
||||
https://lists.gnu.org/archive/html/bug-coreutils/
|
||||
|
||||
* Open Bugs:
|
||||
https://debbugs.gnu.org/cgi/pkgreport.cgi?which=pkg&data=coreutils
|
||||
|
||||
* Translation related issues:
|
||||
https://translationproject.org/domain/coreutils.html
|
||||
|
||||
|
||||
## Effective bug reports
|
||||
|
||||
* Include a descriptive subject line (e.g. the program with which
|
||||
you experience a problem, and what the problem is).
|
||||
* Include the version of the program (e.g. the output of `PROG --version`).
|
||||
* Include the operating system and the type of hardware you are using
|
||||
(e.g. the output of `uname -a`).
|
||||
* Include the exact command and parameters you have used.
|
||||
* Clearly explain what is the output you expected to get, and what is
|
||||
the actual result you encountered.
|
||||
* Include as much information as possible to reproduce the problem.
|
||||
If the problem happens on a very large input file, try to provide
|
||||
a minimal example (a subset of the input file) that still causes the problem.
|
||||
*Do not* include attachments over 40kB.
|
||||
* List policy is reply-to-all, and non-subscribers may post.
|
||||
* There may be a moderation delay for a first-time post, whether or not
|
||||
you subscribe.
|
||||
|
||||
|
||||
## Mailing List Etiquette
|
||||
|
||||
When sending messages to coreutils@gnu.org or bug-coreutils@gnu.org :
|
||||
|
||||
* Send messages as plain text.
|
||||
* Do not send messages encoded as HTML nor encoded as base64 MIME nor
|
||||
included as multiple formats.
|
||||
* Avoid sending large messages, such as log files, system call trace
|
||||
output, and other content resulting in messages over about 40 kB.
|
||||
* Avoid sending screenshots (e.g. PNG files). When reporting errors
|
||||
you encounter on the terminal, copy and paste the text to your message.
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Copyright (C) 2017-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
-->
|
||||
105
.github/PULL_REQUEST_TEMPLATE.txt
vendored
105
.github/PULL_REQUEST_TEMPLATE.txt
vendored
@@ -1,105 +0,0 @@
|
||||
Please *do not* send pull-requests or open new issues on Github.
|
||||
See "hacking resources" below for recommended alternatives.
|
||||
|
||||
Github is a downstream mirror and is not frequently monitored,
|
||||
all development is coordinated upstream on GNU resources.
|
||||
|
||||
* Send general questions or suggestions to: coreutils@gnu.org .
|
||||
* Send bugs reports to: <bug-coreutils@gnu.org>
|
||||
|
||||
Before sending the bug, please consult the FAQ and Mailing list
|
||||
archives (see below). Often these perceived bugs are simply due to
|
||||
wrong program usage.
|
||||
|
||||
Please remember that development of Coreutils is a volunteer effort,
|
||||
and you can also contribute to its development. For information about
|
||||
contributing to the GNU Project, please read
|
||||
[How to help GNU](https://www.gnu.org/help/].
|
||||
|
||||
|
||||
## Getting Help
|
||||
|
||||
* Coreutils FAQ: https://www.gnu.org/software/coreutils/faq/coreutils-faq.html
|
||||
|
||||
* Coreutils Gotchas: https://www.pixelbeat.org/docs/coreutils-gotchas.html
|
||||
contains a list of some quirks and unexpected behavior (which are often
|
||||
mistaken for bugs).
|
||||
|
||||
* Online Manual:
|
||||
https://www.gnu.org/software/coreutils/manual/html_node/index.html
|
||||
|
||||
* Search the archives for previous questions and answers:
|
||||
|
||||
* Coreutils Mailing list (General usage and advice):
|
||||
https://lists.gnu.org/archive/html/coreutils/
|
||||
|
||||
* Bug reports Mailing List:
|
||||
https://lists.gnu.org/archive/html/bug-coreutils/
|
||||
|
||||
* Open Bugs: https://debbugs.gnu.org/cgi/pkgreport.cgi?which=pkg&data=coreutils
|
||||
|
||||
* Translation related issues:
|
||||
https://translationproject.org/domain/coreutils.html
|
||||
|
||||
|
||||
## Mailing List Etiquette
|
||||
|
||||
When sending messages to coreutils@gnu.org or bug-coreutils@gnu.org :
|
||||
|
||||
* Send messages as plain text.
|
||||
* Do not send messages encoded as HTML nor encoded as base64 MIME nor
|
||||
included as multiple formats.
|
||||
* Include a descriptive subject line.
|
||||
* Avoid sending large messages, such as log files, system call trace
|
||||
output, and other content resulting in messages over about 40 kB.
|
||||
* Avoid sending screenshots (e.g. PNG files). When reporting errors
|
||||
you encounter on the terminal, copy and paste the text to your message.
|
||||
* List policy is reply-to-all, and non-subscribers may post.
|
||||
* There may be a moderation delay for a first-time post, whether or not
|
||||
you subscribe.
|
||||
|
||||
|
||||
## Hacking resources
|
||||
|
||||
files contain information about hacking and contributing to GNU coreutils:
|
||||
https://git.savannah.gnu.org/cgit/coreutils.git/tree/HACKING
|
||||
https://git.savannah.gnu.org/cgit/coreutils.git/tree/README-hacking
|
||||
Please read them first.
|
||||
|
||||
Before suggesting a new feature, read the list of rejected features requests:
|
||||
https://www.gnu.org/software/coreutils/rejected_requests.html
|
||||
|
||||
Send a patch as an email attachment. Patches can be generated with
|
||||
`git format-patch` (the HACKING links above provide examples of generating
|
||||
a patch).
|
||||
|
||||
|
||||
## Copyright Assignment
|
||||
|
||||
If your change is significant (i.e., if it adds more than ~10 lines),
|
||||
then you'll have to have a copyright assignment on file with the FSF.
|
||||
To learn more see https://www.gnu.org/licenses/why-assign.html .
|
||||
|
||||
The HACKING file (above) contains more details about how to initial
|
||||
the copyright assignment process. Coreutils maintainers can also help
|
||||
in this matter.
|
||||
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
Copyright (C) 2017-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
-->
|
||||
272
.gitignore
vendored
272
.gitignore
vendored
@@ -1,218 +1,74 @@
|
||||
*.I[12]
|
||||
*.[EIOXao]
|
||||
*.bak
|
||||
*.gcda
|
||||
*.gcno
|
||||
*.[EIOX]
|
||||
*.o
|
||||
*/.deps
|
||||
*~
|
||||
._bootmp
|
||||
.deps
|
||||
.gdb-history
|
||||
.kludge-stamp
|
||||
.tarball-version
|
||||
.version
|
||||
/*.patch
|
||||
/.Tpo
|
||||
/.am*
|
||||
/.re-list
|
||||
/.sc-start-*
|
||||
/ABOUT-NLS
|
||||
/ChangeLog
|
||||
/GNUmakefile
|
||||
/INSTALL
|
||||
/THANKS-to-translators
|
||||
/aclocal.m4
|
||||
/autom4te.cache
|
||||
/build-aux/.gitignore
|
||||
/build-aux/ar-lib
|
||||
/build-aux/compile
|
||||
/build-aux/config.guess
|
||||
/build-aux/config.rpath
|
||||
/build-aux/config.sub
|
||||
/build-aux/depcomp
|
||||
/build-aux/install-sh
|
||||
/build-aux/mdate-sh
|
||||
/build-aux/missing
|
||||
/build-aux/snippet/
|
||||
/build-aux/test-driver
|
||||
/build-aux/texinfo.tex
|
||||
/build-aux/ylwrap
|
||||
/confdefs*
|
||||
/config.cache
|
||||
/config.log
|
||||
/config.status
|
||||
/configure
|
||||
/conftest*
|
||||
/coreutils-*.tar.gz
|
||||
/coreutils-*.tar.gz.sig
|
||||
/coreutils-*.tar.xz
|
||||
/coreutils-*.tar.xz.sig
|
||||
/doc/coverage
|
||||
/doc/manual
|
||||
/gnulib-tests
|
||||
/lib/.dirstamp
|
||||
/lib/.gitignore
|
||||
/lib/alloca.h
|
||||
/lib/arg-nonnull.h
|
||||
/lib/arpa/inet.h
|
||||
/lib/assert.h
|
||||
/lib/byteswap.h
|
||||
/lib/c++defs.h
|
||||
/lib/charset.alias
|
||||
/lib/config.h
|
||||
/lib/config.hin
|
||||
/lib/configmake.h
|
||||
/lib/ctype.h
|
||||
/lib/dirent.h
|
||||
/lib/errno.h
|
||||
/lib/error.h
|
||||
/lib/fcntl.h
|
||||
/lib/float.h
|
||||
/lib/fnmatch.h
|
||||
/lib/getopt-cdefs.h
|
||||
/lib/getopt.h
|
||||
/lib/glthread
|
||||
/lib/gmp.h
|
||||
/lib/iconv.h
|
||||
/lib/iconv_open-aix.h
|
||||
/lib/iconv_open-hpux.h
|
||||
/lib/iconv_open-irix.h
|
||||
/lib/iconv_open-osf.h
|
||||
/lib/iconv_open-solaris.h
|
||||
/lib/iconv_open-zos.h
|
||||
/lib/inttypes.h
|
||||
/lib/langinfo.h
|
||||
/lib/limits.h
|
||||
/lib/link-warning.h
|
||||
/lib/locale.h
|
||||
/lib/malloc/
|
||||
/lib/math.h
|
||||
/lib/netdb.h
|
||||
/lib/netinet/in.h
|
||||
/lib/obstack.h
|
||||
/lib/parse-datetime-gen.h
|
||||
/lib/parse-datetime.c
|
||||
/lib/poll.h
|
||||
/lib/printf.c
|
||||
/lib/pthread.h
|
||||
/lib/ref-add.sed
|
||||
/lib/ref-del.sed
|
||||
/lib/sched.h
|
||||
/lib/se-context.h
|
||||
/lib/se-label.h
|
||||
/lib/se-selinux.h
|
||||
/lib/selinux
|
||||
/lib/signal.h
|
||||
/lib/spawn.h
|
||||
/lib/stamp-h1
|
||||
/lib/stdarg.h
|
||||
/lib/stdbool.h
|
||||
/lib/stdckdint.h
|
||||
/lib/stddef.h
|
||||
/lib/stdint.h
|
||||
/lib/stdio.h
|
||||
/lib/stdlib.h
|
||||
/lib/string.h
|
||||
/lib/strings.h
|
||||
/lib/sys/
|
||||
/lib/termios.h
|
||||
/lib/time.h
|
||||
/lib/uchar.h
|
||||
/lib/unicase.h
|
||||
/lib/unicase/
|
||||
/lib/unictype
|
||||
/lib/unictype.h
|
||||
/lib/uninorm.h
|
||||
/lib/unistd.h
|
||||
/lib/unistr
|
||||
/lib/unistr.h
|
||||
/lib/unitypes.h
|
||||
/lib/uniwidth
|
||||
/lib/uniwidth.h
|
||||
/lib/utime.h
|
||||
/lib/warn-on-use.h
|
||||
/lib/wchar.h
|
||||
/lib/wctype.h
|
||||
/m4/.cvsignore
|
||||
/m4/.gitignore
|
||||
/m4/codeset.m4
|
||||
/m4/cu-progs.m4
|
||||
/m4/fcntl-o.m4
|
||||
/m4/gettext.m4
|
||||
/m4/glibc2.m4
|
||||
/m4/glibc21.m4
|
||||
/m4/gnulib-cache.m4
|
||||
/m4/iconv.m4
|
||||
/m4/intdiv0.m4
|
||||
/m4/intl.m4
|
||||
/m4/intldir.m4
|
||||
/m4/intlmacosx.m4
|
||||
/m4/intmax.m4
|
||||
/m4/inttypes-pri.m4
|
||||
/m4/inttypes_h.m4
|
||||
/m4/lcmessage.m4
|
||||
/m4/lib-ld.m4
|
||||
/m4/lib-link.m4
|
||||
/m4/lib-prefix.m4
|
||||
/m4/lock.m4
|
||||
/m4/longlong.m4
|
||||
/m4/nls.m4
|
||||
/m4/po.m4
|
||||
/m4/printf-posix.m4
|
||||
/m4/progtest.m4
|
||||
/m4/size_max.m4
|
||||
/m4/stdint_h.m4
|
||||
/m4/threadlib.m4
|
||||
/m4/uintmax_t.m4
|
||||
/m4/visibility.m4
|
||||
/m4/wchar_t.m4
|
||||
/m4/wint_t.m4
|
||||
/m4/xsize.m4
|
||||
/maint.mk
|
||||
/man/*.1
|
||||
/po/*.gmo
|
||||
/po/*.po
|
||||
/po/.gitignore
|
||||
/po/.reference
|
||||
/po/LINGUAS
|
||||
/po/Makefile.in
|
||||
/po/Makefile.in.in
|
||||
/po/Makevars
|
||||
/po/Makevars.template
|
||||
/po/POTFILES
|
||||
/po/Rules-quot
|
||||
/po/boldquot.sed
|
||||
/po/checksums
|
||||
/po/coreutils.pot
|
||||
/po/en@boldquot.header
|
||||
/po/en@quot.header
|
||||
/po/insert-header.sin
|
||||
/po/quot.sed
|
||||
/po/remove-potcdate.sed
|
||||
/po/remove-potcdate.sin
|
||||
/po/stamp-po
|
||||
/src/coreutils.h
|
||||
/src/coreutils_shebangs
|
||||
/src/coreutils_symlinks
|
||||
/src/cu-progs.mk
|
||||
/src/fs-def
|
||||
/src/fs-kernel-magic
|
||||
/src/fs-latest-magic.h
|
||||
/src/fs-magic
|
||||
/src/make-prime-list
|
||||
/src/primes.h
|
||||
/src/single-binary.mk
|
||||
/src/version.c
|
||||
/src/version.h
|
||||
/stamp-h1
|
||||
/tests/*/*.log
|
||||
/tests/*/*.trs
|
||||
/tests/.built-programs
|
||||
/tests/factor/t[0-9][0-9].sh
|
||||
/tests/t?
|
||||
/tests/test-suite.log
|
||||
/tight-scope.mk
|
||||
ABOUT-NLS
|
||||
ChangeLog
|
||||
GNUmakefile
|
||||
ID
|
||||
INSTALL
|
||||
Makefile
|
||||
Makefile.in
|
||||
TAGS
|
||||
THANKS
|
||||
THANKS-to-translators
|
||||
aclocal.m4
|
||||
autom4te.cache
|
||||
build-aux/.gitignore
|
||||
build-aux/compile
|
||||
build-aux/config.guess
|
||||
build-aux/config.sub
|
||||
build-aux/depcomp
|
||||
build-aux/install-sh
|
||||
build-aux/mdate-sh
|
||||
build-aux/missing
|
||||
build-aux/texinfo.tex
|
||||
build-aux/ylwrap
|
||||
config.cache
|
||||
config.h
|
||||
config.hin
|
||||
config.log
|
||||
config.status
|
||||
configure
|
||||
coreutils-*.tar.bz2
|
||||
coreutils-*.tar.bz2.sig
|
||||
coreutils-*.tar.gz
|
||||
coreutils-*.tar.gz.sig
|
||||
coreutils-*.tar.lzma
|
||||
coreutils-*.tar.lzma.sig
|
||||
gnulib-tests
|
||||
lib/.cvsignore
|
||||
lib/.gitignore
|
||||
lib/arpa
|
||||
lib/binary-io.h
|
||||
lib/charset.alias
|
||||
lib/configmake.h
|
||||
lib/libcoreutils.a
|
||||
lib/printf.c
|
||||
lib/progname.c
|
||||
lib/progname.h
|
||||
lib/selinux
|
||||
lib/uniwidth
|
||||
m4/.cvsignore
|
||||
m4/.gitignore
|
||||
maint.mk
|
||||
man/*.1
|
||||
po/*.gmo
|
||||
po/*.po
|
||||
po/.gitignore
|
||||
po/.reference
|
||||
po/LINGUAS
|
||||
po/Makefile.in
|
||||
po/Makevars
|
||||
po/POTFILES
|
||||
po/checksums
|
||||
po/coreutils.pot
|
||||
po/stamp-po
|
||||
src/version.c
|
||||
src/version.h
|
||||
stamp-h1
|
||||
tests/*/*.log
|
||||
|
||||
2
.gitmodules
vendored
2
.gitmodules
vendored
@@ -1,3 +1,3 @@
|
||||
[submodule "gnulib"]
|
||||
path = gnulib
|
||||
url = https://git.savannah.gnu.org/git/gnulib.git
|
||||
url = git://git.sv.gnu.org/gnulib.git
|
||||
|
||||
44
.mailmap
44
.mailmap
@@ -1,44 +0,0 @@
|
||||
# Map git author names and email addresses to canonical/preferred form.
|
||||
<jim@meyering.net> <meyering@fb.com>
|
||||
<jim@meyering.net> <meyering@iou.iou>
|
||||
<jim@meyering.net> <meyering@redhat.com>
|
||||
<jim@meyering.net> <meyering@rho.meyering.net>
|
||||
<jim@meyering.net> <meyering@vm.meyering.net.localdomain>
|
||||
Paul Eggert <eggert@cs.ucla.edu> <eggert@penguin.cs.ucla.edu>
|
||||
Paul Eggert <eggert@cs.ucla.edu> <eggert@CS.UCLA.EDU>
|
||||
<eggert@cs.ucla.edu> <eggert@twinsun.com>
|
||||
|
||||
# Evan's two changes listed my email address.
|
||||
Evan Hunt <ethanol@armory.com> Evan Hunt <jim@meyering.net>
|
||||
|
||||
<P@draigBrady.com> <P@draigBrady.com (trivial change)>
|
||||
Pádraig Brady <P@draigBrady.com>
|
||||
<chen.guo.0625@gmail.com> <chenguo4@yahoo.com>
|
||||
<chen.guo.0625@gmail.com> <chenguo4@ucla.edu>
|
||||
<schwab@linux-m68k.org> <schwab@suse.de>
|
||||
<aurel32@debian.org> <aurelien@aurel32.net>
|
||||
<bob@proulx.com> <rwp@fc.hp.com>
|
||||
<bkorb@gnu.org> <bkorb@veritas.com>
|
||||
<bruno@clisp.org> <haible@clisp.cons.org>
|
||||
<eblake@redhat.com> <ebb9@byu.net>
|
||||
<jrv@debian.org> <jrvz@comcast.net>
|
||||
<dave.anglin@nrc.ca> <dave@hiauly1.hia.nrc.ca>
|
||||
<psfales@alcatel-lucent.com> <psfales@lucent.com>
|
||||
<karl@gnu.org> <karl@freefriends.org>
|
||||
<stephane.raimbault@gmail.com> <stephane.raimbault@makina-corpus.com>
|
||||
<jarkko.sakkinen@iki.fi> <jarkko.sakkinen@linux.intel.com>
|
||||
<tobias@stoeckmann.org> <tobias@bugol.de>
|
||||
<cjwatson@debian.org> <cjwatson@ubuntu.com>
|
||||
|
||||
# Prefer spelled-out middle name and its address.
|
||||
Arne Henrik Juul <arnej@imf.unit.no> Arne H. Juul <arnej@solan.unit.no>
|
||||
|
||||
# Had email as name.
|
||||
Dan Jacobson <jidanni@jidanni.org> jidanni@jidanni.org <jidanni@jidanni.org>
|
||||
|
||||
# Consolidate names of same email address.
|
||||
Jeff Liu <jeff.liu@oracle.com> jeff.liu <jeff.liu@oracle.com>
|
||||
Jeff Liu <jeff.liu@oracle.com> Jie Liu <jeff.liu@oracle.com>
|
||||
|
||||
# Convert to latin1 for a better 'THANKS' sort order.
|
||||
Aleksej Shilin <rootlexx@mail.ru> Алексей Шилин <rootlexx@mail.ru>
|
||||
@@ -1 +1 @@
|
||||
9.4
|
||||
8.0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Suppress valgrind diagnostics we don't care about.
|
||||
|
||||
# Copyright (C) 2003-2024 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2003, 2004, 2006-2009 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
|
||||
@@ -13,7 +13,7 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
{
|
||||
libc_dl_open
|
||||
|
||||
1
.x-sc_GPL_version
Normal file
1
.x-sc_GPL_version
Normal file
@@ -0,0 +1 @@
|
||||
^build-aux/check\.mk$
|
||||
1
.x-sc_error_message_uppercase
Normal file
1
.x-sc_error_message_uppercase
Normal file
@@ -0,0 +1 @@
|
||||
build-aux/cvsu
|
||||
5
.x-sc_file_system
Normal file
5
.x-sc_file_system
Normal file
@@ -0,0 +1,5 @@
|
||||
ChangeLog
|
||||
NEWS
|
||||
src/df.c
|
||||
src/stat.c
|
||||
tests/misc/df-P
|
||||
1
.x-sc_obsolete_symbols
Normal file
1
.x-sc_obsolete_symbols
Normal file
@@ -0,0 +1 @@
|
||||
ChangeLog
|
||||
1
.x-sc_po_check
Normal file
1
.x-sc_po_check
Normal file
@@ -0,0 +1 @@
|
||||
^gl/
|
||||
2
.x-sc_program_name
Normal file
2
.x-sc_program_name
Normal file
@@ -0,0 +1,2 @@
|
||||
gl/lib/randint.c
|
||||
lib/euidaccess-stat.c
|
||||
1
.x-sc_prohibit_atoi_atof
Normal file
1
.x-sc_prohibit_atoi_atof
Normal file
@@ -0,0 +1 @@
|
||||
^lib/euidaccess-stat\.c$
|
||||
4
.x-sc_prohibit_stat_st_blocks
Normal file
4
.x-sc_prohibit_stat_st_blocks
Normal file
@@ -0,0 +1,4 @@
|
||||
src/system.h
|
||||
tests/du/2g
|
||||
old/fileutils/ChangeLog-1997
|
||||
ChangeLog-2005
|
||||
1
.x-sc_prohibit_strcmp
Normal file
1
.x-sc_prohibit_strcmp
Normal file
@@ -0,0 +1 @@
|
||||
ChangeLog
|
||||
6
.x-sc_prohibit_tab_based_indentation
Normal file
6
.x-sc_prohibit_tab_based_indentation
Normal file
@@ -0,0 +1,6 @@
|
||||
^GNUMakefile$
|
||||
Makefile\.am$
|
||||
\.mk$
|
||||
^tests/pr/
|
||||
ChangeLog.*
|
||||
^man/help2man$
|
||||
9
.x-sc_require_config_h
Normal file
9
.x-sc_require_config_h
Normal file
@@ -0,0 +1,9 @@
|
||||
^lib/buffer-lcm\.c$
|
||||
^src/false\.c$
|
||||
^src/lbracket\.c$
|
||||
^src/ls-dir\.c$
|
||||
^src/ls-ls\.c$
|
||||
^src/ls-vdir\.c$
|
||||
^src/tac-pipe\.c$
|
||||
^src/uname-arch\.c$
|
||||
^src/uname-uname\.c$
|
||||
9
.x-sc_require_config_h_first
Normal file
9
.x-sc_require_config_h_first
Normal file
@@ -0,0 +1,9 @@
|
||||
^lib/buffer-lcm\.c$
|
||||
^src/false\.c$
|
||||
^src/lbracket\.c$
|
||||
^src/ls-dir\.c$
|
||||
^src/ls-ls\.c$
|
||||
^src/ls-vdir\.c$
|
||||
^src/tac-pipe\.c$
|
||||
^src/uname-arch\.c$
|
||||
^src/uname-uname\.c$
|
||||
11
.x-sc_space_tab
Normal file
11
.x-sc_space_tab
Normal file
@@ -0,0 +1,11 @@
|
||||
config(ure|\.(guess|sub))
|
||||
tests/pr
|
||||
lib/regex.c
|
||||
config-log
|
||||
tests/misc/nl
|
||||
po/de.po
|
||||
m4/lib-ld.m4
|
||||
m4/lib-prefix.m4
|
||||
m4/po.m4
|
||||
aclocal.m4
|
||||
src/c99-to-c89.diff
|
||||
2
.x-sc_sun_os_names
Normal file
2
.x-sc_sun_os_names
Normal file
@@ -0,0 +1,2 @@
|
||||
config-log
|
||||
build-aux/config.guess
|
||||
3
.x-sc_system_h_headers
Normal file
3
.x-sc_system_h_headers
Normal file
@@ -0,0 +1,3 @@
|
||||
^src/libstdbuf\.c$
|
||||
^src/system\.h$
|
||||
^src/copy\.h$
|
||||
1
.x-sc_trailing_blank
Normal file
1
.x-sc_trailing_blank
Normal file
@@ -0,0 +1 @@
|
||||
^tests/pr/
|
||||
2
.x-sc_unmarked_diagnostics
Normal file
2
.x-sc_unmarked_diagnostics
Normal file
@@ -0,0 +1,2 @@
|
||||
^lib/xstrtol\.h$
|
||||
^build-aux/cvsu$
|
||||
13
.x-sc_useless_cpp_parens
Normal file
13
.x-sc_useless_cpp_parens
Normal file
@@ -0,0 +1,13 @@
|
||||
^build-aux/config.guess
|
||||
^configure
|
||||
^lib/alloca.c
|
||||
^lib/fts.c
|
||||
^lib/getdate.c
|
||||
^lib/getloadavg.c
|
||||
^lib/gettext.h
|
||||
^lib/getusershell.c
|
||||
^lib/mbswidth.c
|
||||
^lib/strtod.c
|
||||
^lib/xstrtol.c
|
||||
^m4/
|
||||
^tests/misc/pwd-unreadable-parent
|
||||
@@ -1,5 +0,0 @@
|
||||
^COPYING$
|
||||
^bootstrap$
|
||||
^doc/fdl\.texi$
|
||||
^man/help2man$
|
||||
^tests/init\.sh$
|
||||
18
AUTHORS
18
AUTHORS
@@ -2,20 +2,16 @@ Here are the names of the programs in this package,
|
||||
each followed by the name(s) of its author(s).
|
||||
|
||||
arch: David MacKenzie, Karel Zak
|
||||
b2sum: Pádraig Brady, Samuel Neves
|
||||
base32: Simon Josefsson
|
||||
base64: Simon Josefsson
|
||||
basename: David MacKenzie
|
||||
basenc: Simon Josefsson, Assaf Gordon
|
||||
cat: Torbjörn Granlund, Richard M. Stallman
|
||||
chcon: Russell Coker, Jim Meyering
|
||||
chgrp: David MacKenzie, Jim Meyering
|
||||
chmod: David MacKenzie, Jim Meyering
|
||||
chown: David MacKenzie, Jim Meyering
|
||||
chroot: Roland McGrath
|
||||
cksum: Pádraig Brady, Q. Frank Xia
|
||||
cksum: Q. Frank Xia
|
||||
comm: Richard M. Stallman, David MacKenzie
|
||||
coreutils: Alex Deymo
|
||||
cp: Torbjörn Granlund, David MacKenzie, Jim Meyering
|
||||
csplit: Stuart Kemp, David MacKenzie
|
||||
cut: David M. Ihnat, David MacKenzie, Jim Meyering
|
||||
@@ -27,10 +23,10 @@ dircolors: H. Peter Anvin
|
||||
dirname: David MacKenzie, Jim Meyering
|
||||
du: Torbjörn Granlund, David MacKenzie, Paul Eggert, Jim Meyering
|
||||
echo: Brian Fox, Chet Ramey
|
||||
env: Richard Mlynarik, David MacKenzie, Assaf Gordon
|
||||
env: Richard Mlynarik, David MacKenzie
|
||||
expand: David MacKenzie
|
||||
expr: Mike Parker, James Youngman, Paul Eggert
|
||||
factor: Paul Rubin, Torbjörn Granlund, Niels Möller
|
||||
factor: Paul Rubin
|
||||
false: Jim Meyering
|
||||
fmt: Ross Paterson
|
||||
fold: David MacKenzie
|
||||
@@ -50,13 +46,11 @@ md5sum: Ulrich Drepper, Scott Miller, David Madore
|
||||
mkdir: David MacKenzie
|
||||
mkfifo: David MacKenzie
|
||||
mknod: David MacKenzie
|
||||
mktemp: Jim Meyering, Eric Blake
|
||||
mktemp: Jim Meyering
|
||||
mv: Mike Parker, David MacKenzie, Jim Meyering
|
||||
nice: David MacKenzie
|
||||
nl: Scott Bartram, David MacKenzie
|
||||
nohup: Jim Meyering
|
||||
nproc: Giuseppe Scrivano
|
||||
numfmt: Assaf Gordon
|
||||
od: Jim Meyering
|
||||
paste: David M. Ihnat, David MacKenzie
|
||||
pathchk: Paul Eggert, David MacKenzie, Jim Meyering
|
||||
@@ -67,7 +61,6 @@ printf: David MacKenzie
|
||||
ptx: François Pinard
|
||||
pwd: Jim Meyering
|
||||
readlink: Dmitry V. Levin
|
||||
realpath: Pádraig Brady
|
||||
rm: Paul Rubin, David MacKenzie, Richard M. Stallman, Jim Meyering
|
||||
rmdir: David MacKenzie
|
||||
runcon: Russell Coker
|
||||
@@ -85,8 +78,9 @@ split: Torbjörn Granlund, Richard M. Stallman
|
||||
stat: Michael Meskes
|
||||
stdbuf: Pádraig Brady
|
||||
stty: David MacKenzie
|
||||
su: David MacKenzie
|
||||
sum: Kayvan Aghaiepour, David MacKenzie
|
||||
sync: Jim Meyering, Giuseppe Scrivano
|
||||
sync: Jim Meyering
|
||||
tac: Jay Lepreau, David MacKenzie
|
||||
tail: Paul Rubin, David MacKenzie, Ian Lance Taylor, Jim Meyering
|
||||
tee: Mike Parker, Richard M. Stallman, David MacKenzie
|
||||
|
||||
8
COPYING
8
COPYING
@@ -1,7 +1,7 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
@@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
@@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box".
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
|
||||
11616
ChangeLog-2005
Normal file
11616
ChangeLog-2005
Normal file
File diff suppressed because it is too large
Load Diff
4040
ChangeLog-2006
Normal file
4040
ChangeLog-2006
Normal file
File diff suppressed because it is too large
Load Diff
4022
ChangeLog-2007
Normal file
4022
ChangeLog-2007
Normal file
File diff suppressed because it is too large
Load Diff
379
ChangeLog-2008
Normal file
379
ChangeLog-2008
Normal file
@@ -0,0 +1,379 @@
|
||||
2008-12-16 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
NB: ChangeLog files are no longer manually maintained.
|
||||
See HACKING for details.
|
||||
|
||||
2008-02-07 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
We *do* need two different version files.
|
||||
One for tarball-only, the other to be updated any time we
|
||||
get a new value of $(VERSION).
|
||||
* Makefile.am (dist-hook): Create .tarball-version in dist tarball.
|
||||
* GNUmakefile (_curr-ver): Make git-version-gen use it.
|
||||
* .gitignore: Ignore it.
|
||||
|
||||
Fix a typo in description of size suffixes: s/GB/G/.
|
||||
* doc/coreutils.texi (od invocation, head invocation, tail invocation):
|
||||
Spotted by Bert Wesarg.
|
||||
|
||||
* NEWS [6.9.90]: Mention the added feature that head, od, split and
|
||||
tail now accept the standard size suffixes (kB, M, MB, G, GB, and
|
||||
so on for T, P, Y, Z, and Y) on arguments to selected options.
|
||||
|
||||
2008-02-06 Steven Schubiger <schubiger@gmail.com>
|
||||
|
||||
mkdir, split: write --verbose output to stdout, not stderr.
|
||||
* src/mkdir.c (verbose_output): New function.
|
||||
(announce_mkdir): Use it.
|
||||
* src/split.c (usage): Update.
|
||||
* src/split.c (cwrite): Write to stdout, not stderr.
|
||||
* doc/coreutils.texi (split invocation): Remove the mention
|
||||
of --verbose output being printed to stderr.
|
||||
* tests/mkdir/p-v: Redirect stdout, not stderr.
|
||||
* tests/misc/split-a: Likewise.
|
||||
* NEWS: Mention this change.
|
||||
* TODO: Remove this item.
|
||||
|
||||
2008-02-04 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
* Makefile.maint (announcement): Remove stale comment.
|
||||
|
||||
2008-02-02 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Clarify a comment.
|
||||
* tests/sort/Test.pm: Replace a vague ChangeLog reference with a URL.
|
||||
|
||||
2008-01-31 Bob Proulx <bob@proulx.com>
|
||||
|
||||
Improve wording of date and time man page.
|
||||
* man/date.x: Improve compact description of the --date=STRING.
|
||||
* man/touch.x: Likewise.
|
||||
Suggested by A. Costa.
|
||||
|
||||
2008-01-31 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Remove alignment constraint from the sha*_read_ctx functions.
|
||||
* lib/sha256.c (set_uint32): New function.
|
||||
(sha256_read_ctx, sha224_read_ctx): Use it.
|
||||
* lib/sha512.c (set_uint64): New function.
|
||||
(sha512_read_ctx, sha384_read_ctx): Use it.
|
||||
* lib/sha256.h: Remove warning about alignment constraint.
|
||||
* lib/sha512.h: Likewise.
|
||||
Prompted by similar changes in gnulib's sha1 and md[45] modules.
|
||||
|
||||
Adapt to new version of vc-list-files.
|
||||
* tests/check.mk (vc_exe_in_TESTS): Adapt to new constraint
|
||||
that vc-list-files be run only from $(top_srcdir).
|
||||
|
||||
Pull vc-list-files from gnulib.
|
||||
* bootstrap.conf (gnulib_modules): Add vc-list-files.
|
||||
* build-aux/vc-list-files: Remove file.
|
||||
|
||||
Improve the cp/parent-perm test.
|
||||
* tests/cp/parent-perm: Also check that perms of existing dest
|
||||
dirs are changed to match those of corresponding src dir
|
||||
|
||||
2008-01-30 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Don't modify argv in dd due to ',' in arguments.
|
||||
* src/dd.c: Include quotearg.h.
|
||||
(operand_matches): New function.
|
||||
(parse_symbols, operand_is): Use it.
|
||||
(parse_symbols): 1st arg is now const pointer. Don't modify it.
|
||||
msgid arg is now just the message, not a format.
|
||||
(scanargs): Add some 'const's to check for problems like the above.
|
||||
|
||||
2008-01-30 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
* src/c99-to-c89.diff: Adjust remove.c offsets, again.
|
||||
|
||||
Now that system.h defines is_empty_dir, include "openat.h".
|
||||
* src/system.h: Include "openat.h" here, ...
|
||||
* src/chcon.c: ... not here.
|
||||
* src/chmod.c: Likewise.
|
||||
* src/chown-core.c: Likewise.
|
||||
* src/remove.c: Likewise.
|
||||
|
||||
* src/c99-to-c89.diff: Adjust remove.c offsets.
|
||||
|
||||
Improve "rmdir --ignore-fail-on-non-empty"
|
||||
* src/rmdir.c (remove_parents, main): With --ignore-fail-on-non-empty,
|
||||
suppress a diagnostic also for other errno values, which can arise
|
||||
with read-only media or when the parent directory has the immutable
|
||||
attribute (set via chattr +i).
|
||||
(errno_may_be_empty, ignorable_failure): New functions.
|
||||
* src/remove.c (is_empty_dir): Move function to ...
|
||||
* src/system.h (is_empty_dir): ...here, and make it inline.
|
||||
Suggested by Josselin Mouette in <http://bugs.debian.org/363011>
|
||||
via Bob Proulx.
|
||||
* NEWS: Mention the improvement.
|
||||
|
||||
2008-01-29 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Don't modify argv in dd.
|
||||
* src/dd.c (operand_is): New function.
|
||||
(scanargs): Use it so that we don't need to modify argv, as a nicety.
|
||||
Problem reported by Adam Goode in
|
||||
<http://lists.gnu.org/archive/html/bug-coreutils/2008-01/msg00264.html>.
|
||||
|
||||
2008-01-29 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
* Makefile.am (BUILT_SOURCES): Ensure that .version exists.
|
||||
Reported by Bob Proulx.
|
||||
|
||||
2008-01-29 Bob Proulx <bob@proulx.com>
|
||||
|
||||
Improve the man pages of --date=STRING for 'date' and 'touch'.
|
||||
* man/date.x: Add a compact description of the --date=STRING.
|
||||
* man/touch.x: Likewise.
|
||||
Reported by A. Costa in http://bugs.debian.org/363011
|
||||
|
||||
2008-01-29 Michael Stone <mstone@debian.org>
|
||||
|
||||
Improve the description of when dd outputs its final statistics.
|
||||
* doc/coreutils.texi (dd invocation): Say that dd prints stats
|
||||
upon normal termination and upon SIGINT.
|
||||
|
||||
2008-01-29 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Avoid "make distcheck" failure: newly-created man/*.1 files not removed
|
||||
* Makefile.am (EXTRA_DIST): Add .version.
|
||||
(.version): New rule.
|
||||
(dist-hook): Don't create $(distdir)/.version here, now that it's
|
||||
being distributed.
|
||||
* man/Makefile.am (common_dep): Use ../.version, not ../VERSION.
|
||||
(../VERSION): Remove rule.
|
||||
* GNUmakefile (dummy): Create .version, not VERSION.
|
||||
Add an extra "...:= $(shell..." statement to ensure that
|
||||
.version exists even when the preceding code is not run.
|
||||
* .gitignore: Remove both .version and VERSION.
|
||||
|
||||
ls: don't segfault on files in /proc with an old libselinux
|
||||
* src/ls.c (gobble_file): Work around a bug in libselinux1-2.0.15
|
||||
whereby getfilecon returns 0 yet sets the context to NULL.
|
||||
Reported by Jan Moringen via Michael Stone in
|
||||
http://bugs.debian.org/463043
|
||||
* tests/ls/Makefile.am (TESTS): Add proc-selinux-segfault.
|
||||
* tests/ls/proc-selinux-segfault: Test for the above fix.
|
||||
* NEWS: Mention the fix.
|
||||
|
||||
2008-01-26 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Work around Darwin9's set-GID-like group ownership inheritance.
|
||||
This avoids another spurious Mac OS 10.5.1 (Darwin 9.1) test failure.
|
||||
* tests/cp/preserve-gid: Accept a group ID of 0, as well.
|
||||
Reported by Elias Pipping.
|
||||
|
||||
Emit "info coreutils 'PROG invocation'" into the man page,
|
||||
rather than just "info PROG". The latter would often fail
|
||||
or simply display the man page.
|
||||
* man/help2man: Change the template.
|
||||
Prompted by http://bugs.debian.org/399684
|
||||
|
||||
chcon: correct description of --no-dereference (-h) option.
|
||||
* src/chcon.c (usage): Remove invalid reference to lchown.
|
||||
Reported by Göran Uddeborg.
|
||||
|
||||
Ensure that each version string change propagates to man pages.
|
||||
* man/Makefile.am (common_dep): Don't depend on configure.ac for
|
||||
version changes. Instead, depend on ../VERSION.
|
||||
(../VERSION): New rule.
|
||||
* Makefile.am (DISTCLEANFILES): Define.
|
||||
* GNUmakefile: Update ./VERSION.
|
||||
* .gitignore: List VERSION.
|
||||
Reported by Sven Joachim.
|
||||
|
||||
Avoid cp/preserve-gid test failure on Mac OS 10.5.1 (Darwin 9.1)
|
||||
* tests/cp/preserve-gid: Set group as well as owner on ".".
|
||||
Reported by Elias Pipping.
|
||||
|
||||
Improve a warning about non-portable "mv" usage.
|
||||
* doc/coreutils.texi (mv invocation): Adjust the warning: moving a
|
||||
dir-symlink-specified-with-a-trailing-slash works in a surprising
|
||||
manner only on some systems. Reported by Tomas Pospisek in
|
||||
http://bugs.debian.org/343652.
|
||||
|
||||
2008-01-26 Mike Frysinger <vapier@gentoo.org>
|
||||
|
||||
* src/dircolors.hin (TERM): Add jfbterm.
|
||||
|
||||
2008-01-23 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Clean up build-related rules.
|
||||
* Makefile.cfg (gnulib_dir): Update comment.
|
||||
* Makefile.maint (announcement) [cl_date, utc_date]: Don't set
|
||||
now-unused variables.
|
||||
|
||||
* TODO: Update the note on getgrouplist.
|
||||
|
||||
2008-01-23 Zvi Har'El <rl@math.technion.ac.il>
|
||||
|
||||
Add a ";", so "make install" works with --enable-install-program=su.
|
||||
* src/Makefile.am (install_su): Add a semicolon. (tiny change)
|
||||
|
||||
2008-01-23 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Avoid misinterpreting mgetgroups failure in running root-only tests.
|
||||
* src/setuidgid.c (main): Don't misinterpret as size_t an error
|
||||
return from mgetgroups. Reported by Theodoros V. Kalamatianos.
|
||||
|
||||
* README: Remove/convert a few stray mentions of CVS.
|
||||
|
||||
2008-01-22 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Require automake-1.10.1, for its support of dist-lzma.
|
||||
* configure.ac (AM_INIT_AUTOMAKE): Require 1.10.1.
|
||||
|
||||
Version 6.10.
|
||||
|
||||
* NEWS: Record release date.
|
||||
|
||||
* README-hacking: Update to reflect existence of automake-1.10.1.
|
||||
|
||||
2008-01-18 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Update README.
|
||||
* README: Remove a note about failing tests on SunOS 4.
|
||||
On Mac OS 10.5.1 (Darwin 9.1), you'll need --disable-acl.
|
||||
(Running tests as root): Recommend using "check-root", not "check".
|
||||
|
||||
2008-01-17 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Do not define-away __attribute__ when __STRICT_ANSI__ is set.
|
||||
* src/system.h (__attribute__): Remove the __STRICT_ANSI__ disjunct.
|
||||
It has been unnecessary since approximately gcc-2.6, and now, leaving
|
||||
it would cause gcc -Werror -ansi to fail to compile csplit.c.
|
||||
* gl/lib/randread.c (__attribute__): Likewise.
|
||||
|
||||
2008-01-16 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
* NEWS: Mention the configure.ac fix.
|
||||
|
||||
* TODO: Add an introduction.
|
||||
Remove a few entries. Update a few others.
|
||||
|
||||
2008-01-13 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Remove each output redirection target before writing to it.
|
||||
* tests/check.mk (vc_exe_in_TESTS): Remove t1 and t2 _first_,
|
||||
in case they exist beforehand and are not writable.
|
||||
* build-aux/check.mk (am__check_pre): Likewise, remove $@-t.
|
||||
|
||||
2008-01-13 Elias Pipping <pipping@gentoo.org>
|
||||
|
||||
* configure.ac: Correct a non-portable use of sed.
|
||||
|
||||
2008-01-12 Mike Frysinger <vapier@gentoo.org>
|
||||
|
||||
* src/dircolors.hin (image formats): Add the .svg suffix.
|
||||
|
||||
2008-01-12 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Use new version of announce-gen.
|
||||
* Makefile.maint (announcement): Remove use of the
|
||||
--gnulib-snapshot-time-stamp option.
|
||||
Use new --gnulib-version option instead.
|
||||
(gnulib-version): New variable.
|
||||
|
||||
2008-01-11 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
* Version 6.9.92.
|
||||
|
||||
* tests/tr/Test.pm: Prefer en_US.ISO-8859-1 to en_US.iso88591.
|
||||
Suggestions from James Youngman and Pádraig Brady in
|
||||
http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/12218/focus=12227
|
||||
|
||||
2008-01-10 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
* README-hacking: Add Git to the list of required tools.
|
||||
|
||||
2008-01-08 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Fix a minor race condition when using cp -p --parents.
|
||||
* src/cp.c (make_dir_parents_private): If stat fails on the parent
|
||||
directory, do not add it to the list of directories whose modes
|
||||
might need fixing later. Also, do not bother invoking 'stat'
|
||||
unless the stat results might be needed later.
|
||||
|
||||
2008-01-08 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
parent-perm: avoid a bizarre test failure.
|
||||
* tests/cp/parent-perm: Accommodate the situation in which
|
||||
chmod ("dir", 02755) returns 0 yet fails to set the S_ISGID bit.
|
||||
|
||||
Remove uses of now-undefined Makefile variable.
|
||||
* src/Makefile.am (dir_LDADD, ls_LDADD, vdir_LDADD): Remove uses
|
||||
of no-longer-defined variable, $(LIB_ACL_TRIVIAL).
|
||||
|
||||
2008-01-07 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
cp (but not copy.c): plug a small leak.
|
||||
* src/cp.c (do_copy) [--parents]: Free the attribute list.
|
||||
|
||||
Make a racy test failure less likely to happen.
|
||||
* tests/misc/tty-eof: Uncomment a debug "warn".
|
||||
This change happens to make this test far less likely to fail.
|
||||
With that statement commented out, this test would fail about
|
||||
20% of the time on my desktop. Now, it's gone 100 iterations
|
||||
in a row with no failure.
|
||||
|
||||
* NEWS: Mention the cp bug fix.
|
||||
|
||||
2008-01-07 Jan Blunck <jblunck@suse.de>
|
||||
|
||||
cp --parents: don't use uninitialized memory when restoring permissions
|
||||
* src/cp.c (make_dir_parents_private): Always stat each source
|
||||
directory, in case its permissions are required in re_protect,
|
||||
when setting permissions of a just-created destination directory.
|
||||
|
||||
2008-01-07 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
cp: add a test for today's bug fix.
|
||||
* tests/cp/parent-perm: New script. Test today's change.
|
||||
Based on reproducer from Jan Blunck.
|
||||
* tests/cp/Makefile.am (TESTS): Add parent-perm.
|
||||
|
||||
2008-01-06 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
touch: add a test for today's change.
|
||||
* tests/touch/now-owned-by-other: New script. Test today's change.
|
||||
* tests/touch/Makefile.am (TESTS): Add now-owned-by-other.
|
||||
* tests/Makefile.am (all_t): Add td, a new root-only test.
|
||||
(td): New target.
|
||||
* NEWS: Mention the improvement.
|
||||
|
||||
2008-01-06 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
touch: ignore "-d now" option, when appropriate
|
||||
* src/touch.c (main): Treat "-d now" as if it were absent, if
|
||||
neither -a nor -m is specified. Problem reported by Dan Jacobson in:
|
||||
http://lists.gnu.org/archive/html/bug-coreutils/2008-01/msg00010.html
|
||||
|
||||
2008-01-05 Jim Meyering <meyering@redhat.com>
|
||||
|
||||
Avoid tr case-conversion failure in some locales.
|
||||
* src/tr.c (skip_construct): New function.
|
||||
(main): When processing a pair of case-converting classes, don't
|
||||
iterate through the elements of each [:upper:] or [:lower:] class.
|
||||
Reported by Gerald Pfeifer in
|
||||
<http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/12218>.
|
||||
* tests/tr/Test.pm [tolower-F]: New test for the above fix.
|
||||
[upcase-xtra, dncase-xtra]: New tests, for a related code path.
|
||||
* NEWS: Mention the tr bug fix.
|
||||
|
||||
2008-01-02 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* .gitignore: Ignore lzma-compressed files, too.
|
||||
|
||||
Update copyright date.
|
||||
* tests/sample-test: Likewise.
|
||||
* doc/coreutils.texi: Likewise.
|
||||
|
||||
|
||||
-----
|
||||
|
||||
Copyright (C) 2008-2009 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without
|
||||
modification, are permitted provided the copyright notice
|
||||
and this notice are preserved.
|
||||
237
HACKING
237
HACKING
@@ -3,24 +3,24 @@ Coreutils Contribution Guidelines
|
||||
|
||||
Prerequisites
|
||||
=============
|
||||
You will need the "git" version control tools. On Fedora-based
|
||||
systems, do "yum install git". On Debian-based ones install the
|
||||
"git-core" package. Then run "git --version". If that says it's
|
||||
older than version 1.4.4, then you'd do well to get a newer version.
|
||||
You will need the "git" version control tools.
|
||||
On Fedora-based systems, do "yum install git".
|
||||
On Debian-based ones install the "git-core" package.
|
||||
Then run "git --version". If that says it's older than
|
||||
version 1.4.4, then you'd do well to get a newer version.
|
||||
At worst, just download the latest stable release from
|
||||
https://git-scm.com/ and build from source.
|
||||
http://git.or.cz/ and build from source.
|
||||
|
||||
For details on building the programs in this package, see the file,
|
||||
README-hacking.
|
||||
For details on building the programs in this package, see
|
||||
the file, README-hacking.
|
||||
|
||||
|
||||
Use the latest upstream sources
|
||||
===============================
|
||||
Base any changes you make on the latest upstream sources. You can get
|
||||
a copy of the latest with this command:
|
||||
Base any changes you make on the latest upstream sources.
|
||||
You can get a copy of the latest with this command:
|
||||
|
||||
git clone https://git.savannah.gnu.org/git/coreutils.git
|
||||
cd coreutils
|
||||
git clone git://git.sv.gnu.org/coreutils
|
||||
|
||||
That downloads the entire repository, including revision control history
|
||||
dating back to 1991. The repository (the part you download, and which
|
||||
@@ -94,7 +94,7 @@ Make your changes on a private "topic" branch
|
||||
=============================================
|
||||
So you checked out coreutils like this:
|
||||
|
||||
git clone https://git.savannah.gnu.org/git/coreutils.git
|
||||
git clone git://git.sv.gnu.org/coreutils
|
||||
|
||||
Now, cd into the coreutils/ directory and run:
|
||||
|
||||
@@ -119,8 +119,6 @@ Note 2:
|
||||
sometimes the checkout will fail, telling you that your local
|
||||
modifications conflict with changes required to switch branches.
|
||||
However, in any case, you will *not* lose your uncommitted changes.
|
||||
Run "git stash" to temporarily hide uncommitted changes in your
|
||||
local directory, restoring a clean working directory.
|
||||
|
||||
Anyhow, get back onto your just-created branch:
|
||||
|
||||
@@ -223,7 +221,7 @@ keep the maximum line length at 72 or smaller, so that the generated
|
||||
ChangeLog lines, each with its leading TAB, will not exceed 80 columns.
|
||||
As for the ChangeLog-style content, please follow these guidelines:
|
||||
|
||||
https://www.gnu.org/prep/standards/standards.html#Change-Logs
|
||||
http://www.gnu.org/software/guile/changelogs/guile-changelogs_3.html
|
||||
|
||||
Try to make the summary line fit one of the following forms:
|
||||
|
||||
@@ -234,118 +232,6 @@ Try to make the summary line fit one of the following forms:
|
||||
build: change-description
|
||||
maint: change-description
|
||||
|
||||
If your commit fixes a bug, try to find the commit that introduced that
|
||||
bug. If you do that, add a note in your new commit log saying something
|
||||
like "Introduced by commit v8.12-103-g54cbe6e." and add something like
|
||||
[bug introduced in coreutils-8.13] in the corresponding NEWS blurb.
|
||||
Assuming you found the bug in commit 54cbe6e6, "git describe 54cbe6e6"
|
||||
will print the longer tag-relative string that you'll need.
|
||||
Note that we used to use an 8-byte SHA1 prefix like "54cbe6e6", because
|
||||
that was automatically rendered as a clickable link by "gitk", but with
|
||||
git-1.7.10, the more descriptive version-containing "git describe" format
|
||||
that we now require is also highlighted.
|
||||
|
||||
|
||||
Curly braces: use judiciously
|
||||
=============================
|
||||
Omit the curly braces around an "if", "while", "for" etc. body only when
|
||||
that body occupies a single line. In every other case we require the braces.
|
||||
This ensures that it is trivially easy to identify a single-*statement* loop:
|
||||
each has only one *line* in its body.
|
||||
|
||||
Omitting braces with a single-line body is fine:
|
||||
|
||||
while (expr)
|
||||
single_line_stmt ();
|
||||
|
||||
However, the moment your loop/if/else body extends onto a second line,
|
||||
for whatever reason (even if it's just an added comment), then you should
|
||||
add braces. Otherwise, it would be too easy to insert a statement just
|
||||
before that comment (without adding braces), thinking it is already a
|
||||
multi-statement loop:
|
||||
|
||||
while (true)
|
||||
/* comment... */ // BAD: multi-line body without braces
|
||||
single_line_stmt ();
|
||||
|
||||
Do this instead:
|
||||
|
||||
while (true)
|
||||
{ /* Always put braces around a multi-line body. */
|
||||
/* explanation... */
|
||||
single_line_stmt ();
|
||||
}
|
||||
|
||||
There is one exception: when the second body line is not at the same
|
||||
indentation level as the first body line.
|
||||
|
||||
if (expr)
|
||||
error (0, 0, _("a diagnostic that would make this line"
|
||||
" extend past the 80-column limit"));
|
||||
|
||||
It is safe to omit the braces in the code above, since the
|
||||
further-indented second body line makes it obvious that this is still
|
||||
a single-statement body.
|
||||
|
||||
To reiterate, don't do this:
|
||||
|
||||
if (expr)
|
||||
while (expr_2) // BAD: multi-line body without braces
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
Do this, instead:
|
||||
|
||||
if (expr)
|
||||
{
|
||||
while (expr_2)
|
||||
{
|
||||
...
|
||||
}
|
||||
}
|
||||
|
||||
However, there is one exception in the other direction, when even a
|
||||
one-line block should have braces. That occurs when that one-line,
|
||||
brace-less block is an "else" block, and the corresponding "then" block
|
||||
*does* use braces. In that case, either put braces around the "else"
|
||||
block, or negate the "if"-condition and swap the bodies, putting the
|
||||
one-line block first and making the longer, multi-line block be the
|
||||
"else" block.
|
||||
|
||||
if (expr)
|
||||
{
|
||||
...
|
||||
...
|
||||
}
|
||||
else
|
||||
x = y; // BAD: braceless "else" with braced "then"
|
||||
|
||||
This is preferred, especially when the multi-line body is more than a
|
||||
few lines long, because it is easier to read and grasp the semantics of
|
||||
an if-then-else block when the simpler block occurs first, rather than
|
||||
after the more involved block:
|
||||
|
||||
if (!expr)
|
||||
x = y; /* more readable */
|
||||
else
|
||||
{
|
||||
...
|
||||
...
|
||||
}
|
||||
|
||||
If you'd rather not negate the condition, then add braces:
|
||||
|
||||
if (expr)
|
||||
{
|
||||
...
|
||||
...
|
||||
}
|
||||
else
|
||||
{
|
||||
x = y;
|
||||
}
|
||||
|
||||
|
||||
Use SPACE-only indentation in all[*] files
|
||||
==========================================
|
||||
@@ -362,33 +248,18 @@ this code enables the right mode:
|
||||
(not (string-equal mode-name "Makefile")))
|
||||
(setq indent-tabs-mode nil))))
|
||||
|
||||
If you use vim (7+ compiled with autocommands), and coreutils working
|
||||
directory name also matches, add the following in ~/.vimrc:
|
||||
|
||||
" Set GNU style indentation, spaces instead of TABs
|
||||
function! CoreutilsIndent()
|
||||
" Check if 'coreutils' is part of the current working directory
|
||||
if match(getcwd(), "coreutils") > 0
|
||||
" The next 3 lines below set the GNU indentation
|
||||
setlocal cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1
|
||||
setlocal shiftwidth=2
|
||||
setlocal tabstop=8
|
||||
" Coreutils specific, expand TABs with spaces
|
||||
setlocal expandtab
|
||||
endif
|
||||
endfunction
|
||||
|
||||
autocmd BufEnter *.c,*.h call CoreutilsIndent()
|
||||
|
||||
[*] Makefile and ChangeLog files are exempt, of course.
|
||||
|
||||
[FIXME: suggest vim syntax to do same thing, if it can be done safely.
|
||||
Most distros now "set nomodeline" by default for a good reason. ]
|
||||
|
||||
|
||||
Send patches to the address listed in --help output
|
||||
===================================================
|
||||
Please follow the guidelines in the "Sending your patches." section of
|
||||
git's own SubmittingPatches:
|
||||
|
||||
https://github.com/git/git/blob/master/Documentation/SubmittingPatches
|
||||
http://git.kernel.org/?p=git/git.git;a=blob;f=Documentation/SubmittingPatches
|
||||
|
||||
|
||||
Add documentation
|
||||
@@ -405,7 +276,7 @@ active voice, not a passive one. I.e., say "print the frobnozzle",
|
||||
not "the frobnozzle will be printed".
|
||||
|
||||
Please add comments per the GNU Coding Standard:
|
||||
https://www.gnu.org/prep/standards/html_node/Comments.html
|
||||
http://www.gnu.org/prep/standards/html_node/Comments.html
|
||||
|
||||
|
||||
Minor syntactic preferences
|
||||
@@ -417,7 +288,7 @@ Minor syntactic preferences
|
||||
character ;-) ]
|
||||
In writing arithmetic comparisons, use "<" and "<=" rather than
|
||||
">" and ">=". For some justification, read this:
|
||||
http://www.gelato.unsw.edu.au/archives/git/0505/4507.html
|
||||
http://thread.gmane.org/gmane.comp.version-control.git/3903/focus=4126
|
||||
|
||||
const placement:
|
||||
Write "Type const *var", not "const Type *var".
|
||||
@@ -439,21 +310,9 @@ Nearly every significant change must be accompanied by a test suite
|
||||
addition that exercises it. If you fix a bug, add at least one test that
|
||||
fails without the patch, but that succeeds once your patch is applied.
|
||||
If you add a feature, add tests to exercise as much of the new code
|
||||
as possible. If you add a new test file (as opposed to adding a test to
|
||||
an existing test file) add the new test file to 'tests/local.mk'.
|
||||
Note to run tests/misc/new-test in isolation you can do:
|
||||
as possible. Note to run tests/misc/newtest in isolation you can do:
|
||||
|
||||
make check TESTS=tests/misc/new-test SUBDIRS=. VERBOSE=yes
|
||||
|
||||
Variables that are significant for tests with their default values are:
|
||||
|
||||
VERBOSE=yes
|
||||
RUN_EXPENSIVE_TESTS=no
|
||||
RUN_VERY_EXPENSIVE_TESTS=no
|
||||
SHELL=/bin/sh
|
||||
NON_ROOT_USERNAME=nobody
|
||||
NON_ROOT_GID=$(id -g $NON_ROOT_USERNAME)
|
||||
COREUTILS_GROUPS=$(id -G)
|
||||
(cd tests && make check TESTS=misc/newtest VERBOSE=yes)
|
||||
|
||||
There are hundreds of tests in the tests/ directories. You can use
|
||||
tests/sample-test as a template, or one of the various Perl-based ones
|
||||
@@ -479,18 +338,18 @@ The forms to choose from are in gnulib's doc/Copyright/ directory.
|
||||
If you want to assign a single change, you should use the file,
|
||||
doc/Copyright/request-assign.changes:
|
||||
|
||||
https://www.gnu.org/software/gnulib/Copyright/request-assign.changes
|
||||
http://git.sv.gnu.org/gitweb/?p=gnulib.git;a=blob;f=doc/Copyright/request-assign.changes;hb=HEAD
|
||||
|
||||
If you would like to assign past and future contributions to a project,
|
||||
you'd use doc/Copyright/request-assign.future:
|
||||
|
||||
https://www.gnu.org/software/gnulib/Copyright/request-assign.future
|
||||
http://git.sv.gnu.org/gitweb/?p=gnulib.git;a=blob;f=doc/Copyright/request-assign.future;hb=HEAD
|
||||
|
||||
You may make assignments for up to four projects at a time.
|
||||
|
||||
In case you're wondering why we bother with all of this, read this:
|
||||
|
||||
https://www.gnu.org/licenses/why-assign.html
|
||||
http://www.gnu.org/licenses/why-assign.html
|
||||
|
||||
|
||||
Run "make syntax-check", or even "make distcheck"
|
||||
@@ -508,8 +367,10 @@ versions of gcc and the linux kernel, and modern GNU tools.
|
||||
Ensure that your changes are indented properly.
|
||||
===============================================
|
||||
Format the code the way GNU indent does.
|
||||
Filtering most source files through "indent --no-tabs" should
|
||||
induce no change in indentation. Try not to add any more.
|
||||
In a file with the "indent-tabs-mode: nil" directive at the end,
|
||||
running "indent --no-tabs" should induce no change.
|
||||
With other files, there will be some existing differences.
|
||||
Try not to add any more.
|
||||
|
||||
|
||||
Avoid trailing white space
|
||||
@@ -522,11 +383,13 @@ Do not add any more trailing blanks anywhere. While "make syntax-check"
|
||||
will alert you if you slip up, it's better to nip any problem in the
|
||||
bud, as you're typing. A good way to help you adapt to this rule is
|
||||
to configure your editor to highlight any offending characters in the
|
||||
files you edit. If you use Emacs, customize its font-lock mode
|
||||
or use its WhiteSpace mode:
|
||||
files you edit. If you use Emacs, customize its font-lock mode (FIXME:
|
||||
provide more detail) or try one of its whitespace packages. This appears
|
||||
to be the one that will end up in emacs 23:
|
||||
|
||||
https://www.emacswiki.org/emacs/WhiteSpace
|
||||
http://www.emacswiki.org/emacs/WhiteSpace
|
||||
|
||||
[that page says its version also works with emacs 21 and 22]
|
||||
If you use vim, add this to ~/.vimrc:
|
||||
|
||||
let c_space_errors=1
|
||||
@@ -600,27 +463,29 @@ option is always to improve tests. You never know what you might
|
||||
uncover when you improve test coverage, and even if you don't find
|
||||
any bugs your contribution is sure to be appreciated.
|
||||
|
||||
A good way to quickly assess current test coverage, for standard
|
||||
and root only tests, is to follow these steps (requires lcov to be installed):
|
||||
A good way to quickly assess current test coverage is to use "lcov"
|
||||
to generate HTML coverage reports. Follow these steps:
|
||||
|
||||
# Do a standard run as the current user
|
||||
make -j$(nproc) coverage
|
||||
# configure with coverage information
|
||||
./configure CFLAGS="-g -fprofile-arcs -ftest-coverage"
|
||||
make
|
||||
# run whatever tests you want, i.e.:
|
||||
make check
|
||||
# run lcov
|
||||
lcov -t coreutils -q -d lib -b lib -o lib.lcov -c
|
||||
lcov -t coreutils -q -d src -b src -o src.lcov -c
|
||||
# generate HTML from the output
|
||||
genhtml -p `pwd` -t coreutils -q --output-directory lcov-html *.lcov
|
||||
|
||||
# Add the root only tests
|
||||
sudo make -j$(nproc) build-coverage NON_ROOT_USERNAME=$USER SUBDIRS=.
|
||||
|
||||
# Generate the report with the combined results
|
||||
make gen-coverage
|
||||
|
||||
# view the HTML report:
|
||||
xdg-open doc/coverage/index.html
|
||||
Then just open the index.html file (in the generated lcov-html directory)
|
||||
in your favorite web browser.
|
||||
|
||||
========================================================================
|
||||
Copyright (C) 2009-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.3 or
|
||||
under the terms of the GNU Free Documentation License, Version 1.2 or
|
||||
any later version published by the Free Software Foundation; with no
|
||||
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
|
||||
Texts. A copy of the license is included in the "GNU Free
|
||||
Documentation License" file as part of this distribution.
|
||||
Texts. A copy of the license is included in the ``GNU Free
|
||||
Documentation License'' file as part of this distribution.
|
||||
|
||||
202
Makefile.am
202
Makefile.am
@@ -1,6 +1,6 @@
|
||||
# Make coreutils. -*-Makefile-*-
|
||||
|
||||
# Copyright (C) 1990-2024 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1990, 1993-2009 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
|
||||
@@ -13,64 +13,84 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
ALL_RECURSIVE_TARGETS =
|
||||
|
||||
SUBDIRS = po . gnulib-tests
|
||||
SUBDIRS = lib src doc man po tests gnulib-tests
|
||||
|
||||
changelog_etc = \
|
||||
ChangeLog-2005 \
|
||||
ChangeLog-2006 \
|
||||
ChangeLog-2007 \
|
||||
ChangeLog-2008 \
|
||||
build-aux/ChangeLog-2007 \
|
||||
build-aux/update-copyright \
|
||||
doc/ChangeLog-2007 \
|
||||
lib/ChangeLog-2007 \
|
||||
m4/ChangeLog-2007 \
|
||||
old/fileutils/ChangeLog \
|
||||
old/fileutils/ChangeLog-1997 \
|
||||
old/fileutils/NEWS \
|
||||
old/sh-utils/ChangeLog \
|
||||
old/sh-utils/ChangeLog.0 \
|
||||
old/sh-utils/NEWS \
|
||||
old/textutils/ChangeLog \
|
||||
old/textutils/NEWS \
|
||||
po/ChangeLog-2007
|
||||
|
||||
syntax_check_exceptions = \
|
||||
.x-sc_GPL_version \
|
||||
.x-sc_error_message_uppercase \
|
||||
.x-sc_file_system \
|
||||
.x-sc_obsolete_symbols \
|
||||
.x-sc_po_check \
|
||||
.x-sc_program_name \
|
||||
.x-sc_prohibit_atoi_atof \
|
||||
.x-sc_prohibit_stat_st_blocks \
|
||||
.x-sc_prohibit_strcmp \
|
||||
.x-sc_prohibit_tab_based_indentation \
|
||||
.x-sc_require_config_h \
|
||||
.x-sc_require_config_h_first \
|
||||
.x-sc_space_tab \
|
||||
.x-sc_sun_os_names \
|
||||
.x-sc_system_h_headers \
|
||||
.x-sc_trailing_blank \
|
||||
.x-sc_unmarked_diagnostics \
|
||||
.x-sc_useless_cpp_parens
|
||||
|
||||
EXTRA_DIST = \
|
||||
.mailmap \
|
||||
$(changelog_etc) \
|
||||
$(syntax_check_exceptions) \
|
||||
.prev-version \
|
||||
.version \
|
||||
.vg-suppressions \
|
||||
README-install \
|
||||
THANKS.in \
|
||||
THANKS-to-translators \
|
||||
THANKStt.in \
|
||||
bootstrap \
|
||||
bootstrap.conf \
|
||||
build-aux/gen-lists-of-programs.sh \
|
||||
build-aux/gen-single-binary.sh \
|
||||
build-aux/cvsu \
|
||||
cfg.mk \
|
||||
dist-check.mk \
|
||||
maint.mk \
|
||||
tests/GNUmakefile \
|
||||
thanks-gen
|
||||
gl/modules/getloadavg.diff \
|
||||
maint.mk
|
||||
|
||||
gen_progs_lists = $(top_srcdir)/build-aux/gen-lists-of-programs.sh
|
||||
gen_single_binary = $(top_srcdir)/build-aux/gen-single-binary.sh
|
||||
|
||||
# Keep these in sync with bootstrap.conf:bootstrap_post_import_hook().
|
||||
# Use '$(top_srcdir)/m4' and '$(srcdir)/src' for the benefit of non-GNU
|
||||
# makes: it is with those directories that 'cu-progs.m4' and 'cu-progs.mk'
|
||||
# appear in our dependencies.
|
||||
$(top_srcdir)/m4/cu-progs.m4: $(gen_progs_lists)
|
||||
$(AM_V_GEN)rm -f $@ $@-t \
|
||||
&& $(SHELL) $(gen_progs_lists) --autoconf >$@-t \
|
||||
&& chmod a-w $@-t && mv -f $@-t $@
|
||||
$(srcdir)/src/cu-progs.mk: $(gen_progs_lists)
|
||||
$(AM_V_GEN)rm -f $@ $@-t \
|
||||
&& $(SHELL) $(gen_progs_lists) --automake >$@-t \
|
||||
&& chmod a-w $@-t && mv -f $@-t $@
|
||||
$(srcdir)/src/single-binary.mk: $(gen_single_binary) $(srcdir)/src/local.mk
|
||||
$(AM_V_GEN)rm -f $@ $@-t \
|
||||
&& $(SHELL) $(gen_single_binary) $(srcdir)/src/local.mk >$@-t \
|
||||
&& chmod a-w $@-t && mv -f $@-t $@
|
||||
ALL_RECURSIVE_TARGETS += install-root
|
||||
install-root:
|
||||
cd src && $(MAKE) $@
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
# Shortcut targets to make it easier to run (very) expensive tests.
|
||||
check-expensive:
|
||||
$(MAKE) check RUN_EXPENSIVE_TESTS=yes
|
||||
check-very-expensive:
|
||||
$(MAKE) check-expensive RUN_VERY_EXPENSIVE_TESTS=yes
|
||||
# Some tests always need root privileges, others need them only sometimes.
|
||||
ALL_RECURSIVE_TARGETS += check-root
|
||||
check-root:
|
||||
cd tests && $(MAKE) $@ SUBDIRS=
|
||||
|
||||
# Just prior to distribution, ...
|
||||
# transform the automake-generated rule that runs 'rm -f rm'.
|
||||
# transform the automake-generated rule that runs `rm -f rm'.
|
||||
# On some systems, that command would fail with a diagnostic like
|
||||
# "rm: cannot unlink 'rm': Text file busy" when '.' appears so early
|
||||
# in the shell's search path that running 'rm' would run the 'rm'
|
||||
# `rm: cannot unlink `rm': Text file busy' when `.' appears so early
|
||||
# in the shell's search path that running `rm' would run the `rm'
|
||||
# executable in the current directory.
|
||||
# Similarly, adjust the clean-binPROGRAMS rule.
|
||||
rm_subst = \
|
||||
@@ -80,34 +100,22 @@ BUILT_SOURCES = .version
|
||||
.version:
|
||||
$(AM_V_GEN)echo $(VERSION) > $@-t && mv $@-t $@
|
||||
|
||||
# Have no read-only files in the tarball to allow easy removal.
|
||||
# Have .tarball-version based versions only in tarball builds.
|
||||
# Have .timestamp based dates only in tarball builds.
|
||||
# Arrange so that .tarball-version appears only in the distribution
|
||||
# tarball, and never in a checked-out repository.
|
||||
# The perl substitution is to change some key uses of "rm" to "/bin/rm".
|
||||
# See the rm_subst comment for details.
|
||||
# The touch avoids a subtle, spurious "make distcheck" failure.
|
||||
dist-hook: gen-ChangeLog
|
||||
$(AM_V_GEN)chmod -R +rw $(distdir)
|
||||
$(AM_V_GEN)echo $(VERSION) > $(distdir)/.tarball-version
|
||||
$(AM_V_GEN)date +%s > $(distdir)/.timestamp
|
||||
$(AM_V_at)perl -pi -e '$(rm_subst)' $(distdir)/Makefile.in
|
||||
$(AM_V_at)touch $(distdir)/doc/constants.texi \
|
||||
$(distdir)/doc/coreutils.info
|
||||
$(AM_V_at)perl -pi -e '$(rm_subst)' $(distdir)/src/Makefile.in
|
||||
|
||||
gen_start_ver = 8.31
|
||||
gen_start_date = 2008-02-08
|
||||
.PHONY: gen-ChangeLog
|
||||
gen-ChangeLog:
|
||||
$(AM_V_GEN)if test -d .git; then \
|
||||
log_fix="$(srcdir)/build-aux/git-log-fix"; \
|
||||
test -e "$$log_fix" \
|
||||
&& amend_git_log="--amend=$$log_fix" \
|
||||
|| amend_git_log=; \
|
||||
$(top_srcdir)/build-aux/gitlog-to-changelog $$amend_git_log \
|
||||
-- v$(gen_start_ver)~.. > $(distdir)/cl-t && \
|
||||
{ printf '\n\nSee the source repo for older entries\n' \
|
||||
>> $(distdir)/cl-t && \
|
||||
rm -f $(distdir)/ChangeLog && \
|
||||
mv $(distdir)/cl-t $(distdir)/ChangeLog; } \
|
||||
$(top_srcdir)/build-aux/gitlog-to-changelog \
|
||||
--since=$(gen_start_date) > $(distdir)/cl-t; \
|
||||
rm -f $(distdir)/ChangeLog; \
|
||||
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
|
||||
fi
|
||||
|
||||
ALL_RECURSIVE_TARGETS += distcheck-hook
|
||||
@@ -121,7 +129,7 @@ THANKS-to-translators: po/LINGUAS THANKStt.in
|
||||
$(AM_V_GEN)( \
|
||||
cat $(srcdir)/THANKStt.in; \
|
||||
for lang in `cat $(srcdir)/po/LINGUAS`; do \
|
||||
echo https://translationproject.org/team/$$lang.html; \
|
||||
echo http://translationproject.org/team/$$lang.html; \
|
||||
done; \
|
||||
) > $@-tmp && mv $@-tmp $@
|
||||
|
||||
@@ -138,79 +146,3 @@ check-ls-dircolors:
|
||||
|sed -n '/^ *"/p'|tr , '\n'|sed 's/^ *//' \
|
||||
|sed -n 's/^"\(..\)"/\1/p'|sort -u); \
|
||||
test "$$dc" = "$$ls"
|
||||
|
||||
# Sort in traditional ASCII order, regardless of the current locale;
|
||||
# otherwise we may get into trouble with distinct strings that the
|
||||
# current locale considers to be equal.
|
||||
ASSORT = LC_ALL=C sort
|
||||
|
||||
# Extract all lines up to the first one starting with "##".
|
||||
prologue = perl -ne '/^\#\#/ and exit; print' $(srcdir)/THANKS.in
|
||||
|
||||
# FIXME: avoid dependency to build our own 'sort' for 'make dist' ...
|
||||
# when common platforms have a functional case-folding implementation:
|
||||
# $ test 'abácad' = "$(printf '%s\n' 'ab' 'ác' 'ad' \
|
||||
# | LC_ALL=en_US.UTF-8 sort -f \
|
||||
# | tr -d '\n')" && echo GOOD || echo BAD
|
||||
# Note we don't enable case folding (-f) in the sort below, due to bugs
|
||||
# in the I18N patch used in many distros (as of 2015). Also using our
|
||||
# own src/sort here would induce awkward dependencies for `make dist`.
|
||||
THANKS: THANKS.in Makefile.am .mailmap thanks-gen .version
|
||||
$(AM_V_GEN)rm -f $@-t $@; \
|
||||
{ \
|
||||
$(prologue); echo; \
|
||||
{ perl -ne '/^$$/.../^$$/ and !/^$$/ and s/ +/\0/ and print' \
|
||||
$(srcdir)/THANKS.in; \
|
||||
git log --pretty=format:'%aN%x00%aE' \
|
||||
| $(ASSORT) -u; \
|
||||
} | $(srcdir)/thanks-gen \
|
||||
| LC_ALL=en_US.UTF-8 sort -k1,1; \
|
||||
echo; \
|
||||
printf ';; %s\n' 'Local Variables:' 'coding: utf-8' End:; \
|
||||
} > $@-t && chmod a-w $@-t && mv $@-t $@
|
||||
|
||||
# Some of our git hook scripts are supposed to be identical to git's samples.
|
||||
# See if they are still in sync.
|
||||
.PHONY: check-git-hook-script-sync
|
||||
check-git-hook-script-sync:
|
||||
@fail=0; \
|
||||
t=$$(mktemp -d) \
|
||||
&& cd $$t && git init -q && cd .git/hooks \
|
||||
&& for i in pre-commit pre-applypatch applypatch-msg; do \
|
||||
diff $(abs_top_srcdir)/scripts/git-hooks/$$i $$i.sample \
|
||||
|| fail=1; \
|
||||
done; \
|
||||
rm -rf $$t; \
|
||||
test $$fail = 0
|
||||
|
||||
# If we are building a single-binary, create symlinks or shebangs for
|
||||
# the selected tools when installing.
|
||||
install-exec-hook:
|
||||
$(AM_V_at)ctrans=$$(printf coreutils | sed -e "$(transform)"); \
|
||||
for p in x $(single_binary_progs); do \
|
||||
test $$p = x && continue; \
|
||||
ptrans=$$(printf '%s' "$$p" | sed -e "$(transform)"); \
|
||||
rm -f $(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?; \
|
||||
if test "x$(single_binary_install_type)" = xshebangs; then \
|
||||
printf '#!%s --coreutils-prog-shebang=%s\n' \
|
||||
$(bindir)/$$ctrans$(EXEEXT) $$p \
|
||||
>$(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?; \
|
||||
chmod a+x,a-w $(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?;\
|
||||
else \
|
||||
$(LN_S) -s $$ctrans$(EXEEXT) \
|
||||
$(DESTDIR)$(bindir)/$$ptrans$(EXEEXT) || exit $$?; \
|
||||
fi \
|
||||
done
|
||||
|
||||
noinst_LIBRARIES =
|
||||
MOSTLYCLEANFILES =
|
||||
CLEANFILES =
|
||||
MOSTLYCLEANDIRS =
|
||||
|
||||
AM_CPPFLAGS = -Ilib -I$(top_srcdir)/lib -Isrc -I$(top_srcdir)/src
|
||||
|
||||
include $(top_srcdir)/lib/local.mk
|
||||
include $(top_srcdir)/src/local.mk
|
||||
include $(top_srcdir)/doc/local.mk
|
||||
include $(top_srcdir)/man/local.mk
|
||||
include $(top_srcdir)/tests/local.mk
|
||||
|
||||
206
README
206
README
@@ -7,27 +7,28 @@ arbitrary limits.
|
||||
|
||||
The programs that can be built with this package are:
|
||||
|
||||
[ arch b2sum base32 base64 basename basenc cat chcon chgrp chmod chown
|
||||
chroot cksum comm coreutils cp csplit cut date dd df dir dircolors dirname
|
||||
du echo env expand expr factor false fmt fold groups head hostid hostname
|
||||
id install join kill link ln logname ls md5sum mkdir mkfifo mknod mktemp
|
||||
mv nice nl nohup nproc numfmt od paste pathchk pinky pr printenv printf ptx
|
||||
pwd readlink realpath rm rmdir runcon seq sha1sum sha224sum sha256sum
|
||||
sha384sum sha512sum shred shuf sleep sort split stat stdbuf stty sum sync
|
||||
tac tail tee test timeout touch tr true truncate tsort tty uname unexpand
|
||||
uniq unlink uptime users vdir wc who whoami yes
|
||||
[ arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp
|
||||
csplit cut date dd df dir dircolors dirname du echo env expand expr
|
||||
factor false fmt fold groups head hostid hostname id install join kill
|
||||
link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup
|
||||
od paste pathchk pinky pr printenv printf ptx pwd readlink rm rmdir
|
||||
runcon seq sha1sum sha224sum sha256sum sha384sum sha512sum shred shuf
|
||||
sleep sort split stat stdbuf stty su sum sync tac tail tee test timeout
|
||||
touch tr true truncate tsort tty uname unexpand uniq unlink uptime users
|
||||
vdir wc who whoami yes
|
||||
|
||||
See the file NEWS for a list of major changes in the current release.
|
||||
|
||||
If you obtained this file as part of a "git clone", then see the
|
||||
README-hacking file. If this file came to you as part of a tar archive,
|
||||
then see the file INSTALL for general compilation and installation
|
||||
instructions, or README-install for system and coreutils specific instructions.
|
||||
then see the file INSTALL for compilation and installation instructions.
|
||||
|
||||
Like the rest of the GNU system, these programs mostly conform to
|
||||
POSIX, with BSD and other extensions. For closer conformance, or
|
||||
conformance to a particular POSIX version, set the POSIXLY_CORRECT
|
||||
and the _POSIX2_VERSION environment variables, as described in
|
||||
These programs are intended to conform to POSIX (with BSD and other
|
||||
extensions), like the rest of the GNU system. By default they conform
|
||||
to older POSIX (1003.2-1992), and therefore support obsolete usages
|
||||
like "head -10" and "chown owner.group file". This default is
|
||||
overridden at build-time by the value of <unistd.h>'s _POSIX2_VERSION
|
||||
macro, and this in turn can be overridden at runtime as described in
|
||||
the documentation under "Standards conformance".
|
||||
|
||||
The ls, dir, and vdir commands are all separate executables instead of
|
||||
@@ -58,47 +59,123 @@ files (man/*.x) are welcome. However, the authoritative documentation
|
||||
is in texinfo form in the doc directory.
|
||||
|
||||
|
||||
***************
|
||||
Feature requests:
|
||||
---------------
|
||||
*****************************************
|
||||
On Mac OS X 10.5.1 (Darwin 9.1), test failure
|
||||
-----------------------------------------
|
||||
|
||||
If you would like to add a new feature, please try to get some sort of
|
||||
consensus that it is a worthwhile change. One way to do that is to send
|
||||
mail to coreutils@gnu.org including as much description and justification
|
||||
as you can. Based on the feedback that generates, you may be able to
|
||||
convince us that it's worth adding. Please also consult the list of
|
||||
previously discussed but ultimately rejected feature requests at:
|
||||
https://www.gnu.org/software/coreutils/rejected_requests.html
|
||||
Mac OS X 10.5.1 (Darwin 9.1) provides only partial (and incompatible)
|
||||
ACL support, so although "./configure && make" succeeds, "make check"
|
||||
exposes numerous failures. The solution is to turn off ACL support
|
||||
manually via "./configure --disable-acl". For details, see
|
||||
<http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/12292/focus=12318>.
|
||||
|
||||
|
||||
*****************************************
|
||||
Test failure with NLS and gettext <= 0.17
|
||||
-----------------------------------------
|
||||
|
||||
Due to a conflict between libintl.h and gnulib's new xprintf module,
|
||||
when you configure with NLS support, and with a gettext installation
|
||||
older than 0.17.1 (not yet released, at the time of this writing),
|
||||
then some tests fail, at least on NetBSD 1.6. To work around it in
|
||||
the mean time, you can configure with --disable-nls. For details,
|
||||
see <http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/12015/>.
|
||||
|
||||
|
||||
***********************
|
||||
Pre-C99 build failure
|
||||
-----------------------
|
||||
|
||||
There is a new, implicit build requirement:
|
||||
To build the coreutils from source, you should have a C99-conforming
|
||||
compiler, due to the use of declarations after non-declaration statements
|
||||
in several files in src/. There is code in configure to find and, if
|
||||
possible, enable an appropriate compiler. However, if configure doesn't
|
||||
find a C99 compiler, it continues nonetheless, and your build will fail.
|
||||
If that happens, simply[*] apply the included patch using the following
|
||||
command, and then run make again:
|
||||
|
||||
cd src && patch < c99-to-c89.diff
|
||||
|
||||
[*] however, as of coreutils-7.1, the "c99-to-c89.diff" file is no longer
|
||||
maintained, so even if the patches still apply, the result will be an
|
||||
incomplete conversion. It's been 10 years. Get a decent compiler! ;-)
|
||||
|
||||
|
||||
***********************
|
||||
HPUX 11.x build failure
|
||||
-----------------------
|
||||
|
||||
A known problem exists when compiling on HPUX on both hppa and ia64
|
||||
in 64-bit mode (i.e. +DD64) on HP-UX 11.0, 11.11, and 11.23. This
|
||||
is not due to a bug in the package but instead due to a bug in the
|
||||
system header file which breaks things in 64-bit mode. The default
|
||||
compilation mode is 32-bit and the software compiles fine using the
|
||||
default mode. To build this software in 64-bit mode you will need
|
||||
to fix the system /usr/include/inttypes.h header file. After
|
||||
correcting that file the software also compiles fine in 64-bit mode.
|
||||
Here is one possible patch to correct the problem:
|
||||
|
||||
--- /usr/include/inttypes.h.orig Thu May 30 01:00:00 1996
|
||||
+++ /usr/include/inttypes.h Sun Mar 23 00:20:36 2003
|
||||
@@ -489 +489 @@
|
||||
-#ifndef __STDC_32_MODE__
|
||||
+#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:
|
||||
----------------------
|
||||
|
||||
If you run the tests as root, note that a few of them create files
|
||||
and/or run programs as a non-root user, `nobody' by default.
|
||||
If you want to use some other non-root username, specify it via
|
||||
the NON_ROOT_USERNAME environment variable. Depending on the
|
||||
permissions with which the working directories have been created,
|
||||
using `nobody' may fail, because that user won't have the required
|
||||
read and write access to the build and test directories.
|
||||
I find that it is best to unpack and build as a non-privileged
|
||||
user, and then to run the following command as that user in order
|
||||
to run the privilege-requiring tests:
|
||||
|
||||
sudo env PATH="$PATH" NON_ROOT_USERNAME=$USER make -k check-root
|
||||
|
||||
If you can run the tests as root, please do so and report any
|
||||
problems. We get much less test coverage in that mode, and it's
|
||||
arguably more important that these tools work well when run by
|
||||
root than when run by less privileged users.
|
||||
|
||||
|
||||
***************
|
||||
Reporting bugs:
|
||||
---------------
|
||||
|
||||
Send bug reports, questions, comments, etc. to bug-coreutils@gnu.org.
|
||||
To suggest a patch, see the files README-hacking and HACKING for tips.
|
||||
|
||||
All of these programs except 'test' recognize the '--version' option.
|
||||
When reporting bugs, please include in the subject line both the package
|
||||
name/version and the name of the program for which you found a problem.
|
||||
|
||||
If you have a problem with 'sort', try running 'sort --debug', as it
|
||||
can often help find and fix problems without having to wait for an
|
||||
answer to a bug report. If the debug output does not suffice to fix
|
||||
the problem on your own, please compress and attach it to the rest of
|
||||
your bug report.
|
||||
|
||||
IMPORTANT: if you take the time to report a test failure,
|
||||
please be sure to include the output of running 'make check'
|
||||
please be sure to include the output of running `make check'
|
||||
in verbose mode for each failing test. For example,
|
||||
if the test that fails is tests/df/df-P.sh, then you would
|
||||
if the test that fails is tests/misc/df, then you would
|
||||
run this command:
|
||||
|
||||
make check TESTS=tests/df/df-P.sh VERBOSE=yes SUBDIRS=. >> log 2>&1
|
||||
(cd tests && make check TESTS=misc/df VERBOSE=yes) >> log 2>&1
|
||||
|
||||
For some tests, particularly perl tests, you can get even more detail by adding
|
||||
DEBUG=yes. Then include the contents of the file 'log' in your bug report.
|
||||
For some tests, you can get even more detail by adding DEBUG=yes.
|
||||
Then include the contents of the file `log' in your bug report.
|
||||
|
||||
Send bug reports, questions, comments, etc. to bug-coreutils@gnu.org.
|
||||
If you would like to suggest a patch, see the files README-hacking
|
||||
and HACKING for tips.
|
||||
|
||||
***************************************
|
||||
|
||||
@@ -106,7 +183,7 @@ There are many tests, but nowhere near as many as we need.
|
||||
Additions and corrections are very welcome.
|
||||
|
||||
If you see a problem that you've already reported, feel free to re-report
|
||||
it -- it won't bother us to get a reminder. Besides, the more messages we
|
||||
it -- it won't bother me to get a reminder. Besides, the more messages I
|
||||
get regarding a particular problem the sooner it'll be fixed -- usually.
|
||||
If you sent a complete patch and, after a couple weeks you haven't
|
||||
received any acknowledgement, please ping us. A complete patch includes
|
||||
@@ -118,24 +195,45 @@ reproduce whatever problem prompted it. Plus, you'll earn lots of
|
||||
karma if you include a test case to exercise any bug(s) you fix.
|
||||
Here are instructions for checking out the latest development sources:
|
||||
|
||||
https://savannah.gnu.org/git/?group=coreutils
|
||||
http://savannah.gnu.org/git/?group=coreutils
|
||||
|
||||
If your patch adds a new feature, please try to get some sort of consensus
|
||||
that it is a worthwhile change. One way to do that is to send mail to
|
||||
bug-coreutils@gnu.org including as much description and justification
|
||||
as you can. Based on the feedback that generates, you may be able to
|
||||
convince us that it's worth adding.
|
||||
|
||||
|
||||
WARNING: Now that we use the ./bootstrap script, you should not run
|
||||
autoreconf manually. Doing that will overwrite essential source files
|
||||
with older versions, which may make the package unbuildable or introduce
|
||||
subtle bugs.
|
||||
|
||||
|
||||
WARNING: If you modify files like configure.in, m4/*.m4, aclocal.m4,
|
||||
or any Makefile.am, then don't be surprised if what gets regenerated no
|
||||
longer works. To make things work, you'll have to be using appropriate
|
||||
versions of the tools listed in bootstrap.conf's buildreq string.
|
||||
|
||||
All of these programs except `test' recognize the `--version' option.
|
||||
When reporting bugs, please include in the subject line both the package
|
||||
name/version and the name of the program for which you found a problem.
|
||||
|
||||
For general documentation on the coding and usage standards
|
||||
this distribution follows, see the GNU Coding Standards at:
|
||||
https://www.gnu.org/prep/standards/
|
||||
this distribution follows, see the GNU Coding Standards,
|
||||
http://www.gnu.org/prep/standards_toc.html.
|
||||
|
||||
For any copyright year range specified as YYYY-ZZZZ in this package
|
||||
note that the range specifies every single year in that closed interval.
|
||||
Mail suggestions and bug reports for these programs to
|
||||
the address on the last line of --help output.
|
||||
|
||||
Please see the file COPYING for copying conditions.
|
||||
|
||||
========================================================================
|
||||
|
||||
Copyright (C) 1998-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 1998, 2002-2009 Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.3 or
|
||||
under the terms of the GNU Free Documentation License, Version 1.2 or
|
||||
any later version published by the Free Software Foundation; with no
|
||||
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
|
||||
Texts. A copy of the license is included in the "GNU Free
|
||||
Documentation License" file as part of this distribution.
|
||||
Texts. A copy of the license is included in the ``GNU Free
|
||||
Documentation License'' file as part of this distribution.
|
||||
|
||||
@@ -1,49 +1,32 @@
|
||||
Building from a Git repository -*- outline -*-
|
||||
-*- outline -*-
|
||||
|
||||
These notes intend to help people working on the checked-out sources.
|
||||
These requirements do not apply when building from a distribution tarball.
|
||||
If this package has a file HACKING, please also read that file for
|
||||
more detailed contribution guidelines.
|
||||
See also HACKING for more detailed coreutils contribution guidelines.
|
||||
|
||||
* Requirements
|
||||
|
||||
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
|
||||
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.
|
||||
(The requirements to build from a release are much less and are just
|
||||
the requirements of the standard './configure && make' procedure.)
|
||||
Note the requirements to build the released archive are much less and
|
||||
are just the requirements of the standard ./configure && make procedure.
|
||||
Specific development tools and versions will be checked for and listed by
|
||||
the bootstrap script. See README-prereq for specific notes on obtaining
|
||||
these prerequisite tools.
|
||||
|
||||
Valgrind <https://valgrind.org/> is also highly recommended, if
|
||||
Valgrind supports your architecture. See also README-valgrind
|
||||
(if present).
|
||||
Valgrind <http://valgrind.org/> is also highly recommended, if
|
||||
Valgrind supports your architecture. See also README-valgrind.
|
||||
|
||||
While building from a just-cloned source tree may require installing a
|
||||
few prerequisites, later, a plain 'git pull && make' typically suffices.
|
||||
few prerequisites, later, a plain `git pull && make' should be sufficient.
|
||||
|
||||
* First Git checkout
|
||||
* First GIT checkout
|
||||
|
||||
You can get a copy of the source repository like this:
|
||||
|
||||
$ git clone https://git.savannah.gnu.org/git/<packagename>
|
||||
$ cd <packagename>
|
||||
|
||||
where '<packagename>' stands for 'coreutils' or whatever other package
|
||||
you are building.
|
||||
|
||||
To use the most-recent Gnulib (as opposed to the Gnulib version that
|
||||
the package last synchronized to), do this next:
|
||||
|
||||
$ git submodule foreach git pull origin master
|
||||
$ git commit -m 'build: update gnulib submodule to latest' gnulib
|
||||
|
||||
As an optional step, if you already have a copy of the Gnulib Git
|
||||
repository, then you can use it as a reference to reduce download
|
||||
time and file system space requirements:
|
||||
|
||||
$ export GNULIB_SRCDIR=/path/to/gnulib
|
||||
$ git clone git://git.sv.gnu.org/coreutils
|
||||
$ cd coreutils
|
||||
|
||||
The next step is to get and check other files needed to build,
|
||||
which are extracted from other source packages:
|
||||
@@ -52,12 +35,12 @@ which are extracted from other source packages:
|
||||
|
||||
And there you are! Just
|
||||
|
||||
$ ./configure --quiet #[--disable-gcc-warnings] [*]
|
||||
$ ./configure #[--enable-gcc-warnings]
|
||||
$ make
|
||||
$ make check
|
||||
|
||||
At this point, there should be no difference between your local copy,
|
||||
and the Git master copy:
|
||||
and the GIT master copy:
|
||||
|
||||
$ git diff
|
||||
|
||||
@@ -65,43 +48,9 @@ should output no difference.
|
||||
|
||||
Enjoy!
|
||||
|
||||
[*] By default GCC warnings are enabled when building from Git.
|
||||
If you get warnings with recent GCC and Glibc with default
|
||||
configure-time options, please report the warnings to the bug
|
||||
reporting address of this package instead of to bug-gnulib,
|
||||
even if the problem seems to originate in a Gnulib-provided file.
|
||||
If you get warnings with other configurations, you can run
|
||||
'./configure --disable-gcc-warnings' or 'make WERROR_CFLAGS='
|
||||
to build quietly or verbosely, respectively.
|
||||
-----
|
||||
|
||||
* Submitting patches
|
||||
|
||||
If you develop a fix or a new feature, please send it to the
|
||||
appropriate bug-reporting address as reported by the --help option of
|
||||
each program. One way to do this is to use vc-dwim
|
||||
<https://www.gnu.org/software/vc-dwim/>), as follows.
|
||||
|
||||
Run the command "vc-dwim --initialize" from the top-level directory
|
||||
of this package's git-cloned hierarchy.
|
||||
|
||||
Edit the (empty) ChangeLog file that this command creates, creating a
|
||||
properly-formatted entry according to the GNU coding standards
|
||||
<https://www.gnu.org/prep/standards/html_node/Change-Logs.html>.
|
||||
|
||||
Make your changes.
|
||||
|
||||
Run the command "vc-dwim" and make sure its output (the diff of all
|
||||
your changes) looks good.
|
||||
|
||||
Run "vc-dwim --commit".
|
||||
|
||||
Run the command "git format-patch --stdout -1", and email its output
|
||||
in, using the output's subject line.
|
||||
|
||||
-----
|
||||
|
||||
Copyright (C) 2002-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002-2009 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
|
||||
@@ -114,4 +63,4 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
111
README-install
111
README-install
@@ -1,111 +0,0 @@
|
||||
Please see the file INSTALL for generic build and installation instructions.
|
||||
This file details coreutils and system specific build instructions.
|
||||
|
||||
|
||||
*********************
|
||||
Pre-C99 build failure
|
||||
---------------------
|
||||
|
||||
In 2009 we added this requirement:
|
||||
To build the coreutils from source, you must have a C99-conforming
|
||||
compiler, due to the use of declarations after non-declaration statements
|
||||
in several files in src/. There is code in configure to find and, if
|
||||
possible, enable an appropriate compiler. However, if configure doesn't
|
||||
find a C99 compiler, it continues nonetheless, and your build will fail.
|
||||
There used to be a "c99-to-c89.diff" patch you could apply to convert
|
||||
to code that even an old pre-c99 compiler can handle, but it was too
|
||||
tedious to maintain, so has been removed.
|
||||
|
||||
|
||||
***********************
|
||||
HPUX 11.x build failure
|
||||
-----------------------
|
||||
|
||||
A known problem exists when compiling on HPUX on both hppa and ia64
|
||||
in 64-bit mode (i.e., +DD64) on HP-UX 11.0, 11.11, and 11.23. This
|
||||
is not due to a bug in the package but instead due to a bug in the
|
||||
system header file which breaks things in 64-bit mode. The default
|
||||
compilation mode is 32-bit and the software compiles fine using the
|
||||
default mode. To build this software in 64-bit mode you will need
|
||||
to fix the system /usr/include/inttypes.h header file. After
|
||||
correcting that file the software also compiles fine in 64-bit mode.
|
||||
Here is one possible patch to correct the problem:
|
||||
|
||||
--- /usr/include/inttypes.h.orig Thu May 30 01:00:00 1996
|
||||
+++ /usr/include/inttypes.h Sun Mar 23 00:20:36 2003
|
||||
@@ -489 +489 @@
|
||||
-#ifndef __STDC_32_MODE__
|
||||
+#ifndef __LP64__
|
||||
|
||||
|
||||
************************
|
||||
OSF/1 4.0d and AIX build failures
|
||||
------------------------
|
||||
|
||||
If you use /usr/bin/make on these systems, the build will fail due
|
||||
to the presence of the "[" target. OSF/1 make(1) appears to
|
||||
treat "[" as some syntax relating to locks, while AIX make(1)
|
||||
appears to skip the "[" target. To work around these issues
|
||||
the best solution is to use GNU make. Otherwise, simply remove
|
||||
all mention of "[$(EXEEXT)" from src/Makefile.
|
||||
|
||||
|
||||
************************
|
||||
32 bit time_t build failures
|
||||
------------------------
|
||||
|
||||
Although 32-bit builds fail if that forces time_t to be 32 bits, this
|
||||
can be fixed by using 64-bit builds. For example, on AIX where GCC
|
||||
defaults to 32 bits, one can use "./configure CC='gcc -maix64' AR='ar
|
||||
-X64'"; similarly, on Solaris one can configure with CC='gcc -m64'.
|
||||
If all else fails one can configure with --disable-year2038;
|
||||
however, this will mishandle timestamps after 2038, and please file
|
||||
bug reports for any such situations.
|
||||
|
||||
|
||||
*************************************************
|
||||
"make check" failure on IRIX 6.5 and Solaris <= 9
|
||||
-------------------------------------------------
|
||||
|
||||
Using the vendor make program to run "make check" fails on these two systems.
|
||||
If you want to run all of the tests there, use GNU make.
|
||||
|
||||
|
||||
|
||||
**********************
|
||||
Running tests as root:
|
||||
----------------------
|
||||
|
||||
If you run the tests as root, note that a few of them create files
|
||||
and/or run programs as a non-root user, 'nobody' by default.
|
||||
If you want to use some other non-root username, specify it via
|
||||
the NON_ROOT_USERNAME environment variable. Depending on the
|
||||
permissions with which the working directories have been created,
|
||||
using 'nobody' may fail, because that user won't have the required
|
||||
read and write access to the build and test directories.
|
||||
I find that it is best to unpack and build as a non-privileged
|
||||
user, and then to run the following command as that user in order
|
||||
to run the privilege-requiring tests:
|
||||
|
||||
sudo env PATH="$PATH" NON_ROOT_USERNAME=$USER make -k check-root
|
||||
|
||||
If you can run the tests as root, please do so and report any
|
||||
problems. We get much less test coverage in that mode, and it's
|
||||
arguably more important that these tools work well when run by
|
||||
root than when run by less privileged users.
|
||||
|
||||
|
||||
|
||||
**********************
|
||||
autotools considerations:
|
||||
----------------------
|
||||
|
||||
WARNING: Now that we use the ./bootstrap script, you should not run
|
||||
autoreconf manually. Doing that will overwrite essential source files
|
||||
with older versions, which may make the package unbuildable or introduce
|
||||
subtle bugs.
|
||||
|
||||
WARNING: If you modify files like configure.in, m4/*.m4, aclocal.m4,
|
||||
or any Makefile.am, then don't be surprised if what gets regenerated no
|
||||
longer works. To make things work, you'll have to be using appropriate
|
||||
versions of the tools listed in bootstrap.conf's buildreq string.
|
||||
@@ -1,13 +1,18 @@
|
||||
On 2002-09-01, the GNU fileutils, textutils, and sh-utils
|
||||
packages were merged into one, called the GNU coreutils.
|
||||
See https://www.gnu.org/software/coreutils/coreutils.html for a description.
|
||||
As of 2002-09-01, the GNU fileutils, textutils, and sh-utils
|
||||
packages have been merged into one, called the GNU coreutils.
|
||||
See http://www.gnu.org/software/coreutils/ for a description.
|
||||
Here's the FAQ list:
|
||||
|
||||
https://www.gnu.org/software/coreutils/faq/
|
||||
http://www.gnu.org/software/coreutils/faq/
|
||||
|
||||
For information on the mailing lists associated with the
|
||||
coreutils package, including archive locations, see these:
|
||||
coreutils package, see these:
|
||||
|
||||
https://lists.gnu.org/mailman/listinfo/coreutils-announce
|
||||
https://lists.gnu.org/mailman/listinfo/bug-coreutils
|
||||
https://lists.gnu.org/mailman/listinfo/coreutils
|
||||
http://mail.gnu.org/mailman/listinfo/coreutils-announce
|
||||
http://mail.gnu.org/mailman/listinfo/bug-coreutils
|
||||
|
||||
mailing list archives are here:
|
||||
|
||||
http://news.gmane.org/gmane.comp.gnu.coreutils.announce
|
||||
http://news.gmane.org/gmane.comp.gnu.core-utils.bugs (up to the minute)
|
||||
http://mail.gnu.org/pipermail/bug-coreutils/ (updated every 12 hours)
|
||||
|
||||
@@ -1,41 +1,56 @@
|
||||
This gives some notes on obtaining the tools required for development.
|
||||
These tools can be used by the 'bootstrap' and 'configure' scripts,
|
||||
as well as by 'make'. They include:
|
||||
I.E. the tools checked for by the bootstrap script and include:
|
||||
|
||||
- Autoconf <https://www.gnu.org/software/autoconf/>
|
||||
- Automake <https://www.gnu.org/software/automake/>
|
||||
- Bison <https://www.gnu.org/software/bison/>
|
||||
- Gettext <https://www.gnu.org/software/gettext/>
|
||||
- Git <https://git-scm.com/>
|
||||
- Gperf <https://www.gnu.org/software/gperf/>
|
||||
- Gzip <https://www.gnu.org/software/gzip/>
|
||||
- Help2man <https://www.gnu.org/software/help2man/>
|
||||
- M4 <https://www.gnu.org/software/m4/>
|
||||
- Make <https://www.gnu.org/software/make/>
|
||||
- Perl <https://www.cpan.org/>
|
||||
- Tar <https://www.gnu.org/software/tar/>
|
||||
- Texinfo <https://www.gnu.org/software/texinfo/>
|
||||
- Wget <https://www.gnu.org/software/wget/>
|
||||
- XZ Utils <https://tukaani.org/xz/>
|
||||
- Autoconf <http://www.gnu.org/software/autoconf/>
|
||||
- Automake <http://www.gnu.org/software/automake/>
|
||||
- Bison <http://www.gnu.org/software/bison/>
|
||||
- Gettext <http://www.gnu.org/software/gettext/>
|
||||
- Git <http://git.or.cz/>
|
||||
- Gperf <http://www.gnu.org/software/gperf/>
|
||||
- Gzip <http://www.gnu.org/software/gzip/>
|
||||
- Perl <http://www.cpan.org/>
|
||||
- Rsync <http://samba.anu.edu.au/rsync/>
|
||||
- Tar <http://www.gnu.org/software/tar/>
|
||||
- Texinfo <http://www.gnu.org/software/texinfo/>
|
||||
|
||||
It is generally better to use official packages for your system.
|
||||
If a package is not officially available you can build it from source
|
||||
and install it into a directory that you can then use to build this
|
||||
package. If some packages are available but are too old, install the
|
||||
too-old versions first as they may be needed to build newer versions.
|
||||
Note please try to install/build official packages for your system.
|
||||
If these are not available then one can make them available only to
|
||||
the coreutils build using the following instructions. Even if the
|
||||
official packages for your system are too old, please install them
|
||||
as they may be required to build the newer versions.
|
||||
|
||||
Here is an example of how to build a program from source. This
|
||||
example is for Autoconf; a similar approach should work for the other
|
||||
developer prerequisites. This example assumes Autoconf 2.71; it
|
||||
should be OK to use a later version of Autoconf, if available.
|
||||
* autoconf *
|
||||
|
||||
prefix=$HOME/prefix # (or wherever else you choose)
|
||||
export PATH=$prefix/bin:$PATH
|
||||
wget https://ftp.gnu.org/pub/gnu/autoconf/autoconf-2.71.tar.gz
|
||||
gzip -d <autoconf-2.71.tar.gz | tar xf -
|
||||
cd autoconf-2.71
|
||||
./configure --prefix=$prefix
|
||||
# Note Autoconf 2.62 or newer is needed to build automake-1.11
|
||||
git clone --depth=1 git://git.sv.gnu.org/autoconf.git
|
||||
git checkout v2.62
|
||||
autoreconf -vi
|
||||
./configure --prefix=$HOME/coreutils/deps
|
||||
make install
|
||||
|
||||
Once the prerequisites are installed, you can build this package as
|
||||
described in README-hacking.
|
||||
* automake *
|
||||
|
||||
# Note help2man is required to build automake fully
|
||||
git clone git://git.sv.gnu.org/automake.git
|
||||
cd automake
|
||||
git checkout -b branch-1.11 --track origin/branch-1.11
|
||||
./bootstrap
|
||||
./configure --prefix=$HOME/coreutils/deps
|
||||
make install
|
||||
|
||||
coreutils uses XZ utils (successor to LZMA) to create
|
||||
a compressed distribution tarball. Using this feature of Automake
|
||||
requires version 1.10a or newer, as well as the xz program itself.
|
||||
|
||||
* xz *
|
||||
|
||||
git clone git://ctrl.tukaani.org/xz.git
|
||||
cd xz
|
||||
./autogen.sh
|
||||
./configure --prefix=$HOME/coreutils/deps
|
||||
make install
|
||||
|
||||
Now we can build coreutils as described in README-hacking
|
||||
as long as $PATH starts with $HOME/coreutils/deps/bin, which
|
||||
one can set for the current shell like:
|
||||
$ export PATH=$HOME/coreutils/deps/bin:$PATH
|
||||
|
||||
116
README-release
116
README-release
@@ -13,67 +13,29 @@ Here are most of the steps we (maintainers) follow when making a release.
|
||||
* Ensure that you're on "master" with no uncommitted diffs.
|
||||
This should produce no output: git checkout master; git diff
|
||||
|
||||
* Ensure that you've pushed all changes that belong in the release
|
||||
and that the NixOS/Hydra autobuilder is reporting all is well:
|
||||
|
||||
https://hydra.nixos.org/jobset/gnu/coreutils-master
|
||||
|
||||
* Run bootstrap one last time. This downloads any new translations:
|
||||
|
||||
./bootstrap
|
||||
* Run bootstrap: ./bootstrap
|
||||
|
||||
FIXME: enable excluded programs like arch? to get their manual pages?
|
||||
|
||||
* Check for new file system types by running the following command on
|
||||
a system with the most recent kernel possible (e.g., Fedora rawhide):
|
||||
|
||||
make src/fs-magic-compare
|
||||
|
||||
Or download the latest header first like:
|
||||
|
||||
kgit='https://git.kernel.org/cgit/linux/kernel/git'
|
||||
wget -q $kgit/torvalds/linux.git/plain/include/uapi/linux/magic.h \
|
||||
-O src/fs-latest-magic.h
|
||||
|
||||
If it finds a new file system magic number, add it to src/stat.c.
|
||||
If it is a remote file system tag it as such.
|
||||
|
||||
Note there may be some new file systems magic values not defined
|
||||
in that linux/magic.h file, which can be seen at:
|
||||
|
||||
https://www.livegrep.com/search/linux\
|
||||
?q=%23define+.*_SUPER_MAGIC+-file%3Amagic\.h
|
||||
|
||||
|
||||
* Pre-release testing:
|
||||
Ensure that make check syntax-check succeeds.
|
||||
On at least one SELinux-enabled (enforcing) and one non-SELinux system,
|
||||
run all tests, both root-only and regular.
|
||||
Run *all* non-root tests, including expensive and very expensive ones i.e.,
|
||||
run this: make -j1 check RUN_VERY_EXPENSIVE_TESTS=yes RUN_EXPENSIVE_TESTS=yes
|
||||
|
||||
Run the following on at least one SELinux-enabled (enforcing) and
|
||||
one non-SELinux system:
|
||||
Run the root-only tests:
|
||||
sudo env PATH="$PATH" NON_ROOT_USERNAME=$USER make -k check-root
|
||||
|
||||
n=$(( ($(nproc) + 1) / 2 ))
|
||||
sudo env PATH="$PATH" NON_ROOT_USERNAME=$USER \
|
||||
make -k -j$(nproc) check-root SUBDIRS=. \
|
||||
&& make distcheck \
|
||||
&& make -j$n check RUN_VERY_EXPENSIVE_TESTS=yes RUN_EXPENSIVE_TESTS=yes
|
||||
* Run "make distcheck"
|
||||
|
||||
If testing on systems with a non standard default shell, spurious failures
|
||||
may occur. Often there are other shells available, and you can select
|
||||
those by using for example, SHELL=bash in the commands above.
|
||||
* Manually set the date, version number, and [stable/alpha/beta] on
|
||||
line 3 of NEWS, then do e.g.,:
|
||||
|
||||
Note that the use of -j$n tells make to use approximately half of the
|
||||
available processing units. If you use -jN, for larger N, some of the
|
||||
expensive tests are likely to interfere with concurrent performance-measuring
|
||||
or timing-sensitive tests, resulting in spurious failures.
|
||||
|
||||
If "make distcheck" doesn't run "make syntax-check" for you, then run
|
||||
it manually:
|
||||
|
||||
make syntax-check
|
||||
|
||||
* To set the date, version number, and release type [stable/alpha/beta] on
|
||||
line 3 of NEWS, commit that, and tag the release; run:
|
||||
|
||||
build-aux/do-release-commit-and-tag X.Y stable
|
||||
v=8.0
|
||||
pkg=$(sed -n 's/^PACKAGE = \(.*\)/\1/p' Makefile)
|
||||
git commit -F <(printf 'version '$v'\n\n* NEWS: Record release date.\n') -a
|
||||
git tag -s -m "$pkg $v" v$v HEAD
|
||||
|
||||
* Run the following to create release tarballs. Your choice selects the
|
||||
corresponding upload-to destination in the emitted gnupload command.
|
||||
@@ -87,59 +49,49 @@ FIXME: enable excluded programs like arch? to get their manual pages?
|
||||
it builds and passes all tests.
|
||||
|
||||
* While that's happening, write the release announcement that you will
|
||||
soon post. Start with the template, $HOME/announce-coreutils-X.Y
|
||||
that was just created by that "make" command.
|
||||
|
||||
For generating counts use:
|
||||
oldrel=$(cat .prev-version)
|
||||
printf "There have been %d commits by %d people %s\n" \
|
||||
$(($(git log --oneline v$oldrel.. | wc -l) - 3)) \
|
||||
$(git shortlog v$oldrel.. | grep "^[^ ]" | wc -l) \
|
||||
"in the [X] weeks since $oldrel"
|
||||
|
||||
git shortlog v$oldrel.. | sed -n 's/:$//p' |
|
||||
sed 's/^/ /' | column -c 70 | expand
|
||||
soon post.
|
||||
|
||||
Once all the builds and tests have passed,
|
||||
|
||||
* Run the gnupload command that was suggested by your "make stable" run above.
|
||||
* Run the gnupload command that was suggested by your "make major" run above.
|
||||
|
||||
* Wait a few minutes (maybe up to 30?) and then use the release URLs to
|
||||
download all tarball/signature pairs and use gpg --verify to ensure
|
||||
that they're all valid.
|
||||
|
||||
* Push the NEWS-updating changes and the new tag:
|
||||
* Push the new tag:
|
||||
|
||||
v=$(cat .prev-version)
|
||||
git push origin master tag v$v
|
||||
git push origin tag v$v
|
||||
|
||||
* Announce it on Savannah first, so you can include the preferable
|
||||
savannah.org announcement link in the email message.
|
||||
* Send the gpg-signed announcement mail, e.g.,
|
||||
|
||||
To: info-gnu@gnu.org, coreutils-announce@gnu.org
|
||||
Cc: coordinator@translationproject.org, bug-coreutils@gnu.org
|
||||
Subject: coreutils-8.0 released [beta]
|
||||
|
||||
* Approve the announcement here:
|
||||
http://lists.gnu.org/mailman/admindb/coreutils-announce
|
||||
|
||||
* Announce it on Savannah, too:
|
||||
From here:
|
||||
https://savannah.gnu.org/projects/coreutils/
|
||||
click on the "submit news", then write something like the following:
|
||||
(If there is no such button, then enable "News" for the project via
|
||||
the Main -> "Select Features" menu item, or via this link:
|
||||
https://savannah.gnu.org/project/admin/editgroupfeatures.php?group=coreutils)
|
||||
https://savannah.gnu.org/project/admin/editgroupfeatures.php?group=gzip)
|
||||
|
||||
Subject: coreutils-X.Y released [stable]
|
||||
+verbatim+
|
||||
...paste the announcement here...
|
||||
-verbatim-
|
||||
Subject: coreutils-0.0 released [beta]
|
||||
The announcement is here:
|
||||
http://article.gmane.org/gmane.comp.gnu.core-utils.announce/54
|
||||
|
||||
Then go here to approve it:
|
||||
https://savannah.gnu.org/news/approve.php?group=coreutils
|
||||
|
||||
* Send the announcement email message (signed with the release key)
|
||||
|
||||
* Approve the announcement here:
|
||||
https://lists.gnu.org/mailman/admindb/coreutils-announce
|
||||
|
||||
* After each non-alpha release, update the on-line manual accessible via
|
||||
|
||||
https://www.gnu.org/software/coreutils/manual/
|
||||
http://www.gnu.org/software/coreutils/manual/
|
||||
|
||||
by running this:
|
||||
|
||||
build-aux/gnu-web-doc-update --mirror
|
||||
build-aux/gnu-web-doc-update
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#! /bin/bash
|
||||
# Convert this package for use with valgrind.
|
||||
|
||||
# Copyright (C) 2002-2024 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2002-2006, 2009 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
|
||||
@@ -14,36 +14,28 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Convert Makefile.am files:
|
||||
# find tests -name check.mk | xargs grep -wl PATH |
|
||||
# xargs perl -pi -e 's,src(\$\(PATH_SEPARATOR\)),src/vg$1,'
|
||||
# find tests -name Makefile.am | xargs grep -wl PATH|xargs perl -pi -e \
|
||||
# 's,src(\$\(PATH_SEPARATOR\)\$\$PATH),src/vg$1,'
|
||||
# To restore:
|
||||
# find tests -name check.mk | xargs grep -wl PATH |
|
||||
# xargs perl -pi -e 's,src/vg,src,'
|
||||
# find tests -name Makefile.am|xargs grep -wl PATH|xargs perl -pi -e 's,src/vg,src,'
|
||||
#
|
||||
# Create this symlink for suppressions (this is no longer necessary,
|
||||
# with Linux kernel 2.6.9 and valgrind-2.2.0):
|
||||
# ln -s $PWD/.vg-suppressions /tmp/cu-vg
|
||||
|
||||
|
||||
# Create src/vg:
|
||||
|
||||
coreutils=$(echo 'spy:;@echo $(all_programs) $(noinst_PROGRAMS)' |
|
||||
(cd src; make -f Makefile -f - spy | tr -s '\n ' ' '))
|
||||
coreutils=$(echo 'spy:;@echo $(all_programs)' | (cd src; make -f Makefile -f - spy | tr -s '\n ' ' '))
|
||||
mkdir -p src/vg
|
||||
pwd=`pwd`
|
||||
srcdir=$pwd/src
|
||||
_path='export PATH='$srcdir':${PATH#*:}'
|
||||
pre='#!/bin/sh\n'"$_path"'\n'
|
||||
n=15 # stack trace depth
|
||||
log_fd=3 # One can redirect this to file like 3>vg.log
|
||||
test -e /tmp/cu-vg && suppressions='--suppressions=/tmp/cu-vg'
|
||||
vg="exec /usr/bin/valgrind $suppressions --log-fd=$log_fd \
|
||||
--leak-check=yes --track-fds=yes --leak-check=full --num-callers=$n"
|
||||
n=15
|
||||
vg='exec /usr/bin/valgrind --suppressions=/tmp/cu-vg --log-fd=3 --leak-check=yes --track-fds=yes --leak-check=full --num-callers='$n
|
||||
cat <<EOF > src/vg/gen
|
||||
for i in $coreutils; do
|
||||
printf "$pre$vg -- \$i"' "\$@"\n' > \$i
|
||||
|
||||
@@ -1,33 +1,22 @@
|
||||
These people have contributed to the GNU coreutils (formerly, the fileutils,
|
||||
textutils, and/or sh-utils packages). Some have reported problems, others
|
||||
have contributed improvements to the documentation, actual code, and even
|
||||
complete programs. Those contributions are described in the version control
|
||||
logs and ChangeLog files. If your name has been left out, if you'd rather
|
||||
not be listed, or if you'd prefer a different address be used, please send a
|
||||
note to the GNU coreutils mailing list <coreutils@gnu.org>.
|
||||
##
|
||||
## There is no need to list here any name that appears as an Author in
|
||||
## "git log" output. Those are automatically added when this template
|
||||
## is used to generate the THANKS file. Note that numerous people listed
|
||||
## here would have been listed as commit authors if we had been using git
|
||||
## for version control when they contributed.
|
||||
##
|
||||
## Let's keep the list in this order ... which sc_THANKS_in_sorted ensures:
|
||||
## $ LC_ALL=en_US.UTF-8 src/sort -f -k1,1
|
||||
complete programs. Those contributions are described in the ChangeLog
|
||||
files. If your name has been left out, if you'd rather not be listed,
|
||||
or if you'd prefer a different address be used, please send a note to
|
||||
the bug-report mailing list (as seen on last line of e.g., cp --help).
|
||||
|
||||
??? kytek@cybercomm.net
|
||||
A Costa agcosta@gis.net
|
||||
Aaron Davies aaron.davies@gmail.com
|
||||
Aaron Hawley ashawley@uvm.edu
|
||||
Achim Blumensath blume@corona.oche.de
|
||||
Adam Jimerson vendion@charter.net
|
||||
Adam Klein aklein@debian.org
|
||||
Adam Sampson ats@offog.org
|
||||
Adrian Bunk bunk@stusta.de
|
||||
AIDA Shinra shinra@j10n.org
|
||||
Akim Demaille demaille@inf.enst.fr
|
||||
Alain Magloire alain@qnx.com
|
||||
Alan Iwi iwi@atm.ox.ac.uk
|
||||
Alan Jenkins alan-jenkins@tuffmail.co.uk
|
||||
Albert Chin-A-Young china@thewrittenword.com
|
||||
Albert Hopkins ahopkins@dynacare.com
|
||||
Alberto Accomazzi alberto@cfa0.harvard.edu
|
||||
@@ -35,23 +24,24 @@ aldomel aldomel@ix.netcom.com
|
||||
Alen Muzinic zveki@fly.cc.fer.hr
|
||||
Alexander Nguyen vinh@seas.ucla.edu
|
||||
Alexander V. Lukyanov lav@netis.ru
|
||||
Allen Hewes allen@decisiv.net
|
||||
Axel Dörfler axeld@pinc-software.de
|
||||
Alexandre Duret-Lutz duret_g@epita.fr
|
||||
Alexey Solovyov alekso@math.uu.se
|
||||
Alexey Vyskubov alexey@pippuri.mawhrin.net
|
||||
Alfred M. Szmidt ams@kemisten.nu
|
||||
Allen Hewes allen@decisiv.net
|
||||
Ambrose Feinstein ambrose@google.com
|
||||
Amr Ali amr.ali.cc@gmail.com
|
||||
Anders Kaseorg andersk@mit.edu
|
||||
Andi Kleen freitag@alancoxonachip.com
|
||||
Andre Novaes Cunha Andre.Cunha@br.global-one.net
|
||||
Andreas Frische andreasfrische@gmail.com
|
||||
Andreas Gruenbacher ag@bestbits.at
|
||||
Andreas Jaeger jaeger@gnu.org
|
||||
Andreas Luik luik@isa.de
|
||||
Andreas Schwab schwab@linux-m68k.org
|
||||
Andreas Stolcke stolcke@ICSI.Berkeley.EDU
|
||||
Andrei Gaponenko andr@triumf.ca
|
||||
Andres Soolo andres@soolo.matti.ee
|
||||
Andrew Burgess aab@cichlid.com
|
||||
Andrew Church achurch@achurch.org
|
||||
Andrew Dalke dalke@bioreason.com
|
||||
Andrew Fabbro andrew@fabbro.org
|
||||
Andrew Pham andpha@us.ibm.com
|
||||
@@ -59,27 +49,26 @@ Andrew Tridgell tridge@samba.org
|
||||
Andrey Borzenkov arvidjaar@mail.ru
|
||||
Andries Brouwer Andries.Brouwer@cwi.nl
|
||||
Andy Longton alongton@metamark.com
|
||||
Anoop Sharma sendtoanoop@gmail.com
|
||||
Anthony Thyssen anthony@griffith.edu.au
|
||||
Antonio Rendas ajrendas@yahoo.com
|
||||
Ariel Faigon ariel@cthulhu.engr.sgi.com
|
||||
Arjan Opmeer arjan.opmeer@gmail.com
|
||||
Arkadiusz Miśkiewicz arekm@maven.pl
|
||||
Arne H. Juul arnej@solan.unit.no
|
||||
Arne Henrik Juul arnej@imf.unit.no
|
||||
Arnold Robbins arnold@skeeve.com
|
||||
Arthur Pool pool@commerce.uq.edu.au
|
||||
Arun Sharma arun.sharma@intel.com
|
||||
Arvind Autar Autar022@planet.nl
|
||||
Augey Mikus mikus@dqc.org
|
||||
Aurelien Jarno aurel32@debian.org
|
||||
Austin Donnelly Austin.Donnelly@cl.cam.ac.uk
|
||||
Axel Dörfler axeld@pinc-software.de
|
||||
Axel Kittenberger Anshil@gmx.net
|
||||
Barry Kelly http://blog.barrkel.com/
|
||||
Barry Kelly http://barrkel.blogspot.com/
|
||||
Bauke Jan Douma bjdouma@xs4all.nl
|
||||
Ben Elliston bje@air.net.au
|
||||
Ben Harris bjh21@netbsd.org
|
||||
Bengt Martensson bengt@mathematik.uni-Bremen.de
|
||||
Benjamin Cutler cutlerbc@simla.colostate.edu
|
||||
Benno Schulenberg bensberg@justemail.net
|
||||
Bernard Giroud bernard.giroud@creditlyonnais.ch
|
||||
Bernd Eckenfels ecki@debian.org
|
||||
Bernd Leibing bernd.leibing@rz.uni-ulm.de
|
||||
@@ -87,87 +76,79 @@ Bernd Melchers melchers@cis.fu-berlin.de
|
||||
Bernhard Baehr bernhard.baehr@gmx.de
|
||||
Bernhard Gabler bernhard@uni-koblenz.de
|
||||
Bernhard Rosenkraenzer bero@redhat.de
|
||||
Bernhard Voelker bernhard.voelker@siemens-enterprise.com
|
||||
Bert Deknuydt Bert.Deknuydt@esat.kuleuven.ac.be
|
||||
Bert Wesarg bert.wesarg@googlemail.com
|
||||
Bill Brelsford wb@k2di.net
|
||||
Bill Peters peters@gaffel.as.arizona.edu
|
||||
Bjorn Helgaas helgaas@rsn.hp.com
|
||||
Bob McCracken kerouac@ravenet.com
|
||||
Bob Proulx rwp@fc.hp.com
|
||||
Branden Robinson branden@necrotic.deadbeast.net
|
||||
Brendan O'Dea bod@compusol.com.au
|
||||
Brian Foster bfoster@redhat.com
|
||||
Brian Kimball bfk@footbag.org
|
||||
Brian M. Carlson sandals@crustytoothpaste.ath.cx
|
||||
Brian Silverman bsilverman@conceptxdesign.com
|
||||
Brian Youmans 3diff@gnu.org
|
||||
Britton Leo Kerin fsblk@aurora.uaf.edu
|
||||
Bruce Korb bkorb@veritas.com
|
||||
Bruce Robertson brucer@theodolite.dyndns.org
|
||||
Brynnen Owen owen@illinois.edu
|
||||
Bruno Haible haible@clisp.cons.org
|
||||
C de-Avillez hggdh2@gmail.com
|
||||
Carl Johnson carlj@cjlinux.home.org
|
||||
Carl Lowenstein cdl@mpl.UCSD.EDU
|
||||
Carl Roth roth@urs.us
|
||||
Carlos Canau Carlos.Canau@relay.puug.pt
|
||||
Charles Karney karney@pppl.gov
|
||||
Charles Randall crandall@matchlogic.com
|
||||
Chas. Owens chas.owens@gmail.com
|
||||
Chip Salzenberg chip@valinux.com
|
||||
Choi Jongu zoopi01@gmail.com
|
||||
Chris Clayton chris2553@googlemail.com
|
||||
Chris Faylor cgf@cygnus.com
|
||||
Chris J. Bednar cjb@AdvancedDataSolutions.com
|
||||
Chris Jones cjns1989@gmail.com
|
||||
Chris Lesniewski ctl@mit.edu
|
||||
Chris Sylvain csylvain@umm.edu
|
||||
Chris Yeo cyeo@biking.org
|
||||
Christi Alice Scarborough christi@chiark.greenend.org.uk
|
||||
Christian Harkort christian.harkort@web.de
|
||||
Christian Jullien eligis@orange.fr
|
||||
Christian Krackowizer ckrackowiz@std.schuler-ag.com
|
||||
Christian Rose menthos@menthos.com
|
||||
Christian von Roques roques@pond.sub.org
|
||||
Christophe LYON christophe.lyon@st.com
|
||||
Chuck Hedrick hedrick@klinzhai.rutgers.edu
|
||||
Chusslove Illich caslav.ilic@gmx.net
|
||||
Clark Morgan cmorgan@aracnet.com
|
||||
Clement Wang clem.wang@overture.com
|
||||
Cliff Miller cbm@whatexit.org
|
||||
Colin Plumb colin@nyx.net
|
||||
Colin Watson cjw44@riva.ucam.org
|
||||
Collin Rogowski collin@rogowski.de
|
||||
Cray-Cyber Project https://www.cray-cyber.org
|
||||
Cray-Cyber Project http://www.cray-cyber.org
|
||||
Cristian Cadar cristic@stanford.edu
|
||||
Cyril Bouthors cyril@bouthors.org
|
||||
Dale Scheetz dwarf@polaris.net
|
||||
Dameon G. Rogers dgr03@uark.edu
|
||||
Dan Hagerty hag@gnu.ai.it.edu
|
||||
Dan Jacobson jidanni@jidanni.org
|
||||
Dan Pascu dan@services.iiruc.ro
|
||||
Daniel Bergstrom noa@melody.se
|
||||
Daniel Mach dmach@redhat.com
|
||||
Daniel Dunbar ddunbar@stanford.edu
|
||||
Daniel P. Berrangé berrange@redhat.com
|
||||
Daniel Stavrovski d@stavrovski.net
|
||||
Daniel Tschinder daniel.tschinder@project-a.com
|
||||
Dániel Varga danielv@axelero.hu
|
||||
Danny Levinson danny.levinson@overture.com
|
||||
Darrel Francis d.francis@cheerful.com
|
||||
Darren Salt ds@youmustbejoking.demon.co.uk
|
||||
Dave Beckett dajobe@dajobe.org
|
||||
David Alan Gilbert gilbertd@treblig.org
|
||||
David Diggles david.diggles@dnrm.qld.gov.au
|
||||
David Bartley dtbartle@csclub.uwaterloo.ca
|
||||
David Dyck dcd@tc.fluke.COM
|
||||
David Eisner cradle@umd.edu
|
||||
David Flynn dav@chess.plus.com
|
||||
David Gast dgast@csulb.edu
|
||||
David Godfrey dave@delta.demon.co.uk
|
||||
David Luyer david_luyer@pacific.net.au
|
||||
David Madore david.madore@ens.fr
|
||||
David Malone dwmalone@cnri.dit.ie
|
||||
David Matei matei@cs.toronto.edu
|
||||
David Pinto carandraug+dev@gmail.com
|
||||
Davide Canova kc.canova@gmail.com
|
||||
Dawson Engler engler@stanford.edu
|
||||
Dean Gaudet dean-savannah@arctic.org
|
||||
Deepak Goel deego@gnufans.org
|
||||
Denis Excoffier gcc@Denis-Excoffier.org
|
||||
Denis McKeon dmckeon@swcp.com
|
||||
Dennis Clarke dclarke@blastwave.org
|
||||
Denis Excoffier denis.excoffier@airbus.com
|
||||
Dennis Henriksen opus@flamingo.osrl.dk
|
||||
Dennis Smit ds@nerds-incorporated.org
|
||||
Derek Clegg dclegg@next.com
|
||||
@@ -175,31 +156,32 @@ Dick Streefland dick_streefland@tasking.com
|
||||
Dirk Lattermann dlatt@t-online.de
|
||||
Dirk-Jan Faber djfaber@snow.nl
|
||||
Dmitry Rutsky rutsky@school.ioffe.rssi.ru
|
||||
Dmitry V. Levin ldv@altlinux.org
|
||||
Don Parsons dparsons@synapse.kent.edu
|
||||
Donni Erpel donald@appc11.gsi.de
|
||||
Doug Coleman coleman@iarc1.ece.utexas.edu
|
||||
Doug McLaren dougmc@comco.com
|
||||
Dragos Harabor dharabor@us.oracle.com
|
||||
Duncan Roe duncanr@optimation.com.au
|
||||
Edward Schwartz edmcman@cmu.edu
|
||||
Ed Avis ed@membled.com
|
||||
Edward Welbourne eddy@opera.com
|
||||
Edzer Pebesma Edzer.Pebesma@rivm.nl
|
||||
Egmont Koblinger egmont@uhulinux.hu
|
||||
Eirik Fuller eirik@hackrat.com
|
||||
Eivind eivindt@multinet.no
|
||||
Elbert Pol elbert.pol@gmail.com
|
||||
Eldon Stegall eldon@eldondev.com
|
||||
Eli Zaretskii eliz@is.elta.co.il
|
||||
Emanuel Landeholm emanuel.landeholm@gmail.com
|
||||
Elias Pipping pipping@gentoo.org
|
||||
Emile LeBlanc leblanc@math.toronto.edu
|
||||
Emmanuel Lacour elacour@home-dn.net
|
||||
Erik Auerswald auerswal@unix-ag.uni-kl.de
|
||||
Eric Backus ericb@lsid.hp.com
|
||||
Eric Bergen eric.bergen@gmail.com
|
||||
Eric Blake ebb9@byu.net
|
||||
Eric G. Miller egm2@jps.net
|
||||
Eric Pemente pemente@northpark.edu
|
||||
Eric S. Raymond esr@snark.thyrsus.com
|
||||
Erik Bennett bennett@cvo.oneworld.com
|
||||
Erik Bernstein erik@fscking.org
|
||||
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
|
||||
@@ -209,9 +191,7 @@ Florian Schlichting fschlich@cis.fu-berlin.de
|
||||
Florin Iucha fiucha@hsys.mic.ro
|
||||
Francesco Montorsi fr_m@hotmail.com
|
||||
François Pinard pinard@iro.umontreal.ca
|
||||
François Rigault rigault.francois@gmail.com
|
||||
Frank Adler fadler@allesklar.de
|
||||
Frank Busse f.busse@imperial.ac.uk
|
||||
Frank T Lofaro ftlofaro@snooks.Egr.UNLV.EDU
|
||||
Fred Fish fnf@ninemoons.com
|
||||
Frédéric L. W. Meunier 0@pervalidus.net
|
||||
@@ -231,17 +211,18 @@ Gerald Pfeifer gerald@pfeifer.com
|
||||
Gerhard Poul gpoul@gnu.org
|
||||
Germano Leichsenring germano@jedi.cs.kobe-u.ac.jp
|
||||
Glen Lenker glen.lenker@gmail.com
|
||||
Glenn Golden gdg@zplane.com
|
||||
Göran Uddeborg goeran@uddeborg.se
|
||||
Guochun Shi gshi@ncsa.uiuc.edu
|
||||
GOTO Masanori gotom@debian.or.jp
|
||||
Greg Louis glouis@dynamicro.on.ca
|
||||
Greg McGary gkm@gnu.org
|
||||
Greg Metcalfe metcalfegreg@qwest.net
|
||||
Greg Schafer gschafer@zip.com.au
|
||||
Greg Troxel gdt@bbn.com
|
||||
Greg Wooledge gawooledge@sherwin.com
|
||||
Gregory Leblanc gleblanc@cu-portland.edu
|
||||
Guido Leenders guido.leenders@invantive.com
|
||||
Guntram Blohm Extern.Guntram.Blohm@AUDI.DE
|
||||
Guochun Shi gshi@ncsa.uiuc.edu
|
||||
H. J. Lu hjl@valinux.com
|
||||
Hans Ginzel hans@matfyz.cz
|
||||
Hans Lermen lermen@fgan.de
|
||||
@@ -256,47 +237,41 @@ Herbert Xu herbert@gondor.apana.org.au
|
||||
Holger Berger hberger@ess.nec.de
|
||||
Hon-Yin Kok hkok@yoda.unl.edu
|
||||
Hugh Daniel hugh@xanadu.com
|
||||
Iain Calder ic56@rogers.com
|
||||
Ian Bruce ian.bruce@myrealbox.com
|
||||
Iain Calder ic56@rogers.com
|
||||
Ian Jackson ijackson@chiark.greenend.org.uk
|
||||
Ian Kent ikent@redhat.com
|
||||
Ian Lance Taylor ian@cygnus.com
|
||||
Ian Turner vectro@pipeline.com
|
||||
Iida Yosiaki iida@gnu.org
|
||||
Illia Bobyr ibobyr@google.com
|
||||
Ilya N. Golubev gin@mo.msk.ru
|
||||
Ingo Saitz ingo@debian.org
|
||||
Ivan Labath labath3@st.fmph.uniba.sk
|
||||
Ivo Timmermans ivo@debian.org
|
||||
Jack Howarth howarth.mailing.lists@gmail.com
|
||||
Jacky Fong jacky.fong@utoronto.ca
|
||||
James Antill jmanti%essex.ac.uk@seralph21.essex.ac.uk
|
||||
James Hunt jamesodhunt@hotmail.com
|
||||
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 Ralston ralston@pobox.com
|
||||
James R. Van Zandt jrvz@comcast.net
|
||||
James Sneeringer jvs@ocslink.com
|
||||
James Tanis jtt@soscorp.com
|
||||
James Youngman jay@gnu.org
|
||||
Jamie Lokier jamie@imbolc.ucc.ie
|
||||
Jamie McClelland jm@mayfirst.org
|
||||
Jan Engelhardt jengelh@medozas.de
|
||||
Jan Fedak J.Fedak@sh.cvut.cz
|
||||
Jan Moringen jan.moringen@uni-bielefeld.de
|
||||
Jan Nieuwenhuizen janneke@gnu.org
|
||||
Janos Farkas chexum@shadow.banki.hu
|
||||
Jan-Pawel Wrozstinski jpwroz@gmail.com
|
||||
Jari Aalto jari.aalto@cante.net
|
||||
Jarkko Hietaniemi jhi@epsilon.hut.fi
|
||||
Jarod Wilson jwilson@redhat.com
|
||||
Jason Smith jasonmsmith@google.com
|
||||
Jean Charles Delepine delepine@u-picardie.fr
|
||||
Jean-Pierre Tosoni jpt.7196@gmail.com
|
||||
Jeff Moore jbm@mordor.com
|
||||
Jeff Sheinberg jeff@bsrd.net
|
||||
Jens Elkner elkner@imsgroup.de
|
||||
Jens Schmidt jms@jsds.hamburg.com
|
||||
Jeph Cowan jeph@ucar.edu
|
||||
Jeremy Maitin-Shepard jbms@cmu.edu
|
||||
Jérémy Magrin jeremy.magrin@epitech.eu
|
||||
Jerome Abela abela@hsc.fr
|
||||
Jérôme Zago bug-coreutils-ml@agt-the-walker.net
|
||||
Jesse Kornblum kornblum@usna.edu
|
||||
@@ -304,16 +279,16 @@ Jesse Thilo jgt2@eecs.lehigh.edu
|
||||
Jie Xu xuj@iag.net
|
||||
Jim Blandy jimb@cyclic.com
|
||||
Jim Dennis jimd@starshine.org
|
||||
Jirka Hladky jhladky@redhat.com
|
||||
Joakim Rosqvist dvljrt@cs.umu.se
|
||||
Jochen Hein jochen@jochen.org
|
||||
Joe Orton joe@manyfish.co.uk
|
||||
Joel E. Denny jdenny@clemson.edu
|
||||
Joerg Sonnenberger joerg@britannica.bec.de
|
||||
Joey Hess joeyh@debian.org
|
||||
Johan Boule bohan@bohan.dyndns.org
|
||||
Johan Danielsson joda@pdc.kth.se
|
||||
Johannes Altmanninger aclopte@gmail.com
|
||||
John Bley jbb6@acpub.duke.edu
|
||||
John David Anglin dave.anglin@nrc.ca
|
||||
John Gatewood Ham zappaman@alphabox.compsci.buu.ac.th
|
||||
John Gotts jgotts@umich.edu
|
||||
John Kendall kendall@capps.com
|
||||
@@ -321,13 +296,10 @@ John Kodis kodis@acm.org
|
||||
John Murphy jam@philabs.research.philips.com
|
||||
John Roll john@panic.harvard.edu
|
||||
John Salmon johns@mullet.anu.edu.au
|
||||
John Stanley johnstops@verizon.net
|
||||
John Summerfield summer@OS2.ami.com.au
|
||||
Jon Peatfield J.S.Peatfield@damtp.cam.ac.uk
|
||||
Joost van Baal joostvb@xs4all.nl
|
||||
Jordi Pujol jordipujolp@gmail.com
|
||||
Jorge Stolfi stolfi@ic.unicamp.br
|
||||
Joseph D. Wagner joe@josephdwagner.info
|
||||
Joseph S. Myers jsm28@cam.ac.uk
|
||||
Josh Triplett josh@freedesktop.org
|
||||
Joshua Hudson joshudson@gmail.com
|
||||
@@ -335,9 +307,7 @@ Josselin Mouette joss@debian.org
|
||||
Juan F. Codagnone juam@arnet.com.ar
|
||||
Juan M. Guerrero st001906@hrz1.hrz.tu-darmstadt.de
|
||||
Julian Bradfield jcb@inf.ed.ac.uk
|
||||
Julian Büning julian.buening@rwth-aachen.de
|
||||
Jungshik Shin jshin@pantheon.yale.edu
|
||||
Juraj Marko jmarko@redhat.com
|
||||
Jürgen Fluk louis@dachau.marco.de
|
||||
Jurriaan thunder7@xs4all.nl
|
||||
Justin Pryzby justinpryzby@users.sourceforge.net
|
||||
@@ -347,21 +317,19 @@ Kai-Uwe Rommel rommel@informatik.tu-muenchen.de
|
||||
Kalle Olavi Niemitalo kon@iki.fi
|
||||
Kamal Paul Nigam Kamal_Paul_Nigam@gs35.sp.cs.cmu.edu
|
||||
Karl Eichwalder keichwa@gmx.net
|
||||
Karl Heuer kwzh@gnu.org
|
||||
Karl-Michael Schneider schneide@phil.uni-passau.de
|
||||
Karsten Thygesen karthy@kom.auc.dk
|
||||
Kaveh R. Ghazi ghazi@caip.rutgers.edu
|
||||
Keith M. Briggs keith.briggs@bt.com
|
||||
Keith Owens kaos@audio.apana.org.au
|
||||
Keith Thompson Keith.S.Thompson@gmail.com
|
||||
Ken Irving ken.irving@alaska.edu
|
||||
Keith Thompson kst@cts.com
|
||||
Ken Pizzini kenp@halcyon.com
|
||||
Kevin Mudrick kmudrick@healthmarketscience.com
|
||||
Kirk Kelsey kirk.kelsey@0x4b.net
|
||||
Kjetil Torgrim Homme kjetilho@ifi.uio.no
|
||||
Konrad Wróblewski coni@o2.pl
|
||||
Kristin E Thomas kristint@us.ibm.com
|
||||
Kjetil Torgrim Homme kjetilho@ifi.uio.no
|
||||
Kristoffer Rose kris@diku.dk
|
||||
Ladislav Hagara ladislav.hagara@unob.cz
|
||||
Larry McVoy lm@sgi.com
|
||||
Lars Hecking lhecking@nmrc.ucc.ie
|
||||
Leah Q eequor@earthlink.net
|
||||
@@ -379,11 +347,9 @@ Manfred Hollstein manfred@s-direktnet.de
|
||||
Marc Boucher marc@mbsi.ca
|
||||
Marc Haber mh+debian-bugs@zugschlus.de
|
||||
Marc Lehman schmorp@schmorp.de
|
||||
Marc Mengel mengel@fnal.gov
|
||||
Marc Olzheim marcolz@stack.nl
|
||||
Marcel Böhme https://www.comp.nus.edu.sg/~mboehme
|
||||
Marco Franzen Marco.Franzen@Thyron.com
|
||||
Marcus Brinkmann https://www.marcus-brinkmann.de
|
||||
Marcus Brinkmann http://www.marcus-brinkmann.de
|
||||
Marcus Daniels marcus@ee.pdx.edu
|
||||
Mark A. Thomas thommark@access.digex.net
|
||||
Mark Conty Mark_Conty@cargill.com
|
||||
@@ -394,16 +360,14 @@ Mark Hewitt mhewitt@armature.com
|
||||
Mark Hounschell markh@compro.net
|
||||
Mark Hubbart discord@mac.com
|
||||
Mark Kettenis kettenis@phys.uva.nl
|
||||
Mark Korenberg socketpair@gmail.com
|
||||
Mark Melahn mmelahn@gmail.com
|
||||
Mark Nudelman marknu@flash.net
|
||||
Mark W. Eichin eichin@cygnus.com
|
||||
Markus Demleitner msdemlei@auriga.ari.uni-heidelberg.de
|
||||
Martin martin@dresden.nacamar.de
|
||||
Martin Buck martin.buck@ascom.ch
|
||||
Martin Gallant martyg@goodbit.net
|
||||
Martin Hippe martin.hippe@schlund.de
|
||||
Martin Jacobs martin.jacobs@arcor.de
|
||||
Martin martin@dresden.nacamar.de
|
||||
Martin Michlmayr tbm@cyrius.com
|
||||
Martin Mitchell martin@debian.org
|
||||
Martin P.J. Zinser zinser@decus.de
|
||||
@@ -411,65 +375,61 @@ Marty Leisner leisner@sdsp.mc.xerox.com
|
||||
Masami Takikawa takikawm@CS.ORST.EDU
|
||||
Mate Wierdl mw@moni.msci.memphis.edu
|
||||
Matej Vela mvela@public.srce.hr
|
||||
Matheus Afonso Martins Moreira matheus.a.m.moreira@gmail.com
|
||||
Mathias Brodala info@noctus.net
|
||||
Matias A. Fonzo selk@dragora.org
|
||||
Matt Kraai kraai@ftbfs.org
|
||||
Matt McCutchen matt@mattmccutchen.net
|
||||
Matt Perry matt@primefactor.com
|
||||
Matt Pham mattvpham@gmail.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 M. Boedicker matthewm@boedicker.org
|
||||
Matthew Pfeiffer spferical@gmail.com
|
||||
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
|
||||
Mathias Brodala info@noctus.net
|
||||
Mattias Wadenstein maswan@acc.umu.se
|
||||
Max Chang maxchang@ucla.edu
|
||||
Meelis Roos mroos@tartu.cyber.ee
|
||||
Michael Bacarella mbac@netgraft.com
|
||||
Michael michael@aplatform.com
|
||||
Michael ??? michael@roka.net
|
||||
Michael Bacarella mbac@netgraft.com>
|
||||
Michael Deutschmann michael@talamasca.ocis.net
|
||||
Michael Elizabeth Chastain mec.gnu@mindspring.com
|
||||
Michael Gaughen mgaughen@polyserve.com
|
||||
Michael Hasselberg mikelh@zonta.ping.de
|
||||
Michael Hohn hohn@math.utah.edu
|
||||
Michael J. Croghan mcroghan@usatoday.com
|
||||
Michael J. Daniel michael.j.daniel@comcast.net
|
||||
Michael McFarland sidlon@yahoo.com
|
||||
Michael McLagan mmclagan@invlogic.com
|
||||
Michael michael@aplatform.com
|
||||
Michael ??? michael@roka.net
|
||||
Michael Mol mikemol@gmail.com
|
||||
Michael Piefel piefel@informatik.hu-berlin.de
|
||||
Michael Price mprice@atl.lmco.com
|
||||
Michael Speer knomenet@gmail.com
|
||||
Michael Steffens michael.steffens@s.netic.de
|
||||
Michael Stummvoll michael@stummi.org
|
||||
Michael Stone mstone@debian.org
|
||||
Michael Stutz stutz@dsl.org
|
||||
Michael van Elst mlelstv@dev.de.cw.net
|
||||
Michael Veksler mveksler@techunix.technion.ac.il
|
||||
Michail Litvak mci@owl.openwall.com
|
||||
Michal Politowski mpol@charybda.icm.edu.pl
|
||||
Michal Svec msvec@suse.cz
|
||||
Michal Trunecka mtruneck@redhat.com
|
||||
Michel Robitaille robitail@IRO.UMontreal.CA
|
||||
Michiel Bacchiani bacchian@raven.bu.edu
|
||||
Mikael Magnusson mikachu@gmail.com
|
||||
Mike Castle dalgoda@ix.netcom.com
|
||||
Mike Coleman mkc@mathdogs.com
|
||||
Mike Jetzer mjetzer@mke.catalystwms.com
|
||||
Mike Frysinger vapier@gentoo.org
|
||||
Mikko Tuumanen m@sorvankyla.yok.utu.fi
|
||||
Mikulas Patocka mikulas@artax.karlin.mff.cuni.cz
|
||||
Miles Bader miles@gnu.ai.mit.edu
|
||||
Minh Tran-Le tranle@intellicorp.com
|
||||
Morten Welinder terra@diku.dk
|
||||
Nao Nishijima nao.nishijima.xt@hitachi.com
|
||||
Neal H Walfield neal@cs.uml.edu
|
||||
Neil F. Brown neilb@suse.de
|
||||
Neil Brown neilb@cse.unsw.edu.au
|
||||
Nelson H. F. Beebe beebe@math.utah.edu
|
||||
Nick Estes debian@nickstoys.com
|
||||
Nick Graham nick.d.graham@gmail.com
|
||||
@@ -478,13 +438,10 @@ Nickolai Zeldovich nickolai@cs.stanford.edu
|
||||
Nicolas François nicolas.francois@centraliens.net
|
||||
Niklas Edmundsson nikke@acc.umu.se
|
||||
Nikola Milutinovic Nikola.Milutinovic@ev.co.yu
|
||||
Nikolaus Rath Nikolaus@rath.org
|
||||
Nikos Mavrogiannopoulos nmav@redhat.com
|
||||
Nima Nikzad nnikzad@ucla.edu
|
||||
Noah Friedman friedman@splode.com
|
||||
Noel Cragg noel@red-bean.com
|
||||
Norbert Kiesel nkiesel@tbdnetworks.com
|
||||
Norihiro Kamae norihiro@nagater.net
|
||||
Olatunji Oluwabukunmi Ruwase tjruwase@stanford.edu
|
||||
Olav Morkrid olav@funcom.com
|
||||
Ole Laursen olau@hardworking.dk
|
||||
@@ -493,52 +450,51 @@ Olivier Fourdan ofourdan@redhat.com
|
||||
Ørn E. Hansen oehansen@daimi.aau.dk
|
||||
Oskar Liljeblad osk@hem.passagen.se
|
||||
Otavio Salvador otavio@ossystems.com.br
|
||||
Pádraig Brady P@draigBrady.com
|
||||
Patrick Mauritz oxygene@studentenbude.ath.cx
|
||||
Paul D. Smith psmith@gnu.org
|
||||
Paul Eggert eggert@twinsun.com
|
||||
Paul Ghaleb paul.ghaleb@st.com
|
||||
Paul Jarc prj@po.cwru.edu
|
||||
Paul Marinescu paul.marinescu@imperial.ac.uk
|
||||
Paul Nevai nevai@ops.mps.ohio-state.edu
|
||||
Paul Sauer paul@alexa.com
|
||||
Paul Slootman paul@debian.org
|
||||
Paul Townsend aab@purdue.edu
|
||||
Paul Worrall paul@basilisk.uklinux.net
|
||||
Pawel Prokop pablo@wizard.ae.krakow.pl
|
||||
Peng Yu pengyu.ut@gmail.com
|
||||
Per Cederqvist ceder@lysator.liu.se
|
||||
Per Kristian Hove perhov@math.ntnu.no
|
||||
Per Starbäck starback@stp.lingfil.uu.se
|
||||
Peter Breitenlohner peb@mppmu.mpg.de
|
||||
Peter Dyballa peter_dyballa@web.de
|
||||
Peter Eriksson peter@ifm.liu.se
|
||||
Peter Evans peter@ixp.jp
|
||||
Peter Fales psfales@lucent.com
|
||||
Peter Horst peter@ointment.org
|
||||
Peter Moulder reiter@netspace.net.au
|
||||
Peter O'Gorman bug-coreutils@mlists.thewrittenword.com
|
||||
Peter Samuelson psamuels@sampo.creighton.edu
|
||||
Peter Seebach seebs@taniemarie.solon.com
|
||||
Petr Pisar petr.pisar@atlas.cz
|
||||
Petr Uzel petr.uzel@suse.cz
|
||||
Petter Reinholdtsen pere@hungry.com
|
||||
Phelippe Neveu pneveu@pcigeomatics.com
|
||||
Phil Richards phil.richards@vf.vodafone.co.uk
|
||||
Philipp Gortan gortan@gmail.com
|
||||
Philip Rowlands phr@doc.ic.ac.uk
|
||||
Philippe De Muyter phdm@macqel.be
|
||||
Philippe Schnoebelen Philippe.Schnoebelen@imag.fr
|
||||
Phillip Jones mouse@datastacks.com
|
||||
Piergiorgio Sartor sartor@sony.de
|
||||
Pieter Bowman bowman@math.utah.edu
|
||||
Piotr Gackiewicz gacek@intertele.pl
|
||||
Piotr Kwapulinski kwap@univ.gda.pl
|
||||
Prashant TR tr@eth.net
|
||||
Priit Jõerüüt jemm4jemm@yahoo.com
|
||||
Primoz PETERLIN primozz.peterlin@gmail.com
|
||||
Raimonds Miltins raimonds@pro-9.com
|
||||
Rainer Orth ro@TechFak.Uni-Bielefeld.DE
|
||||
Ralf W. Stephan stephan@tmt.de
|
||||
Ralf Wildenhues Ralf.Wildenhues@gmx.de
|
||||
Ralph Loader loader@maths.ox.ac.uk
|
||||
Raul Miller moth@magenta.com
|
||||
Raúl Núñez de Arenas Coronado raul@pleyades.net
|
||||
Rich Burridge rich.burridge@oracle.com
|
||||
Reuben Thomas rrt@sc3d.org
|
||||
Yang Ren ryang@redhat.com
|
||||
Richard A Downing richard.downing@bcs.org.uk
|
||||
Richard Braakman dark@xs4all.nl
|
||||
Richard Dawe rich@phekda.freeserve.co.uk
|
||||
@@ -546,15 +502,11 @@ Richard J. Rauenzahn rrauenza@hairball.cup.hp.com
|
||||
Richard Neill rn214@hermes.cam.ac.uk
|
||||
Richard Sharman rsharman@magmacom.com
|
||||
Rick Sladkey jrs@world.std.com
|
||||
Rick Stanley rstanley@rsiny.com
|
||||
Rik Faith faith@cs.unc.edu
|
||||
Risto Kankkunen kankkune@lingsoft.fi
|
||||
Rob Wortman wyrm@haell.com
|
||||
Robert H. de Vries robert@and.nl
|
||||
Robert Lindgren robert@orcafat.com
|
||||
Robert Millan zeratul2@wanadoo.es
|
||||
Robert Schwebel r.schwebel@pengutronix.de
|
||||
Robin H. Johnson robbat2@gentoo.org
|
||||
Rogier Wolff R.E.Wolff@BitWizard.nl
|
||||
Roland Huebner ro-huebner@gmx.de
|
||||
Roland Turner raz.tah.bet@raz.cx
|
||||
@@ -565,47 +517,42 @@ Ross Ridge rridge@calum.csclub.uwaterloo.ca
|
||||
Rudolf Kastl rkastl@redhat.com
|
||||
Sahil Amoli sahilamoli@gmail.com
|
||||
Sami Farin sfarin@ratol.fi
|
||||
Samuel Neves sneves@dei.uc.pt
|
||||
Samuel Tardieu sam@rfc1149.net
|
||||
Samuel Thibault samuel.thibault@ens-lyon.org
|
||||
Samuli Karkkainen Samuli.Karkkainen@hut.fi
|
||||
Sander van Malssen svm@kozmix.ow.nl
|
||||
Santiago Vila Doncel sanvila@unex.es
|
||||
Savochkin Andrey Vladimirovich saw@msu.ru
|
||||
Scott Harrison scott.gnu.2009@scottrix.co.uk
|
||||
Scott Lurndal slurn@griffin.engr.sgi.com
|
||||
Sébastien Maret smaret@umich.edu
|
||||
Sergei Steshenko sergstesh@yahoo.com
|
||||
Sergey Vlasov vsu@altlinux.org
|
||||
Shing-Shong Shei shei@cs.indiana.edu
|
||||
Soeren Sonnenburg sonnenburg@informatik.hu-berlin.de
|
||||
Solar Designer solar@owl.openwall.com
|
||||
Stanislav Ievlev inger@altlinux.ru
|
||||
Stavros Passas stabat@ics.forth.gr
|
||||
Stefan Vargyas stvar@yahoo.com
|
||||
Stéphane Chazelas Stephane_CHAZELAS@yahoo.fr
|
||||
Stephen Depooter sbdep@myrealbox.com
|
||||
Stephen Eglen eglen@pcg.wustl.edu
|
||||
Stephen Gildea gildea@stop.mail-abuse.org
|
||||
Stephen Shirley kormat@gmail.com
|
||||
Stephen Smoogen smooge@mindspring.com
|
||||
Steve McConnel steve@acadcomp.sil.org
|
||||
Steve McIntyre steve@einval.com
|
||||
Steve Ward planet36@gmail.com
|
||||
Steven Drake sbd@users.sourceforge.net
|
||||
Steven G. Johnson stevenj@alum.mit.edu
|
||||
Steven Mocking ufo@quicknet.nl
|
||||
Steven Parkes smparkes@smparkes.net
|
||||
Steven P Watson steven@magelico.net
|
||||
Steven Schveighoffer schveiguy@yahoo.com
|
||||
Stuart Citrin ctrn3e8@gmail.com
|
||||
Steven P Watson steven@magelico.net
|
||||
Stuart Kemp skemp@peter.bmc.com
|
||||
Stuart Shelton stuart@shelton.me
|
||||
Sven Breuner sven.breuner@itwm.fraunhofer.de
|
||||
Sven Joachim svenjoac@gmx.de
|
||||
Szakacsits Szabolcs szaka@sienet.hu
|
||||
Tadayoshi Funaba tadf@kt.rim.or.jp
|
||||
TAKAI Kousuke takai@vlsi.kuee.kyoto-u.ac.jp
|
||||
The Wanderer inverseparadox@comcast.net
|
||||
Theodore Ts'o tytso@rsts-11.mit.edu
|
||||
The Wanderer inverseparadox@comcast.net
|
||||
Theodoros V. Kalamatianos nyb@users.sourceforge.net
|
||||
Thomas Bushnell thomas@gnu.ai.mit.edu
|
||||
Thomas Goerlich thomas@schnappmatik.de
|
||||
Thomas Hood jdthood@yahoo.co.uk
|
||||
@@ -618,8 +565,8 @@ Tim J. Robbins tjr@FreeBSD.org
|
||||
Tim Mooney mooney@dogbert.cc.ndsu.NoDak.edu
|
||||
Tim Ryan Tim_Ryan@bnz.co.nz
|
||||
Tim Smithers mouse@dmouse.com.au
|
||||
Tim Underwood timunderwood@gmail.com
|
||||
Tim Waugh twaugh@redhat
|
||||
Tobias Stoeckmann tobias@bugol.de
|
||||
Toby Peterson toby@opendarwin.org
|
||||
Todd A. Jacobs tjacobs@codegnome.org
|
||||
Tom Fitzhenry tom@tom-fitzhenry.me.uk
|
||||
@@ -632,11 +579,10 @@ Ton Nijkes ton@murphy.nl
|
||||
Tony Kocurko akocurko@mun.ca
|
||||
Tony Leneis tony@plaza.ds.adp.com
|
||||
Tony Robinson ajr@eng.cam.ac.uk
|
||||
Toomas Soome Toomas.Soome@Elion.ee
|
||||
Toralf Förster toralf.foerster@gmx.de
|
||||
Torbjörn Lindgren tl@funcom.no
|
||||
Torbjorn Granlund tege@nada.kth.se
|
||||
Torbjorn Lindgren tl@funcom.no
|
||||
Torsten Landschoff torsten@pclab.ifg.uni-kiel.de
|
||||
Travis Gummels tgummels@redhat.com
|
||||
Tristan Miller psychonaut@nothingisreal.com
|
||||
Tzvi Rotshtein tzvi.ro@gmail.com
|
||||
Ulrich Drepper drepper@gnu.org
|
||||
@@ -666,12 +612,9 @@ 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
|
||||
Xu Zhongxing xu_zhong_xing@163.com
|
||||
Yang Ren ryang@redhat.com
|
||||
Yanko Kaneti yaneti@declera.com
|
||||
Yann Dirson dirson@debian.org
|
||||
Youngjun Song mastojun@gmail.com
|
||||
Yutaka Amanai yasai-itame1942@jade.plala.or.jp
|
||||
Zvi Har'El rl@math.technion.ac.il
|
||||
|
||||
;; Local Variables:
|
||||
;; coding: utf-8
|
||||
57
TODO
57
TODO
@@ -7,18 +7,19 @@ before embarking on a big project.
|
||||
==================================================
|
||||
Modify chmod so that it does not change an inode's st_ctime
|
||||
when the selected operation would have no other effect.
|
||||
First suggested by Hans Ecke <https://hans.ecke.ws> in
|
||||
https://lists.gnu.org/r/bug-coreutils/2004-09/msg00145.html
|
||||
Discussed more recently on <https://bugs.debian.org/497514>.
|
||||
First suggested by Hans Ecke <http://hans.ecke.ws> in
|
||||
http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/2920
|
||||
Discussed more recently on <http://bugs.debian.org/497514>.
|
||||
|
||||
document the following in coreutils.texi:
|
||||
mktemp
|
||||
[
|
||||
pinky
|
||||
|
||||
Suggestion from Paul Eggert:
|
||||
More generally, there's not that much use for imaxtostr nowadays,
|
||||
since the inttypes module and newer versions of gettext allow things
|
||||
like _("truncating %s at %jd bytes") to work portably.
|
||||
like _("truncating %s at %" PRIdMAX " bytes") to work portably.
|
||||
I suspect that (if someone cares to take the time) we can remove
|
||||
all instances of imaxtostr and umaxtostr in coreutils and gnulib.
|
||||
|
||||
@@ -34,8 +35,9 @@ printf:
|
||||
platforms where the native *printf(3) is deficient.
|
||||
Suggestion from Eric Blake.
|
||||
|
||||
consider adding some implementation of the "col" utility
|
||||
Suggested by Karl Berry.
|
||||
renice: POSIX utility, needs implementing.
|
||||
suggestion from Karl Berry (among others).
|
||||
Bob Proulx is working on this.
|
||||
|
||||
doc/coreutils.texi:
|
||||
Address this comment: FIXME: mv's behavior in this case is system-dependent
|
||||
@@ -43,18 +45,25 @@ doc/coreutils.texi:
|
||||
|
||||
ls: add --format=FORMAT option that controls how each line is printed.
|
||||
|
||||
cp --no-preserve=X should not attempt to preserve attribute X
|
||||
reported by Andreas Schwab
|
||||
|
||||
copy.c: Address the FIXME-maybe comment in copy_internal.
|
||||
And once that's done, add an exclusion so that 'cp --link'
|
||||
And once that's done, add an exclusion so that `cp --link'
|
||||
no longer incurs the overhead of saving src. dev/ino and dest. filename
|
||||
in the hash table.
|
||||
|
||||
Write an autoconf test to work around build failure in HPUX's 64-bit mode.
|
||||
See notes in README-install -- and remove them once there's a work-around.
|
||||
See notes in README -- and remove them once there's a work-around.
|
||||
|
||||
Integrate use of sendfile, suggested here:
|
||||
https://lists.gnu.org/r/bug-fileutils/2003-03/msg00030.html
|
||||
http://mail.gnu.org/archive/html/bug-fileutils/2003-03/msg00030.html
|
||||
I don't plan to do that, since a few tests demonstrate no significant benefit.
|
||||
|
||||
Should printf '\0123' print "\n3"?
|
||||
per report from TAKAI Kousuke on Mar 27
|
||||
http://mail.gnu.org/archive/html/bug-coreutils/2003-03/index.html
|
||||
|
||||
printf: consider adapting builtins/printf.def from bash
|
||||
|
||||
tail: don't use xlseek; it *exits*.
|
||||
@@ -67,6 +76,13 @@ lib/strftime.c: Since %N is the only format that we need but that
|
||||
would expand /%(-_)?\d*N/ to the desired string and then pass the
|
||||
resulting string to glibc's strftime.
|
||||
|
||||
unexpand: [http://www.opengroup.org/onlinepubs/007908799/xcu/unexpand.html]
|
||||
printf 'x\t \t y\n'|unexpand -t 8,9 should print its input, unmodified.
|
||||
printf 'x\t \t y\n'|unexpand -t 5,8 should print "x\ty\n"
|
||||
|
||||
Let GNU su use the `wheel' group if appropriate.
|
||||
(there are a couple patches, already)
|
||||
|
||||
sort: Investigate better sorting algorithms; see Knuth vol. 3.
|
||||
|
||||
We tried list merge sort, but it was about 50% slower than the
|
||||
@@ -86,11 +102,14 @@ sort: Investigate better sorting algorithms; see Knuth vol. 3.
|
||||
Mathematical Monthly 66 (1959), 387-389.
|
||||
|
||||
shred: Update shred as described here to conform to DoD 5220 rules:
|
||||
https://lists.gnu.org/r/bug-coreutils/2007-05/msg00075.html
|
||||
http://lists.gnu.org/archive/html/bug-coreutils/2007-05/msg00075.html
|
||||
|
||||
Remove suspicious uses of alloca (ones that may allocate more than
|
||||
about 4k)
|
||||
|
||||
Adapt these contribution guidelines for coreutils:
|
||||
http://sources.redhat.com/automake/contribute.html
|
||||
|
||||
Improve test coverage.
|
||||
See HACKING for instructions on generating an html test coverage report.
|
||||
Find a program that has poor coverage and improve.
|
||||
@@ -108,6 +127,10 @@ Changes expected to go in, someday.
|
||||
an implicit --NO-dereference-command-line-symlink-to-dir meaning.
|
||||
Pointed out by Karl Berry.
|
||||
|
||||
dd: consider adding an option to suppress `bytes/block read/written'
|
||||
output to stderr. Suggested here:
|
||||
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=165045
|
||||
|
||||
Pending copyright papers:
|
||||
------------------------
|
||||
getpwnam from Bruce Korb
|
||||
@@ -117,13 +140,17 @@ Changes expected to go in, someday.
|
||||
------------------------------
|
||||
|
||||
Remove long-deprecated options. Search case-insensitive for
|
||||
'deprecated' and 'remove in '. Automate this.
|
||||
`deprecated' and `remove in '. Automate this.
|
||||
|
||||
Add a distcheck-time test to ensure that every distributed
|
||||
file is either read-only(indicating generated) or is
|
||||
version-controlled and up to date.
|
||||
|
||||
remove all uses of the 'register' keyword: Done. add a maint.mk rule
|
||||
remove `%s' notation (now that they're all gone, add a maint.mk sc_
|
||||
rule to ensure no new ones are added):
|
||||
grep -E "\`%.{,4}s'" src/*.c
|
||||
|
||||
remove all uses of the `register' keyword: Done. add a maint.mk rule
|
||||
for this, too.
|
||||
|
||||
remove or adjust chown's --changes option, since it
|
||||
@@ -137,13 +164,13 @@ integers. To be converted: seq.
|
||||
Adapt tools like wc, tr, fmt, etc. (most of the textutils) to be
|
||||
multibyte aware. The problem is that I want to avoid duplicating
|
||||
significant blocks of logic, yet I also want to incur only minimal
|
||||
(preferably 'no') cost when operating in single-byte mode.
|
||||
(preferably `no') cost when operating in single-byte mode.
|
||||
|
||||
pr's use of nstrftime can make it malloc a very large (up to SIZE_MAX) buffer
|
||||
|
||||
-----
|
||||
|
||||
Copyright (C) 2002-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002-2009 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
|
||||
@@ -156,4 +183,4 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
279
bootstrap.conf
279
bootstrap.conf
@@ -1,6 +1,6 @@
|
||||
# Bootstrap configuration.
|
||||
|
||||
# Copyright (C) 2006-2024 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2006-2009 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
|
||||
@@ -13,147 +13,123 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
# We don't need these modules.
|
||||
avoided_gnulib_modules='
|
||||
--avoid=canonicalize-lgpl
|
||||
--avoid=dummy
|
||||
--avoid=mbuiter
|
||||
--avoid=mbuiterf
|
||||
'
|
||||
|
||||
# These modules are obsolete and can probably be removed soon,
|
||||
# but leave them in for now to minimize changes.
|
||||
obsolete_gnulib_modules='
|
||||
atexit
|
||||
memcmp
|
||||
memcpy
|
||||
memmove
|
||||
memset
|
||||
strcspn
|
||||
strtod
|
||||
strtol
|
||||
'
|
||||
|
||||
# gnulib modules used by this package.
|
||||
gnulib_modules="
|
||||
$avoided_gnulib_modules
|
||||
$obsolete_gnulib_modules
|
||||
acl
|
||||
alignalloc
|
||||
alignasof
|
||||
alloca
|
||||
announce-gen
|
||||
areadlink-with-size
|
||||
areadlinkat-with-size
|
||||
argmatch
|
||||
argv-iter
|
||||
assert
|
||||
assert-h
|
||||
assure
|
||||
attribute
|
||||
autobuild
|
||||
backup-rename
|
||||
backupfile
|
||||
base32
|
||||
base64
|
||||
btoc32
|
||||
buffer-lcm
|
||||
byteswap
|
||||
c-strcase
|
||||
c32iscntrl
|
||||
c32isspace
|
||||
c32width
|
||||
c-strtod
|
||||
c-strtold
|
||||
calloc
|
||||
canon-host
|
||||
canonicalize
|
||||
chmodat
|
||||
chown
|
||||
chownat
|
||||
cl-strtod
|
||||
cl-strtold
|
||||
cloexec
|
||||
closein
|
||||
closeout
|
||||
config-h
|
||||
configmake
|
||||
copy-file-range
|
||||
count-leading-zeros
|
||||
crypto/md5
|
||||
crypto/sha1
|
||||
crypto/sha256
|
||||
crypto/sha512
|
||||
crypto/sm3
|
||||
cycle-check
|
||||
d-ino
|
||||
d-type
|
||||
di-set
|
||||
diacrit
|
||||
dirfd
|
||||
dirname
|
||||
do-release-commit-and-tag
|
||||
dtoastr
|
||||
dup2
|
||||
environ
|
||||
error
|
||||
euidaccess
|
||||
exclude
|
||||
exitfail
|
||||
explicit_bzero
|
||||
faccessat
|
||||
fadvise
|
||||
fchdir
|
||||
fchmodat
|
||||
fchownat
|
||||
fclose
|
||||
fcntl
|
||||
fcntl-safer
|
||||
fd-reopen
|
||||
fdatasync
|
||||
fdopen
|
||||
fdutimensat
|
||||
file-has-acl
|
||||
fdl
|
||||
file-type
|
||||
fileblocks
|
||||
filemode
|
||||
filenamecat
|
||||
filevercmp
|
||||
flexmember
|
||||
fnmatch-gnu
|
||||
fopen-safer
|
||||
fprintftime
|
||||
fpurge
|
||||
free-posix
|
||||
freopen
|
||||
freopen-safer
|
||||
fseeko
|
||||
fstatat
|
||||
fsusage
|
||||
fsync
|
||||
ftoastr
|
||||
ftello
|
||||
ftruncate
|
||||
fts
|
||||
full-read
|
||||
full-write
|
||||
getdate
|
||||
getgroups
|
||||
gethrxtime
|
||||
getline
|
||||
getloadavg
|
||||
getlogin
|
||||
getndelim2
|
||||
getopt-gnu
|
||||
getpagesize
|
||||
gettext-h
|
||||
getpass-gnu
|
||||
gettext
|
||||
gettime
|
||||
gettime-res
|
||||
gettimeofday
|
||||
getugroups
|
||||
getusershell
|
||||
git-version-gen
|
||||
gitlog-to-changelog
|
||||
gnu-make
|
||||
gnu-web-doc-update
|
||||
gnumakefile
|
||||
gnupload
|
||||
group-member
|
||||
hard-locale
|
||||
hash
|
||||
hash-triple
|
||||
heap
|
||||
hash-pjw
|
||||
host-os
|
||||
human
|
||||
idcache
|
||||
idx
|
||||
ignore-value
|
||||
inttostr
|
||||
inttypes
|
||||
isapipe
|
||||
isatty
|
||||
isblank
|
||||
largefile
|
||||
lchmod
|
||||
ldtoastr
|
||||
lchown
|
||||
lib-ignore
|
||||
libgmp
|
||||
linebuffer
|
||||
link
|
||||
link-follow
|
||||
@@ -161,142 +137,103 @@ gnulib_modules="
|
||||
long-options
|
||||
lstat
|
||||
maintainer-makefile
|
||||
malloc-gnu
|
||||
malloc
|
||||
manywarnings
|
||||
mbrlen
|
||||
mbrtoc32
|
||||
mbrtowc
|
||||
mbschr
|
||||
mbslen
|
||||
mbsalign
|
||||
mbswidth
|
||||
mbszero
|
||||
mcel-prefer
|
||||
memcasecmp
|
||||
memchr
|
||||
memcmp2
|
||||
mempcpy
|
||||
memrchr
|
||||
minmax
|
||||
mgetgroups
|
||||
mkancesdirs
|
||||
mkdir
|
||||
mkdir-p
|
||||
mkdirat
|
||||
mkfifo
|
||||
mkfifoat
|
||||
mknod
|
||||
mkostemp
|
||||
mkstemp
|
||||
mktime
|
||||
modechange
|
||||
mountlist
|
||||
mpsort
|
||||
nproc
|
||||
nstrftime
|
||||
nullptr
|
||||
obstack
|
||||
open
|
||||
openat-safer
|
||||
parse-datetime
|
||||
parse-datetime2
|
||||
pathmax
|
||||
perl
|
||||
physmem
|
||||
pipe-posix
|
||||
pipe2
|
||||
posix-shell
|
||||
posixtm
|
||||
posixver
|
||||
priv-set
|
||||
progname
|
||||
propername-lite
|
||||
pthread-cond
|
||||
pthread-mutex
|
||||
pthread-thread
|
||||
pthread_sigmask
|
||||
propername
|
||||
putenv
|
||||
quote
|
||||
quotearg
|
||||
raise
|
||||
randint
|
||||
randperm
|
||||
rawmemchr
|
||||
read-file
|
||||
readlink
|
||||
readtokens
|
||||
readtokens0
|
||||
readutmp
|
||||
realloc
|
||||
regex
|
||||
remove
|
||||
renameat
|
||||
renameatu
|
||||
rename
|
||||
rename-dest-slash
|
||||
rmdir
|
||||
root-dev-ino
|
||||
rpmatch
|
||||
safe-read
|
||||
same
|
||||
save-cwd
|
||||
savedir
|
||||
savewd
|
||||
select
|
||||
selinux-at
|
||||
setenv
|
||||
settime
|
||||
sig2str
|
||||
sigaction
|
||||
skipchars
|
||||
smack
|
||||
ssize_t
|
||||
stat-macros
|
||||
stat-size
|
||||
stat-time
|
||||
stdbool
|
||||
stdckdint
|
||||
stdlib-safer
|
||||
stpcpy
|
||||
stpncpy
|
||||
strdup-posix
|
||||
strnlen
|
||||
strnumcmp
|
||||
strftime
|
||||
strpbrk
|
||||
strsignal
|
||||
strtoimax
|
||||
strtoumax
|
||||
symlinkat
|
||||
sys_ioctl
|
||||
sys_resource
|
||||
strverscmp
|
||||
symlink
|
||||
sys_stat
|
||||
sys_wait
|
||||
targetdir
|
||||
tempname
|
||||
termios
|
||||
time_rz
|
||||
timer-time
|
||||
timespec
|
||||
tmpdir
|
||||
tzset
|
||||
uname
|
||||
unicodeio
|
||||
unistd-safer
|
||||
unlink-busy
|
||||
unlinkat
|
||||
unlinkdir
|
||||
unlocked-io
|
||||
unsetenv
|
||||
update-copyright
|
||||
uptime
|
||||
useless-if-before-free
|
||||
userspec
|
||||
utimecmp
|
||||
utimens
|
||||
utimensat
|
||||
vasprintf-posix
|
||||
vc-list-files
|
||||
verify
|
||||
verror
|
||||
version-etc-fsf
|
||||
warnings
|
||||
wcwidth
|
||||
winsz-ioctl
|
||||
winsz-termios
|
||||
write-any-file
|
||||
xalignalloc
|
||||
xalloc
|
||||
xbinary-io
|
||||
xdectoint
|
||||
xfts
|
||||
xfreopen
|
||||
xgetcwd
|
||||
xgetgroups
|
||||
xgethostname
|
||||
xmemcoll
|
||||
xnanosleep
|
||||
@@ -306,10 +243,8 @@ gnulib_modules="
|
||||
xstrtod
|
||||
xstrtoimax
|
||||
xstrtol
|
||||
xstrtol-error
|
||||
xstrtold
|
||||
xstrtoumax
|
||||
year2038-recommended
|
||||
yesno
|
||||
"
|
||||
|
||||
@@ -338,86 +273,60 @@ see_manual='"This is a proper name. See the gettext manual, section Names."'
|
||||
see_manual=\'"$see_manual"\'
|
||||
XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
|
||||
--keyword=proper_name:1,'"$see_manual"'\\\
|
||||
--keyword=proper_name_lite:1,'"$see_manual"'\\\
|
||||
--keyword=proper_name_utf8:1,'"$see_manual"'\\\
|
||||
'
|
||||
|
||||
gnulib_tool_option_extras="--tests-base=gnulib-tests --with-tests --symlink\
|
||||
--makefile-name=gnulib.mk --automake-subdir
|
||||
"
|
||||
# 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/uintmax_t.m4
|
||||
m4/ulonglong.m4
|
||||
m4/visibility.m4
|
||||
'
|
||||
fi
|
||||
|
||||
gnulib_tool_option_extras="--tests-base=$bt/gnulib-tests --with-tests"
|
||||
|
||||
# Build prerequisites
|
||||
buildreq="\
|
||||
autoconf 2.64
|
||||
automake 1.11.2
|
||||
autopoint 0.19.2
|
||||
autoconf 2.61
|
||||
automake 1.11
|
||||
autopoint -
|
||||
bison -
|
||||
gettext 0.19.2
|
||||
gettext -
|
||||
git 1.4.4
|
||||
gperf -
|
||||
gzip -
|
||||
m4 -
|
||||
makeinfo 6.1
|
||||
texi2pdf 6.1
|
||||
patch -
|
||||
makeinfo -
|
||||
perl 5.5
|
||||
rsync -
|
||||
tar -
|
||||
wget -
|
||||
xz -
|
||||
"
|
||||
|
||||
bootstrap_post_import_hook ()
|
||||
{
|
||||
# Automake requires that ChangeLog exist.
|
||||
touch ChangeLog || return 1
|
||||
# List of coreutils programs. See heading comments in the invoked
|
||||
# script for more info. Keep this in sync with the rules in
|
||||
(m4f=m4/cu-progs.m4 mkf=src/cu-progs.mk tmp=cu-progs.tmp \
|
||||
&& rm -f $m4f $mkf $tmp-1 $tmp-2 \
|
||||
&& build-aux/gen-lists-of-programs.sh --autoconf >$tmp-1 \
|
||||
&& build-aux/gen-lists-of-programs.sh --automake >$tmp-2 \
|
||||
&& chmod a-w $tmp-1 $tmp-2 \
|
||||
&& mv -f $tmp-1 $m4f && mv -f $tmp-2 $mkf)
|
||||
|
||||
# Regenerate src/single-binary.mk
|
||||
(mkf=src/single-binary.mk tmp=single-binary.tmp \
|
||||
&& rm -f $mkf $tmp \
|
||||
&& build-aux/gen-single-binary.sh src/local.mk >$tmp \
|
||||
&& chmod a-w $tmp \
|
||||
&& mv -f $tmp $mkf)
|
||||
}
|
||||
|
||||
# Automake requires that ChangeLog exist.
|
||||
touch ChangeLog || exit 1
|
||||
|
||||
bootstrap_epilogue()
|
||||
{
|
||||
# Since this is a "GNU" package, replace this line
|
||||
# if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null \
|
||||
# | grep -v 'libtool:' >/dev/null; then
|
||||
# with this:
|
||||
# if true; then
|
||||
# Why? That pipeline searches all files in $(top_srcdir), and if you
|
||||
# happen to have large files (or apparently large sparse files), the
|
||||
# first grep may well run out of memory.
|
||||
perl -pi -e 's/if LC_ALL=C grep .GNU .PACKAGE.*; then/if true; then/' \
|
||||
po/Makefile.in.in
|
||||
|
||||
# Add dummy 'install-html' target, required for packages using
|
||||
# non-recursive makefiles with older gettext.
|
||||
# See https://debbugs.gnu.org/25690
|
||||
if ! grep -w 'install-html' po/Makefile.in.in ; then
|
||||
printf 'install-%s:;\n' dvi ps pdf html >> po/Makefile.in.in
|
||||
fi
|
||||
|
||||
# Install our git hooks, as long as "cp" accepts the --backup option,
|
||||
# so that we can back up any existing files.
|
||||
case $(cp --help) in *--backup*) backup=1;; *) backup=0;; esac
|
||||
if test $backup = 1; then
|
||||
hooks=$(cd scripts/git-hooks && git ls-files)
|
||||
for f in $hooks; do
|
||||
# If it is identical, skip it.
|
||||
cmp scripts/git-hooks/$f .git/hooks/$f > /dev/null \
|
||||
&& continue
|
||||
cp --backup=numbered scripts/git-hooks/$f .git/hooks
|
||||
chmod a-w .git/hooks/$f
|
||||
done
|
||||
fi
|
||||
# Change paths in gnulib-tests/gnulib.mk from "../.." to "..".
|
||||
m=gnulib-tests/gnulib.mk
|
||||
sed 's,\.\./\.\.,..,g' $m > $m-t
|
||||
mv -f $m-t $m
|
||||
}
|
||||
|
||||
241
build-aux/ChangeLog-2007
Normal file
241
build-aux/ChangeLog-2007
Normal file
@@ -0,0 +1,241 @@
|
||||
2007-09-29 Eric Blake <ebb9@byu.net>
|
||||
|
||||
* check.mk (%.log): Also allow suffix-less tests, on platforms
|
||||
where $(EXEEXT) is not empty.
|
||||
|
||||
2007-09-15 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* vc-list-files: Remove mercurial support.
|
||||
Check for CVS first. Adjust comments.
|
||||
|
||||
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.
|
||||
Add a comment about cvsu.
|
||||
|
||||
2006-08-22 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* .cvsignore: New file.
|
||||
|
||||
2006-08-20 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* compile, config.guess, config.rpath, config.sub, depcomp:
|
||||
* install-sh, mdate-sh, missing, texinfo.tex:
|
||||
Remove from CVS, since ../bootstrap generates them automatically.
|
||||
|
||||
2006-08-15 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* ChangeLog: Add copyright notice.
|
||||
* vc-list-files: Likewise.
|
||||
* mkinstalldirs: Remove; no longer needed.
|
||||
|
||||
2006-08-09 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* texinfo.tex: Update from gnulib.
|
||||
|
||||
2006-07-25 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* vc-list-files: Handle git repositories, too.
|
||||
|
||||
2006-07-19 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* vc-list-files: Command line args correspond to an "include"
|
||||
list, not an exclude list.
|
||||
|
||||
2006-07-14 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* vc-list-files: New file.
|
||||
|
||||
2006-07-08 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess, config.sub, install-sh, texinfo.tex:
|
||||
Update from gnulib.
|
||||
|
||||
2006-05-29 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* config.guess, config.rpath, config.sub, install-sh:
|
||||
* mkinstalldirs, texinfo.tex: Update from gnulib.
|
||||
|
||||
2006-02-14 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* install-sh: Update from gnulib.
|
||||
|
||||
2006-01-31 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* config.guess, missing, texinfo.tex: Update from gnulib.
|
||||
|
||||
2006-01-10 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess, config.sub, depcomp, texinfo.tex: Sync from gnulib.
|
||||
|
||||
2005-12-13 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess: Sync from gnulib.
|
||||
|
||||
2005-12-07 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* cvsu: New file.
|
||||
|
||||
2005-11-12 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* config.guess, install-sh: Update from gnulib.
|
||||
|
||||
2005-10-23 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* compile: New file, used to build sha* programs from md5sum.c.
|
||||
|
||||
2005-10-13 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* texinfo.tex: Sync from gnulib.
|
||||
|
||||
2005-09-21 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* install-sh, config.guess: Sync from gnulib.
|
||||
|
||||
2005-07-01 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* config.guess, config.sub, mdate-sh, missing, mkinstalldirs:
|
||||
* texinfo.tex: Update from gnulib.
|
||||
|
||||
2005-06-02 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess, config.sub, texinfo.tex: Sync from gnulib.
|
||||
|
||||
2005-05-20 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess: Sync from gnulib.
|
||||
|
||||
2005-05-15 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* depcomp, install-sh, mdate-sh, missing, pmkinstalldirs:
|
||||
Sync from gnulib (scriptversion change only).
|
||||
|
||||
2005-05-14 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess, config.sub: Sync from gnulib.
|
||||
|
||||
2005-05-01 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess, config.sub, texinfo.tex: Sync from gnulib.
|
||||
|
||||
2005-03-20 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.rpath: Sync from gnulib.
|
||||
|
||||
2005-02-25 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess, config.sub, depcomp, install-sh, mdate-sh, missing,
|
||||
mkinstalldirs: Sync from gnulib.
|
||||
|
||||
2005-01-21 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.sub: Sync from gnulib.
|
||||
|
||||
2004-12-17 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* install-sh: Sync from gnulib.
|
||||
|
||||
2004-12-16 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* mdate-sh: Sync from gnulib.
|
||||
|
||||
2004-11-23 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.sub, texinfo.tex: Sync from gnulib.
|
||||
|
||||
2004-11-17 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess, config.sub: Sync from gnulib.
|
||||
|
||||
2004-11-10 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* texinfo.tex: Sync from gnulib.
|
||||
|
||||
2004-11-02 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* texinfo.tex: Sync from gnulib.
|
||||
|
||||
2004-10-29 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess, install-sh, texinfo.tex: Sync from gnulib.
|
||||
|
||||
2004-10-03 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess, config.sub, install-sh, missing, texinfo.tex:
|
||||
Sync from gnulib.
|
||||
|
||||
2004-09-24 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* cvsu: Remove file. The version of cvsu from the cvsutils package
|
||||
does the same job with --find --type=... options.
|
||||
* cvsu: New file, used by rules in coreutils' Makefile.maint.
|
||||
|
||||
2004-08-05 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* config.guess, config.sub, install-sh, texinfo.tex: Sync from gnulib.
|
||||
|
||||
2004-03-30 Paul Eggert <eggert@twinsun.com>
|
||||
|
||||
* config.guess, config.sub, install-sh, texinfo.tex: Sync from gnulib.
|
||||
|
||||
2003-08-16 Paul Eggert <eggert@twinsun.com>
|
||||
|
||||
* config.rpath, texinfo.tex: Sync with gnulib.
|
||||
|
||||
2003-04-21 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* depcomp: New version, now that this file is on the list
|
||||
in ../Makefile.cfg.
|
||||
|
||||
2003-01-12 Jim Meyering <jim@meyering.net>
|
||||
|
||||
Lots of syntactic clean-up, mostly from Karl Berry.
|
||||
* install-sh: Use consistent indentation, two spaces per level.
|
||||
(scriptversion): New variable.
|
||||
Change initializations like `variable=""' to `variable='.
|
||||
(usage): New variable.
|
||||
Use `test', not `['.
|
||||
Use `test -z "$var"', not `[ x"$var" = x ]'.
|
||||
Use `test -n "$var"', not `[ x"$var" != x ]'.
|
||||
Alphabetize case entries.
|
||||
Accept --help and --version options.
|
||||
Remove unnecessary `else :' clauses.
|
||||
Add a `Local variables' eval block to help emacs users update
|
||||
the time-stamp variable added above.
|
||||
|
||||
2002-12-20 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* install-sh: Set the execute bit on this file.
|
||||
Reported by Vin Shelton.
|
||||
|
||||
2002-11-09 Jim Meyering <jim@meyering.net>
|
||||
|
||||
Make it work even when names contain spaces or shell metachars.
|
||||
* install-sh: Write diagnostics to stderr, not stdout.
|
||||
Normalize spacing in diagnostics: use one space (not two, and not a TAB)
|
||||
after the leading `install:'.
|
||||
Add double quotes around `$src' here: $doit $instcmd "$src" "$dsttmp"
|
||||
|
||||
Merge in some changes from the version in automake.
|
||||
* install-sh: Remove unnecessary quotes around `case' argument.
|
||||
Use `[ cond1 ] || [ cond2 ]' rather than `[ cond1 -o cond2 ]'.
|
||||
Use `:' rather than `true'.
|
||||
|
||||
2002-02-17 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* config.guess (main): Don't use `head -1'; it's no longer portable.
|
||||
Use `sed 1q' instead.
|
||||
|
||||
|
||||
-----
|
||||
|
||||
Copyright (C) 2002-2009 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without
|
||||
modification, are permitted provided the copyright notice
|
||||
and this notice are preserved.
|
||||
512
build-aux/cvsu
Executable file
512
build-aux/cvsu
Executable file
@@ -0,0 +1,512 @@
|
||||
#! /usr/bin/perl -w
|
||||
|
||||
# cvsu - do a quick check to see what files are out of date.
|
||||
#
|
||||
# Copyright (C) 2000-2005 Pavel Roskin <proski@gnu.org>
|
||||
# Initially written by Tom Tromey <tromey@cygnus.com>
|
||||
# Completely rewritten by Pavel Roskin <proski@gnu.org>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
require 5.004;
|
||||
use Getopt::Long;
|
||||
use File::Basename;
|
||||
use Time::Local;
|
||||
use strict;
|
||||
|
||||
use vars qw($list_types %messages %options @batch_list $batch_cmd
|
||||
$no_recurse $explain_type $find_mode $short_print
|
||||
$no_cvsignore $nolinks $file $single_filename $curr_dir
|
||||
@common_ignores $ignore_rx %entries %subdirs %removed);
|
||||
|
||||
use constant SUBDIR_FOUND => 1;
|
||||
use constant SUBDIR_CVS => 2;
|
||||
|
||||
# This list comes from the CVS manual.
|
||||
use constant STANDARD_IGNORES =>
|
||||
('RCS', 'SCCS', 'CVS', 'CVS.adm', 'RCSLOG', 'cvslog.*', 'tags',
|
||||
'TAGS', '.make.state', '.nse_depinfo', '*~', '#*', '.#*', ',*',
|
||||
"_\$*", "*\$", '*.old', '*.bak', '*.BAK', '*.orig', '*.rej',
|
||||
'.del-*', '*.a', '*.olb', '*.o', '*.obj', '*.so', '*.exe',
|
||||
'*.Z', '*.elc', '*.ln', 'core');
|
||||
|
||||
# 3-letter month names in POSIX locale, for fast date decoding
|
||||
my %months = (
|
||||
"Jan" => 0,
|
||||
"Feb" => 1,
|
||||
"Mar" => 2,
|
||||
"Apr" => 3,
|
||||
"May" => 4,
|
||||
"Jun" => 5,
|
||||
"Jul" => 6,
|
||||
"Aug" => 7,
|
||||
"Sep" => 8,
|
||||
"Oct" => 9,
|
||||
"Nov" => 10,
|
||||
"Dec" => 11
|
||||
);
|
||||
|
||||
# print usage information and exit
|
||||
sub usage ()
|
||||
{
|
||||
print "Usage:\n" .
|
||||
" cvsu [OPTIONS] [FILE] ...\n" .
|
||||
"Options:\n" .
|
||||
" --local Disable recursion\n" .
|
||||
" --explain Verbosely print status of files\n" .
|
||||
" --find Emulate find - filenames only\n" .
|
||||
" --short Don't print paths\n" .
|
||||
" --ignore Don't read .cvsignore\n" .
|
||||
" --messages List known file types and long messages\n" .
|
||||
" --nolinks Disable recognizing hard and soft links\n" .
|
||||
" --types=[^]LIST Print only file types [not] from LIST\n" .
|
||||
" --batch=COMMAND Execute this command on files\n" .
|
||||
" --help Print this usage information\n" .
|
||||
" --version Print version number\n" .
|
||||
"Abbreviations and short options are supported\n";
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# print version information and exit
|
||||
sub version ()
|
||||
{
|
||||
print "cvsu - CVS offline examiner, version 0.2.3\n";
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# If types begin with '^', make inversion
|
||||
sub adjust_types ()
|
||||
{
|
||||
if ($list_types =~ m{^\^(.*)$}) {
|
||||
$list_types = "";
|
||||
foreach (keys %messages) {
|
||||
$list_types .= $_
|
||||
if (index ($1, $_) < 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# list known messages and exit
|
||||
sub list_messages ()
|
||||
{
|
||||
my $default_mark;
|
||||
print "Recognizable file types are:\n";
|
||||
foreach (sort keys %messages) {
|
||||
if (index($list_types, $_) >= 0) {
|
||||
$default_mark = "*";
|
||||
} else {
|
||||
$default_mark = " ";
|
||||
}
|
||||
print " $default_mark $_ $messages{$_}\n";
|
||||
}
|
||||
print "* indicates file types listed by default\n";
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# Initialize @common_ignores
|
||||
# Also read $HOME/.cvsignore and append it to @common_ignores
|
||||
sub init_ignores ()
|
||||
{
|
||||
my $HOME = $ENV{"HOME"};
|
||||
|
||||
push @common_ignores, STANDARD_IGNORES;
|
||||
|
||||
unless (defined($HOME)) {
|
||||
return;
|
||||
}
|
||||
|
||||
my $home_cvsignore = "${HOME}/.cvsignore";
|
||||
|
||||
if (-f "$home_cvsignore") {
|
||||
|
||||
unless (open (CVSIGNORE, "< $home_cvsignore")) {
|
||||
error ("couldn't open $home_cvsignore: $!");
|
||||
}
|
||||
|
||||
while (<CVSIGNORE>) {
|
||||
push (@common_ignores, split);
|
||||
}
|
||||
|
||||
close (CVSIGNORE);
|
||||
}
|
||||
|
||||
my $CVSIGNOREENV = $ENV{"CVSIGNORE"};
|
||||
|
||||
unless (defined($CVSIGNOREENV)) {
|
||||
return;
|
||||
}
|
||||
|
||||
my @ignores_var = split (/ /, $CVSIGNOREENV);
|
||||
push (@common_ignores, @ignores_var);
|
||||
|
||||
}
|
||||
|
||||
# Print message and exit (like "die", but without raising an exception).
|
||||
# Newline is added at the end.
|
||||
sub error ($)
|
||||
{
|
||||
print STDERR "cvsu: ERROR: " . shift(@_) . "\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
# execute commands from @exec_list with $exec_cmd
|
||||
sub do_batch ()
|
||||
{
|
||||
my @cmd_list = split (' ', $batch_cmd);
|
||||
system (@cmd_list, @batch_list);
|
||||
}
|
||||
|
||||
# print files status
|
||||
# Parameter 1: status in one-letter representation
|
||||
sub file_status ($)
|
||||
{
|
||||
my $type = shift (@_);
|
||||
my $item;
|
||||
my $pathfile;
|
||||
|
||||
return
|
||||
if $ignore_rx ne '' && $type =~ /[?SLD]/ && $file =~ /$ignore_rx/;
|
||||
|
||||
return
|
||||
if (index($list_types, $type) < 0);
|
||||
|
||||
$pathfile = $curr_dir . $file;
|
||||
|
||||
if (defined($batch_cmd)) {
|
||||
push (@batch_list, $pathfile);
|
||||
# 1000 items in the command line might be too much for HP-UX
|
||||
if ($#batch_list > 1000) {
|
||||
do_batch();
|
||||
undef @batch_list;
|
||||
}
|
||||
}
|
||||
|
||||
if ($short_print) {
|
||||
$item = $file;
|
||||
} else {
|
||||
$item = $pathfile;
|
||||
}
|
||||
|
||||
if ($find_mode) {
|
||||
print "$item\n";
|
||||
} else {
|
||||
$type = $messages{$type}
|
||||
if ($explain_type);
|
||||
print "$type $item\n";
|
||||
}
|
||||
}
|
||||
|
||||
# load entries from CVS/Entries and CVS/Entries.Log
|
||||
# Parameter 1: file name for CVS/Entries
|
||||
# Return: list of entries in the format used in CVS/Entries
|
||||
sub load_entries ($);
|
||||
sub load_entries ($)
|
||||
{
|
||||
my $entries_file = shift (@_);
|
||||
my $entries_log_file = "$entries_file.Log";
|
||||
my %ent = ();
|
||||
|
||||
unless (open (ENTRIES, "< $entries_file")) {
|
||||
error ("couldn't open $entries_file: $!");
|
||||
}
|
||||
while (<ENTRIES>) {
|
||||
chomp;
|
||||
$ent{$_} = 1;
|
||||
}
|
||||
close (ENTRIES);
|
||||
|
||||
if (open (ENTRIES, "< $entries_log_file")) {
|
||||
while (<ENTRIES>) {
|
||||
chomp;
|
||||
if ( m{^A (.+)} ) {
|
||||
$ent{$1} = 1;
|
||||
} elsif ( m{^R (.+)} ) {
|
||||
delete $ent{$1};
|
||||
} else {
|
||||
# Note: "cvs commit" helps even when you are offline
|
||||
error ("$entries_log_file:$.: unrecognizable line, " .
|
||||
"try \"cvs commit\"");
|
||||
}
|
||||
}
|
||||
close (ENTRIES);
|
||||
}
|
||||
|
||||
return keys %ent;
|
||||
}
|
||||
|
||||
# process one directory
|
||||
# Parameter 1: directory name
|
||||
sub process_arg ($);
|
||||
sub process_arg ($)
|
||||
{
|
||||
my $arg = shift (@_);
|
||||
my %found_files = ();
|
||||
|
||||
# $file, $curr_dir, and $ignore_rx must be seen in file_status
|
||||
local $file = "";
|
||||
local $ignore_rx = "";
|
||||
local $single_filename = 0;
|
||||
|
||||
if ( $arg eq "" or -d $arg ) {
|
||||
$curr_dir = $arg;
|
||||
my $real_curr_dir = $curr_dir eq "" ? "." : $curr_dir;
|
||||
|
||||
error ("$real_curr_dir is not a directory")
|
||||
unless ( -d $real_curr_dir );
|
||||
|
||||
# Scan present files.
|
||||
file_status (".");
|
||||
opendir (DIR, $real_curr_dir) ||
|
||||
error ("couldn't open directory $real_curr_dir: $!");
|
||||
foreach (readdir (DIR)) {
|
||||
$found_files {$_} = 1;
|
||||
}
|
||||
closedir (DIR);
|
||||
} else {
|
||||
$single_filename = basename $arg;
|
||||
$curr_dir = dirname $arg;
|
||||
$found_files{$single_filename} = 1 if lstat $arg;
|
||||
}
|
||||
|
||||
$curr_dir .= "/"
|
||||
unless ( $curr_dir eq "" || $curr_dir =~ m{/$} );
|
||||
|
||||
# Scan CVS/Entries.
|
||||
my %entries = ();
|
||||
my %subdirs = ();
|
||||
my %removed = ();
|
||||
|
||||
foreach ( load_entries ("${curr_dir}CVS/Entries") ) {
|
||||
if ( m{^D/([^/]+)/} ) {
|
||||
$subdirs{$1} = SUBDIR_FOUND if !$single_filename;
|
||||
} elsif ( m{^/([^/]+)/([^/])[^/]*/([^/]*)/} ) {
|
||||
if ( !$single_filename or $single_filename eq $1 ) {
|
||||
$entries{$1} = $3;
|
||||
$removed{$1} = 1
|
||||
if $2 eq '-';
|
||||
}
|
||||
} elsif ( m{^D$} ) {
|
||||
next;
|
||||
} else {
|
||||
error ("${curr_dir}CVS/Entries: unrecognizable line");
|
||||
}
|
||||
}
|
||||
|
||||
if ( $single_filename && !$entries{$single_filename} &&
|
||||
!$found_files{$single_filename} ) {
|
||||
error ("nothing known about $arg");
|
||||
}
|
||||
|
||||
# Scan .cvsignore if any
|
||||
unless ($no_cvsignore) {
|
||||
my (@ignore_list) = ();
|
||||
|
||||
if (-f "${curr_dir}.cvsignore") {
|
||||
open (CVSIGNORE, "< ${curr_dir}.cvsignore")
|
||||
|| error ("couldn't open ${curr_dir}.cvsignore: $!");
|
||||
while (<CVSIGNORE>) {
|
||||
push (@ignore_list, split);
|
||||
}
|
||||
close (CVSIGNORE);
|
||||
}
|
||||
|
||||
my ($iter);
|
||||
foreach $iter (@ignore_list, @common_ignores) {
|
||||
if ($iter eq '!') {
|
||||
$ignore_rx = ''
|
||||
} else {
|
||||
if ($ignore_rx eq '') {
|
||||
$ignore_rx = '^(';
|
||||
} else {
|
||||
$ignore_rx .= '|';
|
||||
}
|
||||
$ignore_rx .= glob_to_rx ($iter);
|
||||
}
|
||||
}
|
||||
$ignore_rx .= ')$'
|
||||
if $ignore_rx ne '';
|
||||
}
|
||||
|
||||
# File is missing
|
||||
foreach $file (sort keys %entries) {
|
||||
unless ($found_files{$file}) {
|
||||
if ($removed{$file}) {
|
||||
file_status("R");
|
||||
} else {
|
||||
file_status("U");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach $file (sort keys %found_files) {
|
||||
next if ($file eq '.' || $file eq '..');
|
||||
lstat ($curr_dir . $file) ||
|
||||
error ("lstat() failed on $curr_dir . $file");
|
||||
if (! $nolinks && -l _) {
|
||||
file_status ("L");
|
||||
} elsif (-d _) {
|
||||
if ($file eq 'CVS') {
|
||||
file_status ("C");
|
||||
} elsif ($subdirs{$file}) {
|
||||
$subdirs{$file} = SUBDIR_CVS;
|
||||
} else {
|
||||
file_status ("D"); # Unknown directory
|
||||
}
|
||||
} elsif (! (-f _) && ! (-l _)) {
|
||||
file_status ("S"); # This must be something very special
|
||||
} elsif (! $nolinks && (stat _) [3] > 1 ) {
|
||||
file_status ("H"); # Hard link
|
||||
} elsif (! $entries{$file}) {
|
||||
file_status ("?");
|
||||
} elsif ($entries{$file} =~ /^Initial |^dummy /) {
|
||||
file_status ("A");
|
||||
} elsif ($entries{$file} =~ /^Result of merge/) {
|
||||
file_status ("G");
|
||||
} elsif ($entries{$file} !~
|
||||
/^(...) (...) (..) (..):(..):(..) (....)$/) {
|
||||
error ("Invalid timestamp for $curr_dir$file: $entries{$file}");
|
||||
} else {
|
||||
my $cvtime = timegm($6, $5, $4, $3, $months{$2}, $7 - 1900);
|
||||
my $mtime = (stat _) [9];
|
||||
if ($cvtime == $mtime) {
|
||||
file_status ("F");
|
||||
} elsif ($cvtime < $mtime) {
|
||||
file_status ("M");
|
||||
} else {
|
||||
file_status ("O");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Now do directories.
|
||||
unless ($no_recurse) {
|
||||
my $save_curr_dir = $curr_dir;
|
||||
foreach $file (sort keys %subdirs) {
|
||||
if ($subdirs{$file} == SUBDIR_FOUND) {
|
||||
$curr_dir = $save_curr_dir;
|
||||
file_status ("X");
|
||||
} elsif ($subdirs{$file} == SUBDIR_CVS) {
|
||||
process_arg ($save_curr_dir . $file)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Turn a glob into a regexp without recognizing square brackets.
|
||||
sub glob_to_rx_simple ($)
|
||||
{
|
||||
my ($expr) = @_;
|
||||
# Quote all non-word characters, convert ? to . and * to .*
|
||||
$expr =~ s/(\W)/\\$1/g;
|
||||
$expr =~ s/\\\*/.*/g;
|
||||
$expr =~ s/\\\?/./g;
|
||||
return $expr;
|
||||
}
|
||||
|
||||
# Turn a glob into a regexp
|
||||
sub glob_to_rx ($)
|
||||
{
|
||||
my $result = '';
|
||||
my ($expr) = @_;
|
||||
# Find parts in square brackets and copy them literally
|
||||
# Text outside brackets is processed by glob_to_rx_simple()
|
||||
while ($expr ne '') {
|
||||
if ($expr =~ /^(.*?)(\[.*?\])(.*)/) {
|
||||
$expr = $3;
|
||||
$result .= glob_to_rx_simple ($1) . $2;
|
||||
} else {
|
||||
$result .= glob_to_rx_simple ($expr);
|
||||
last;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
sub Main ()
|
||||
{
|
||||
# types of files to be listed
|
||||
$list_types = "^.FCL";
|
||||
|
||||
# long status messages
|
||||
%messages = (
|
||||
"?" => "Unlisted file",
|
||||
"." => "Known directory",
|
||||
"F" => "Up-to-date file",
|
||||
"C" => "CVS admin directory",
|
||||
"M" => "Modified file",
|
||||
"S" => "Special file",
|
||||
"D" => "Unlisted directory",
|
||||
"L" => "Symbolic link",
|
||||
"H" => "Hard link",
|
||||
"U" => "Lost file",
|
||||
"X" => "Lost directory",
|
||||
"A" => "Newly added",
|
||||
"O" => "Older copy",
|
||||
"G" => "Result of merge",
|
||||
"R" => "Removed file"
|
||||
);
|
||||
|
||||
undef @batch_list; # List of files for batch processing
|
||||
undef $batch_cmd; # Command to be executed on files
|
||||
$no_recurse = 0; # If this is set, do only local files
|
||||
$explain_type = 0; # Verbosely print status of files
|
||||
$find_mode = 0; # Don't print status at all
|
||||
$short_print = 0; # Print only filenames without path
|
||||
$no_cvsignore = 0; # Ignore .cvsignore
|
||||
$nolinks = 0; # Do not test for soft- or hard-links
|
||||
my $want_msg = 0; # List possible filetypes and exit
|
||||
my $want_help = 0; # Print help and exit
|
||||
my $want_ver = 0; # Print version and exit
|
||||
|
||||
my %options = (
|
||||
"types=s" => \$list_types,
|
||||
"batch=s" => \$batch_cmd,
|
||||
"local" => \$no_recurse,
|
||||
"explain" => \$explain_type,
|
||||
"find" => \$find_mode,
|
||||
"short" => \$short_print,
|
||||
"ignore" => \$no_cvsignore,
|
||||
"messages" => \$want_msg,
|
||||
"nolinks" => \$nolinks,
|
||||
"help" => \$want_help,
|
||||
"version" => \$want_ver
|
||||
);
|
||||
|
||||
GetOptions(%options);
|
||||
|
||||
adjust_types();
|
||||
|
||||
list_messages() if $want_msg;
|
||||
usage() if $want_help;
|
||||
version() if $want_ver;
|
||||
|
||||
unless ($no_cvsignore) {
|
||||
init_ignores();
|
||||
}
|
||||
|
||||
if ($#ARGV < 0) {
|
||||
@ARGV = ("");
|
||||
}
|
||||
|
||||
foreach (@ARGV) {
|
||||
process_arg ($_);
|
||||
}
|
||||
|
||||
if ($#batch_list >= 0) {
|
||||
do_batch();
|
||||
}
|
||||
}
|
||||
|
||||
Main();
|
||||
@@ -1,196 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Generate lists of all coreutils programs, to be fed both to Autoconf
|
||||
# and Automake, and with further distinctions about how and when these
|
||||
# programs should be built. This is useful to avoid duplicating these
|
||||
# list definitions among several files ('configure.ac' and
|
||||
# 'src/local.mk' at least); such duplication had proved a source of
|
||||
# inconsistencies and bugs in the past.
|
||||
|
||||
set -u
|
||||
set -e
|
||||
|
||||
# These are the names of programs that are neither built nor installed
|
||||
# by default. This list is *not* intended for programs like 'who',
|
||||
# 'nice', 'chroot', etc., that are built only when certain requisite
|
||||
# system features are detected.
|
||||
# If you would like to install programs from this list anyway, say A and B,
|
||||
# use "--enable-install-program=A,B" when invoking configure.
|
||||
disabled_by_default_progs='
|
||||
arch
|
||||
coreutils
|
||||
hostname
|
||||
'
|
||||
|
||||
# Programs that can be built only when certain requisite system
|
||||
# features are detected at configure time.
|
||||
build_if_possible_progs='
|
||||
chroot
|
||||
df
|
||||
hostid
|
||||
libstdbuf.so
|
||||
nice
|
||||
pinky
|
||||
stdbuf
|
||||
stty
|
||||
timeout
|
||||
users
|
||||
who
|
||||
'
|
||||
|
||||
# All the other programs, to be built by default, and that should
|
||||
# be buildable without problems on any target system.
|
||||
normal_progs='
|
||||
[
|
||||
b2sum
|
||||
base64
|
||||
base32
|
||||
basenc
|
||||
basename
|
||||
cat
|
||||
chcon
|
||||
chgrp
|
||||
chmod
|
||||
chown
|
||||
cksum
|
||||
comm
|
||||
cp
|
||||
csplit
|
||||
cut
|
||||
date
|
||||
dd
|
||||
dir
|
||||
dircolors
|
||||
dirname
|
||||
du
|
||||
echo
|
||||
env
|
||||
expand
|
||||
expr
|
||||
factor
|
||||
false
|
||||
fmt
|
||||
fold
|
||||
ginstall
|
||||
groups
|
||||
head
|
||||
id
|
||||
join
|
||||
kill
|
||||
link
|
||||
ln
|
||||
logname
|
||||
ls
|
||||
md5sum
|
||||
mkdir
|
||||
mkfifo
|
||||
mknod
|
||||
mktemp
|
||||
mv
|
||||
nl
|
||||
nproc
|
||||
nohup
|
||||
numfmt
|
||||
od
|
||||
paste
|
||||
pathchk
|
||||
pr
|
||||
printenv
|
||||
printf
|
||||
ptx
|
||||
pwd
|
||||
readlink
|
||||
realpath
|
||||
rm
|
||||
rmdir
|
||||
runcon
|
||||
seq
|
||||
sha1sum
|
||||
sha224sum
|
||||
sha256sum
|
||||
sha384sum
|
||||
sha512sum
|
||||
shred
|
||||
shuf
|
||||
sleep
|
||||
sort
|
||||
split
|
||||
stat
|
||||
sum
|
||||
sync
|
||||
tac
|
||||
tail
|
||||
tee
|
||||
test
|
||||
touch
|
||||
tr
|
||||
true
|
||||
truncate
|
||||
tsort
|
||||
tty
|
||||
uname
|
||||
unexpand
|
||||
uniq
|
||||
unlink
|
||||
uptime
|
||||
vdir
|
||||
wc
|
||||
whoami
|
||||
yes
|
||||
'
|
||||
|
||||
me=`echo "$0" | sed 's,.*/,,'`
|
||||
msg="Automatically generated by $me. DO NOT EDIT BY HAND!"
|
||||
|
||||
case $#,$1 in
|
||||
1,--autoconf|1,--for-autoconf)
|
||||
echo "dnl $msg"
|
||||
for p in $normal_progs; do
|
||||
test x"$p" = x"[" && p='@<:@'
|
||||
echo "gl_ADD_PROG([optional_bin_progs], [$p])"
|
||||
done
|
||||
# Extra 'echo' to normalize whitespace.
|
||||
echo "no_install_progs_default='`echo $disabled_by_default_progs`'"
|
||||
sed 's/^ *//' <<END
|
||||
# Given the name of a variable containing a space-separated
|
||||
# list of install-by-default programs and the actual list of
|
||||
# do-not-install-by-default programs, modify the former variable
|
||||
# to reflect any "do-install" and "don't-install" requests.
|
||||
# That is, add any program specified via --enable-install-program,
|
||||
# and remove any program specified via --enable-no-install-program.
|
||||
# Note how the second argument below is a literal, with ","
|
||||
# separators. That is required due to the way the macro works,
|
||||
# and since the corresponding ./configure option argument is
|
||||
# comma-separated on input.
|
||||
gl_INCLUDE_EXCLUDE_PROG([optional_bin_progs], [`\
|
||||
echo $disabled_by_default_progs \
|
||||
| sed 's/ /,/g'`])
|
||||
END
|
||||
;;
|
||||
1,--automake|1,--for-automake)
|
||||
echo "## $msg"
|
||||
progsdir=src
|
||||
echo no_install__progs =
|
||||
for p in $disabled_by_default_progs; do
|
||||
echo no_install__progs += $progsdir/$p
|
||||
done
|
||||
echo build_if_possible__progs =
|
||||
for p in $build_if_possible_progs; do
|
||||
echo build_if_possible__progs += $progsdir/$p
|
||||
done
|
||||
echo default__progs =
|
||||
for p in $normal_progs; do
|
||||
echo default__progs += $progsdir/$p
|
||||
done
|
||||
;;
|
||||
1,--list-progs)
|
||||
for p in $disabled_by_default_progs $build_if_possible_progs \
|
||||
$normal_progs; do
|
||||
echo $p
|
||||
done
|
||||
;;
|
||||
*)
|
||||
echo "$0: invalid usage" >&2; exit 2
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
@@ -1,119 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Generate the list of rules for the single-binary option based on all the other
|
||||
# binaries found in src/local.mk.
|
||||
#
|
||||
# We need to duplicate the specific rules to build each program into a new
|
||||
# static library target. We can't reuse the existing target since we need to
|
||||
# create a .a file instead of linking the program. We can't do this at
|
||||
# ./configure since the file names need to be available when automake runs
|
||||
# to let it generate all the required rules in Makefile.in. The configure
|
||||
# step will select which ones will be used to build, but they need to be
|
||||
# generated beforehand.
|
||||
#
|
||||
# Instead of maintaining a duplicated list of rules, we generate the
|
||||
# single-binary required rules based on the normal configuration found on
|
||||
# src/local.mk with this script.
|
||||
|
||||
if test "x$1" = "x"; then
|
||||
echo "Usage: $0 path/to/src/local.mk" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -e
|
||||
|
||||
LOCAL_MK=$1
|
||||
GEN_LISTS_OF_PROGRAMS="`dirname "$0"`/gen-lists-of-programs.sh"
|
||||
|
||||
ALL_PROGRAMS=$($GEN_LISTS_OF_PROGRAMS --list-progs \
|
||||
| grep -v -F -e coreutils -e libstdbuf.so \
|
||||
| tr '[' '_')
|
||||
|
||||
# Compute default SOURCES. automake will assume the source file for the
|
||||
# src_${cmd} target to be src/${cmd}.c, but we will add rules to generate
|
||||
# the lib src_libsinglebin_${cmd}_a which won't match the autogenerated source
|
||||
# file. This loop will initialize the default source file and will be reset
|
||||
# later if needed.
|
||||
for cmd in $ALL_PROGRAMS; do
|
||||
eval "src_${cmd}_SOURCES=src/${cmd}.c"
|
||||
done
|
||||
|
||||
# Load actual values from src/local.mk. This will read all the variables from
|
||||
# the local.mk matching the src_${cmd}_... case.
|
||||
while read l; do
|
||||
if echo "$l" | grep -E '^src_[_[:alnum:]]+ +\+?=' > /dev/null; then
|
||||
var=$(echo $l | cut -f 1 -d ' ')
|
||||
value=$(echo $l | cut -f 2- -d =)
|
||||
if [ "$value" != " \$(LDADD)" ]; then
|
||||
oldvalue=""
|
||||
if echo $l | grep -F '+=' >/dev/null; then
|
||||
eval "oldvalue=\${$var}"
|
||||
fi
|
||||
value=$(echo "$value" | sed "s/'/'\"'\"'/g")
|
||||
eval "$var='$oldvalue "$value"'"
|
||||
fi
|
||||
fi
|
||||
done < $LOCAL_MK
|
||||
|
||||
me=`echo "$0" | sed 's,.*/,,'`
|
||||
echo "## Automatically generated by $me. DO NOT EDIT BY HAND!"
|
||||
|
||||
# Override the sources for some tools, to use smaller variants
|
||||
override_single() {
|
||||
from="$1"; to="$2";
|
||||
|
||||
eval "src_${from}_SOURCES='src/coreutils-${from}.c'"
|
||||
eval "src_from_LDADD=\$src_${from}_LDADD"
|
||||
eval "src_${from}_LDADD='$src_from_LDADD src/libsinglebin_${to}.a'"
|
||||
eval "src_libsinglebin_${from}_a_DEPENDENCIES='src/libsinglebin_${to}.a'"
|
||||
echo "src_libsinglebin_${from}_a_DEPENDENCIES = src/libsinglebin_${to}.a"
|
||||
}
|
||||
override_single dir ls
|
||||
override_single vdir ls
|
||||
override_single arch uname
|
||||
override_single chgrp chown
|
||||
|
||||
for cmd in $ALL_PROGRAMS; do
|
||||
echo "# Command $cmd"
|
||||
echo noinst_LIBRARIES += src/libsinglebin_${cmd}.a
|
||||
base="src_libsinglebin_${cmd}_a"
|
||||
# SOURCES
|
||||
var=src_${cmd}_SOURCES
|
||||
eval "value=\$$var"
|
||||
echo "${base}_SOURCES = $value"
|
||||
|
||||
# LDADD
|
||||
var=src_${cmd}_LDADD
|
||||
eval "value=\$$var"
|
||||
if [ "x$value" != "x" ]; then
|
||||
echo "${base}_ldadd = $value"
|
||||
fi
|
||||
|
||||
# DEPENDENCIES
|
||||
var=src_libsinglebin_${cmd}_a_DEPENDENCIES
|
||||
eval "value=\$$var"
|
||||
if [ "x$value" = "x" ]; then
|
||||
echo "$var = \$(src_${cmd}_DEPENDENCIES)"
|
||||
fi
|
||||
|
||||
# CFLAGS
|
||||
# Hack any other program defining a main() replacing its main by
|
||||
# single_binary_main_$PROGRAM_NAME.
|
||||
echo "${base}_CFLAGS = \"-Dmain=single_binary_main_${cmd} (int, char **);" \
|
||||
" int single_binary_main_${cmd}\" " \
|
||||
"-Dusage=_usage_${cmd} \$(src_coreutils_CFLAGS)"
|
||||
var=src_${cmd}_CFLAGS
|
||||
eval "value=\$$var"
|
||||
if [ "x$value" != "x" ]; then
|
||||
echo "${base}_CFLAGS += $value"
|
||||
fi
|
||||
|
||||
# CPPFLAGS
|
||||
var=src_${cmd}_CPPFLAGS
|
||||
eval "value=\$$var"
|
||||
if [ "x$value" != "x" ]; then
|
||||
echo "${base}_CPPFLAGS = $value"
|
||||
fi
|
||||
done
|
||||
|
||||
exit 0
|
||||
@@ -1,3 +0,0 @@
|
||||
# This file is expected to be used via gitlog-to-changelog's --amend=FILE
|
||||
# option. It specifies what changes to make to each given SHA1's commit
|
||||
# log and metadata, using Perl-eval'able expressions.
|
||||
676
configure.ac
676
configure.ac
@@ -1,7 +1,7 @@
|
||||
# -*- autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
# Copyright (C) 1991-2024 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1991, 1993-2009 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
|
||||
@@ -14,182 +14,54 @@
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
dnl Written by Jim Meyering.
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_PREREQ([2.61])
|
||||
|
||||
# Make inter-release version strings look like, e.g., v6.9-219-g58ddd, which
|
||||
# indicates that it is built from the 219th delta (in _some_ repository)
|
||||
# following the v6.9 tag, and that 58ddd is a prefix of the commit SHA1.
|
||||
# The explicit URL can be removed when autoconf > 2.69 is released.
|
||||
AC_INIT([GNU coreutils],
|
||||
m4_esyscmd([build-aux/git-version-gen .tarball-version]),
|
||||
[bug-coreutils@gnu.org],
|
||||
[coreutils],
|
||||
[https://www.gnu.org/software/coreutils/])
|
||||
[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])
|
||||
|
||||
AM_INIT_AUTOMAKE([1.11.2 dist-xz color-tests parallel-tests subdir-objects])
|
||||
AM_INIT_AUTOMAKE([1.11 dist-xz color-tests parallel-tests])
|
||||
AM_SILENT_RULES([yes]) # make --enable-silent-rules the default.
|
||||
|
||||
dnl POSIXCHECK is worthwhile for maintainers, but adds several seconds
|
||||
dnl (more than 10% execution time) to ./configure, with no benefit for
|
||||
dnl most users. Using it to look for bugs requires:
|
||||
dnl GNULIB_POSIXCHECK=1 autoreconf -f
|
||||
dnl ./configure
|
||||
dnl make
|
||||
dnl make -C src clean
|
||||
dnl make CFLAGS=-DGNULIB_POSIXCHECK=1
|
||||
dnl FIXME: Once we figure out how to avoid false positives, we should
|
||||
dnl have 'make my-distcheck' in dist-check.mk exercise this.
|
||||
m4_syscmd([test "${GNULIB_POSIXCHECK+set}" = set])
|
||||
m4_if(m4_sysval, [0], [], [dnl
|
||||
gl_ASSERT_NO_GNULIB_POSIXCHECK])
|
||||
|
||||
AC_PROG_CC
|
||||
AC_PROG_CC_STDC
|
||||
AM_PROG_CC_C_O
|
||||
AC_PROG_CPP
|
||||
AC_PROG_GCC_TRADITIONAL
|
||||
AC_PROG_RANLIB
|
||||
AC_PROG_EGREP
|
||||
AC_PROG_LN_S
|
||||
gl_EARLY
|
||||
gl_SET_CRYPTO_CHECK_DEFAULT([auto-gpl-compat])
|
||||
gl_INIT
|
||||
coreutils_MACROS
|
||||
|
||||
# These are safe, since 'sort', coreutils's only multithreaded app,
|
||||
# does not use the relevant modules.
|
||||
AC_DEFINE([GNULIB_EXCLUDE_SINGLE_THREAD], [1],
|
||||
[Define to 1 if apps call 'exclude' functions from a single thread.])
|
||||
AC_DEFINE([GNULIB_REGEX_SINGLE_THREAD], [1],
|
||||
[Define to 1 if apps call 'regex' functions from a single thread.])
|
||||
# Although 'sort' is multithreaded and can use these functions,
|
||||
# it uses them only from the main thread.
|
||||
AC_DEFINE([GNULIB_MBRTOWC_SINGLE_THREAD], [1],
|
||||
[Define to 1 if apps call mbrtowc, mbrtoc32, and 'regex' functions
|
||||
from a single thread.])
|
||||
# This is safe, since all apps set locale early.
|
||||
AC_DEFINE([GNULIB_WCHAR_SINGLE_LOCALE], [1],
|
||||
[Define to 1 if apps don't set the locale after calling
|
||||
locale-sensitive functions like mbrtowc and wcwidth.])
|
||||
|
||||
AC_DEFINE([GNULIB_MBRTOC32_REGULAR], [1],
|
||||
[Do not worry about rare encodings like CP864, EBCDIC, Johab, and Shift JIS
|
||||
that glibc does not support.])
|
||||
|
||||
# The test suite needs to know if we have a working perl.
|
||||
AM_CONDITIONAL([HAVE_PERL], [test "$gl_cv_prog_perl" != no])
|
||||
|
||||
# gl_GCC_VERSION_IFELSE([major], [minor], [run-if-found], [run-if-not-found])
|
||||
# ------------------------------------------------
|
||||
# If $CPP is gcc-MAJOR.MINOR or newer, then run RUN-IF-FOUND.
|
||||
# Otherwise, run RUN-IF-NOT-FOUND.
|
||||
AC_DEFUN([gl_GCC_VERSION_IFELSE],
|
||||
[AC_PREPROC_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[
|
||||
#if ($1) < __GNUC__ || (($1) == __GNUC__ && ($2) <= __GNUC_MINOR__)
|
||||
/* ok */
|
||||
#else
|
||||
# error "your version of gcc is older than $1.$2"
|
||||
#endif
|
||||
]]),
|
||||
], [$3], [$4])
|
||||
]
|
||||
)
|
||||
|
||||
AC_ARG_ENABLE([single-binary],
|
||||
[AS_HELP_STRING([--enable-single-binary=[shebangs|symlinks]],
|
||||
[Compile all the tools in a single binary, reducing the overall size.
|
||||
When compiled this way, shebangs (default when enabled) or symlinks are
|
||||
installed for each tool that points to the single binary.])],
|
||||
[gl_single_binary=no ;
|
||||
case $enableval in
|
||||
yes) gl_single_binary=shebangs ;;
|
||||
no|shebangs|symlinks) gl_single_binary=$enableval ;;
|
||||
*) AC_MSG_ERROR([bad value $enableval for single-binary option.
|
||||
Options are: symlinks, shebangs, no.]) ;;
|
||||
esac],
|
||||
[gl_single_binary=no]
|
||||
)
|
||||
AC_ARG_ENABLE([single-binary-exceptions],
|
||||
[AS_HELP_STRING([--enable-single-binary-exceptions=PROG_LIST],
|
||||
[When used with --enable-single-binary, exclude the PROG_LIST from
|
||||
it, so these programs are compiled as separated files
|
||||
(comma-separated, default none))])],
|
||||
[gl_single_binary_exceptions=$enableval],
|
||||
[gl_single_binary_exceptions=]
|
||||
)
|
||||
if test "$gl_single_binary" = 'symlinks'; then
|
||||
if ! test "`echo ls | sed \"$program_transform_name\"`" = 'ls'; then
|
||||
AC_MSG_ERROR([program name transformations are not currently supported
|
||||
with --enable-single-binary=symlinks.])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL([SINGLE_BINARY], [test "$gl_single_binary" != no])
|
||||
|
||||
AC_ARG_ENABLE([bold-man-page-references],
|
||||
[AS_HELP_STRING([--disable-bold-man-page-references],
|
||||
[When generating man pages, do not apply bold style around any
|
||||
references like name(1) etc.])],
|
||||
[gl_bold_manpages=yes ;
|
||||
case $enableval in
|
||||
no|yes) gl_bold_manpages=$enableval ;;
|
||||
*) AC_MSG_ERROR([bad value $enableval for bold-man-page-references.
|
||||
Options are: yes, no.]) ;;
|
||||
esac],
|
||||
[gl_bold_manpages=yes]
|
||||
)
|
||||
AM_CONDITIONAL([BOLD_MAN_REFS], [test "$gl_bold_manpages" != no])
|
||||
|
||||
AC_ARG_ENABLE([gcc-warnings],
|
||||
[AS_HELP_STRING([--enable-gcc-warnings@<:@=TYPE@:>@],
|
||||
[control generation of GCC warnings. The TYPE 'no' disables
|
||||
warnings (default for non-developer builds); 'yes' generates
|
||||
cheap warnings if available (default for developer builds);
|
||||
'expensive' in addition generates expensive-to-compute warnings
|
||||
if available.])],
|
||||
[AS_HELP_STRING([--enable-gcc-warnings],
|
||||
[turn on lots of GCC warnings (for developers)])],
|
||||
[case $enableval in
|
||||
no|yes|expensive) ;;
|
||||
yes|no) ;;
|
||||
*) AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;;
|
||||
esac
|
||||
gl_gcc_warnings=$enableval],
|
||||
[
|
||||
# GCC provides fine-grained control over diagnostics which
|
||||
# is used in gnulib for example to suppress warnings from
|
||||
# certain sections of code. So if this is available and
|
||||
# we're running from a git repo, then auto enable the warnings.
|
||||
gl_gcc_warnings=no
|
||||
gl_GCC_VERSION_IFELSE([4], [6],
|
||||
[test -d "$srcdir"/.git \
|
||||
&& ! test -f "$srcdir"/.tarball-version \
|
||||
&& gl_gcc_warnings=yes])]
|
||||
[gl_gcc_warnings=no]
|
||||
)
|
||||
|
||||
# clang is unduly picky about some things, even by default.
|
||||
if test "$gl_cv_compiler_clang" = yes; then
|
||||
gl_WARN_ADD([-Wno-format-extra-args])
|
||||
gl_WARN_ADD([-Wno-implicit-const-int-float-conversion])
|
||||
gl_WARN_ADD([-Wno-tautological-constant-out-of-range-compare])
|
||||
fi
|
||||
|
||||
if test $gl_gcc_warnings != no; then
|
||||
if test "$gl_gcc_warnings" = yes; then
|
||||
gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
|
||||
AC_SUBST([WERROR_CFLAGS])
|
||||
|
||||
ew=
|
||||
AS_IF([test $gl_gcc_warnings != expensive],
|
||||
[# -fanalyzer and related options slow GCC considerably.
|
||||
ew="$ew -fanalyzer -Wno-analyzer-malloc-leak"])
|
||||
|
||||
nw=
|
||||
# This, $nw, is the list of warnings we disable.
|
||||
nw=$ew
|
||||
nw="$nw -Wdeclaration-after-statement" # too useful to forbid
|
||||
nw="$nw -Waggregate-return" # anachronistic
|
||||
nw="$nw -Wlong-long" # C90 is anachronistic (lib/gethrxtime.h)
|
||||
@@ -204,91 +76,43 @@ if test $gl_gcc_warnings != no; then
|
||||
nw="$nw -Wunreachable-code" # Too many warnings for now
|
||||
nw="$nw -Wpadded" # Our structs are not padded
|
||||
nw="$nw -Wredundant-decls" # openat.h declares e.g., mkdirat
|
||||
nw="$nw -Wlogical-op" # any use of fwrite provokes this
|
||||
nw="$nw -Wformat-nonliteral" # who.c and pinky.c strftime uses
|
||||
nw="$nw -Wvla" # warnings in gettext.h
|
||||
nw="$nw -Wnested-externs" # use of XARGMATCH/verify_function__
|
||||
nw="$nw -Wswitch-enum" # Too many warnings for now
|
||||
nw="$nw -Wswitch-default" # Too many warnings for now
|
||||
nw="$nw -Wstack-protector" # not worth working around
|
||||
nw="$nw -Wformat-overflow=2" # False alarms due to GCC bug 110333
|
||||
nw="$nw -Wformat-truncation=2" # False alarm in ls.c, probably related
|
||||
# things I might fix soon:
|
||||
nw="$nw -Wfloat-equal" # sort.c, seq.c
|
||||
nw="$nw -Wmissing-format-attribute" # copy.c
|
||||
nw="$nw -Wunsafe-loop-optimizations" # a few src/*.c
|
||||
nw="$nw -Winline" # system.h's readdir_ignoring_dot_and_dotdot
|
||||
nw="$nw -Wvector-operation-performance" # warns about randperm.c
|
||||
|
||||
# Suppress noreturn warnings with single binaries; otherwise
|
||||
# GCC complains about the renamed 'main' not being declared noreturn
|
||||
# because 'main_exit' calls 'exit' when linting.
|
||||
if test "$gl_single_binary" != no; then
|
||||
nw="$nw -Wsuggest-attribute=noreturn"
|
||||
fi
|
||||
|
||||
# Using -Wstrict-overflow is a pain, but the alternative is worse.
|
||||
# For an example, see the code that provoked this report:
|
||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=33498
|
||||
# Code like that still infloops with gcc-4.6.0 and -O2. Scary indeed.
|
||||
nw="$nw -Wstrict-overflow" # expr.c, pr.c, tr.c, factor.c
|
||||
# ?? -Wstrict-overflow
|
||||
|
||||
gl_MANYWARN_ALL_GCC([ws])
|
||||
gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw])
|
||||
for w in $ws; do
|
||||
gl_WARN_ADD([$w])
|
||||
done
|
||||
gl_WARN_ADD([-Wno-missing-field-initializers]) # We need this one
|
||||
gl_WARN_ADD([-Wno-sign-compare]) # Too many warnings for now
|
||||
gl_WARN_ADD([-Wno-pointer-sign]) # Too many warnings for now
|
||||
gl_WARN_ADD([-Wno-unused-parameter]) # Too many warnings for now
|
||||
gl_WARN_ADD([-Wno-format-nonliteral])
|
||||
|
||||
# In spite of excluding -Wlogical-op above, it is enabled, as of
|
||||
# gcc 4.5.0 20090517, and it provokes warnings in cat.c, dd.c, truncate.c
|
||||
gl_WARN_ADD([-Wno-logical-op])
|
||||
|
||||
gl_WARN_ADD([-fdiagnostics-show-option])
|
||||
gl_WARN_ADD([-funit-at-a-time])
|
||||
|
||||
AC_SUBST([WARN_CFLAGS])
|
||||
|
||||
AC_DEFINE([lint], [1], [Define to 1 if the compiler is checking for lint.])
|
||||
AH_VERBATIM([FORTIFY_SOURCE],
|
||||
[/* Enable compile-time and run-time bounds-checking, and some warnings,
|
||||
without upsetting glibc 2.15+. */
|
||||
#if !defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__
|
||||
# define _FORTIFY_SOURCE 2
|
||||
#endif
|
||||
])
|
||||
AC_DEFINE([_FORTIFY_SOURCE], [2],
|
||||
[enable compile-time and run-time bounds-checking, and some warnings])
|
||||
AC_DEFINE([GNULIB_PORTCHECK], [1], [enable some gnulib portability checks])
|
||||
|
||||
# We use a slightly smaller set of warning options for lib/.
|
||||
# Remove the following and save the result in GNULIB_WARN_CFLAGS.
|
||||
nw=$ew
|
||||
nw="$nw -Wduplicated-branches" # Too many false alarms
|
||||
nw="$nw -Wformat-truncation=2"
|
||||
nw="$nw -Wstrict-overflow"
|
||||
nw="$nw -Wuninitialized"
|
||||
nw="$nw -Wunused-macros"
|
||||
nw="$nw -Wmissing-prototypes"
|
||||
nw="$nw -Wold-style-definition"
|
||||
# FIXME: it may be easy to remove this, since it affects only one file:
|
||||
# the snprintf call at ftoastr.c:132.
|
||||
nw="$nw -Wdouble-promotion"
|
||||
|
||||
# FIXME: remove this line when gcc improves
|
||||
# FP in careadlinkat.c w/gcc 10.0.1 20200205
|
||||
gl_WARN_ADD([-Wno-return-local-addr])
|
||||
|
||||
# FIXME: remove this line when gcc improves
|
||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88443
|
||||
gl_WARN_ADD([-Wno-stringop-overflow])
|
||||
|
||||
gl_MANYWARN_COMPLEMENT([GNULIB_WARN_CFLAGS], [$WARN_CFLAGS], [$nw])
|
||||
AC_SUBST([GNULIB_WARN_CFLAGS])
|
||||
|
||||
# For gnulib-tests, the set is slightly smaller still.
|
||||
nw=
|
||||
nw="$nw -Wstrict-prototypes"
|
||||
# It's not worth being this picky about test programs.
|
||||
nw="$nw -Wsuggest-attribute=const"
|
||||
nw="$nw -Wsuggest-attribute=format"
|
||||
nw="$nw -Wsuggest-attribute=pure"
|
||||
gl_MANYWARN_COMPLEMENT([GNULIB_TEST_WARN_CFLAGS],
|
||||
[$GNULIB_WARN_CFLAGS], [$nw])
|
||||
AC_SUBST([GNULIB_TEST_WARN_CFLAGS])
|
||||
fi
|
||||
|
||||
AC_FUNC_FORK
|
||||
@@ -298,8 +122,6 @@ AC_CHECK_FUNCS([chroot],
|
||||
gl_ADD_PROG([optional_bin_progs], [chroot]))
|
||||
AC_CHECK_FUNCS([gethostid],
|
||||
gl_ADD_PROG([optional_bin_progs], [hostid]))
|
||||
AC_CHECK_FUNCS([sigsuspend],
|
||||
gl_ADD_PROG([optional_bin_progs], [timeout]))
|
||||
|
||||
gl_WINSIZE_IN_PTEM
|
||||
|
||||
@@ -318,24 +140,23 @@ void unset_TZ (void)
|
||||
if (! (to[0][0] == 'T' && to[0][1] == 'Z' && to[0][2] == '='))
|
||||
to++;
|
||||
}
|
||||
int
|
||||
main ()
|
||||
int main()
|
||||
{
|
||||
time_t now = time ((time_t *) 0);
|
||||
int hour_GMT0, hour_unset;
|
||||
if (putenv ("TZ=GMT0") != 0)
|
||||
return 1;
|
||||
exit (1);
|
||||
hour_GMT0 = localtime (&now)->tm_hour;
|
||||
unset_TZ ();
|
||||
hour_unset = localtime (&now)->tm_hour;
|
||||
if (putenv ("TZ=PST8") != 0)
|
||||
return 1;
|
||||
exit (1);
|
||||
if (localtime (&now)->tm_hour == hour_GMT0)
|
||||
return 1;
|
||||
exit (1);
|
||||
unset_TZ ();
|
||||
if (localtime (&now)->tm_hour != hour_unset)
|
||||
return 1;
|
||||
return 0;
|
||||
exit (1);
|
||||
exit (0);
|
||||
}]])],
|
||||
[utils_cv_localtime_cache=no],
|
||||
[utils_cv_localtime_cache=yes],
|
||||
@@ -351,64 +172,6 @@ if test $utils_cv_localtime_cache = yes; then
|
||||
AC_DEFINE([LOCALTIME_CACHE], [1], [FIXME])
|
||||
fi
|
||||
|
||||
# Find the library for dynamic loading of shared libraries.
|
||||
AC_SEARCH_LIBS([dlopen], [dl])
|
||||
AS_CASE([$ac_cv_search_dlopen],
|
||||
[no | 'none required'],
|
||||
[LIB_DL=],
|
||||
[*],
|
||||
[LIB_DL="$ac_cv_search_dlopen"])
|
||||
AC_SUBST([LIB_DL])
|
||||
|
||||
# Should 'sort' link libcrypto dynamically?
|
||||
AS_CASE([$LIB_CRYPTO],
|
||||
[-lcrypto],
|
||||
[# Check for dlopen and libcrypto dynamic linking in one program,
|
||||
# as there's little point to checking them separately.
|
||||
AC_CACHE_CHECK([for dlopen and whether libcrypto is linked dynamically],
|
||||
[utils_cv_dlopen_libcrypto],
|
||||
[utils_cv_dlopen_libcrypto=no
|
||||
saved_LIBS=$LIBS
|
||||
LIBS="$LIBS $LIB_DL $LIB_CRYPTO"
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[#include <dlfcn.h>
|
||||
#include <openssl/sha.h>
|
||||
/* Use SHA512 rather than MD5 here to avoid deprecation warnings.
|
||||
So need to check HAVE_OPENSSL_MD5.. with DLOPEN_LIBCRYPTO. */
|
||||
]],
|
||||
[[return !(dlopen ("libcrypto.so", RTLD_LAZY | RTLD_GLOBAL)
|
||||
&& SHA512 (0, 0, 0));]])],
|
||||
[# readelf works with cross-builds; ldd works on more platforms.
|
||||
LIBCRYPTO_SONAME="`(readelf -d conftest$EXEEXT || ldd conftest$EXEEXT
|
||||
) 2>/dev/null |
|
||||
sed -n 's/.*\(libcrypto\.so\.[[.0-9]]*\).*/\1/p'`"
|
||||
AS_CASE([$LIBCRYPTO_SONAME],
|
||||
[*libcrypto*],
|
||||
[utils_cv_dlopen_libcrypto=yes])])
|
||||
LIBS=$saved_LIBS])
|
||||
AS_CASE([$utils_cv_dlopen_libcrypto],
|
||||
[yes],
|
||||
[AC_DEFINE([DLOPEN_LIBCRYPTO], [1],
|
||||
[Define to 1 if dlopen exists and libcrypto is
|
||||
linked dynamically.])
|
||||
AC_DEFINE_UNQUOTED([LIBCRYPTO_SONAME], ["$LIBCRYPTO_SONAME"],
|
||||
[versioned libcrypto])
|
||||
])])
|
||||
|
||||
# macOS >= 10.12
|
||||
AC_CHECK_FUNCS([fclonefileat])
|
||||
|
||||
# Assume that if getattrat exists, it's compatible with Solaris 11.
|
||||
AC_CHECK_FUNCS([getattrat])
|
||||
if test $ac_cv_func_getattrat = yes; then
|
||||
LIB_NVPAIR=-lnvpair
|
||||
AC_SUBST([LIB_NVPAIR])
|
||||
fi
|
||||
|
||||
# glibc >= 2.28 and linux kernel >= 4.11
|
||||
AC_CHECK_FUNCS([statx])
|
||||
|
||||
# SCO-ODT-3.0 is reported to need -los to link programs using initgroups
|
||||
AC_CHECK_FUNCS([initgroups])
|
||||
if test $ac_cv_func_initgroups = no; then
|
||||
@@ -442,15 +205,6 @@ case $utils_cv_func_setpriority,$ac_cv_func_nice in
|
||||
gl_ADD_PROG([optional_bin_progs], [nice])
|
||||
esac
|
||||
|
||||
if test "$cross_compiling" = yes || test -c /dev/stdin <.; then
|
||||
AC_DEFINE([DEV_FD_MIGHT_BE_CHR], [1],
|
||||
[Define to 1 if /dev/std{in,out,err} and /dev/fd/N, if they exist, might be
|
||||
character-special devices whose minor device number is the file
|
||||
descriptor number, such as on Solaris. Leave undefined if they are
|
||||
definitely the actual files. This determination should be done after any
|
||||
symbolic links are followed.])
|
||||
fi
|
||||
|
||||
AC_DEFUN([coreutils_DUMMY_1],
|
||||
[
|
||||
AC_REQUIRE([gl_READUTMP])
|
||||
@@ -462,6 +216,34 @@ AC_DEFUN([coreutils_DUMMY_1],
|
||||
])
|
||||
coreutils_DUMMY_1
|
||||
|
||||
AC_MSG_CHECKING([ut_host in struct utmp])
|
||||
AC_CACHE_VAL([su_cv_func_ut_host_in_utmp],
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
|
||||
#include <utmp.h>]], [[struct utmp ut; return !sizeof ut.ut_host;]])],
|
||||
[su_cv_func_ut_host_in_utmp=yes],
|
||||
[su_cv_func_ut_host_in_utmp=no])])
|
||||
AC_MSG_RESULT([$su_cv_func_ut_host_in_utmp])
|
||||
if test $su_cv_func_ut_host_in_utmp = yes; then
|
||||
have_ut_host=1
|
||||
AC_DEFINE([HAVE_UT_HOST], [1], [FIXME])
|
||||
fi
|
||||
|
||||
if test -z "$have_ut_host"; then
|
||||
AC_MSG_CHECKING([ut_host in struct utmpx])
|
||||
AC_CACHE_VAL([su_cv_func_ut_host_in_utmpx],
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
|
||||
#include <utmpx.h>]], [[struct utmpx ut; return !sizeof ut.ut_host;]])],
|
||||
[su_cv_func_ut_host_in_utmpx=yes],
|
||||
[su_cv_func_ut_host_in_utmpx=no])])
|
||||
AC_MSG_RESULT([$su_cv_func_ut_host_in_utmpx])
|
||||
if test $su_cv_func_ut_host_in_utmpx = yes; then
|
||||
AC_DEFINE([HAVE_UTMPX_H], [1], [FIXME])
|
||||
AC_DEFINE([HAVE_UT_HOST], [1], [FIXME])
|
||||
fi
|
||||
fi
|
||||
|
||||
GNULIB_BOOT_TIME([gl_ADD_PROG([optional_bin_progs], [uptime])])
|
||||
|
||||
AC_SYS_POSIX_TERMIOS()
|
||||
gl_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL
|
||||
|
||||
@@ -487,12 +269,10 @@ yes
|
||||
AC_MSG_CHECKING([c_line in struct termios])
|
||||
AC_CACHE_VAL([su_cv_sys_c_line_in_termios],
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if TERMIOS_NEEDS_XOPEN_SOURCE
|
||||
#define _XOPEN_SOURCE
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <termios.h>
|
||||
struct termios t;
|
||||
int s = sizeof t.c_line;]])],
|
||||
#define _XOPEN_SOURCE
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <termios.h>]], [[struct termios t; return !sizeof t.c_line;]])],
|
||||
[su_cv_sys_c_line_in_termios=yes],
|
||||
[su_cv_sys_c_line_in_termios=no])])
|
||||
AC_MSG_RESULT([$su_cv_sys_c_line_in_termios])
|
||||
@@ -527,273 +307,131 @@ if test $gl_cv_sys_tiocgwinsz_needs_termios_h = no && \
|
||||
[Define if your system defines TIOCGWINSZ in sys/pty.h.])
|
||||
fi
|
||||
|
||||
# For src/kill.c.
|
||||
AC_CHECK_DECLS([strsignal, sys_siglist, _sys_siglist, __sys_siglist], , ,
|
||||
[AC_INCLUDES_DEFAULT
|
||||
#include <signal.h>])
|
||||
|
||||
cu_LIB_CHECK
|
||||
cu_GMP
|
||||
|
||||
# Build df only if there's a point to it.
|
||||
if test $gl_cv_list_mounted_fs = yes && test $gl_cv_fs_space = yes; then
|
||||
gl_ADD_PROG([optional_bin_progs], [df])
|
||||
fi
|
||||
|
||||
# Build stdbuf only if supported
|
||||
ac_save_CFLAGS=$CFLAGS
|
||||
ac_save_LDFLAGS=$LDFLAGS
|
||||
cu_save_c_werror_flag=$ac_c_werror_flag
|
||||
AC_LANG_WERROR
|
||||
# Detect warnings about ignored "constructor" attributes.
|
||||
gl_WARN_ADD([-Werror], [CFLAGS])
|
||||
gl_WARN_ADD([-errwarn], [CFLAGS])
|
||||
# Put this message here, after gl_WARN_ADD's chatter.
|
||||
AC_MSG_CHECKING([whether this system supports stdbuf])
|
||||
CFLAGS="-fPIC $CFLAGS"
|
||||
LDFLAGS="-shared $LDFLAGS"
|
||||
AC_CACHE_VAL([utils_cv_stdbuf_supported],[
|
||||
utils_cv_stdbuf_supported=no
|
||||
# Note we only LINK here rather than RUN to support cross compilation
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM([[
|
||||
static int stdbuf = 0;
|
||||
|
||||
void __attribute__ ((constructor))
|
||||
stdbuf_init (void)
|
||||
{
|
||||
stdbuf = 1;
|
||||
}]],[[
|
||||
if (stdbuf != 1)
|
||||
return 1;]])
|
||||
],
|
||||
[utils_cv_stdbuf_supported=yes])])
|
||||
AC_MSG_RESULT([$utils_cv_stdbuf_supported])
|
||||
if test "$utils_cv_stdbuf_supported" = "yes" && test -z "$EXEEXT"; then
|
||||
# Limit stdbuf to ELF systems with GCC
|
||||
optional_pkglib_progs=
|
||||
AC_MSG_CHECKING([whether this is an ELF system])
|
||||
AC_EGREP_CPP([yes], [#if __ELF__
|
||||
yes
|
||||
#endif], [elf_sys=yes], [elf_sys=no])
|
||||
AC_MSG_RESULT([$elf_sys])
|
||||
if test "$elf_sys" = "yes" && \
|
||||
test "$GCC" = "yes"; then
|
||||
gl_ADD_PROG([optional_bin_progs], [stdbuf])
|
||||
gl_ADD_PROG([optional_pkglib_progs], [libstdbuf.so])
|
||||
fi
|
||||
CFLAGS=$ac_save_CFLAGS
|
||||
LDFLAGS=$ac_save_LDFLAGS
|
||||
ac_c_werror_flag=$cu_save_c_werror_flag
|
||||
|
||||
# Test compiler support for half precision floating point types (for od)
|
||||
AC_MSG_CHECKING([IEEE 16 bit floating point])
|
||||
AC_CACHE_VAL([utils_cv_ieee_16_bit_supported],[
|
||||
AC_RUN_IFELSE(
|
||||
[AC_LANG_SOURCE([[
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
volatile _Float16 hf = 1;
|
||||
float f = hf; /* Ensure compiler can promote to float. */
|
||||
return !(f == 1.0f);
|
||||
}
|
||||
]])
|
||||
],[
|
||||
utils_cv_ieee_16_bit_supported=yes
|
||||
],[
|
||||
utils_cv_ieee_16_bit_supported=no
|
||||
],[
|
||||
utils_cv_ieee_16_bit_supported=no
|
||||
])])
|
||||
AC_MSG_RESULT([$utils_cv_ieee_16_bit_supported])
|
||||
if test $utils_cv_ieee_16_bit_supported = yes; then
|
||||
AC_DEFINE([FLOAT16_SUPPORTED], [1], [IEEE 16 bit float supported])
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([Brain 16 bit floating point])
|
||||
AC_CACHE_VAL([utils_cv_brain_16_bit_supported],[
|
||||
AC_RUN_IFELSE(
|
||||
[AC_LANG_SOURCE([[
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
volatile __bf16 hf = 1;
|
||||
float f = hf; /* Ensure compiler can promote to float. */
|
||||
return !(f == 1.0f);
|
||||
}
|
||||
]])
|
||||
],[
|
||||
utils_cv_brain_16_bit_supported=yes
|
||||
],[
|
||||
utils_cv_brain_16_bit_supported=no
|
||||
],[
|
||||
utils_cv_brain_16_bit_supported=no
|
||||
])])
|
||||
AC_MSG_RESULT([$utils_cv_brain_16_bit_supported])
|
||||
if test $utils_cv_brain_16_bit_supported = yes; then
|
||||
AC_DEFINE([BF16_SUPPORTED], [1], [Brain 16 bit float supported])
|
||||
fi
|
||||
|
||||
ac_save_CFLAGS=$CFLAGS
|
||||
CFLAGS="-mavx -mpclmul $CFLAGS"
|
||||
AC_MSG_CHECKING([if pclmul intrinsic exists])
|
||||
AC_CACHE_VAL([utils_cv_pclmul_intrinsic_exists],[
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_SOURCE([[
|
||||
#include <x86intrin.h>
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
__m128i a, b;
|
||||
a = _mm_clmulepi64_si128 (a, b, 0x00);
|
||||
a = _mm_shuffle_epi8 (a, b);
|
||||
return __builtin_cpu_supports ("pclmul");
|
||||
}
|
||||
]])
|
||||
],[
|
||||
utils_cv_pclmul_intrinsic_exists=yes
|
||||
],[
|
||||
utils_cv_pclmul_intrinsic_exists=no
|
||||
])])
|
||||
AC_MSG_RESULT([$utils_cv_pclmul_intrinsic_exists])
|
||||
if test $utils_cv_pclmul_intrinsic_exists = yes; then
|
||||
AC_DEFINE([USE_PCLMUL_CRC32], [1],
|
||||
[CRC32 calculation by pclmul hardware instruction enabled])
|
||||
fi
|
||||
AM_CONDITIONAL([USE_PCLMUL_CRC32],
|
||||
[test $utils_cv_pclmul_intrinsic_exists = yes])
|
||||
CFLAGS=$ac_save_CFLAGS
|
||||
|
||||
CFLAGS="-mavx2 $CFLAGS"
|
||||
AC_MSG_CHECKING([for avx2 intrinsics])
|
||||
AC_CACHE_VAL([utils_cv_avx2_intrinsic_exists],[
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_SOURCE([[
|
||||
#include <x86intrin.h>
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
__m256i a, b;
|
||||
a = _mm256_sad_epu8 (a, b);
|
||||
return __builtin_cpu_supports ("avx2");
|
||||
}
|
||||
]])
|
||||
],[
|
||||
utils_cv_avx2_intrinsic_exists=yes
|
||||
],[
|
||||
utils_cv_avx2_intrinsic_exists=no
|
||||
])])
|
||||
AC_MSG_RESULT([$utils_cv_avx2_intrinsic_exists])
|
||||
if test $utils_cv_avx2_intrinsic_exists = yes; then
|
||||
AC_DEFINE([USE_AVX2_WC_LINECOUNT], [1], [Counting lines with AVX2 enabled])
|
||||
fi
|
||||
AM_CONDITIONAL([USE_AVX2_WC_LINECOUNT],
|
||||
[test $utils_cv_avx2_intrinsic_exists = yes])
|
||||
|
||||
CFLAGS=$ac_save_CFLAGS
|
||||
|
||||
############################################################################
|
||||
mk="$srcdir/src/Makefile.am"
|
||||
# Extract all literal names from the definition of $(EXTRA_PROGRAMS)
|
||||
# in $mk but don't expand the variable references.
|
||||
# Append each literal name to $optional_bin_progs.
|
||||
v=EXTRA_PROGRAMS
|
||||
for gl_i in `sed -n '/^'$v' =/,/[[^\]]$/p' $mk \
|
||||
| sed 's/^ *//;/^\$.*/d;/^'$v' =/d' \
|
||||
| tr -s '\\015\\012\\\\' ' '`; do
|
||||
gl_ADD_PROG([optional_bin_progs], $gl_i)
|
||||
done
|
||||
|
||||
dnl Autogenerated by the 'gen-lists-of-programs.sh' auxiliary script.
|
||||
dnl Issue proper calls to the macros gl_INCLUDE_EXCLUDE_PROG and
|
||||
dnl gl_ADD_PROG (updating $optional_bin_progs), and generate the list
|
||||
dnl of coreutils programs to be built only upon explicit user request,
|
||||
dnl saving that list in the $no_install_progs_default shell variable.
|
||||
m4_include([m4/cu-progs.m4])
|
||||
# As above, extract literal names from the definition of $(no_install__progs)
|
||||
# in $mk but don't expand the variable references.
|
||||
v=no_install__progs
|
||||
t=`sed -n '/^'$v' =/,/[[^\]]$/p' $mk \
|
||||
| sed 's/^ *//;/^\$.*/d;/^'$v' =/d' \
|
||||
| tr -s '\\015\\012\\\\' ' '`
|
||||
# Remove any trailing space.
|
||||
no_install_progs_default=`echo "$t"|sed 's/ $//'`
|
||||
|
||||
# Now that we know which programs will actually be built, determine
|
||||
# which optional helper progs should be compiled.
|
||||
# Note it adding to pkglibexec_PROGRAMS, $(transform) in src/local.mk
|
||||
# may need to be updated accordingly.
|
||||
case " $optional_bin_progs " in
|
||||
*' stdbuf '*) pkglibexec_PROGRAMS='src/libstdbuf.so';;
|
||||
*) pkglibexec_PROGRAMS='';;
|
||||
# Unfortunately, due to the way autoconf's AS_HELP_STRING works, the list
|
||||
# of default-not-installed programs, "arch hostname su", must appear in two
|
||||
# places: in this file below, and in $mk. Using "$no_install_progs_default"
|
||||
# below cannot work. And we can't substitute the names into $mk because
|
||||
# automake needs the literals, too.
|
||||
# The compromise is to ensure that the space-separated list extracted
|
||||
# above matches the literal 2nd argument below.
|
||||
c="$srcdir/configure.ac"
|
||||
re='^g''l_INCLUDE_EXCLUDE_PROG(.* [\[\(.*\)\]])'
|
||||
t=`sed -n '/'"$re"'/{s/'"$re"'/\1/;s/,/ /gp
|
||||
}' $c`
|
||||
case $t in
|
||||
$no_install_progs_default) ;;
|
||||
*) AC_MSG_ERROR([[internal error: g'l_INCLUDE_EXCLUDE_PROG's 2nd arg, $t,
|
||||
does not match the list of default-not-installed programs
|
||||
($no_install_progs_default) also recorded in $mk]],
|
||||
1) ;;
|
||||
esac
|
||||
|
||||
man1_MANS=`
|
||||
for p in $optional_bin_progs; do
|
||||
# Change "ginstall.1" to "install.1".
|
||||
test $p = ginstall && p=install
|
||||
# Ignore the "[" program, since writing a portable make rule to
|
||||
# generate its manpage is not practical.
|
||||
dnl Use the autoconf-provided quadrigraph to represent "[",
|
||||
dnl otherwise we will incur in dreadful quoting issues.
|
||||
test x$p = x'@<:@' && continue
|
||||
echo "man/$p.1"
|
||||
done`
|
||||
# Given the name of a variable containing a space-separated list of
|
||||
# install-by-default programs and the actual list do-not-install-by-default
|
||||
# programs, modify the former variable to reflect any "do-install" and
|
||||
# "don't-install" requests.
|
||||
# I.e., add any program name specified via --enable-install-program=..., and
|
||||
# remove any program name specified via --enable-no-install-program=...
|
||||
# Note how the second argument below is a literal, with "," separators.
|
||||
# That is required due to the way the macro works, and since the
|
||||
# corresponding ./configure option argument is comma-separated on input.
|
||||
gl_INCLUDE_EXCLUDE_PROG([optional_bin_progs], [arch,hostname,su])
|
||||
|
||||
# Not installed by "make install", but must be built when creating
|
||||
# a distribution tarball.
|
||||
EXTRA_MANS=`for p in $no_install_progs_default $gl_no_install_prog; do
|
||||
echo man/$p.1
|
||||
done`
|
||||
# Set INSTALL_SU if su installation has been requested via
|
||||
# --enable-install-program=su.
|
||||
AC_SUBST([INSTALL_SU])
|
||||
case " $optional_bin_progs " in
|
||||
*' su '*) INSTALL_SU=yes ;;
|
||||
*) INSTALL_SU=no ;;
|
||||
esac
|
||||
|
||||
# Replace all the programs by the single binary and symlinks if specified.
|
||||
single_binary_progs=
|
||||
single_binary_libs=
|
||||
single_binary_deps=
|
||||
single_binary_install_type=
|
||||
if test "$gl_single_binary" != no; then
|
||||
man1_MANS="$man1_MANS man/coreutils.1"
|
||||
# Convert the list to a space separated list
|
||||
gl_single_binary_exceptions=`echo $gl_single_binary_exceptions | tr ',' ' '`
|
||||
MAN=`echo "$optional_bin_progs "|sed 's/ /.1 /g;s/ $//'|tr -d '\\015\\012'`
|
||||
|
||||
single_binary_progs=`echo $optional_bin_progs`
|
||||
optional_bin_progs="coreutils"
|
||||
for prog in $gl_single_binary_exceptions; do
|
||||
# Fail if requested to exclude a program than was not part of coreutils.
|
||||
case " $single_binary_progs " in
|
||||
*" $prog "*)
|
||||
gl_REMOVE_PROG([single_binary_progs], [$prog]) ;
|
||||
gl_ADD_PROG([optional_bin_progs], [$prog]) ;;
|
||||
*) AC_MSG_ERROR(['$prog' is not being compiled.]) ;;
|
||||
esac
|
||||
done
|
||||
# Change ginstall.1 to "install.h" in $MAN.
|
||||
MAN=`for m in $MAN; do test $m = ginstall.1 && m=install.1; echo $m; done \
|
||||
| tr '\015\012' ' '; echo`
|
||||
|
||||
# single_binary_libs holds the list of libs required by the selected
|
||||
# programs, such as for example -lrt.
|
||||
single_binary_libs=`
|
||||
for p in $single_binary_progs; do
|
||||
# Convert '[' to '_'
|
||||
test x"$p" = x'@<:@' && p='_'
|
||||
printf '$(src_libsinglebin_%s_a_ldadd) ' "$p"
|
||||
done`
|
||||
# single_binary_deps holds the list of libsinglebin_*.a files that have the
|
||||
# compiled code of each selected program in a "library" format.
|
||||
single_binary_deps=`
|
||||
for p in $single_binary_progs; do
|
||||
# Convert '[' to '_'
|
||||
test x"$p" = x'@<:@' && p='_'
|
||||
printf 'src/libsinglebin_%s.a ' "$p"
|
||||
done`
|
||||
single_binary_install_type="$gl_single_binary"
|
||||
fi
|
||||
AC_SUBST([single_binary_progs], [$single_binary_progs])
|
||||
AC_SUBST([single_binary_libs], [$single_binary_libs])
|
||||
AC_SUBST([single_binary_deps], [$single_binary_deps])
|
||||
AC_SUBST([single_binary_install_type], [$single_binary_install_type])
|
||||
# Remove [.1, since writing a portable rule for it in man/Makefile.am
|
||||
# is not practical. The sed LHS below uses the autoconf quadrigraph
|
||||
# representing '['.
|
||||
MAN=`echo "$MAN"|sed 's/\@<:@\.1//'`
|
||||
|
||||
|
||||
# The programs built and installed by "make && make install".
|
||||
# Since this is AC_SUBST'd, Automake won't be able to perform rewrite
|
||||
# with $(EXEEXT) appending on it, so we have to do it ourselves -- in
|
||||
# this case, only for $(bin_PROGRAMS).
|
||||
bin_PROGRAMS=`
|
||||
for p in $optional_bin_progs; do echo src/"$p"'$(EXEEXT)'; done`
|
||||
|
||||
# Normalize whitespace.
|
||||
man1_MANS=`echo $man1_MANS`
|
||||
EXTRA_MANS=`echo $EXTRA_MANS`
|
||||
bin_PROGRAMS=`echo $bin_PROGRAMS`
|
||||
pkglibexec_PROGS=`echo $pkglibexec_PROGRAMS`
|
||||
|
||||
AC_SUBST([bin_PROGRAMS]) AM_SUBST_NOTMAKE([bin_PROGRAMS])
|
||||
AC_SUBST([pkglibexec_PROGRAMS]) AM_SUBST_NOTMAKE([pkglibexec_PROGRAMS])
|
||||
AC_SUBST([man1_MANS]) AM_SUBST_NOTMAKE([man1_MANS])
|
||||
AC_SUBST([EXTRA_MANS]) AM_SUBST_NOTMAKE([EXTRA_MANS])
|
||||
|
||||
AC_SUBST([built_programs], [$optional_bin_progs])
|
||||
OPTIONAL_BIN_PROGS=`echo "$optional_bin_progs "|sed 's/ /\$(EXEEXT) /g;s/ $//'`
|
||||
AC_SUBST([OPTIONAL_BIN_PROGS])
|
||||
OPTIONAL_PKGLIB_PROGS=`echo "$optional_pkglib_progs " | sed 's/ $//'`
|
||||
AC_SUBST([OPTIONAL_PKGLIB_PROGS])
|
||||
NO_INSTALL_PROGS_DEFAULT=$no_install_progs_default
|
||||
AC_SUBST([NO_INSTALL_PROGS_DEFAULT])
|
||||
|
||||
AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes])
|
||||
|
||||
# Arrange to rerun configure whenever the file, src/Makefile.am,
|
||||
# containing the list of program names changes.
|
||||
CONFIG_STATUS_DEPENDENCIES='$(top_srcdir)/src/Makefile.am'
|
||||
AC_SUBST([CONFIG_STATUS_DEPENDENCIES])
|
||||
############################################################################
|
||||
|
||||
# As long as "grep 'PRI[diouxX]' po/*.pot" reports matches in
|
||||
# translatable strings, we must use need-formatstring-macros here.
|
||||
AM_GNU_GETTEXT([external], [need-formatstring-macros])
|
||||
AM_GNU_GETTEXT_VERSION([0.19.2])
|
||||
AM_GNU_GETTEXT_VERSION([0.15])
|
||||
|
||||
# For a test of uniq: it uses the $LOCALE_FR envvar.
|
||||
gt_LOCALE_FR
|
||||
|
||||
AC_CONFIG_FILES(
|
||||
Makefile
|
||||
doc/Makefile
|
||||
lib/Makefile
|
||||
man/Makefile
|
||||
po/Makefile.in
|
||||
src/Makefile
|
||||
tests/Makefile
|
||||
gnulib-tests/Makefile
|
||||
)
|
||||
AC_OUTPUT
|
||||
|
||||
114
dist-check.mk
114
dist-check.mk
@@ -4,60 +4,36 @@ bin=bin-$$$$
|
||||
|
||||
write_loser = printf '\#!%s\necho $$0: bad path 1>&2; exit 1\n' '$(SHELL)'
|
||||
|
||||
tmpdir = $(abs_top_builddir)/tests/torture
|
||||
|
||||
t=$(tmpdir)/$(PACKAGE)/test
|
||||
TMPDIR ?= /tmp
|
||||
t=$(TMPDIR)/$(PACKAGE)/test
|
||||
pfx=$(t)/i
|
||||
|
||||
built_programs := $(sort $(patsubst src/%$(EXEEXT),%,$(bin_PROGRAMS)))
|
||||
|
||||
# More than once, tainted build and source directory names would
|
||||
# have caused at least one "make check" test to apply "chmod 700"
|
||||
# to all directories under $HOME. Make sure it doesn't happen again.
|
||||
tp = $(tmpdir)/taint
|
||||
tp := $(shell echo "$(TMPDIR)/$(PACKAGE)-$$$$")
|
||||
t_prefix = $(tp)/a
|
||||
t_taint = '$(t_prefix) b'
|
||||
fake_home = $(tp)/home
|
||||
|
||||
# When extracting from a distribution tarball, extract using the fastest
|
||||
# method possible. With dist-xz, that means using the *.xz file.
|
||||
ifneq ('', $(filter *.xz, $(DIST_ARCHIVES)))
|
||||
tar_decompress_opt_ = J
|
||||
suffix_ = xz
|
||||
else
|
||||
ifneq ('', $(filter *.gz, $(DIST_ARCHIVES)))
|
||||
tar_decompress_opt_ = z
|
||||
suffix_ = gz
|
||||
else
|
||||
tar_decompress_opt_ = j
|
||||
suffix_ = bz2
|
||||
endif
|
||||
endif
|
||||
amtar_extract_ = $(AMTAR) -$(tar_decompress_opt_)xf
|
||||
preferred_tarball_ = $(distdir).tar.$(suffix_)
|
||||
|
||||
# Ensure that tests run from tainted build and src dir names work,
|
||||
# and don't affect anything in $HOME. Create witness files in $HOME,
|
||||
# record their attributes, and build/test. Then ensure that the
|
||||
# witnesses were not affected.
|
||||
# Skip this test when using libtool, since libtool-generated scripts
|
||||
# cannot deal with a space-tainted srcdir.
|
||||
ALL_RECURSIVE_TARGETS += taint-distcheck
|
||||
taint-distcheck: $(DIST_ARCHIVES)
|
||||
grep '^[ ]*LT_INIT' configure.ac >/dev/null && exit 0 || :
|
||||
test -d $(t_taint) && chmod -R 700 $(t_taint) || :
|
||||
-rm -rf $(t_taint) $(fake_home)
|
||||
mkdir -p $(t_prefix) $(t_taint) $(fake_home)
|
||||
$(amtar_extract_) $(preferred_tarball_) -C $(t_taint)
|
||||
GZIP=$(GZIP_ENV) $(AMTAR) -C $(t_taint) -zxf $(distdir).tar.gz
|
||||
mkfifo $(fake_home)/fifo
|
||||
touch $(fake_home)/f
|
||||
mkdir -p $(fake_home)/d/e
|
||||
ls -lR $(fake_home) $(t_prefix) > $(tp)/.ls-before
|
||||
HOME=$(fake_home); export HOME; \
|
||||
cd $(t_taint)/$(distdir) \
|
||||
&& ./configure \
|
||||
&& $(MAKE) \
|
||||
&& $(MAKE) check \
|
||||
&& HOME=$(fake_home) $(MAKE) check \
|
||||
&& ls -lR $(fake_home) $(t_prefix) > $(tp)/.ls-after \
|
||||
&& diff $(tp)/.ls-before $(tp)/.ls-after \
|
||||
&& test -d $(t_prefix)
|
||||
@@ -74,9 +50,8 @@ define install-transform-check
|
||||
endef
|
||||
|
||||
# Install, then verify that all binaries and man pages are in place.
|
||||
# Note that neither the binary, ginstall, nor the [.1 man page is installed.
|
||||
# Note that neither the binary, ginstall, nor the ].1 man page is installed.
|
||||
define my-instcheck
|
||||
echo running my-instcheck; \
|
||||
$(MAKE) prefix=$(pfx) install \
|
||||
&& test ! -f $(pfx)/bin/ginstall \
|
||||
&& { fail=0; \
|
||||
@@ -93,41 +68,66 @@ define my-instcheck
|
||||
}
|
||||
endef
|
||||
|
||||
# Use this to make sure we don't run these programs when building
|
||||
# from a virgin compressed tarball file, below.
|
||||
null_AM_MAKEFLAGS ?= \
|
||||
ACLOCAL=false \
|
||||
AUTOCONF=false \
|
||||
AUTOMAKE=false \
|
||||
AUTOHEADER=false \
|
||||
GPERF=false \
|
||||
MAKEINFO=false
|
||||
define coreutils-path-check
|
||||
{ \
|
||||
if test -f $(srcdir)/src/true.c; then \
|
||||
fail=1; \
|
||||
mkdir $(bin) \
|
||||
&& ($(write_loser)) > $(bin)/loser \
|
||||
&& chmod a+x $(bin)/loser \
|
||||
&& for i in $(built_programs); do \
|
||||
case $$i in \
|
||||
rm|expr|basename|echo|sort|ls|tr);; \
|
||||
cat|dirname|mv|wc);; \
|
||||
*) ln $(bin)/loser $(bin)/$$i;; \
|
||||
esac; \
|
||||
done \
|
||||
&& ln -sf ../src/true $(bin)/false \
|
||||
&& PATH=`pwd`/$(bin)$(PATH_SEPARATOR)$$PATH \
|
||||
$(MAKE) -C tests check \
|
||||
&& { test -d gnulib-tests \
|
||||
&& $(MAKE) -C gnulib-tests check \
|
||||
|| :; } \
|
||||
&& rm -rf $(bin) \
|
||||
&& fail=0; \
|
||||
else \
|
||||
fail=0; \
|
||||
fi; \
|
||||
test $$fail = 1 && exit 1 || :; \
|
||||
}
|
||||
endef
|
||||
|
||||
# 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.
|
||||
# The hard-linking for-loop below ensures that there is a bin/ directory
|
||||
# full of all of the programs under test (except the ones that are required
|
||||
# for basic Makefile rules), all symlinked to the just-built "false" program.
|
||||
# This is to ensure that if ever a test neglects to make PATH include
|
||||
# the build srcdir, these always-failing programs will run.
|
||||
# Otherwise, it is too easy to test the wrong programs.
|
||||
# Note that "false" itself is a symlink to true, so it too will malfunction.
|
||||
ALL_RECURSIVE_TARGETS += my-distcheck
|
||||
my-distcheck: $(DIST_ARCHIVES) $(local-check)
|
||||
$(MAKE) syntax-check
|
||||
$(MAKE) check
|
||||
-rm -rf $(t)
|
||||
mkdir -p $(t)
|
||||
$(amtar_extract_) $(preferred_tarball_) -C $(t)
|
||||
(set -e; cd $(t)/$(distdir); \
|
||||
./configure --quiet --enable-gcc-warnings --disable-nls; \
|
||||
$(MAKE) AM_MAKEFLAGS='$(null_AM_MAKEFLAGS)'; \
|
||||
$(MAKE) dvi; \
|
||||
$(install-transform-check); \
|
||||
$(my-instcheck); \
|
||||
$(MAKE) distclean \
|
||||
)
|
||||
GZIP=$(GZIP_ENV) $(AMTAR) -C $(t) -zxf $(distdir).tar.gz
|
||||
cd $(t)/$(distdir) \
|
||||
&& ./configure --enable-gcc-warnings --disable-nls \
|
||||
&& $(MAKE) AM_MAKEFLAGS='$(null_AM_MAKEFLAGS)' \
|
||||
&& $(MAKE) dvi \
|
||||
&& $(install-transform-check) \
|
||||
&& $(my-instcheck) \
|
||||
&& $(coreutils-path-check) \
|
||||
&& $(MAKE) distclean
|
||||
(cd $(t) && mv $(distdir) $(distdir).old \
|
||||
&& $(amtar_extract_) - ) < $(preferred_tarball_)
|
||||
# With post-v1.15 automake, "distclean" would fail to remove .deps
|
||||
# directories, leading to a spurious failure of the following recursive diff.
|
||||
# FIXME: remove this, once automake is fixed.
|
||||
find $(t)/$(distdir).old $(t)/$(distdir) -name .deps | xargs -r rmdir
|
||||
&& $(AMTAR) -zxf - ) < $(distdir).tar.gz
|
||||
diff -ur $(t)/$(distdir).old $(t)/$(distdir)
|
||||
-rm -rf $(t)
|
||||
rmdir $(tmpdir)/$(PACKAGE) $(tmpdir)
|
||||
@echo "========================"; \
|
||||
echo "ready for distribution:"; \
|
||||
for i in $(DIST_ARCHIVES); do echo " $$i"; done; \
|
||||
echo "$(distdir).tar.gz is ready for distribution"; \
|
||||
echo "========================"
|
||||
|
||||
46
doc/.gitignore
vendored
46
doc/.gitignore
vendored
@@ -1,24 +1,22 @@
|
||||
/.dirstamp
|
||||
/constants.texi
|
||||
/coreutils.aux
|
||||
/coreutils.cp
|
||||
/coreutils.cps
|
||||
/coreutils.dvi
|
||||
/coreutils.fl
|
||||
/coreutils.fn
|
||||
/coreutils.html
|
||||
/coreutils.info
|
||||
/coreutils.ky
|
||||
/coreutils.log
|
||||
/coreutils.op
|
||||
/coreutils.pdf
|
||||
/coreutils.pg
|
||||
/coreutils.t2p/
|
||||
/coreutils.toc
|
||||
/coreutils.tp
|
||||
/coreutils.vr
|
||||
/gendocs_template
|
||||
/gendocs_template_min
|
||||
/parse-datetime.texi
|
||||
/stamp-vti
|
||||
/version.texi
|
||||
constants.texi
|
||||
coreutils.aux
|
||||
coreutils.cp
|
||||
coreutils.cps
|
||||
coreutils.dvi
|
||||
coreutils.fl
|
||||
coreutils.fn
|
||||
coreutils.html
|
||||
coreutils.info
|
||||
coreutils.ky
|
||||
coreutils.log
|
||||
coreutils.op
|
||||
coreutils.pdf
|
||||
coreutils.pg
|
||||
coreutils.toc
|
||||
coreutils.tp
|
||||
coreutils.vr
|
||||
fdl.texi
|
||||
gendocs_template
|
||||
getdate.texi
|
||||
stamp-vti
|
||||
version.texi
|
||||
|
||||
2009
doc/ChangeLog-2007
Normal file
2009
doc/ChangeLog-2007
Normal file
File diff suppressed because it is too large
Load Diff
121
doc/Makefile.am
Normal file
121
doc/Makefile.am
Normal file
@@ -0,0 +1,121 @@
|
||||
# Make coreutils documentation. -*-Makefile-*-
|
||||
|
||||
# Copyright (C) 1995-1998, 2001-2009 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
info_TEXINFOS = coreutils.texi
|
||||
|
||||
EXTRA_DIST = perm.texi getdate.texi constants.texi fdl.texi
|
||||
|
||||
# The following is necessary if the package name is 8 characters or longer.
|
||||
# If the info documentation would be split into 10 or more separate files,
|
||||
# then this is necessary even if the package name is 7 characters long.
|
||||
#
|
||||
# Tell makeinfo to put everything in a single info file: <package>.info.
|
||||
# Otherwise, it would also generate files with names like <package>.info-[123],
|
||||
# and those names all map to one 14-byte name (<package>.info-) on some crufty
|
||||
# old systems.
|
||||
AM_MAKEINFOFLAGS = --no-split
|
||||
|
||||
constants.texi: $(top_srcdir)/src/tail.c $(top_srcdir)/src/shred.c
|
||||
LC_ALL=C \
|
||||
sed -n -e 's/^#define \(DEFAULT_MAX[_A-Z]*\) \(.*\)/@set \1 \2/p' \
|
||||
$(top_srcdir)/src/tail.c > t-$@
|
||||
LC_ALL=C \
|
||||
sed -n -e 's/.*\(DEFAULT_PASSES\)[ =]* \([0-9]*\).*/@set SHRED_\1 \2/p'\
|
||||
$(top_srcdir)/src/shred.c >> t-$@
|
||||
mv t-$@ $@
|
||||
|
||||
MAINTAINERCLEANFILES = constants.texi
|
||||
|
||||
$(DVIS): $(EXTRA_DIST)
|
||||
$(INFO_DEPS): $(EXTRA_DIST)
|
||||
|
||||
# Extended regular expressions to match word starts and ends.
|
||||
_W = (^|[^A-Za-z0-9_])
|
||||
W_ = ([^A-Za-z0-9_]|$$)
|
||||
|
||||
syntax_checks = \
|
||||
sc-avoid-io \
|
||||
sc-avoid-non-zero \
|
||||
sc-avoid-timezone \
|
||||
sc-avoid-zeroes \
|
||||
sc-exponent-grouping \
|
||||
sc-lower-case-var \
|
||||
sc-use-small-caps-NUL
|
||||
|
||||
.PHONY: $(syntax_checks) check-texinfo
|
||||
|
||||
# List words/regexps here that should not appear in the texinfo documentation.
|
||||
check-texinfo: $(syntax_checks)
|
||||
$(AM_V_GEN)fail=0; \
|
||||
grep '@url{' $(srcdir)/*.texi && fail=1; \
|
||||
grep '\$$@"' $(srcdir)/*.texi && fail=1; \
|
||||
grep -n '[^[:punct:]]@footnote' $(srcdir)/*.texi && fail=1; \
|
||||
grep -n filename $(srcdir)/*.texi \
|
||||
| $(EGREP) -v 'setfilename|[{]filename[}]' \
|
||||
&& fail=1; \
|
||||
$(PERL) -e 1 2> /dev/null && { $(PERL) -ne \
|
||||
'/\bPOSIX\b/ && !/\@acronym{POSIX}/ && !/^\* / || /{posix}/ and print,exit 1' \
|
||||
$(srcdir)/*.texi 2> /dev/null || fail=1; }; \
|
||||
$(EGREP) -i '$(_W)builtins?$(W_)' $(srcdir)/*.texi && fail=1; \
|
||||
$(EGREP) -i '$(_W)path(name)?s?$(W_)' $(srcdir)/*.texi \
|
||||
| $(EGREP) -v 'search path|@vindex PATH$$|@env[{]PATH[}]' && fail=1; \
|
||||
exit $$fail
|
||||
|
||||
# Use `time zone', not `timezone'.
|
||||
sc-avoid-timezone:
|
||||
$(AM_V_GEN)$(EGREP) timezone $(srcdir)/*.texi && exit 1 || :
|
||||
|
||||
# Check for insufficient exponent grouping, e.g.,
|
||||
# @math{2^64} should be @math{2^{64}}.
|
||||
sc-exponent-grouping:
|
||||
$(AM_V_GEN)$(EGREP) '\{.*\^[0-9][0-9]' $(srcdir)/*.texi && exit 1 || :
|
||||
|
||||
# E.g., use @sc{nul}, not NUL.
|
||||
sc-use-small-caps-NUL:
|
||||
$(AM_V_GEN)$(EGREP) '$(_W)NUL$(W_)' $(srcdir)/*.texi && exit 1 || :
|
||||
|
||||
# Say I/O, not IO.
|
||||
sc-avoid-io:
|
||||
$(AM_V_GEN)$(EGREP) '$(_W)IO$(W_)' $(srcdir)/*.texi && exit 1 || :
|
||||
|
||||
# I prefer nonzero over non-zero.
|
||||
sc-avoid-non-zero:
|
||||
$(AM_V_GEN)$(EGREP) non-zero $(srcdir)/*.texi && exit 1 || :
|
||||
|
||||
# Use `zeros', not `zeroes' (nothing wrong with `zeroes'. just be consistent).
|
||||
sc-avoid-zeroes:
|
||||
$(AM_V_GEN)$(EGREP) -i '$(_W)zeroes$(W_)' $(srcdir)/*.texi && exit 1 || :
|
||||
|
||||
# ME = $(subdir)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
|
||||
ME = doc/Makefile
|
||||
|
||||
# The quantity inside @var{...} should not contain upper case letters.
|
||||
# The leading backslash exemption is to permit in-macro uses like
|
||||
# @var{\varName\} where the upper case letter is part of a parameter name.
|
||||
find_upper_case_var = \
|
||||
'/\@var{/ or next; \
|
||||
while (/\@var{(.+?)}/g) \
|
||||
{ \
|
||||
$$v = $$1; \
|
||||
$$v =~ /[A-Z]/ && $$v !~ /^\\/ and (print "$$ARGV:$$.:$$_"), $$m = 1 \
|
||||
} \
|
||||
END {$$m and (warn "$(ME): do not use upper case in \@var{...}\n"), exit 1}'
|
||||
sc-lower-case-var:
|
||||
$(AM_V_GEN)$(PERL) -e 1 \
|
||||
&& $(PERL) -lne $(find_upper_case_var) $(srcdir)/*.texi
|
||||
|
||||
check: check-texinfo
|
||||
9102
doc/coreutils.texi
9102
doc/coreutils.texi
File diff suppressed because it is too large
Load Diff
505
doc/fdl.texi
505
doc/fdl.texi
@@ -1,505 +0,0 @@
|
||||
@c The GNU Free Documentation License.
|
||||
@center Version 1.3, 3 November 2008
|
||||
|
||||
@c This file is intended to be included within another document,
|
||||
@c hence no sectioning command or @node.
|
||||
|
||||
@display
|
||||
Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
|
||||
@uref{https://fsf.org/}
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
@end display
|
||||
|
||||
@enumerate 0
|
||||
@item
|
||||
PREAMBLE
|
||||
|
||||
The purpose of this License is to make a manual, textbook, or other
|
||||
functional and useful document @dfn{free} in the sense of freedom: to
|
||||
assure everyone the effective freedom to copy and redistribute it,
|
||||
with or without modifying it, either commercially or noncommercially.
|
||||
Secondarily, this License preserves for the author and publisher a way
|
||||
to get credit for their work, while not being considered responsible
|
||||
for modifications made by others.
|
||||
|
||||
This License is a kind of ``copyleft'', which means that derivative
|
||||
works of the document must themselves be free in the same sense. It
|
||||
complements the GNU General Public License, which is a copyleft
|
||||
license designed for free software.
|
||||
|
||||
We have designed this License in order to use it for manuals for free
|
||||
software, because free software needs free documentation: a free
|
||||
program should come with manuals providing the same freedoms that the
|
||||
software does. But this License is not limited to software manuals;
|
||||
it can be used for any textual work, regardless of subject matter or
|
||||
whether it is published as a printed book. We recommend this License
|
||||
principally for works whose purpose is instruction or reference.
|
||||
|
||||
@item
|
||||
APPLICABILITY AND DEFINITIONS
|
||||
|
||||
This License applies to any manual or other work, in any medium, that
|
||||
contains a notice placed by the copyright holder saying it can be
|
||||
distributed under the terms of this License. Such a notice grants a
|
||||
world-wide, royalty-free license, unlimited in duration, to use that
|
||||
work under the conditions stated herein. The ``Document'', below,
|
||||
refers to any such manual or work. Any member of the public is a
|
||||
licensee, and is addressed as ``you''. You accept the license if you
|
||||
copy, modify or distribute the work in a way requiring permission
|
||||
under copyright law.
|
||||
|
||||
A ``Modified Version'' of the Document means any work containing the
|
||||
Document or a portion of it, either copied verbatim, or with
|
||||
modifications and/or translated into another language.
|
||||
|
||||
A ``Secondary Section'' is a named appendix or a front-matter section
|
||||
of the Document that deals exclusively with the relationship of the
|
||||
publishers or authors of the Document to the Document's overall
|
||||
subject (or to related matters) and contains nothing that could fall
|
||||
directly within that overall subject. (Thus, if the Document is in
|
||||
part a textbook of mathematics, a Secondary Section may not explain
|
||||
any mathematics.) The relationship could be a matter of historical
|
||||
connection with the subject or with related matters, or of legal,
|
||||
commercial, philosophical, ethical or political position regarding
|
||||
them.
|
||||
|
||||
The ``Invariant Sections'' are certain Secondary Sections whose titles
|
||||
are designated, as being those of Invariant Sections, in the notice
|
||||
that says that the Document is released under this License. If a
|
||||
section does not fit the above definition of Secondary then it is not
|
||||
allowed to be designated as Invariant. The Document may contain zero
|
||||
Invariant Sections. If the Document does not identify any Invariant
|
||||
Sections then there are none.
|
||||
|
||||
The ``Cover Texts'' are certain short passages of text that are listed,
|
||||
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
|
||||
the Document is released under this License. A Front-Cover Text may
|
||||
be at most 5 words, and a Back-Cover Text may be at most 25 words.
|
||||
|
||||
A ``Transparent'' copy of the Document means a machine-readable copy,
|
||||
represented in a format whose specification is available to the
|
||||
general public, that is suitable for revising the document
|
||||
straightforwardly with generic text editors or (for images composed of
|
||||
pixels) generic paint programs or (for drawings) some widely available
|
||||
drawing editor, and that is suitable for input to text formatters or
|
||||
for automatic translation to a variety of formats suitable for input
|
||||
to text formatters. A copy made in an otherwise Transparent file
|
||||
format whose markup, or absence of markup, has been arranged to thwart
|
||||
or discourage subsequent modification by readers is not Transparent.
|
||||
An image format is not Transparent if used for any substantial amount
|
||||
of text. A copy that is not ``Transparent'' is called ``Opaque''.
|
||||
|
||||
Examples of suitable formats for Transparent copies include plain
|
||||
ASCII without markup, Texinfo input format, La@TeX{} input
|
||||
format, SGML or XML using a publicly available
|
||||
DTD, and standard-conforming simple HTML,
|
||||
PostScript or PDF designed for human modification. Examples
|
||||
of transparent image formats include PNG, XCF and
|
||||
JPG@. Opaque formats include proprietary formats that can be
|
||||
read and edited only by proprietary word processors, SGML or
|
||||
XML for which the DTD and/or processing tools are
|
||||
not generally available, and the machine-generated HTML,
|
||||
PostScript or PDF produced by some word processors for
|
||||
output purposes only.
|
||||
|
||||
The ``Title Page'' means, for a printed book, the title page itself,
|
||||
plus such following pages as are needed to hold, legibly, the material
|
||||
this License requires to appear in the title page. For works in
|
||||
formats which do not have any title page as such, ``Title Page'' means
|
||||
the text near the most prominent appearance of the work's title,
|
||||
preceding the beginning of the body of the text.
|
||||
|
||||
The ``publisher'' means any person or entity that distributes copies
|
||||
of the Document to the public.
|
||||
|
||||
A section ``Entitled XYZ'' means a named subunit of the Document whose
|
||||
title either is precisely XYZ or contains XYZ in parentheses following
|
||||
text that translates XYZ in another language. (Here XYZ stands for a
|
||||
specific section name mentioned below, such as ``Acknowledgements'',
|
||||
``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
|
||||
of such a section when you modify the Document means that it remains a
|
||||
section ``Entitled XYZ'' according to this definition.
|
||||
|
||||
The Document may include Warranty Disclaimers next to the notice which
|
||||
states that this License applies to the Document. These Warranty
|
||||
Disclaimers are considered to be included by reference in this
|
||||
License, but only as regards disclaiming warranties: any other
|
||||
implication that these Warranty Disclaimers may have is void and has
|
||||
no effect on the meaning of this License.
|
||||
|
||||
@item
|
||||
VERBATIM COPYING
|
||||
|
||||
You may copy and distribute the Document in any medium, either
|
||||
commercially or noncommercially, provided that this License, the
|
||||
copyright notices, and the license notice saying this License applies
|
||||
to the Document are reproduced in all copies, and that you add no other
|
||||
conditions whatsoever to those of this License. You may not use
|
||||
technical measures to obstruct or control the reading or further
|
||||
copying of the copies you make or distribute. However, you may accept
|
||||
compensation in exchange for copies. If you distribute a large enough
|
||||
number of copies you must also follow the conditions in section 3.
|
||||
|
||||
You may also lend copies, under the same conditions stated above, and
|
||||
you may publicly display copies.
|
||||
|
||||
@item
|
||||
COPYING IN QUANTITY
|
||||
|
||||
If you publish printed copies (or copies in media that commonly have
|
||||
printed covers) of the Document, numbering more than 100, and the
|
||||
Document's license notice requires Cover Texts, you must enclose the
|
||||
copies in covers that carry, clearly and legibly, all these Cover
|
||||
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
|
||||
the back cover. Both covers must also clearly and legibly identify
|
||||
you as the publisher of these copies. The front cover must present
|
||||
the full title with all words of the title equally prominent and
|
||||
visible. You may add other material on the covers in addition.
|
||||
Copying with changes limited to the covers, as long as they preserve
|
||||
the title of the Document and satisfy these conditions, can be treated
|
||||
as verbatim copying in other respects.
|
||||
|
||||
If the required texts for either cover are too voluminous to fit
|
||||
legibly, you should put the first ones listed (as many as fit
|
||||
reasonably) on the actual cover, and continue the rest onto adjacent
|
||||
pages.
|
||||
|
||||
If you publish or distribute Opaque copies of the Document numbering
|
||||
more than 100, you must either include a machine-readable Transparent
|
||||
copy along with each Opaque copy, or state in or with each Opaque copy
|
||||
a computer-network location from which the general network-using
|
||||
public has access to download using public-standard network protocols
|
||||
a complete Transparent copy of the Document, free of added material.
|
||||
If you use the latter option, you must take reasonably prudent steps,
|
||||
when you begin distribution of Opaque copies in quantity, to ensure
|
||||
that this Transparent copy will remain thus accessible at the stated
|
||||
location until at least one year after the last time you distribute an
|
||||
Opaque copy (directly or through your agents or retailers) of that
|
||||
edition to the public.
|
||||
|
||||
It is requested, but not required, that you contact the authors of the
|
||||
Document well before redistributing any large number of copies, to give
|
||||
them a chance to provide you with an updated version of the Document.
|
||||
|
||||
@item
|
||||
MODIFICATIONS
|
||||
|
||||
You may copy and distribute a Modified Version of the Document under
|
||||
the conditions of sections 2 and 3 above, provided that you release
|
||||
the Modified Version under precisely this License, with the Modified
|
||||
Version filling the role of the Document, thus licensing distribution
|
||||
and modification of the Modified Version to whoever possesses a copy
|
||||
of it. In addition, you must do these things in the Modified Version:
|
||||
|
||||
@enumerate A
|
||||
@item
|
||||
Use in the Title Page (and on the covers, if any) a title distinct
|
||||
from that of the Document, and from those of previous versions
|
||||
(which should, if there were any, be listed in the History section
|
||||
of the Document). You may use the same title as a previous version
|
||||
if the original publisher of that version gives permission.
|
||||
|
||||
@item
|
||||
List on the Title Page, as authors, one or more persons or entities
|
||||
responsible for authorship of the modifications in the Modified
|
||||
Version, together with at least five of the principal authors of the
|
||||
Document (all of its principal authors, if it has fewer than five),
|
||||
unless they release you from this requirement.
|
||||
|
||||
@item
|
||||
State on the Title page the name of the publisher of the
|
||||
Modified Version, as the publisher.
|
||||
|
||||
@item
|
||||
Preserve all the copyright notices of the Document.
|
||||
|
||||
@item
|
||||
Add an appropriate copyright notice for your modifications
|
||||
adjacent to the other copyright notices.
|
||||
|
||||
@item
|
||||
Include, immediately after the copyright notices, a license notice
|
||||
giving the public permission to use the Modified Version under the
|
||||
terms of this License, in the form shown in the Addendum below.
|
||||
|
||||
@item
|
||||
Preserve in that license notice the full lists of Invariant Sections
|
||||
and required Cover Texts given in the Document's license notice.
|
||||
|
||||
@item
|
||||
Include an unaltered copy of this License.
|
||||
|
||||
@item
|
||||
Preserve the section Entitled ``History'', Preserve its Title, and add
|
||||
to it an item stating at least the title, year, new authors, and
|
||||
publisher of the Modified Version as given on the Title Page. If
|
||||
there is no section Entitled ``History'' in the Document, create one
|
||||
stating the title, year, authors, and publisher of the Document as
|
||||
given on its Title Page, then add an item describing the Modified
|
||||
Version as stated in the previous sentence.
|
||||
|
||||
@item
|
||||
Preserve the network location, if any, given in the Document for
|
||||
public access to a Transparent copy of the Document, and likewise
|
||||
the network locations given in the Document for previous versions
|
||||
it was based on. These may be placed in the ``History'' section.
|
||||
You may omit a network location for a work that was published at
|
||||
least four years before the Document itself, or if the original
|
||||
publisher of the version it refers to gives permission.
|
||||
|
||||
@item
|
||||
For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
|
||||
the Title of the section, and preserve in the section all the
|
||||
substance and tone of each of the contributor acknowledgements and/or
|
||||
dedications given therein.
|
||||
|
||||
@item
|
||||
Preserve all the Invariant Sections of the Document,
|
||||
unaltered in their text and in their titles. Section numbers
|
||||
or the equivalent are not considered part of the section titles.
|
||||
|
||||
@item
|
||||
Delete any section Entitled ``Endorsements''. Such a section
|
||||
may not be included in the Modified Version.
|
||||
|
||||
@item
|
||||
Do not retitle any existing section to be Entitled ``Endorsements'' or
|
||||
to conflict in title with any Invariant Section.
|
||||
|
||||
@item
|
||||
Preserve any Warranty Disclaimers.
|
||||
@end enumerate
|
||||
|
||||
If the Modified Version includes new front-matter sections or
|
||||
appendices that qualify as Secondary Sections and contain no material
|
||||
copied from the Document, you may at your option designate some or all
|
||||
of these sections as invariant. To do this, add their titles to the
|
||||
list of Invariant Sections in the Modified Version's license notice.
|
||||
These titles must be distinct from any other section titles.
|
||||
|
||||
You may add a section Entitled ``Endorsements'', provided it contains
|
||||
nothing but endorsements of your Modified Version by various
|
||||
parties---for example, statements of peer review or that the text has
|
||||
been approved by an organization as the authoritative definition of a
|
||||
standard.
|
||||
|
||||
You may add a passage of up to five words as a Front-Cover Text, and a
|
||||
passage of up to 25 words as a Back-Cover Text, to the end of the list
|
||||
of Cover Texts in the Modified Version. Only one passage of
|
||||
Front-Cover Text and one of Back-Cover Text may be added by (or
|
||||
through arrangements made by) any one entity. If the Document already
|
||||
includes a cover text for the same cover, previously added by you or
|
||||
by arrangement made by the same entity you are acting on behalf of,
|
||||
you may not add another; but you may replace the old one, on explicit
|
||||
permission from the previous publisher that added the old one.
|
||||
|
||||
The author(s) and publisher(s) of the Document do not by this License
|
||||
give permission to use their names for publicity for or to assert or
|
||||
imply endorsement of any Modified Version.
|
||||
|
||||
@item
|
||||
COMBINING DOCUMENTS
|
||||
|
||||
You may combine the Document with other documents released under this
|
||||
License, under the terms defined in section 4 above for modified
|
||||
versions, provided that you include in the combination all of the
|
||||
Invariant Sections of all of the original documents, unmodified, and
|
||||
list them all as Invariant Sections of your combined work in its
|
||||
license notice, and that you preserve all their Warranty Disclaimers.
|
||||
|
||||
The combined work need only contain one copy of this License, and
|
||||
multiple identical Invariant Sections may be replaced with a single
|
||||
copy. If there are multiple Invariant Sections with the same name but
|
||||
different contents, make the title of each such section unique by
|
||||
adding at the end of it, in parentheses, the name of the original
|
||||
author or publisher of that section if known, or else a unique number.
|
||||
Make the same adjustment to the section titles in the list of
|
||||
Invariant Sections in the license notice of the combined work.
|
||||
|
||||
In the combination, you must combine any sections Entitled ``History''
|
||||
in the various original documents, forming one section Entitled
|
||||
``History''; likewise combine any sections Entitled ``Acknowledgements'',
|
||||
and any sections Entitled ``Dedications''. You must delete all
|
||||
sections Entitled ``Endorsements.''
|
||||
|
||||
@item
|
||||
COLLECTIONS OF DOCUMENTS
|
||||
|
||||
You may make a collection consisting of the Document and other documents
|
||||
released under this License, and replace the individual copies of this
|
||||
License in the various documents with a single copy that is included in
|
||||
the collection, provided that you follow the rules of this License for
|
||||
verbatim copying of each of the documents in all other respects.
|
||||
|
||||
You may extract a single document from such a collection, and distribute
|
||||
it individually under this License, provided you insert a copy of this
|
||||
License into the extracted document, and follow this License in all
|
||||
other respects regarding verbatim copying of that document.
|
||||
|
||||
@item
|
||||
AGGREGATION WITH INDEPENDENT WORKS
|
||||
|
||||
A compilation of the Document or its derivatives with other separate
|
||||
and independent documents or works, in or on a volume of a storage or
|
||||
distribution medium, is called an ``aggregate'' if the copyright
|
||||
resulting from the compilation is not used to limit the legal rights
|
||||
of the compilation's users beyond what the individual works permit.
|
||||
When the Document is included in an aggregate, this License does not
|
||||
apply to the other works in the aggregate which are not themselves
|
||||
derivative works of the Document.
|
||||
|
||||
If the Cover Text requirement of section 3 is applicable to these
|
||||
copies of the Document, then if the Document is less than one half of
|
||||
the entire aggregate, the Document's Cover Texts may be placed on
|
||||
covers that bracket the Document within the aggregate, or the
|
||||
electronic equivalent of covers if the Document is in electronic form.
|
||||
Otherwise they must appear on printed covers that bracket the whole
|
||||
aggregate.
|
||||
|
||||
@item
|
||||
TRANSLATION
|
||||
|
||||
Translation is considered a kind of modification, so you may
|
||||
distribute translations of the Document under the terms of section 4.
|
||||
Replacing Invariant Sections with translations requires special
|
||||
permission from their copyright holders, but you may include
|
||||
translations of some or all Invariant Sections in addition to the
|
||||
original versions of these Invariant Sections. You may include a
|
||||
translation of this License, and all the license notices in the
|
||||
Document, and any Warranty Disclaimers, provided that you also include
|
||||
the original English version of this License and the original versions
|
||||
of those notices and disclaimers. In case of a disagreement between
|
||||
the translation and the original version of this License or a notice
|
||||
or disclaimer, the original version will prevail.
|
||||
|
||||
If a section in the Document is Entitled ``Acknowledgements'',
|
||||
``Dedications'', or ``History'', the requirement (section 4) to Preserve
|
||||
its Title (section 1) will typically require changing the actual
|
||||
title.
|
||||
|
||||
@item
|
||||
TERMINATION
|
||||
|
||||
You may not copy, modify, sublicense, or distribute the Document
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense, or distribute it is void, and
|
||||
will automatically terminate your rights under this License.
|
||||
|
||||
However, if you cease all violation of this License, then your license
|
||||
from a particular copyright holder is reinstated (a) provisionally,
|
||||
unless and until the copyright holder explicitly and finally
|
||||
terminates your license, and (b) permanently, if the copyright holder
|
||||
fails to notify you of the violation by some reasonable means prior to
|
||||
60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, receipt of a copy of some or all of the same material does
|
||||
not give you any rights to use it.
|
||||
|
||||
@item
|
||||
FUTURE REVISIONS OF THIS LICENSE
|
||||
|
||||
The Free Software Foundation may publish new, revised versions
|
||||
of the GNU Free Documentation License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns. See
|
||||
@uref{https://www.gnu.org/licenses/}.
|
||||
|
||||
Each version of the License is given a distinguishing version number.
|
||||
If the Document specifies that a particular numbered version of this
|
||||
License ``or any later version'' applies to it, you have the option of
|
||||
following the terms and conditions either of that specified version or
|
||||
of any later version that has been published (not as a draft) by the
|
||||
Free Software Foundation. If the Document does not specify a version
|
||||
number of this License, you may choose any version ever published (not
|
||||
as a draft) by the Free Software Foundation. If the Document
|
||||
specifies that a proxy can decide which future versions of this
|
||||
License can be used, that proxy's public statement of acceptance of a
|
||||
version permanently authorizes you to choose that version for the
|
||||
Document.
|
||||
|
||||
@item
|
||||
RELICENSING
|
||||
|
||||
``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
|
||||
World Wide Web server that publishes copyrightable works and also
|
||||
provides prominent facilities for anybody to edit those works. A
|
||||
public wiki that anybody can edit is an example of such a server. A
|
||||
``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
|
||||
site means any set of copyrightable works thus published on the MMC
|
||||
site.
|
||||
|
||||
``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
|
||||
license published by Creative Commons Corporation, a not-for-profit
|
||||
corporation with a principal place of business in San Francisco,
|
||||
California, as well as future copyleft versions of that license
|
||||
published by that same organization.
|
||||
|
||||
``Incorporate'' means to publish or republish a Document, in whole or
|
||||
in part, as part of another Document.
|
||||
|
||||
An MMC is ``eligible for relicensing'' if it is licensed under this
|
||||
License, and if all works that were first published under this License
|
||||
somewhere other than this MMC, and subsequently incorporated in whole
|
||||
or in part into the MMC, (1) had no cover texts or invariant sections,
|
||||
and (2) were thus incorporated prior to November 1, 2008.
|
||||
|
||||
The operator of an MMC Site may republish an MMC contained in the site
|
||||
under CC-BY-SA on the same site at any time before August 1, 2009,
|
||||
provided the MMC is eligible for relicensing.
|
||||
|
||||
@end enumerate
|
||||
|
||||
@page
|
||||
@heading ADDENDUM: How to use this License for your documents
|
||||
|
||||
To use this License in a document you have written, include a copy of
|
||||
the License in the document and put the following copyright and
|
||||
license notices just after the title page:
|
||||
|
||||
@smallexample
|
||||
@group
|
||||
Copyright (C) @var{year} @var{your name}.
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.3
|
||||
or any later version published by the Free Software Foundation;
|
||||
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
||||
Texts. A copy of the license is included in the section entitled ``GNU
|
||||
Free Documentation License''.
|
||||
@end group
|
||||
@end smallexample
|
||||
|
||||
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
|
||||
replace the ``with@dots{}Texts.''@: line with this:
|
||||
|
||||
@smallexample
|
||||
@group
|
||||
with the Invariant Sections being @var{list their titles}, with
|
||||
the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
|
||||
being @var{list}.
|
||||
@end group
|
||||
@end smallexample
|
||||
|
||||
If you have Invariant Sections without Cover Texts, or some other
|
||||
combination of the three, merge those two alternatives to suit the
|
||||
situation.
|
||||
|
||||
If your document contains nontrivial examples of program code, we
|
||||
recommend releasing these examples in parallel under your choice of
|
||||
free software license, such as the GNU General Public License,
|
||||
to permit their use in free software.
|
||||
|
||||
@c Local Variables:
|
||||
@c ispell-local-pdict: "ispell-dict"
|
||||
@c End:
|
||||
132
doc/local.mk
132
doc/local.mk
@@ -1,132 +0,0 @@
|
||||
# Make coreutils documentation. -*-Makefile-*-
|
||||
# This is included by the top-level Makefile.am.
|
||||
|
||||
# Copyright (C) 1995-2024 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
info_TEXINFOS = doc/coreutils.texi
|
||||
|
||||
doc_coreutils_TEXINFOS = \
|
||||
doc/perm.texi \
|
||||
doc/parse-datetime.texi \
|
||||
doc/constants.texi \
|
||||
doc/fdl.texi \
|
||||
doc/sort-version.texi
|
||||
|
||||
# The customization variable CHECK_NORMAL_MENU_STRUCTURE is necessary with
|
||||
# makeinfo versions ≥ 6.8.
|
||||
MAKEINFO = @MAKEINFO@ -c CHECK_NORMAL_MENU_STRUCTURE=1
|
||||
|
||||
# The following is necessary if the package name is 8 characters or longer.
|
||||
# If the info documentation would be split into 10 or more separate files,
|
||||
# then this is necessary even if the package name is 7 characters long.
|
||||
#
|
||||
# Tell makeinfo to put everything in a single info file: <package>.info.
|
||||
# Otherwise, it would also generate files with names like <package>.info-[123],
|
||||
# and those names all map to one 14-byte name (<package>.info-) on some crufty
|
||||
# old systems.
|
||||
AM_MAKEINFOFLAGS = --no-split
|
||||
|
||||
doc/constants.texi: $(top_srcdir)/src/tail.c $(top_srcdir)/src/shred.c
|
||||
$(AM_V_GEN)LC_ALL=C; export LC_ALL; \
|
||||
$(MKDIR_P) doc && \
|
||||
{ sed -n -e 's/^#define \(DEFAULT_MAX[_A-Z]*\) \(.*\)/@set \1 \2/p' \
|
||||
$(top_srcdir)/src/tail.c && \
|
||||
sed -n -e \
|
||||
's/.*\(DEFAULT_PASSES\)[ =]* \([0-9]*\).*/@set SHRED_\1 \2/p'\
|
||||
$(top_srcdir)/src/shred.c; } > $@-t \
|
||||
&& { cmp $@-t $@ >/dev/null 2>&1 || mv $@-t $@; rm -f $@-t; }
|
||||
|
||||
MAINTAINERCLEANFILES += doc/constants.texi
|
||||
|
||||
# Extended regular expressions to match word starts and ends.
|
||||
_W = (^|[^A-Za-z0-9_])
|
||||
W_ = ([^A-Za-z0-9_]|$$)
|
||||
|
||||
syntax_checks = \
|
||||
sc-avoid-builtin \
|
||||
sc-avoid-io \
|
||||
sc-avoid-non-zero \
|
||||
sc-avoid-path \
|
||||
sc-avoid-timezone \
|
||||
sc-avoid-zeroes \
|
||||
sc-exponent-grouping \
|
||||
sc-lower-case-var
|
||||
|
||||
texi_files = $(srcdir)/doc/*.texi
|
||||
|
||||
.PHONY: $(syntax_checks) check-texinfo
|
||||
|
||||
# List words/regexps here that should not appear in the texinfo documentation.
|
||||
check-texinfo: $(syntax_checks)
|
||||
$(AM_V_GEN)fail=0; \
|
||||
grep '@url{' $(texi_files) && fail=1; \
|
||||
grep '\$$@"' $(texi_files) && fail=1; \
|
||||
grep -n '[^[:punct:]]@footnote' $(texi_files) && fail=1; \
|
||||
grep -n filename $(texi_files) \
|
||||
| $(EGREP) -v 'setfilename|[{]filename[}]' \
|
||||
&& fail=1; \
|
||||
exit $$fail
|
||||
|
||||
sc-avoid-builtin:
|
||||
$(AM_V_GEN)$(EGREP) -i '$(_W)builtins?$(W_)' $(texi_files) \
|
||||
&& exit 1 || :
|
||||
|
||||
sc-avoid-path:
|
||||
$(AM_V_GEN)fail=0; \
|
||||
$(EGREP) -i '$(_W)path(name)?s?$(W_)' $(texi_files) \
|
||||
| $(EGREP) -v \
|
||||
'PATH=|path search|search path|@vindex PATH$$|@env[{]PATH[}]' \
|
||||
&& fail=1; \
|
||||
exit $$fail
|
||||
|
||||
# Use "time zone", not "timezone".
|
||||
sc-avoid-timezone:
|
||||
$(AM_V_GEN)$(EGREP) timezone $(texi_files) && exit 1 || :
|
||||
|
||||
# Check for insufficient exponent grouping, e.g.,
|
||||
# @math{2^64} should be @math{2^{64}}.
|
||||
sc-exponent-grouping:
|
||||
$(AM_V_GEN)$(EGREP) '\{.*\^[0-9][0-9]' $(texi_files) && exit 1 || :
|
||||
|
||||
# Say I/O, not IO.
|
||||
sc-avoid-io:
|
||||
$(AM_V_GEN)$(EGREP) '$(_W)IO$(W_)' $(texi_files) && exit 1 || :
|
||||
|
||||
# I prefer nonzero over non-zero.
|
||||
sc-avoid-non-zero:
|
||||
$(AM_V_GEN)$(EGREP) non-zero $(texi_files) && exit 1 || :
|
||||
|
||||
# Use "zeros", not "zeroes" (nothing wrong with "zeroes"; just be consistent).
|
||||
sc-avoid-zeroes:
|
||||
$(AM_V_GEN)$(EGREP) -i '$(_W)zeroes$(W_)' $(texi_files) \
|
||||
&& exit 1 || :
|
||||
|
||||
# The quantity inside @var{...} should not contain upper case letters.
|
||||
# The leading backslash exemption is to permit in-macro uses like
|
||||
# @var{\varName\} where the upper case letter is part of a parameter name.
|
||||
find_upper_case_var = \
|
||||
'/\@var\{/ or next; \
|
||||
while (/\@var\{(.+?)}/g) \
|
||||
{ \
|
||||
$$v = $$1; \
|
||||
$$v =~ /[A-Z]/ && $$v !~ /^\\/ and (print "$$ARGV:$$.:$$_"), $$m = 1 \
|
||||
} \
|
||||
END {$$m and (warn "$@: do not use upper case in \@var{...}\n"), exit 1}'
|
||||
sc-lower-case-var:
|
||||
$(AM_V_GEN)$(PERL) -e 1 || { echo $@: skipping test; exit 0; }; \
|
||||
$(PERL) -lne $(find_upper_case_var) $(texi_files)
|
||||
|
||||
check-local: check-texinfo
|
||||
149
doc/perm.texi
149
doc/perm.texi
@@ -1,6 +1,7 @@
|
||||
@c File mode bits
|
||||
|
||||
@c Copyright (C) 1994--2024 Free Software Foundation, Inc.
|
||||
@c Copyright (C) 1994, 1996, 1999-2001, 2003-2006,
|
||||
@c 2008-2009 Free Software Foundation, Inc.
|
||||
|
||||
@c Permission is granted to copy, distribute and/or modify this document
|
||||
@c under the terms of the GNU Free Documentation License, Version 1.3 or
|
||||
@@ -17,7 +18,6 @@ symbolic form or as an octal number.
|
||||
* Mode Structure:: Structure of file mode bits.
|
||||
* Symbolic Modes:: Mnemonic representation of file mode bits.
|
||||
* Numeric Modes:: File mode bits as octal numbers.
|
||||
* Operator Numeric Modes:: ANDing, ORing, and setting modes octally.
|
||||
* Directory Setuid and Setgid:: Set-user-ID and set-group-ID on directories.
|
||||
@end menu
|
||||
|
||||
@@ -70,36 +70,38 @@ In addition to the three sets of three permissions listed above, the
|
||||
file mode bits have three special components, which affect only
|
||||
executable files (programs) and, on most systems, directories:
|
||||
|
||||
@table @asis
|
||||
@item The @dfn{set-user-ID bit} (@dfn{setuid bit}).
|
||||
@enumerate
|
||||
@item
|
||||
@cindex set-user-ID
|
||||
@cindex setuid
|
||||
On execution, set the process's effective user ID to that of the file.
|
||||
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{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.
|
||||
|
||||
@item The @dfn{set-group-ID bit} (@dfn{setgid bit}).
|
||||
@item
|
||||
@cindex set-group-ID
|
||||
@cindex setgid
|
||||
On execution, set the process's effective group ID to that of the file.
|
||||
Set the process's effective group ID to that of the file upon execution
|
||||
(called the @dfn{set-group-ID bit}, or sometimes the @dfn{setgid bit}).
|
||||
For directories on most systems, give files created in the directory
|
||||
the same group as the directory, no matter what group the user who
|
||||
creates them is in, and set the set-group-ID bit of newly-created
|
||||
subdirectories.
|
||||
|
||||
@item The @dfn{restricted deletion flag} or @dfn{sticky bit}.
|
||||
@item
|
||||
@cindex sticky
|
||||
@cindex swap space, saving text image in
|
||||
@cindex text image, saving in swap space
|
||||
@cindex restricted deletion flag
|
||||
Prevent unprivileged users from removing or renaming a file in a directory
|
||||
unless they own the file or the directory; this is commonly
|
||||
unless they own the file or the directory; this is called the
|
||||
@dfn{restricted deletion flag} for the directory, and is commonly
|
||||
found on world-writable directories like @file{/tmp}.
|
||||
|
||||
For regular files on some older systems, save the program's text image on the
|
||||
swap device so it will load more quickly when run, so that the image
|
||||
is ``sticky''.
|
||||
@end table
|
||||
swap device so it will load more quickly when run; this is called the
|
||||
@dfn{sticky bit}.
|
||||
@end enumerate
|
||||
|
||||
In addition to the file mode bits listed above, there may be file attributes
|
||||
specific to the file system, e.g., access control lists (ACLs), whether a
|
||||
@@ -110,7 +112,7 @@ specific to the file system. For example:
|
||||
|
||||
@table @asis
|
||||
@item ext2
|
||||
On GNU and GNU/Linux the file attributes specific to
|
||||
On @acronym{GNU} and @acronym{GNU}/Linux the file attributes specific to
|
||||
the ext2 file system are set using @command{chattr}.
|
||||
|
||||
@item FFS
|
||||
@@ -146,7 +148,7 @@ their previous values, and perhaps on the current @code{umask} as well
|
||||
The format of symbolic modes is:
|
||||
|
||||
@example
|
||||
@r{[}ugoa@dots{}@r{][}-+=@r{]}@var{perms}@dots{}@r{[},@dots{}@r{]}
|
||||
@r{[}ugoa@dots{}@r{][}+-=@r{]}@var{perms}@dots{}@r{[},@dots{}@r{]}
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
@@ -343,7 +345,7 @@ the mode:
|
||||
+t
|
||||
@end example
|
||||
|
||||
The combination @samp{o+s} has no effect. On GNU systems
|
||||
The combination @samp{o+s} has no effect. On @acronym{GNU} systems
|
||||
the combinations @samp{u+t} and @samp{g+t} have no effect, and
|
||||
@samp{o+t} acts like plain @samp{+t}.
|
||||
|
||||
@@ -492,81 +494,54 @@ the file to all users.
|
||||
As an
|
||||
alternative to giving a symbolic mode, you can give an octal (base 8)
|
||||
number that represents the mode.
|
||||
This number is always interpreted in octal; you do not have to add a
|
||||
leading @samp{0}, as you do in C. Mode @samp{0055} is the same as
|
||||
mode @samp{55}.
|
||||
|
||||
A numeric mode is usually shorter than the corresponding symbolic
|
||||
mode, but it is limited in that normally it cannot take into account the
|
||||
previous file mode bits; it can only set them absolutely.
|
||||
(As discussed in the next section, the set-user-ID and set-group-ID
|
||||
bits of directories are an exception to this general limitation.)
|
||||
|
||||
The permissions granted to the user,
|
||||
to other users in the file's group,
|
||||
and to other users not in the file's group each require three
|
||||
bits: one bit for read, one for write, and one for execute/search permission.
|
||||
These three bits are represented as one octal digit;
|
||||
for example, if all three are present, the resulting 111 (in binary)
|
||||
is represented as the digit 7 (in octal). The three special
|
||||
bits, which are represented as one octal digit. The three special
|
||||
mode bits also require one bit each, and they are as a group
|
||||
represented as another octal digit. Here is how the bits are arranged,
|
||||
starting with the highest valued bit:
|
||||
starting with the lowest valued bit:
|
||||
|
||||
@example
|
||||
Value in Corresponding
|
||||
Mode Mode Bit
|
||||
|
||||
Special mode bits:
|
||||
4000 Set user ID
|
||||
2000 Set group ID
|
||||
1000 Restricted deletion flag or sticky bit
|
||||
|
||||
The file's owner:
|
||||
400 Read
|
||||
200 Write
|
||||
100 Execute/search
|
||||
Other users not in the file's group:
|
||||
1 Execute/search
|
||||
2 Write
|
||||
4 Read
|
||||
|
||||
Other users in the file's group:
|
||||
40 Read
|
||||
20 Write
|
||||
10 Execute/search
|
||||
20 Write
|
||||
40 Read
|
||||
|
||||
Other users not in the file's group:
|
||||
4 Read
|
||||
2 Write
|
||||
1 Execute/search
|
||||
The file's owner:
|
||||
100 Execute/search
|
||||
200 Write
|
||||
400 Read
|
||||
|
||||
Special mode bits:
|
||||
1000 Restricted deletion flag or sticky bit
|
||||
2000 Set group ID on execution
|
||||
4000 Set user ID on execution
|
||||
@end example
|
||||
|
||||
For example, numeric mode @samp{4751} corresponds to symbolic mode
|
||||
@samp{u=srwx,g=rx,o=x}, and numeric mode @samp{664} corresponds to symbolic mode
|
||||
For example, numeric mode @samp{4755} corresponds to symbolic mode
|
||||
@samp{u=rwxs,go=rx}, and numeric mode @samp{664} corresponds to symbolic mode
|
||||
@samp{ug=rw,o=r}. Numeric mode @samp{0} corresponds to symbolic mode
|
||||
@samp{a=}.
|
||||
|
||||
A numeric mode is usually shorter than the corresponding symbolic
|
||||
mode, but it is limited in that normally it cannot take into account the
|
||||
previous file mode bits; it can only set them absolutely.
|
||||
The set-user-ID and set-group-ID bits of directories are an exception
|
||||
to this general limitation. @xref{Directory Setuid and Setgid}.
|
||||
Also, operator numeric modes can take previous file mode bits into
|
||||
account. @xref{Operator Numeric Modes}.
|
||||
|
||||
Numeric modes are always interpreted in octal; you do not have to add a
|
||||
leading @samp{0}, as you do in C@. Mode @samp{0055} is the same as
|
||||
mode @samp{55}. However, modes of five digits or more, such as
|
||||
@samp{00055}, are sometimes special (@pxref{Directory Setuid and Setgid}).
|
||||
|
||||
@node Operator Numeric Modes
|
||||
@section Operator Numeric Modes
|
||||
|
||||
An operator numeric mode is a numeric mode that is prefixed by a
|
||||
@samp{-}, @samp{+}, or @samp{=} operator, which has the same
|
||||
interpretation as in symbolic modes. For example, @samp{+440} enables
|
||||
read permission for the file's owner and group, @samp{-1} disables
|
||||
execute permission for other users, and @samp{=600} clears all
|
||||
permissions except for enabling read-write permissions for the file's
|
||||
owner. Operator numeric modes can be combined with symbolic modes by
|
||||
separating them with a comma; for example, @samp{=0,u+r} clears all
|
||||
permissions except for enabling read permission for the file's owner.
|
||||
|
||||
The commands @samp{chmod =755 @var{dir}} and @samp{chmod 755
|
||||
@var{dir}} differ in that the former clears the directory @var{dir}'s
|
||||
setuid and setgid bits, whereas the latter preserves them.
|
||||
@xref{Directory Setuid and Setgid}.
|
||||
|
||||
Operator numeric modes are a GNU extension.
|
||||
|
||||
@node Directory Setuid and Setgid
|
||||
@section Directories and the Set-User-ID and Set-Group-ID Bits
|
||||
|
||||
@@ -585,10 +560,8 @@ bits of directories. If commands like @command{chmod} and
|
||||
mechanisms would be less convenient and it would be harder to share
|
||||
files. Therefore, a command like @command{chmod} does not affect the
|
||||
set-user-ID or set-group-ID bits of a directory unless the user
|
||||
specifically mentions them in a symbolic mode, or uses an operator
|
||||
numeric mode such as @samp{=755}, or sets them in a numeric mode, or
|
||||
clears them in a numeric mode that has five or more octal digits.
|
||||
For example, on systems that support
|
||||
specifically mentions them in a symbolic mode, or sets them in
|
||||
a numeric mode. For example, on systems that support
|
||||
set-group-ID inheritance:
|
||||
|
||||
@example
|
||||
@@ -610,32 +583,22 @@ explicitly in the symbolic or numeric modes, e.g.:
|
||||
@example
|
||||
# These commands try to set the set-user-ID
|
||||
# and set-group-ID bits of the subdirectories.
|
||||
mkdir G
|
||||
mkdir G H
|
||||
chmod 6755 G
|
||||
chmod +6000 G
|
||||
chmod u=rwx,go=rx,a+s G
|
||||
mkdir -m 6755 H
|
||||
mkdir -m +6000 I
|
||||
chmod u=rwx,go=rx,a+s H
|
||||
mkdir -m 6755 I
|
||||
mkdir -m u=rwx,go=rx,a+s J
|
||||
@end example
|
||||
|
||||
If you want to try to clear these bits, you must mention them
|
||||
explicitly in a symbolic mode, or use an operator numeric mode, or
|
||||
specify a numeric mode with five or more octal digits, e.g.:
|
||||
explicitly in a symbolic mode, e.g.:
|
||||
|
||||
@example
|
||||
# These commands try to clear the set-user-ID
|
||||
# This command tries to clear the set-user-ID
|
||||
# and set-group-ID bits of the directory D.
|
||||
chmod a-s D
|
||||
chmod -6000 D
|
||||
chmod =755 D
|
||||
chmod 00755 D
|
||||
@end example
|
||||
|
||||
This behavior is a GNU extension. Portable scripts should
|
||||
This behavior is a @acronym{GNU} extension. Portable scripts should
|
||||
not rely on requests to set or clear these bits on directories, as
|
||||
POSIX allows implementations to ignore these requests.
|
||||
The GNU behavior with numeric modes of four or fewer digits
|
||||
is intended for scripts portable to systems that preserve these bits;
|
||||
the behavior with numeric modes of five or more digits is for scripts
|
||||
portable to systems that do not preserve the bits.
|
||||
@acronym{POSIX} allows implementations to ignore these requests.
|
||||
|
||||
@@ -1,909 +0,0 @@
|
||||
@c GNU Version-sort ordering documentation
|
||||
|
||||
@c Copyright (C) 2019--2024 Free Software Foundation, Inc.
|
||||
|
||||
@c Permission is granted to copy, distribute and/or modify this document
|
||||
@c under the terms of the GNU Free Documentation License, Version 1.3 or
|
||||
@c any later version published by the Free Software Foundation; with no
|
||||
@c Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
||||
@c Texts. A copy of the license is included in the ``GNU Free
|
||||
@c Documentation License'' file as part of this distribution.
|
||||
|
||||
@c Written by Assaf Gordon
|
||||
|
||||
@node Version sort ordering
|
||||
@chapter Version sort ordering
|
||||
|
||||
|
||||
|
||||
@node Version sort overview
|
||||
@section Version sort overview
|
||||
|
||||
@dfn{Version sort} puts items such as file names and lines of
|
||||
text in an order that feels natural to people, when the text
|
||||
contains a mixture of letters and digits.
|
||||
|
||||
Lexicographic sorting usually does not produce the order that one expects
|
||||
because comparisons are made on a character-by-character basis.
|
||||
|
||||
Compare the sorting of the following items:
|
||||
|
||||
@example
|
||||
Lexicographic sort: Version Sort:
|
||||
|
||||
a1 a1
|
||||
a120 a2
|
||||
a13 a13
|
||||
a2 a120
|
||||
@end example
|
||||
|
||||
Version sort functionality in GNU Coreutils is available in the @samp{ls -v},
|
||||
@samp{ls --sort=version}, @samp{sort -V}, and
|
||||
@samp{sort --version-sort} commands.
|
||||
|
||||
|
||||
|
||||
@node Using version sort in GNU Coreutils
|
||||
@subsection Using version sort in GNU Coreutils
|
||||
|
||||
Two GNU Coreutils programs use version sort: @command{ls} and @command{sort}.
|
||||
|
||||
To list files in version sort order, use @command{ls}
|
||||
with the @option{-v} or @option{--sort=version} option:
|
||||
|
||||
@example
|
||||
default sort: version sort:
|
||||
|
||||
$ ls -1 $ ls -1 -v
|
||||
a1 a1
|
||||
a100 a1.4
|
||||
a1.13 a1.13
|
||||
a1.4 a1.40
|
||||
a1.40 a2
|
||||
a2 a100
|
||||
@end example
|
||||
|
||||
To sort text files in version sort order, use @command{sort} with
|
||||
the @option{-V} or @option{--version-sort} option:
|
||||
|
||||
@example
|
||||
$ cat input
|
||||
b3
|
||||
b11
|
||||
b1
|
||||
b20
|
||||
|
||||
|
||||
lexicographic order: version sort order:
|
||||
|
||||
$ sort input $ sort -V input
|
||||
b1 b1
|
||||
b11 b3
|
||||
b20 b11
|
||||
b3 b20
|
||||
@end example
|
||||
|
||||
To sort a specific field in a file, use @option{-k/--key} with
|
||||
@samp{V} type sorting, which is often combined with @samp{b} to
|
||||
ignore leading blanks in the field:
|
||||
|
||||
@example
|
||||
$ cat input2
|
||||
100 b3 apples
|
||||
2000 b11 oranges
|
||||
3000 b1 potatoes
|
||||
4000 b20 bananas
|
||||
$ sort -k 2bV,2 input2
|
||||
3000 b1 potatoes
|
||||
100 b3 apples
|
||||
2000 b11 oranges
|
||||
4000 b20 bananas
|
||||
@end example
|
||||
|
||||
@node Version sort and natural sort
|
||||
@subsection Version sort and natural sort
|
||||
|
||||
In GNU Coreutils, the name @dfn{version sort} was chosen because it is based
|
||||
on Debian GNU/Linux's algorithm of sorting packages' versions.
|
||||
|
||||
Its goal is to answer questions like
|
||||
``Which package is newer, @file{firefox-60.7.2} or @file{firefox-60.12.3}?''
|
||||
|
||||
In Coreutils this algorithm was slightly modified to work on more
|
||||
general input such as textual strings and file names
|
||||
(see @ref{Differences from Debian version sort}).
|
||||
|
||||
In other contexts, such as other programs and other programming
|
||||
languages, a similar sorting functionality is called
|
||||
@uref{https://en.wikipedia.org/wiki/Natural_sort_order,natural sort}.
|
||||
|
||||
|
||||
@node Variations in version sort order
|
||||
@subsection Variations in version sort order
|
||||
|
||||
Currently there is no standard for version sort.
|
||||
|
||||
That is: there is no one correct way or universally agreed-upon way to
|
||||
order items. Each program and each programming language can decide its
|
||||
own ordering algorithm and call it ``version sort'', ``natural sort'',
|
||||
or other names.
|
||||
|
||||
See @ref{Other version/natural sort implementations} for many examples of
|
||||
differing sorting possibilities, each with its own rules and variations.
|
||||
|
||||
If you find a bug in the Coreutils implementation of version-sort, please
|
||||
report it. @xref{Reporting version sort bugs}.
|
||||
|
||||
|
||||
@node Version sort implementation
|
||||
@section Version sort implementation
|
||||
|
||||
GNU Coreutils version sort is based on the ``upstream version''
|
||||
part of
|
||||
@uref{https://www.debian.org/doc/debian-policy/ch-controlfields.html#version,
|
||||
Debian's versioning scheme}.
|
||||
|
||||
This section describes the GNU Coreutils sort ordering rules.
|
||||
|
||||
The next section (@ref{Differences from Debian version
|
||||
sort}) describes some differences between GNU Coreutils
|
||||
and Debian version sort.
|
||||
|
||||
|
||||
@node Version-sort ordering rules
|
||||
@subsection Version-sort ordering rules
|
||||
|
||||
The version sort ordering rules are:
|
||||
|
||||
@enumerate
|
||||
@item
|
||||
The strings are compared from left to right.
|
||||
|
||||
@item
|
||||
First the initial part of each string consisting entirely of non-digit
|
||||
bytes is determined.
|
||||
|
||||
@enumerate A
|
||||
@item
|
||||
These two parts (either of which may be empty) are compared lexically.
|
||||
If a difference is found it is returned.
|
||||
|
||||
@item
|
||||
The lexical comparison is a lexicographic comparison of byte strings,
|
||||
except that:
|
||||
|
||||
@enumerate a
|
||||
@item
|
||||
ASCII letters sort before other bytes.
|
||||
@item
|
||||
A tilde sorts before anything, even an empty string.
|
||||
@end enumerate
|
||||
@end enumerate
|
||||
|
||||
@item
|
||||
Then the initial part of the remainder of each string that contains
|
||||
all the leading digits is determined. The numerical values represented by
|
||||
these two parts are compared, and any difference found is returned as
|
||||
the result of the comparison.
|
||||
|
||||
@enumerate A
|
||||
@item
|
||||
For these purposes an empty string (which can only occur at the end of
|
||||
one or both version strings being compared) counts as zero.
|
||||
|
||||
@item
|
||||
Because the numerical value is used, non-identical strings can compare
|
||||
equal. For example, @samp{123} compares equal to @samp{00123}, and
|
||||
the empty string compares equal to @samp{0}.
|
||||
@end enumerate
|
||||
|
||||
@item
|
||||
These two steps (comparing and removing initial non-digit strings and
|
||||
initial digit strings) are repeated until a difference is found or
|
||||
both strings are exhausted.
|
||||
@end enumerate
|
||||
|
||||
Consider the version-sort comparison of two file names:
|
||||
@file{foo07.7z} and @file{foo7a.7z}. The two strings will be broken
|
||||
down to the following parts, and the parts compared respectively from
|
||||
each string:
|
||||
|
||||
@example
|
||||
foo @r{vs} foo @r{(rule 2, non-digits)}
|
||||
07 @r{vs} 7 @r{(rule 3, digits)}
|
||||
. @r{vs} a. @r{(rule 2)}
|
||||
7 @r{vs} 7 @r{(rule 3)}
|
||||
z @r{vs} z @r{(rule 2)}
|
||||
@end example
|
||||
|
||||
Comparison flow based on above algorithm:
|
||||
|
||||
@enumerate
|
||||
@item
|
||||
The first parts (@samp{foo}) are identical.
|
||||
|
||||
@item
|
||||
The second parts (@samp{07} and @samp{7}) are compared numerically,
|
||||
and compare equal.
|
||||
|
||||
@item
|
||||
The third parts (@samp{.} vs @samp{a.}) are compared
|
||||
lexically by ASCII value (rule 2.B).
|
||||
|
||||
@item
|
||||
The first byte of the first string (@samp{.}) is compared
|
||||
to the first byte of the second string (@samp{a}).
|
||||
|
||||
@item
|
||||
Rule 2.B.a says letters sorts before non-letters.
|
||||
Hence, @samp{a} comes before @samp{.}.
|
||||
|
||||
@item
|
||||
The returned result is that @file{foo7a.7z} comes before @file{foo07.7z}.
|
||||
@end enumerate
|
||||
|
||||
Result when using sort:
|
||||
|
||||
@example
|
||||
$ cat input3
|
||||
foo07.7z
|
||||
foo7a.7z
|
||||
$ sort -V input3
|
||||
foo7a.7z
|
||||
foo07.7z
|
||||
@end example
|
||||
|
||||
See @ref{Differences from Debian version sort} for
|
||||
additional rules that extend the Debian algorithm in Coreutils.
|
||||
|
||||
|
||||
@node Version sort is not the same as numeric sort
|
||||
@subsection Version sort is not the same as numeric sort
|
||||
|
||||
Consider the following text file:
|
||||
|
||||
@example
|
||||
$ cat input4
|
||||
8.10
|
||||
8.5
|
||||
8.1
|
||||
8.01
|
||||
8.010
|
||||
8.100
|
||||
8.49
|
||||
|
||||
Numerical Sort: Version Sort:
|
||||
|
||||
$ sort -n input4 $ sort -V input4
|
||||
8.01 8.01
|
||||
8.010 8.1
|
||||
8.1 8.5
|
||||
8.10 8.010
|
||||
8.100 8.10
|
||||
8.49 8.49
|
||||
8.5 8.100
|
||||
@end example
|
||||
|
||||
Numeric sort (@samp{sort -n}) treats the entire string as a single numeric
|
||||
value, and compares it to other values. For example, @samp{8.1}, @samp{8.10} and
|
||||
@samp{8.100} are numerically equivalent, and are ordered together. Similarly,
|
||||
@samp{8.49} is numerically less than @samp{8.5}, and appears before first.
|
||||
|
||||
Version sort (@samp{sort -V}) first breaks down the string into digit and
|
||||
non-digit parts, and only then compares each part (see annotated
|
||||
example in @ref{Version-sort ordering rules}).
|
||||
|
||||
Comparing the string @samp{8.1} to @samp{8.01}, first the
|
||||
@samp{8}s are compared (and are identical), then the
|
||||
dots (@samp{.}) are compared and are identical, and lastly the
|
||||
remaining digits are compared numerically (@samp{1} and @samp{01}) --
|
||||
which are numerically equal. Hence, @samp{8.01} and @samp{8.1}
|
||||
are grouped together.
|
||||
|
||||
Similarly, comparing @samp{8.5} to @samp{8.49} -- the @samp{8}
|
||||
and @samp{.} parts are identical, then the numeric values @samp{5} and
|
||||
@samp{49} are compared. The resulting @samp{5} appears before @samp{49}.
|
||||
|
||||
This sorting order (where @samp{8.5} comes before @samp{8.49}) is common when
|
||||
assigning versions to computer programs (while perhaps not intuitive
|
||||
or ``natural'' for people).
|
||||
|
||||
@node Version sort punctuation
|
||||
@subsection Version sort punctuation
|
||||
|
||||
Punctuation is sorted by ASCII order (rule 2.B).
|
||||
|
||||
@example
|
||||
$ touch 1.0.5_src.tar.gz 1.0_src.tar.gz
|
||||
$ ls -v -1
|
||||
1.0.5_src.tar.gz
|
||||
1.0_src.tar.gz
|
||||
@end example
|
||||
|
||||
Why is @file{1.0.5_src.tar.gz} listed before @file{1.0_src.tar.gz}?
|
||||
|
||||
Based on the version-sort ordering rules, the strings are broken down
|
||||
into the following parts:
|
||||
|
||||
@example
|
||||
1 @r{vs} 1 @r{(rule 3, all digits)}
|
||||
. @r{vs} . @r{(rule 2, all non-digits)}
|
||||
0 @r{vs} 0 @r{(rule 3)}
|
||||
. @r{vs} _src.tar.gz @r{(rule 2)}
|
||||
5 @r{vs} empty string @r{(no more bytes in the file name)}
|
||||
_src.tar.gz @r{vs} empty string
|
||||
@end example
|
||||
|
||||
The fourth parts (@samp{.} and @samp{_src.tar.gz}) are compared
|
||||
lexically by ASCII order. The @samp{.} (ASCII value 46) is
|
||||
less than @samp{_} (ASCII value 95) -- and should be listed before it.
|
||||
|
||||
Hence, @file{1.0.5_src.tar.gz} is listed first.
|
||||
|
||||
If a different byte appears instead of the underscore (for
|
||||
example, percent sign @samp{%} ASCII value 37, which is less
|
||||
than dot's ASCII value of 46), that file will be listed first:
|
||||
|
||||
@example
|
||||
$ touch 1.0.5_src.tar.gz 1.0%zzzzz.gz
|
||||
1.0%zzzzz.gz
|
||||
1.0.5_src.tar.gz
|
||||
@end example
|
||||
|
||||
The same reasoning applies to the following example, as @samp{.} with
|
||||
ASCII value 46 is less than @samp{/} with ASCII value 47:
|
||||
|
||||
@example
|
||||
$ cat input5
|
||||
3.0/
|
||||
3.0.5
|
||||
$ sort -V input5
|
||||
3.0.5
|
||||
3.0/
|
||||
@end example
|
||||
|
||||
|
||||
@node Punctuation vs letters
|
||||
@subsection Punctuation vs letters
|
||||
|
||||
Rule 2.B.a says letters sort before non-letters
|
||||
(after breaking down a string to digit and non-digit parts).
|
||||
|
||||
@example
|
||||
$ cat input6
|
||||
a%
|
||||
az
|
||||
$ sort -V input6
|
||||
az
|
||||
a%
|
||||
@end example
|
||||
|
||||
The input strings consist entirely of non-digits, and based on the
|
||||
above algorithm have only one part, all non-digits
|
||||
(@samp{a%} vs @samp{az}).
|
||||
|
||||
Each part is then compared lexically,
|
||||
byte-by-byte; @samp{a} compares identically in both
|
||||
strings.
|
||||
|
||||
Rule 2.B.a says a letter like @samp{z} sorts before
|
||||
a non-letter like @samp{%} -- hence @samp{az} appears first (despite
|
||||
@samp{z} having ASCII value of 122, much larger than @samp{%}
|
||||
with ASCII value 37).
|
||||
|
||||
@node The tilde @samp{~}
|
||||
@subsection The tilde @samp{~}
|
||||
|
||||
Rule 2.B.b says the tilde @samp{~} (ASCII 126) sorts
|
||||
before other bytes, and before an empty string.
|
||||
|
||||
@example
|
||||
$ cat input7
|
||||
1
|
||||
1%
|
||||
1.2
|
||||
1~
|
||||
~
|
||||
$ sort -V input7
|
||||
~
|
||||
1~
|
||||
1
|
||||
1%
|
||||
1.2
|
||||
@end example
|
||||
|
||||
The sorting algorithm starts by breaking down the string into
|
||||
non-digit (rule 2) and digit parts (rule 3).
|
||||
|
||||
In the above input file, only the last line in the input file starts
|
||||
with a non-digit (@samp{~}). This is the first part. All other lines
|
||||
in the input file start with a digit -- their first non-digit part is
|
||||
empty.
|
||||
|
||||
Based on rule 2.B.b, tilde @samp{~} sorts before other bytes
|
||||
and before the empty string -- hence it comes before all other strings,
|
||||
and is listed first in the sorted output.
|
||||
|
||||
The remaining lines (@samp{1}, @samp{1%}, @samp{1.2}, @samp{1~})
|
||||
follow similar logic: The digit part is extracted (1 for all strings)
|
||||
and compares equal. The following extracted parts for the remaining
|
||||
input lines are: empty part, @samp{%}, @samp{.}, @samp{~}.
|
||||
|
||||
Tilde sorts before all others, hence the line @samp{1~} appears next.
|
||||
|
||||
The remaining lines (@samp{1}, @samp{1%}, @samp{1.2}) are sorted based
|
||||
on previously explained rules.
|
||||
|
||||
@node Version sort ignores locale
|
||||
@subsection Version sort ignores locale
|
||||
|
||||
In version sort, Unicode characters are compared byte-by-byte according
|
||||
to their binary representation, ignoring their Unicode value or the
|
||||
current locale.
|
||||
|
||||
Most commonly, Unicode characters are encoded as UTF-8 bytes; for
|
||||
example, GREEK SMALL LETTER ALPHA (U+03B1, @samp{α}) is encoded as the
|
||||
UTF-8 sequence @samp{0xCE 0xB1}). The encoding is compared
|
||||
byte-by-byte, e.g., first @samp{0xCE} (decimal value 206) then
|
||||
@samp{0xB1} (decimal value 177).
|
||||
|
||||
@example
|
||||
$ touch aa az "a%" "aα"
|
||||
$ ls -1 -v
|
||||
aa
|
||||
az
|
||||
a%
|
||||
aα
|
||||
@end example
|
||||
|
||||
Ignoring the first letter (@samp{a}) which is identical in all
|
||||
strings, the compared values are:
|
||||
|
||||
@samp{a} and @samp{z} are letters, and sort before
|
||||
all other non-digits.
|
||||
|
||||
Then, percent sign @samp{%} (ASCII value 37) is compared to the
|
||||
first byte of the UTF-8 sequence of @samp{α}, which is 0xCE or 206). The
|
||||
value 37 is smaller, hence @samp{a%} is listed before @samp{aα}.
|
||||
|
||||
@node Differences from Debian version sort
|
||||
@section Differences from Debian version sort
|
||||
|
||||
GNU Coreutils version sort differs slightly from the
|
||||
official Debian algorithm, in order to accommodate more general usage
|
||||
and file name listing.
|
||||
|
||||
|
||||
@node Hyphen-minus and colon
|
||||
@subsection Hyphen-minus @samp{-} and colon @samp{:}
|
||||
|
||||
In Debian's version string syntax the version consists of three parts:
|
||||
@example
|
||||
[epoch:]upstream_version[-debian_revision]
|
||||
@end example
|
||||
The @samp{epoch} and @samp{debian_revision} parts are optional.
|
||||
|
||||
Example of such version strings:
|
||||
|
||||
@example
|
||||
60.7.2esr-1~deb9u1
|
||||
52.9.0esr-1~deb9u1
|
||||
1:2.3.4-1+b2
|
||||
327-2
|
||||
1:1.0.13-3
|
||||
2:1.19.2-1+deb9u5
|
||||
@end example
|
||||
|
||||
If the @samp{debian_revision part} is not present,
|
||||
hyphens @samp{-} are not allowed.
|
||||
If epoch is not present, colons @samp{:} are not allowed.
|
||||
|
||||
If these parts are present, hyphen and/or colons can appear only once
|
||||
in valid Debian version strings.
|
||||
|
||||
In GNU Coreutils, such restrictions are not reasonable (a file name can
|
||||
have many hyphens, a line of text can have many colons).
|
||||
|
||||
As a result, in GNU Coreutils hyphens and colons are treated exactly
|
||||
like all other punctuation, i.e., they are sorted after
|
||||
letters. @xref{Version sort punctuation}.
|
||||
|
||||
In Debian, these characters are treated differently than in Coreutils:
|
||||
a version string with hyphen will sort before similar strings without
|
||||
hyphens.
|
||||
|
||||
Compare:
|
||||
|
||||
@example
|
||||
$ touch 1ab-cd 1abb
|
||||
$ ls -v -1
|
||||
1abb
|
||||
1ab-cd
|
||||
$ if dpkg --compare-versions 1abb lt 1ab-cd
|
||||
> then echo sorted
|
||||
> else echo out of order
|
||||
> fi
|
||||
out of order
|
||||
@end example
|
||||
|
||||
For further details, see @ref{Comparing two strings using Debian's
|
||||
algorithm} and @uref{https://bugs.gnu.org/35939,GNU Bug 35939}.
|
||||
|
||||
@node Special priority in GNU Coreutils version sort
|
||||
@subsection Special priority in GNU Coreutils version sort
|
||||
|
||||
In GNU Coreutils version sort, the following items have
|
||||
special priority and sort before all other strings (listed in order):
|
||||
|
||||
@enumerate
|
||||
@item The empty string
|
||||
|
||||
@item The string @samp{.} (a single dot, ASCII 46)
|
||||
|
||||
@item The string @samp{..} (two dots)
|
||||
|
||||
@item Strings starting with dot (@samp{.}) sort before
|
||||
strings starting with any other byte.
|
||||
@end enumerate
|
||||
|
||||
Example:
|
||||
|
||||
@example
|
||||
$ printf '%s\n' a "" b "." c ".." ".d20" ".d3" | sort -V
|
||||
.
|
||||
..
|
||||
.d3
|
||||
.d20
|
||||
a
|
||||
b
|
||||
c
|
||||
@end example
|
||||
|
||||
These priorities make perfect sense for @samp{ls -v}: The special
|
||||
files dot @samp{.} and dot-dot @samp{..} will be listed
|
||||
first, followed by any hidden files (files starting with a dot),
|
||||
followed by non-hidden files.
|
||||
|
||||
For @samp{sort -V} these priorities might seem arbitrary. However,
|
||||
because the sorting code is shared between the @command{ls} and @command{sort}
|
||||
program, the ordering rules are the same.
|
||||
|
||||
@node Special handling of file extensions
|
||||
@subsection Special handling of file extensions
|
||||
|
||||
GNU Coreutils version sort implements specialized handling
|
||||
of strings that look like file names with extensions.
|
||||
This enables slightly more natural ordering of file
|
||||
names.
|
||||
|
||||
The following additional rules apply when comparing two strings where
|
||||
both begin with non-@samp{.}. They also apply when comparing two
|
||||
strings where both begin with @samp{.} but neither is @samp{.} or @samp{..}.
|
||||
|
||||
@enumerate
|
||||
@item
|
||||
A suffix (i.e., a file extension) is defined as: a dot, followed by an
|
||||
ASCII letter or tilde, followed by zero or more ASCII letters, digits,
|
||||
or tildes; all repeated zero or more times, and ending at string end.
|
||||
This is equivalent to matching the extended regular expression
|
||||
@code{(\.[A-Za-z~][A-Za-z0-9~]*)*$} in the C locale.
|
||||
The longest such match is used, except that a suffix is not
|
||||
allowed to match an entire nonempty string.
|
||||
|
||||
@item
|
||||
The suffixes are temporarily removed, and the strings are compared
|
||||
without them, using version sort (see @ref{Version-sort ordering
|
||||
rules}) without special priority (see @ref{Special priority in GNU
|
||||
Coreutils version sort}).
|
||||
|
||||
@item
|
||||
If the suffix-less strings do not compare equal, this comparison
|
||||
result is used and the suffixes are effectively ignored.
|
||||
|
||||
@item
|
||||
If the suffix-less strings compare equal, the suffixes are restored
|
||||
and the entire strings are compared using version sort.
|
||||
@end enumerate
|
||||
|
||||
Examples for rule 1:
|
||||
|
||||
@itemize
|
||||
@item
|
||||
@samp{hello-8.txt}: the suffix is @samp{.txt}
|
||||
|
||||
@item
|
||||
@samp{hello-8.2.txt}: the suffix is @samp{.txt}
|
||||
(@samp{.2} is not included because the dot is not followed by a letter)
|
||||
|
||||
@item
|
||||
@samp{hello-8.0.12.tar.gz}: the suffix is @samp{.tar.gz} (@samp{.0.12}
|
||||
is not included)
|
||||
|
||||
@item
|
||||
@samp{hello-8.2}: no suffix (suffix is an empty string)
|
||||
|
||||
@item
|
||||
@samp{hello.foobar65}: the suffix is @samp{.foobar65}
|
||||
|
||||
@item
|
||||
@samp{gcc-c++-10.8.12-0.7rc2.fc9.tar.bz2}: the suffix is
|
||||
@samp{.fc9.tar.bz2} (@samp{.7rc2} is not included as it begins with a digit)
|
||||
|
||||
@item
|
||||
@samp{.autom4te.cfg}: the suffix is the entire string.
|
||||
@end itemize
|
||||
|
||||
Examples for rule 2:
|
||||
|
||||
@itemize
|
||||
@item
|
||||
Comparing @samp{hello-8.txt} to @samp{hello-8.2.12.txt}, the
|
||||
@samp{.txt} suffix is temporarily removed from both strings.
|
||||
|
||||
@item
|
||||
Comparing @samp{foo-10.3.tar.gz} to @samp{foo-10.tar.xz}, the suffixes
|
||||
@samp{.tar.gz} and @samp{.tar.xz} are temporarily removed from the
|
||||
strings.
|
||||
@end itemize
|
||||
|
||||
Example for rule 3:
|
||||
|
||||
@itemize
|
||||
@item
|
||||
Comparing @samp{hello.foobar65} to @samp{hello.foobar4}, the suffixes
|
||||
(@samp{.foobar65} and @samp{.foobar4}) are temporarily removed. The
|
||||
remaining strings are identical (@samp{hello}). The suffixes are then
|
||||
restored, and the entire strings are compared (@samp{hello.foobar4} comes
|
||||
first).
|
||||
@end itemize
|
||||
|
||||
Examples for rule 4:
|
||||
|
||||
@itemize
|
||||
@item
|
||||
When comparing the strings @samp{hello-8.2.txt} and @samp{hello-8.10.txt}, the
|
||||
suffixes (@samp{.txt}) are temporarily removed. The remaining strings
|
||||
(@samp{hello-8.2} and @samp{hello-8.10}) are compared as previously described
|
||||
(@samp{hello-8.2} comes first).
|
||||
@slanted{(In this case the suffix removal algorithm
|
||||
does not have a noticeable effect on the resulting order.)}
|
||||
@end itemize
|
||||
|
||||
@b{How does the suffix-removal algorithm effect ordering results?}
|
||||
|
||||
Consider the comparison of hello-8.txt and hello-8.2.txt.
|
||||
|
||||
Without the suffix-removal algorithm, the strings will be broken down
|
||||
to the following parts:
|
||||
|
||||
@example
|
||||
hello- @r{vs} hello- @r{(rule 2, all non-digits)}
|
||||
8 @r{vs} 8 @r{(rule 3, all digits)}
|
||||
.txt @r{vs} . @r{(rule 2)}
|
||||
empty @r{vs} 2
|
||||
empty @r{vs} .txt
|
||||
@end example
|
||||
|
||||
The comparison of the third parts (@samp{.} vs
|
||||
@samp{.txt}) will determine that the shorter string comes first --
|
||||
resulting in @file{hello-8.2.txt} appearing first.
|
||||
|
||||
Indeed this is the order in which Debian's @command{dpkg} compares the strings.
|
||||
|
||||
A more natural result is that @file{hello-8.txt} should come before
|
||||
@file{hello-8.2.txt}, and this is where the suffix-removal comes into play:
|
||||
|
||||
The suffixes (@samp{.txt}) are removed, and the remaining strings are
|
||||
broken down into the following parts:
|
||||
|
||||
@example
|
||||
hello- @r{vs} hello- @r{(rule 2, all non-digits)}
|
||||
8 @r{vs} 8 @r{(rule 3, all digits)}
|
||||
empty @r{vs} . @r{(rule 2)}
|
||||
empty @r{vs} 2
|
||||
@end example
|
||||
|
||||
As empty strings sort before non-empty strings, the result is @samp{hello-8}
|
||||
being first.
|
||||
|
||||
A real-world example would be listing files such as:
|
||||
@file{gcc_10.fc9.tar.gz}
|
||||
and @file{gcc_10.8.12.7rc2.fc9.tar.bz2}: Debian's algorithm would list
|
||||
@file{gcc_10.8.12.7rc2.fc9.tar.bz2} first, while @samp{ls -v} will list
|
||||
@file{gcc_10.fc9.tar.gz} first.
|
||||
|
||||
These priorities make sense for @samp{ls -v}:
|
||||
Versioned files will be listed in a more natural order.
|
||||
|
||||
For @samp{sort -V} these priorities might seem arbitrary. However,
|
||||
because the sorting code is shared between the @command{ls} and @command{sort}
|
||||
program, the ordering rules are the same.
|
||||
|
||||
|
||||
@node Comparing two strings using Debian's algorithm
|
||||
@subsection Comparing two strings using Debian's algorithm
|
||||
|
||||
The Debian program @command{dpkg} (available on all Debian and Ubuntu
|
||||
installations) can compare two strings using the @option{--compare-versions}
|
||||
option.
|
||||
|
||||
To use it, create a helper shell function (simply copy & paste the
|
||||
following snippet to your shell command-prompt):
|
||||
|
||||
@example
|
||||
compver() @{
|
||||
if dpkg --compare-versions "$1" lt "$2"
|
||||
then printf '%s\n' "$1" "$2"
|
||||
else printf '%s\n' "$2" "$1"
|
||||
fi
|
||||
@}
|
||||
@end example
|
||||
|
||||
Then compare two strings by calling @command{compver}:
|
||||
|
||||
@example
|
||||
$ compver 8.49 8.5
|
||||
8.5
|
||||
8.49
|
||||
@end example
|
||||
|
||||
Note that @command{dpkg} will warn if the strings have invalid syntax:
|
||||
|
||||
@example
|
||||
$ compver "foo07.7z" "foo7a.7z"
|
||||
dpkg: warning: version 'foo07.7z' has bad syntax:
|
||||
version number does not start with digit
|
||||
dpkg: warning: version 'foo7a.7z' has bad syntax:
|
||||
version number does not start with digit
|
||||
foo7a.7z
|
||||
foo07.7z
|
||||
$ compver "3.0/" "3.0.5"
|
||||
dpkg: warning: version '3.0/' has bad syntax:
|
||||
invalid character in version number
|
||||
3.0.5
|
||||
3.0/
|
||||
@end example
|
||||
|
||||
To illustrate the different handling of hyphens between Debian and
|
||||
Coreutils algorithms (see
|
||||
@ref{Hyphen-minus and colon}):
|
||||
|
||||
@example
|
||||
$ compver abb ab-cd 2>/dev/null $ printf 'abb\nab-cd\n' | sort -V
|
||||
ab-cd abb
|
||||
abb ab-cd
|
||||
@end example
|
||||
|
||||
To illustrate the different handling of file extension: (see @ref{Special
|
||||
handling of file extensions}):
|
||||
|
||||
@example
|
||||
$ compver hello-8.txt hello-8.2.txt 2>/dev/null
|
||||
hello-8.2.txt
|
||||
hello-8.txt
|
||||
$ printf '%s\n' hello-8.txt hello-8.2.txt | sort -V
|
||||
hello-8.txt
|
||||
hello-8.2.txt
|
||||
@end example
|
||||
|
||||
|
||||
@node Advanced version sort topics
|
||||
@section Advanced Topics
|
||||
|
||||
|
||||
@node Reporting version sort bugs
|
||||
@subsection Reporting version sort bugs
|
||||
|
||||
If you suspect a bug in GNU Coreutils version sort (i.e., in the
|
||||
output of @samp{ls -v} or @samp{sort -V}), please first check the following:
|
||||
|
||||
@enumerate
|
||||
@item
|
||||
Is the result consistent with Debian's own ordering (using @command{dpkg}, see
|
||||
@ref{Comparing two strings using Debian's algorithm})? If it is, then this
|
||||
is not a bug -- please do not report it.
|
||||
|
||||
@item
|
||||
If the result differs from Debian's, is it explained by one of the
|
||||
sections in @ref{Differences from Debian version sort}? If it is,
|
||||
then this is not a bug -- please do not report it.
|
||||
|
||||
@item
|
||||
If you have a question about specific ordering which is not explained
|
||||
here, please write to @email{coreutils@@gnu.org}, and provide a
|
||||
concise example that will help us diagnose the issue.
|
||||
|
||||
@item
|
||||
If you still suspect a bug which is not explained by the above, please
|
||||
write to @email{bug-coreutils@@gnu.org} with a concrete example of the
|
||||
suspected incorrect output, with details on why you think it is
|
||||
incorrect.
|
||||
|
||||
@end enumerate
|
||||
|
||||
@node Other version/natural sort implementations
|
||||
@subsection Other version/natural sort implementations
|
||||
|
||||
As previously mentioned, there are multiple variations on
|
||||
version/natural sort, each with its own rules. Some examples are:
|
||||
|
||||
@itemize
|
||||
|
||||
@item
|
||||
Natural Sorting variants in
|
||||
@uref{https://rosettacode.org/wiki/Natural_sorting,Rosetta Code}.
|
||||
|
||||
@item
|
||||
Python's @uref{https://pypi.org/project/natsort/,natsort package}
|
||||
(includes detailed description of their sorting rules:
|
||||
@uref{https://natsort.readthedocs.io/en/master/howitworks.html,
|
||||
natsort -- how it works}).
|
||||
|
||||
@item
|
||||
Ruby's @uref{https://github.com/github/version_sorter,version_sorter}.
|
||||
|
||||
@item
|
||||
Perl has multiple packages for natural and version sorts
|
||||
(each likely with its own rules and nuances):
|
||||
@uref{https://metacpan.org/pod/Sort::Naturally,Sort::Naturally},
|
||||
@uref{https://metacpan.org/pod/Sort::Versions,Sort::Versions},
|
||||
@uref{https://metacpan.org/pod/CPAN::Version,CPAN::Version}.
|
||||
|
||||
@item
|
||||
PHP has a built-in function
|
||||
@uref{https://www.php.net/manual/en/function.natsort.php,natsort}.
|
||||
|
||||
@item
|
||||
NodeJS's @uref{https://www.npmjs.com/package/natural-sort,natural-sort package}.
|
||||
|
||||
@item
|
||||
In zsh, the
|
||||
@uref{http://zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Qualifiers,
|
||||
glob modifier} @samp{*(n)} will expand to files in natural sort order.
|
||||
|
||||
@item
|
||||
When writing C programs, the GNU libc library (@samp{glibc})
|
||||
provides the
|
||||
@uref{https://man7.org/linux/man-pages/man3/strverscmp.3.html,
|
||||
strverscmp(3)} function to compare two strings, and
|
||||
@uref{https://man7.org/linux/man-pages/man3/versionsort.3.html,versionsort(3)}
|
||||
function to compare two directory entries (despite the names, they are
|
||||
not identical to GNU Coreutils version sort ordering).
|
||||
|
||||
@item
|
||||
Using Debian's sorting algorithm in:
|
||||
|
||||
@itemize
|
||||
@item
|
||||
python: @uref{https://stackoverflow.com/a/4957741,
|
||||
Stack Overflow Example #4957741}.
|
||||
|
||||
@item
|
||||
NodeJS: @uref{https://www.npmjs.com/package/deb-version-compare,
|
||||
deb-version-compare}.
|
||||
@end itemize
|
||||
|
||||
@end itemize
|
||||
|
||||
|
||||
@node Related source code
|
||||
@subsection Related source code
|
||||
|
||||
@itemize
|
||||
|
||||
@item
|
||||
Debian's code which splits a version string into
|
||||
@code{epoch/upstream_version/debian_revision} parts:
|
||||
@uref{https://git.dpkg.org/cgit/dpkg/dpkg.git/tree/lib/dpkg/parsehelp.c#n191,
|
||||
parsehelp.c:parseversion()}.
|
||||
|
||||
@item
|
||||
Debian's code which performs the @code{upstream_version} comparison:
|
||||
@uref{https://git.dpkg.org/cgit/dpkg/dpkg.git/tree/lib/dpkg/version.c#n140,
|
||||
version.c}.
|
||||
|
||||
@item
|
||||
Gnulib code (used by GNU Coreutils) which performs the version comparison:
|
||||
@uref{https://git.savannah.gnu.org/cgit/gnulib.git/tree/lib/filevercmp.c,
|
||||
filevercmp.c}.
|
||||
@end itemize
|
||||
@@ -1,2 +0,0 @@
|
||||
#include <stddef.h>
|
||||
size_t buffer_lcm (size_t, size_t, size_t) _GL_ATTRIBUTE_CONST;
|
||||
@@ -1,76 +0,0 @@
|
||||
/* Convert string to double in the current locale, falling back on the C locale.
|
||||
|
||||
Copyright 2019-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "cl-strtod.h"
|
||||
|
||||
#include <c-strtod.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#if LONG
|
||||
# define CL_STRTOD cl_strtold
|
||||
# define DOUBLE long double
|
||||
# define C_STRTOD c_strtold
|
||||
# define STRTOD strtold
|
||||
#else
|
||||
# define CL_STRTOD cl_strtod
|
||||
# define DOUBLE double
|
||||
# define C_STRTOD c_strtod
|
||||
# define STRTOD strtod
|
||||
#endif
|
||||
|
||||
/* This function acts like strtod or strtold, except that it falls
|
||||
back on the C locale if the initial prefix is not parsable in
|
||||
the current locale. If the prefix is parsable in both locales,
|
||||
it uses the longer parse, breaking ties in favor of the current locale.
|
||||
|
||||
Parse the initial prefix of NPTR as a floating-point number in the
|
||||
current locale or in the C locale (preferring the locale that
|
||||
yields the longer parse, or the current locale if there is a tie).
|
||||
If ENDPTR is non-null, set *ENDPTR to the first unused byte, or to
|
||||
NPTR if the prefix cannot be parsed.
|
||||
|
||||
If successful, return a number without changing errno.
|
||||
If the prefix cannot be parsed, return 0 and possibly set errno to EINVAL.
|
||||
If the number overflows, return an extreme value and set errno to ERANGE.
|
||||
If the number underflows, return a value close to 0 and set errno to ERANGE.
|
||||
If there is some other error, return 0 and set errno. */
|
||||
|
||||
DOUBLE
|
||||
CL_STRTOD (char const *nptr, char **restrict endptr)
|
||||
{
|
||||
char *end;
|
||||
DOUBLE d = STRTOD (nptr, &end);
|
||||
if (*end)
|
||||
{
|
||||
int strtod_errno = errno;
|
||||
char *c_end;
|
||||
DOUBLE c = C_STRTOD (nptr, &c_end);
|
||||
if (end < c_end)
|
||||
d = c, end = c_end;
|
||||
else
|
||||
errno = strtod_errno;
|
||||
}
|
||||
if (endptr)
|
||||
*endptr = end;
|
||||
return d;
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
double cl_strtod (char const *, char **restrict)
|
||||
_GL_ATTRIBUTE_NONNULL ((1));
|
||||
long double cl_strtold (char const *, char **restrict)
|
||||
_GL_ATTRIBUTE_NONNULL ((1));
|
||||
@@ -1,2 +0,0 @@
|
||||
#define LONG 1
|
||||
#include "cl-strtod.c"
|
||||
@@ -1,37 +0,0 @@
|
||||
/* Declare an access pattern hint for files.
|
||||
Copyright (C) 2010-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
#include "fadvise.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include "ignore-value.h"
|
||||
|
||||
void
|
||||
fdadvise (int fd, off_t offset, off_t len, fadvice_t advice)
|
||||
{
|
||||
#if HAVE_POSIX_FADVISE
|
||||
ignore_value (posix_fadvise (fd, offset, len, advice));
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
fadvise (FILE *fp, fadvice_t advice)
|
||||
{
|
||||
if (fp)
|
||||
fdadvise (fileno (fp), 0, 0, advice);
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
/* Declare an access pattern hint for files.
|
||||
Copyright (C) 2010-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* There are a few hints one can provide, which have the
|
||||
following characteristics on Linux 2.6.31 at least.
|
||||
|
||||
POSIX_FADV_SEQUENTIAL
|
||||
Doubles the size of read ahead done for file
|
||||
POSIX_FADV_WILLNEED
|
||||
_synchronously_ prepopulate the buffer cache with the file
|
||||
POSIX_FADV_NOREUSE
|
||||
Could lower priority of data in buffer caches,
|
||||
but currently does nothing.
|
||||
POSIX_FADV_DONTNEED
|
||||
Drop the file from cache.
|
||||
Note this is automatically done when files are unlinked.
|
||||
|
||||
We use this enum "type" both to make it explicit that
|
||||
these options are mutually exclusive, and to discourage
|
||||
the passing of the possibly undefined POSIX_FADV_... values.
|
||||
Note we could #undef the POSIX_FADV_ values, but that would
|
||||
preclude using the posix_fadvise() function with its standard
|
||||
constants. Using posix_fadvise() might be required if the return
|
||||
value is needed, but it must be guarded by appropriate #ifdefs. */
|
||||
|
||||
#if HAVE_POSIX_FADVISE
|
||||
typedef enum {
|
||||
FADVISE_NORMAL = POSIX_FADV_NORMAL,
|
||||
FADVISE_SEQUENTIAL = POSIX_FADV_SEQUENTIAL,
|
||||
FADVISE_NOREUSE = POSIX_FADV_NOREUSE,
|
||||
FADVISE_DONTNEED = POSIX_FADV_DONTNEED,
|
||||
FADVISE_WILLNEED = POSIX_FADV_WILLNEED,
|
||||
FADVISE_RANDOM = POSIX_FADV_RANDOM
|
||||
} fadvice_t;
|
||||
#else
|
||||
typedef enum {
|
||||
FADVISE_NORMAL,
|
||||
FADVISE_SEQUENTIAL,
|
||||
FADVISE_NOREUSE,
|
||||
FADVISE_DONTNEED,
|
||||
FADVISE_WILLNEED,
|
||||
FADVISE_RANDOM
|
||||
} fadvice_t;
|
||||
#endif
|
||||
|
||||
/* We ignore any errors as these hints are only advisory.
|
||||
There is the chance one can pass invalid ADVICE, which will
|
||||
not be indicated, but given the simplicity of the interface
|
||||
this is unlikely. Also not returning errors allows the
|
||||
unconditional passing of descriptors to non standard files,
|
||||
which will just be ignored if unsupported. */
|
||||
|
||||
void fdadvise (int fd, off_t offset, off_t len, fadvice_t advice);
|
||||
void fadvise (FILE *fp, fadvice_t advice);
|
||||
151
gl/lib/heap.c
151
gl/lib/heap.c
@@ -1,151 +0,0 @@
|
||||
/* Barebones heap implementation supporting only insert and pop.
|
||||
|
||||
Copyright (C) 2010-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Full implementation: GDSL (http://gna.org/projects/gdsl/) by Nicolas
|
||||
Darnis <ndarnis@free.fr>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "heap.h"
|
||||
#include "stdlib--.h"
|
||||
#include "xalloc.h"
|
||||
|
||||
static int heap_default_compare (void const *, void const *);
|
||||
static size_t heapify_down (void **, size_t, size_t,
|
||||
int (*) (void const *, void const *));
|
||||
static void heapify_up (void **, size_t,
|
||||
int (*) (void const *, void const *));
|
||||
|
||||
struct heap
|
||||
{
|
||||
void **array; /* array[0] is not used */
|
||||
size_t capacity; /* Array size */
|
||||
size_t count; /* Used as index to last element. Also is num of items. */
|
||||
int (*compare) (void const *, void const *);
|
||||
};
|
||||
|
||||
/* Allocate memory for the heap. */
|
||||
|
||||
struct heap *
|
||||
heap_alloc (int (*compare) (void const *, void const *), size_t n_reserve)
|
||||
{
|
||||
struct heap *heap = xmalloc (sizeof *heap);
|
||||
|
||||
if (n_reserve == 0)
|
||||
n_reserve = 1;
|
||||
|
||||
heap->array = xnmalloc (n_reserve, sizeof *(heap->array));
|
||||
|
||||
heap->array[0] = nullptr;
|
||||
heap->capacity = n_reserve;
|
||||
heap->count = 0;
|
||||
heap->compare = compare ? compare : heap_default_compare;
|
||||
|
||||
return heap;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
heap_default_compare (void const *a, void const *b)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
heap_free (struct heap *heap)
|
||||
{
|
||||
free (heap->array);
|
||||
free (heap);
|
||||
}
|
||||
|
||||
/* Insert element into heap. */
|
||||
|
||||
int
|
||||
heap_insert (struct heap *heap, void *item)
|
||||
{
|
||||
if (heap->capacity - 1 <= heap->count)
|
||||
heap->array = x2nrealloc (heap->array, &heap->capacity,
|
||||
sizeof *(heap->array));
|
||||
|
||||
heap->array[++heap->count] = item;
|
||||
heapify_up (heap->array, heap->count, heap->compare);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Pop top element off heap. */
|
||||
|
||||
void *
|
||||
heap_remove_top (struct heap *heap)
|
||||
{
|
||||
void *top;
|
||||
|
||||
if (heap->count == 0)
|
||||
return nullptr;
|
||||
|
||||
top = heap->array[1];
|
||||
heap->array[1] = heap->array[heap->count--];
|
||||
heapify_down (heap->array, heap->count, 1, heap->compare);
|
||||
|
||||
return top;
|
||||
}
|
||||
|
||||
/* Move element down into appropriate position in heap. */
|
||||
|
||||
static size_t
|
||||
heapify_down (void **array, size_t count, size_t initial,
|
||||
int (*compare) (void const *, void const *))
|
||||
{
|
||||
void *element = array[initial];
|
||||
|
||||
size_t parent = initial;
|
||||
while (parent <= count / 2)
|
||||
{
|
||||
size_t child = 2 * parent;
|
||||
|
||||
if (child < count && compare (array[child], array[child + 1]) < 0)
|
||||
child++;
|
||||
|
||||
if (compare (array[child], element) <= 0)
|
||||
break;
|
||||
|
||||
array[parent] = array[child];
|
||||
parent = child;
|
||||
}
|
||||
|
||||
array[parent] = element;
|
||||
return parent;
|
||||
}
|
||||
|
||||
/* Move element up into appropriate position in heap. */
|
||||
|
||||
static void
|
||||
heapify_up (void **array, size_t count,
|
||||
int (*compare) (void const *, void const *))
|
||||
{
|
||||
size_t k = count;
|
||||
void *new_element = array[k];
|
||||
|
||||
while (k != 1 && compare (array[k / 2], new_element) <= 0)
|
||||
{
|
||||
array[k] = array[k / 2];
|
||||
k /= 2;
|
||||
}
|
||||
|
||||
array[k] = new_element;
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
/* Barebones heap implementation supporting only insert and pop.
|
||||
|
||||
Copyright (C) 2010-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Full implementation: GDSL (http://gna.org/projects/gdsl/) by Nicolas
|
||||
Darnis <ndarnis@free.fr>. Adapted by Gene Auyeung. */
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
struct heap;
|
||||
|
||||
void heap_free (struct heap *) _GL_ATTRIBUTE_NONNULL ();
|
||||
|
||||
struct heap *heap_alloc (int (*) (void const *, void const *), size_t)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (heap_free, 1)
|
||||
_GL_ATTRIBUTE_RETURNS_NONNULL;
|
||||
|
||||
int heap_insert (struct heap *heap, void *item) _GL_ATTRIBUTE_NONNULL ();
|
||||
void *heap_remove_top (struct heap *heap) _GL_ATTRIBUTE_NONNULL ();
|
||||
231
gl/lib/mbsalign.c
Normal file
231
gl/lib/mbsalign.c
Normal file
@@ -0,0 +1,231 @@
|
||||
/* Align/Truncate a string in a given screen width
|
||||
Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Pádraig Brady. */
|
||||
|
||||
#include <config.h>
|
||||
#include "mbsalign.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <limits.h>
|
||||
#include <wchar.h>
|
||||
#include <wctype.h>
|
||||
|
||||
#ifndef MIN
|
||||
# define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
/* Replace non printable chars.
|
||||
Return 1 if replacement made, 0 otherwise. */
|
||||
|
||||
static bool
|
||||
wc_ensure_printable (wchar_t *wchars)
|
||||
{
|
||||
bool replaced = false;
|
||||
wchar_t *wc = wchars;
|
||||
while (*wc)
|
||||
{
|
||||
if (!iswprint ((wint_t) *wc))
|
||||
{
|
||||
*wc = 0xFFFD; /* L'\uFFFD' (replacement char) */
|
||||
replaced = true;
|
||||
}
|
||||
wc++;
|
||||
}
|
||||
return replaced;
|
||||
}
|
||||
|
||||
/* Truncate wchar string to width cells.
|
||||
* Returns number of cells used. */
|
||||
|
||||
static size_t
|
||||
wc_truncate (wchar_t *wc, size_t width)
|
||||
{
|
||||
size_t cells = 0;
|
||||
int next_cells = 0;
|
||||
|
||||
while (*wc)
|
||||
{
|
||||
next_cells = wcwidth (*wc);
|
||||
if (next_cells == -1) /* non printable */
|
||||
{
|
||||
*wc = 0xFFFD; /* L'\uFFFD' (replacement char) */
|
||||
next_cells = 1;
|
||||
}
|
||||
if (cells + next_cells > width)
|
||||
break;
|
||||
cells += next_cells;
|
||||
wc++;
|
||||
}
|
||||
*wc = L'\0';
|
||||
return cells;
|
||||
}
|
||||
|
||||
/* FIXME: move this function to gnulib as it's missing on:
|
||||
OpenBSD 3.8, IRIX 5.3, Solaris 2.5.1, mingw, BeOS */
|
||||
|
||||
static int
|
||||
rpl_wcswidth (const wchar_t *s, size_t n)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
while (n-- > 0 && *s != L'\0')
|
||||
{
|
||||
int nwidth = wcwidth (*s++);
|
||||
if (nwidth == -1) /* non printable */
|
||||
return -1;
|
||||
if (ret > (INT_MAX - nwidth)) /* overflow */
|
||||
return -1;
|
||||
ret += nwidth;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Write N_SPACES space characters to DEST while ensuring
|
||||
nothing is written beyond DEST_END. A terminating NUL
|
||||
is always added to DEST.
|
||||
A pointer to the terminating NUL is returned. */
|
||||
|
||||
static char*
|
||||
mbs_align_pad (char *dest, const char* dest_end, size_t n_spaces)
|
||||
{
|
||||
/* FIXME: Should we pad with "figure space" (\u2007)
|
||||
if non ascii data present? */
|
||||
while (n_spaces-- && (dest < dest_end))
|
||||
*dest++ = ' ';
|
||||
*dest = '\0';
|
||||
return dest;
|
||||
}
|
||||
|
||||
/* Align a string, SRC, in a field of *WIDTH columns, handling multi-byte
|
||||
characters; write the result into the DEST_SIZE-byte buffer, DEST.
|
||||
ALIGNMENT specifies whether to left- or right-justify or to center.
|
||||
If SRC requires more than *WIDTH columns, truncate it to fit.
|
||||
When centering, the number of trailing spaces may be one less than the
|
||||
number of leading spaces. The FLAGS parameter is unused at present.
|
||||
Return the length in bytes required for the final result, not counting
|
||||
the trailing NUL. A return value of DEST_SIZE or larger means there
|
||||
wasn't enough space. DEST will be NUL terminated in any case.
|
||||
Return (size_t) -1 upon error (invalid multi-byte sequence in SRC,
|
||||
or malloc failure).
|
||||
Update *WIDTH to indicate how many columns were used before padding. */
|
||||
|
||||
size_t
|
||||
mbsalign (const char *src, char *dest, size_t dest_size,
|
||||
size_t *width, mbs_align_t align, int flags)
|
||||
{
|
||||
size_t ret = -1;
|
||||
size_t src_size = strlen (src) + 1;
|
||||
char *newstr = NULL;
|
||||
wchar_t *str_wc = NULL;
|
||||
const char *str_to_print = src;
|
||||
size_t n_cols = src_size - 1;
|
||||
size_t n_used_bytes = n_cols; /* Not including NUL */
|
||||
size_t n_spaces = 0;
|
||||
bool conversion = false;
|
||||
bool wc_enabled = false;
|
||||
|
||||
/* In multi-byte locales convert to wide characters
|
||||
to allow easy truncation. Also determine number
|
||||
of screen columns used. */
|
||||
if (MB_CUR_MAX > 1)
|
||||
{
|
||||
size_t src_chars = mbstowcs (NULL, src, 0);
|
||||
if (src_chars == (size_t) -1)
|
||||
goto mbsalign_cleanup;
|
||||
src_chars += 1; /* make space for NUL */
|
||||
str_wc = malloc (src_chars * sizeof (wchar_t));
|
||||
if (str_wc == NULL)
|
||||
goto mbsalign_cleanup;
|
||||
if (mbstowcs (str_wc, src, src_chars) > 0)
|
||||
{
|
||||
str_wc[src_chars - 1] = L'\0';
|
||||
wc_enabled = true;
|
||||
conversion = wc_ensure_printable (str_wc);
|
||||
n_cols = rpl_wcswidth (str_wc, src_chars);
|
||||
}
|
||||
}
|
||||
|
||||
/* If we transformed or need to truncate the source string
|
||||
then create a modified copy of it. */
|
||||
if (conversion || (n_cols > *width))
|
||||
{
|
||||
newstr = malloc (src_size);
|
||||
if (newstr == NULL)
|
||||
goto mbsalign_cleanup;
|
||||
str_to_print = newstr;
|
||||
if (wc_enabled)
|
||||
{
|
||||
n_cols = wc_truncate (str_wc, *width);
|
||||
n_used_bytes = wcstombs (newstr, str_wc, src_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
n_cols = *width;
|
||||
n_used_bytes = n_cols;
|
||||
memcpy (newstr, src, n_cols);
|
||||
newstr[n_cols] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
if (*width > n_cols)
|
||||
n_spaces = *width - n_cols;
|
||||
|
||||
/* indicate to caller how many cells needed (not including padding). */
|
||||
*width = n_cols;
|
||||
|
||||
/* indicate to caller how many bytes needed (not including NUL). */
|
||||
ret = n_used_bytes + (n_spaces * 1);
|
||||
|
||||
/* Write as much NUL terminated output to DEST as possible. */
|
||||
if (dest_size != 0)
|
||||
{
|
||||
char *dest_end = dest + dest_size - 1;
|
||||
size_t start_spaces = n_spaces / 2 + n_spaces % 2;
|
||||
size_t end_spaces = n_spaces / 2;
|
||||
|
||||
switch (align)
|
||||
{
|
||||
case MBS_ALIGN_CENTER:
|
||||
start_spaces = n_spaces / 2 + n_spaces % 2;
|
||||
end_spaces = n_spaces / 2;
|
||||
break;
|
||||
case MBS_ALIGN_LEFT:
|
||||
start_spaces = 0;
|
||||
end_spaces = n_spaces;
|
||||
break;
|
||||
case MBS_ALIGN_RIGHT:
|
||||
start_spaces = n_spaces;
|
||||
end_spaces = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
dest = mbs_align_pad (dest, dest_end, start_spaces);
|
||||
dest = mempcpy(dest, str_to_print, MIN (n_used_bytes, dest_end - dest));
|
||||
mbs_align_pad (dest, dest_end, end_spaces);
|
||||
}
|
||||
|
||||
mbsalign_cleanup:
|
||||
|
||||
free (str_wc);
|
||||
free (newstr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/* find-mount-point.h -- find the root mount point for a file.
|
||||
Copyright (C) 2010-2024 Free Software Foundation, Inc.
|
||||
/* Align/Truncate a string in a given screen width
|
||||
Copyright (C) 2009 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
|
||||
@@ -12,9 +12,12 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
extern char *find_mount_point (char const *, struct stat const *)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_NONNULL ();
|
||||
typedef enum { MBS_ALIGN_LEFT, MBS_ALIGN_RIGHT, MBS_ALIGN_CENTER } mbs_align_t;
|
||||
|
||||
size_t
|
||||
mbsalign (const char *src, char *dest, size_t dest_size,
|
||||
size_t *width, mbs_align_t align, int flags);
|
||||
142
gl/lib/mgetgroups.c
Normal file
142
gl/lib/mgetgroups.c
Normal file
@@ -0,0 +1,142 @@
|
||||
/* mgetgroups.c -- return a list of the groups a user is in
|
||||
|
||||
Copyright (C) 2007-2009 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Extracted from coreutils' src/id.c. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "mgetgroups.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#if HAVE_GETGROUPLIST
|
||||
# include <grp.h>
|
||||
#endif
|
||||
#include "getugroups.h"
|
||||
#include "xalloc.h"
|
||||
|
||||
|
||||
static GETGROUPS_T *
|
||||
realloc_groupbuf (GETGROUPS_T *g, size_t num)
|
||||
{
|
||||
if (xalloc_oversized (num, sizeof (*g)))
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return realloc (g, num * sizeof (*g));
|
||||
}
|
||||
|
||||
/* Like getugroups, but store the result in malloc'd storage.
|
||||
Set *GROUPS to the malloc'd list of all group IDs of which USERNAME
|
||||
is a member. If GID is not -1, store it first. GID should be the
|
||||
group ID (pw_gid) obtained from getpwuid, in case USERNAME is not
|
||||
listed in the groups database (e.g., /etc/groups). Upon failure,
|
||||
don't modify *GROUPS, set errno, and return -1. Otherwise, return
|
||||
the number of groups. */
|
||||
|
||||
int
|
||||
mgetgroups (char const *username, gid_t gid, GETGROUPS_T **groups)
|
||||
{
|
||||
int max_n_groups;
|
||||
int ng;
|
||||
GETGROUPS_T *g;
|
||||
|
||||
#if HAVE_GETGROUPLIST
|
||||
/* We prefer to use getgrouplist if available, because it has better
|
||||
performance characteristics.
|
||||
|
||||
In glibc 2.3.2, getgrouplist is buggy. If you pass a zero as the
|
||||
length of the output buffer, getgrouplist will still write to the
|
||||
buffer. Contrary to what some versions of the getgrouplist
|
||||
manpage say, this doesn't happen with nonzero buffer sizes.
|
||||
Therefore our usage here just avoids a zero sized buffer. */
|
||||
if (username)
|
||||
{
|
||||
enum { N_GROUPS_INIT = 10 };
|
||||
max_n_groups = N_GROUPS_INIT;
|
||||
|
||||
g = realloc_groupbuf (NULL, max_n_groups);
|
||||
if (g == NULL)
|
||||
return -1;
|
||||
|
||||
while (1)
|
||||
{
|
||||
GETGROUPS_T *h;
|
||||
int last_n_groups = max_n_groups;
|
||||
|
||||
/* getgrouplist updates max_n_groups to num required. */
|
||||
ng = getgrouplist (username, gid, g, &max_n_groups);
|
||||
|
||||
/* Some systems (like Darwin) have a bug where they
|
||||
never increase max_n_groups. */
|
||||
if (ng < 0 && last_n_groups == max_n_groups)
|
||||
max_n_groups *= 2;
|
||||
|
||||
if ((h = realloc_groupbuf (g, max_n_groups)) == NULL)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
free (g);
|
||||
errno = saved_errno;
|
||||
return -1;
|
||||
}
|
||||
g = h;
|
||||
|
||||
if (0 <= ng)
|
||||
{
|
||||
*groups = g;
|
||||
/* On success some systems just return 0 from getgrouplist,
|
||||
so return max_n_groups rather than ng. */
|
||||
return max_n_groups;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* else no username, so fall through and use getgroups. */
|
||||
#endif
|
||||
|
||||
max_n_groups = (username
|
||||
? getugroups (0, NULL, username, gid)
|
||||
: getgroups (0, NULL));
|
||||
|
||||
/* If we failed to count groups with NULL for a buffer,
|
||||
try again with a non-NULL one, just in case. */
|
||||
if (max_n_groups < 0)
|
||||
max_n_groups = 5;
|
||||
|
||||
g = realloc_groupbuf (NULL, max_n_groups);
|
||||
if (g == NULL)
|
||||
return -1;
|
||||
|
||||
ng = (username
|
||||
? getugroups (max_n_groups, g, username, gid)
|
||||
: getgroups (max_n_groups, g));
|
||||
|
||||
if (ng < 0)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
free (g);
|
||||
errno = saved_errno;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*groups = g;
|
||||
return ng;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/* relpath - print the relative path
|
||||
Copyright (C) 2012-2024 Free Software Foundation, Inc.
|
||||
/* Get a list of all group IDs associated with a specified user ID.
|
||||
Copyright (C) 2007, 2009 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
|
||||
@@ -12,14 +12,8 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Pádraig Brady. */
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifndef _RELPATH_H
|
||||
# define _RELPATH_H
|
||||
|
||||
extern bool
|
||||
relpath (char const *can_fname, char const *can_reldir, char *buf, size_t len);
|
||||
|
||||
#endif
|
||||
int mgetgroups (const char *username, gid_t gid, GETGROUPS_T **groups);
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Bob Jenkins's cryptographic random number generators, ISAAC and ISAAC64.
|
||||
/* Bob Jenkins's cryptographic random number generator, ISAAC.
|
||||
|
||||
Copyright (C) 1999-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999-2006, 2009 Free Software Foundation, Inc.
|
||||
Copyright (C) 1997, 1998, 1999 Colin Plumb.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
@@ -14,9 +14,9 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Colin Plumb and Paul Eggert. */
|
||||
Written by Colin Plumb. */
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------
|
||||
@@ -25,7 +25,7 @@
|
||||
* so I can be a little bit experimental in the choice of RNGs here.
|
||||
*
|
||||
* This generator is based somewhat on RC4, but has analysis
|
||||
* <https://burtleburtle.net/bob/rand/isaacafa.html>
|
||||
* <http://burtleburtle.net/bob/rand/isaacafa.html>
|
||||
* pointing to it actually being better. I like it because it's nice
|
||||
* and fast, and because the author did good work analyzing it.
|
||||
* --------------------------------------------------------------------
|
||||
@@ -34,105 +34,60 @@
|
||||
|
||||
#include "rand-isaac.h"
|
||||
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* If the platform supports unaligned access,
|
||||
then don't have -fsanitize=undefined warn about it. */
|
||||
#undef ATTRIBUTE_NO_WARN_SANITIZE_UNDEFINED
|
||||
#if !(_STRING_ARCH_unaligned || _STRING_INLINE_unaligned) \
|
||||
|| __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 9)
|
||||
# define ATTRIBUTE_NO_WARN_SANITIZE_UNDEFINED /* empty */
|
||||
#else
|
||||
# define ATTRIBUTE_NO_WARN_SANITIZE_UNDEFINED \
|
||||
__attribute__ ((__no_sanitize_undefined__))
|
||||
#endif
|
||||
#include "gethrxtime.h"
|
||||
|
||||
/* A if 32-bit ISAAC, B if 64-bit. This is a macro, not an inline
|
||||
function, to prevent undefined behavior if the unused argument
|
||||
shifts by more than a word width. */
|
||||
#define IF32(a, b) (ISAAC_BITS == 32 ? (a) : (b))
|
||||
|
||||
/* Discard bits outside the desired range. On typical machines, any
|
||||
decent compiler should optimize this function call away to nothing.
|
||||
But machines with pad bits in integers may need to do more work. */
|
||||
static inline isaac_word
|
||||
just (isaac_word a)
|
||||
/* This index operation is more efficient on many processors */
|
||||
#define ind(mm, x) \
|
||||
(* (uint32_t *) ((char *) (mm) \
|
||||
+ ((x) & (ISAAC_WORDS - 1) * sizeof (uint32_t))))
|
||||
|
||||
/*
|
||||
* The central step. This uses two temporaries, x and y. mm is the
|
||||
* whole state array, while m is a pointer to the current word. off is
|
||||
* the offset from m to the word ISAAC_WORDS/2 words away in the mm array,
|
||||
* i.e. +/- ISAAC_WORDS/2.
|
||||
*/
|
||||
#define isaac_step(mix, a, b, mm, m, off, r) \
|
||||
( \
|
||||
a = ((a) ^ (mix)) + (m)[off], \
|
||||
x = *(m), \
|
||||
*(m) = y = ind (mm, x) + (a) + (b), \
|
||||
*(r) = b = ind (mm, (y) >> ISAAC_LOG) + x \
|
||||
)
|
||||
|
||||
/* Use and update *S to generate random data to fill R. */
|
||||
void
|
||||
isaac_refill (struct isaac_state *s, uint32_t r[ISAAC_WORDS])
|
||||
{
|
||||
isaac_word desired_bits = ((isaac_word) 1 << 1 << (ISAAC_BITS - 1)) - 1;
|
||||
return a & desired_bits;
|
||||
}
|
||||
uint32_t a, b; /* Caches of a and b */
|
||||
uint32_t x, y; /* Temps needed by isaac_step macro */
|
||||
uint32_t *m = s->mm; /* Pointer into state array */
|
||||
|
||||
/* The index operation. */
|
||||
static inline isaac_word
|
||||
ind (isaac_word const *m, isaac_word x)
|
||||
{
|
||||
if (sizeof *m * CHAR_BIT == ISAAC_BITS)
|
||||
{
|
||||
/* The typical case, where words are exactly the right size.
|
||||
Optimize this to a mask, an addition, and an indirect
|
||||
load. */
|
||||
void const *void_m = m;
|
||||
char const *base_p = void_m;
|
||||
void const *word_p = base_p + (x & ((ISAAC_WORDS - 1) * sizeof *m));
|
||||
isaac_word const *p = word_p;
|
||||
return *p;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Atypical machines need more work. */
|
||||
return m[(x / (ISAAC_BITS / CHAR_BIT)) & (ISAAC_WORDS - 1)];
|
||||
}
|
||||
}
|
||||
|
||||
/* Use and update *S to generate random data to fill RESULT. */
|
||||
void ATTRIBUTE_NO_WARN_SANITIZE_UNDEFINED
|
||||
isaac_refill (struct isaac_state *s, isaac_word result[ISAAC_WORDS])
|
||||
{
|
||||
/* Caches of S->a and S->b. */
|
||||
isaac_word a = s->a;
|
||||
isaac_word b = s->b + (++s->c);
|
||||
|
||||
/* Pointers into state array and into result. */
|
||||
isaac_word *m = s->m;
|
||||
isaac_word *r = result;
|
||||
|
||||
enum { HALF = ISAAC_WORDS / 2 };
|
||||
|
||||
/* The central step. S->m is the whole state array, while M is a
|
||||
pointer to the current word. OFF is the offset from M to the
|
||||
word ISAAC_WORDS/2 words away in the SM array, i.e., +/-
|
||||
ISAAC_WORDS/2. A and B are state variables, and R the result.
|
||||
This updates A, B, M[I], and R[I]. */
|
||||
#define ISAAC_STEP(i, off, mix) \
|
||||
{ \
|
||||
isaac_word x, y; \
|
||||
a = (IF32 (a, 0) ^ (mix)) + m[off + (i)]; \
|
||||
x = m[i]; \
|
||||
m[i] = y = ind (s->m, x) + a + b; \
|
||||
r[i] = b = just (ind (s->m, y >> ISAAC_WORDS_LOG) + x); \
|
||||
}
|
||||
a = s->a;
|
||||
b = s->b + (++s->c);
|
||||
|
||||
do
|
||||
{
|
||||
ISAAC_STEP (0, HALF, IF32 ( a << 13, ~ (a ^ (a << 21))));
|
||||
ISAAC_STEP (1, HALF, IF32 (just (a) >> 6, a ^ (just (a) >> 5)));
|
||||
ISAAC_STEP (2, HALF, IF32 ( a << 2, a ^ ( a << 12)));
|
||||
ISAAC_STEP (3, HALF, IF32 (just (a) >> 16, a ^ (just (a) >> 33)));
|
||||
isaac_step (a << 13, a, b, s->mm, m, ISAAC_WORDS / 2, r);
|
||||
isaac_step (a >> 6, a, b, s->mm, m + 1, ISAAC_WORDS / 2, r + 1);
|
||||
isaac_step (a << 2, a, b, s->mm, m + 2, ISAAC_WORDS / 2, r + 2);
|
||||
isaac_step (a >> 16, a, b, s->mm, m + 3, ISAAC_WORDS / 2, r + 3);
|
||||
r += 4;
|
||||
}
|
||||
while ((m += 4) < s->m + HALF);
|
||||
|
||||
while ((m += 4) < s->mm + ISAAC_WORDS / 2);
|
||||
do
|
||||
{
|
||||
ISAAC_STEP (0, -HALF, IF32 ( a << 13, ~ (a ^ (a << 21))));
|
||||
ISAAC_STEP (1, -HALF, IF32 (just (a) >> 6, a ^ (just (a) >> 5)));
|
||||
ISAAC_STEP (2, -HALF, IF32 ( a << 2, a ^ ( a << 12)));
|
||||
ISAAC_STEP (3, -HALF, IF32 (just (a) >> 16, a ^ (just (a) >> 33)));
|
||||
isaac_step (a << 13, a, b, s->mm, m, -ISAAC_WORDS / 2, r);
|
||||
isaac_step (a >> 6, a, b, s->mm, m + 1, -ISAAC_WORDS / 2, r + 1);
|
||||
isaac_step (a << 2, a, b, s->mm, m + 2, -ISAAC_WORDS / 2, r + 2);
|
||||
isaac_step (a >> 16, a, b, s->mm, m + 3, -ISAAC_WORDS / 2, r + 3);
|
||||
r += 4;
|
||||
}
|
||||
while ((m += 4) < s->m + ISAAC_WORDS);
|
||||
|
||||
while ((m += 4) < s->mm + ISAAC_WORDS);
|
||||
s->a = a;
|
||||
s->b = b;
|
||||
}
|
||||
@@ -141,133 +96,205 @@ isaac_refill (struct isaac_state *s, isaac_word result[ISAAC_WORDS])
|
||||
* The basic seed-scrambling step for initialization, based on Bob
|
||||
* Jenkins' 256-bit hash.
|
||||
*/
|
||||
#if ISAAC_BITS == 32
|
||||
#define mix(a, b, c, d, e, f, g, h) \
|
||||
{ \
|
||||
a ^= b << 11; d += a; \
|
||||
b += c; b ^= just (c) >> 2; e += b; \
|
||||
c += d; c ^= d << 8; f += c; \
|
||||
d += e; d ^= just (e) >> 16; g += d; \
|
||||
e += f; e ^= f << 10; h += e; \
|
||||
f += g; f ^= just (g) >> 4; a += f; \
|
||||
g += h; g ^= h << 8; b += g; \
|
||||
h += a; h ^= just (a) >> 9; c += h; \
|
||||
a += b; \
|
||||
}
|
||||
#else
|
||||
#define mix(a, b, c, d, e, f, g, h) \
|
||||
{ \
|
||||
a -= e; f ^= just (h) >> 9; h += a; \
|
||||
b -= f; g ^= a << 9; a += b; \
|
||||
c -= g; h ^= just (b) >> 23; b += c; \
|
||||
d -= h; a ^= c << 15; c += d; \
|
||||
e -= a; b ^= just (d) >> 14; d += e; \
|
||||
f -= b; c ^= e << 20; e += f; \
|
||||
g -= c; d ^= just (f) >> 17; f += g; \
|
||||
h -= d; e ^= g << 14; g += h; \
|
||||
}
|
||||
#endif
|
||||
|
||||
#define mix(a,b,c,d,e,f,g,h) \
|
||||
( a ^= b << 11, d += a, \
|
||||
b += c, b ^= c >> 2, e += b, \
|
||||
c += d, c ^= d << 8, f += c, \
|
||||
d += e, d ^= e >> 16, g += d, \
|
||||
e += f, e ^= f << 10, h += e, \
|
||||
f += g, f ^= g >> 4, a += f, \
|
||||
g += h, g ^= h << 8, b += g, \
|
||||
h += a, h ^= a >> 9, c += h, \
|
||||
a += b )
|
||||
|
||||
/* The basic ISAAC initialization pass. */
|
||||
#define ISAAC_MIX(s, a, b, c, d, e, f, g, h, seed) \
|
||||
{ \
|
||||
int i; \
|
||||
\
|
||||
for (i = 0; i < ISAAC_WORDS; i += 8) \
|
||||
{ \
|
||||
a += seed[i]; \
|
||||
b += seed[i + 1]; \
|
||||
c += seed[i + 2]; \
|
||||
d += seed[i + 3]; \
|
||||
e += seed[i + 4]; \
|
||||
f += seed[i + 5]; \
|
||||
g += seed[i + 6]; \
|
||||
h += seed[i + 7]; \
|
||||
mix (a, b, c, d, e, f, g, h); \
|
||||
s->m[i] = a; \
|
||||
s->m[i + 1] = b; \
|
||||
s->m[i + 2] = c; \
|
||||
s->m[i + 3] = d; \
|
||||
s->m[i + 4] = e; \
|
||||
s->m[i + 5] = f; \
|
||||
s->m[i + 6] = g; \
|
||||
s->m[i + 7] = h; \
|
||||
} \
|
||||
}
|
||||
static void
|
||||
isaac_mix (struct isaac_state *s, uint32_t const seed[/* ISAAC_WORDS */])
|
||||
{
|
||||
int i;
|
||||
uint32_t a = s->iv[0];
|
||||
uint32_t b = s->iv[1];
|
||||
uint32_t c = s->iv[2];
|
||||
uint32_t d = s->iv[3];
|
||||
uint32_t e = s->iv[4];
|
||||
uint32_t f = s->iv[5];
|
||||
uint32_t g = s->iv[6];
|
||||
uint32_t h = s->iv[7];
|
||||
|
||||
for (i = 0; i < ISAAC_WORDS; i += 8)
|
||||
{
|
||||
a += seed[i];
|
||||
b += seed[i + 1];
|
||||
c += seed[i + 2];
|
||||
d += seed[i + 3];
|
||||
e += seed[i + 4];
|
||||
f += seed[i + 5];
|
||||
g += seed[i + 6];
|
||||
h += seed[i + 7];
|
||||
|
||||
mix (a, b, c, d, e, f, g, h);
|
||||
|
||||
s->mm[i] = a;
|
||||
s->mm[i + 1] = b;
|
||||
s->mm[i + 2] = c;
|
||||
s->mm[i + 3] = d;
|
||||
s->mm[i + 4] = e;
|
||||
s->mm[i + 5] = f;
|
||||
s->mm[i + 6] = g;
|
||||
s->mm[i + 7] = h;
|
||||
}
|
||||
|
||||
s->iv[0] = a;
|
||||
s->iv[1] = b;
|
||||
s->iv[2] = c;
|
||||
s->iv[3] = d;
|
||||
s->iv[4] = e;
|
||||
s->iv[5] = f;
|
||||
s->iv[6] = g;
|
||||
s->iv[7] = h;
|
||||
}
|
||||
|
||||
#if 0 /* Provided for reference only; not used in this code */
|
||||
/*
|
||||
* Initialize the ISAAC RNG with the given seed material.
|
||||
* Its size MUST be a multiple of ISAAC_BYTES, and may be
|
||||
* stored in the s->m array.
|
||||
* stored in the s->mm array.
|
||||
*
|
||||
* This is a generalization of the original ISAAC initialization code
|
||||
* to support larger seed sizes. For seed sizes of 0 and ISAAC_BYTES,
|
||||
* it is identical.
|
||||
*/
|
||||
static void
|
||||
isaac_init (struct isaac_state *s, isaac_word const *seed, size_t seedsize)
|
||||
isaac_init (struct isaac_state *s, uint32_t const *seed, size_t seedsize)
|
||||
{
|
||||
isaac_word a, b, c, d, e, f, g, h;
|
||||
static uint32_t const iv[8] =
|
||||
{
|
||||
0x1367df5a, 0x95d90059, 0xc3163e4b, 0x0f421ad8,
|
||||
0xd92a4a78, 0xa51a3c49, 0xc4efea1b, 0x30609119};
|
||||
int i;
|
||||
|
||||
a = b = c = d = e = f = g = h = /* the golden ratio */
|
||||
IF32 (UINT32_C (0x9e3779b9), UINT64_C (0x9e3779b97f4a7c13));
|
||||
for (int i = 0; i < 4; i++) /* scramble it */
|
||||
mix (a, b, c, d, e, f, g, h);
|
||||
# if 0
|
||||
/* The initialization of iv is a precomputed form of: */
|
||||
for (i = 0; i < 7; i++)
|
||||
iv[i] = 0x9e3779b9; /* the golden ratio */
|
||||
for (i = 0; i < 4; ++i) /* scramble it */
|
||||
mix (iv[0], iv[1], iv[2], iv[3], iv[4], iv[5], iv[6], iv[7]);
|
||||
# endif
|
||||
s->a = s->b = s->c = 0;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
s->iv[i] = iv[i];
|
||||
|
||||
if (seedsize)
|
||||
{
|
||||
/* First pass (as in reference ISAAC code) */
|
||||
ISAAC_MIX (s, a, b, c, d, e, f, g, h, seed);
|
||||
isaac_mix (s, seed);
|
||||
/* Second and subsequent passes (extension to ISAAC) */
|
||||
while (seedsize -= ISAAC_BYTES)
|
||||
{
|
||||
seed += ISAAC_WORDS;
|
||||
for (i = 0; i < ISAAC_WORDS; i++)
|
||||
s->m[i] += seed[i];
|
||||
ISAAC_MIX (s, a, b, c, d, e, f, g, h, s->m);
|
||||
s->mm[i] += seed[i];
|
||||
isaac_mix (s, s->mm);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The no seed case (as in reference ISAAC code) */
|
||||
for (i = 0; i < ISAAC_WORDS; i++)
|
||||
s->m[i] = 0;
|
||||
s->mm[i] = 0;
|
||||
}
|
||||
|
||||
/* Final pass */
|
||||
ISAAC_MIX (s, a, b, c, d, e, f, g, h, s->m);
|
||||
isaac_mix (s, s->mm);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Initialize *S to a somewhat-random value, derived from a seed
|
||||
stored in S->m. */
|
||||
/* Initialize *S to a somewhat-random value. */
|
||||
static void
|
||||
isaac_seed_start (struct isaac_state *s)
|
||||
{
|
||||
static uint32_t const iv[8] =
|
||||
{
|
||||
0x1367df5a, 0x95d90059, 0xc3163e4b, 0x0f421ad8,
|
||||
0xd92a4a78, 0xa51a3c49, 0xc4efea1b, 0x30609119
|
||||
};
|
||||
|
||||
#if 0
|
||||
/* The initialization of iv is a precomputed form of: */
|
||||
int i;
|
||||
for (i = 0; i < 7; i++)
|
||||
iv[i] = 0x9e3779b9; /* the golden ratio */
|
||||
for (i = 0; i < 4; ++i) /* scramble it */
|
||||
mix (iv[0], iv[1], iv[2], iv[3], iv[4], iv[5], iv[6], iv[7]);
|
||||
#endif
|
||||
|
||||
memset (s->mm, 0, sizeof s->mm);
|
||||
memcpy (s->iv, iv, sizeof s->iv);
|
||||
|
||||
/* s->c gets used for a data pointer during the seeding phase */
|
||||
s->a = s->b = s->c = 0;
|
||||
}
|
||||
|
||||
/* Add a buffer of seed material. */
|
||||
static void
|
||||
isaac_seed_data (struct isaac_state *s, void const *buffer, size_t size)
|
||||
{
|
||||
unsigned char const *buf = buffer;
|
||||
unsigned char *p;
|
||||
size_t avail;
|
||||
size_t i;
|
||||
|
||||
avail = sizeof s->mm - s->c; /* s->c is used as a write pointer */
|
||||
|
||||
/* Do any full buffers that are necessary */
|
||||
while (size > avail)
|
||||
{
|
||||
p = (unsigned char *) s->mm + s->c;
|
||||
for (i = 0; i < avail; i++)
|
||||
p[i] ^= buf[i];
|
||||
buf += avail;
|
||||
size -= avail;
|
||||
isaac_mix (s, s->mm);
|
||||
s->c = 0;
|
||||
avail = sizeof s->mm;
|
||||
}
|
||||
|
||||
/* And the final partial block */
|
||||
p = (unsigned char *) s->mm + s->c;
|
||||
for (i = 0; i < size; i++)
|
||||
p[i] ^= buf[i];
|
||||
s->c = size;
|
||||
}
|
||||
|
||||
|
||||
/* End of seeding phase; get everything ready to produce output. */
|
||||
static void
|
||||
isaac_seed_finish (struct isaac_state *s)
|
||||
{
|
||||
isaac_mix (s, s->mm);
|
||||
isaac_mix (s, s->mm);
|
||||
/* Now reinitialize c to start things off right */
|
||||
s->c = 0;
|
||||
}
|
||||
#define ISAAC_SEED(s,x) isaac_seed_data (s, &(x), sizeof (x))
|
||||
|
||||
/* Initialize *S to a somewhat-random value; this starts seeding,
|
||||
seeds with somewhat-random data, and finishes seeding. */
|
||||
void
|
||||
isaac_seed (struct isaac_state *s)
|
||||
{
|
||||
isaac_word a = IF32 (UINT32_C (0x1367df5a), UINT64_C (0x647c4677a2884b7c));
|
||||
isaac_word b = IF32 (UINT32_C (0x95d90059), UINT64_C (0xb9f8b322c73ac862));
|
||||
isaac_word c = IF32 (UINT32_C (0xc3163e4b), UINT64_C (0x8c0ea5053d4712a0));
|
||||
isaac_word d = IF32 (UINT32_C (0x0f421ad8), UINT64_C (0xb29b2e824a595524));
|
||||
isaac_word e = IF32 (UINT32_C (0xd92a4a78), UINT64_C (0x82f053db8355e0ce));
|
||||
isaac_word f = IF32 (UINT32_C (0xa51a3c49), UINT64_C (0x48fe4a0fa5a09315));
|
||||
isaac_word g = IF32 (UINT32_C (0xc4efea1b), UINT64_C (0xae985bf2cbfc89ed));
|
||||
isaac_word h = IF32 (UINT32_C (0x30609119), UINT64_C (0x98f5704f6c44c0ab));
|
||||
isaac_seed_start (s);
|
||||
|
||||
#if 0
|
||||
/* The initialization of a through h is a precomputed form of: */
|
||||
a = b = c = d = e = f = g = h = /* the golden ratio */
|
||||
IF32 (UINT32_C (0x9e3779b9), UINT64_C (0x9e3779b97f4a7c13));
|
||||
for (int i = 0; i < 4; i++) /* scramble it */
|
||||
mix (a, b, c, d, e, f, g, h);
|
||||
#endif
|
||||
{ pid_t t = getpid (); ISAAC_SEED (s, t); }
|
||||
{ pid_t t = getppid (); ISAAC_SEED (s, t); }
|
||||
{ uid_t t = getuid (); ISAAC_SEED (s, t); }
|
||||
{ gid_t t = getgid (); ISAAC_SEED (s, t); }
|
||||
|
||||
/* Mix S->m so that every part of the seed affects every part of the
|
||||
state. */
|
||||
ISAAC_MIX (s, a, b, c, d, e, f, g, h, s->m);
|
||||
ISAAC_MIX (s, a, b, c, d, e, f, g, h, s->m);
|
||||
{
|
||||
xtime_t t = gethrxtime ();
|
||||
ISAAC_SEED (s, t);
|
||||
}
|
||||
|
||||
s->a = s->b = s->c = 0;
|
||||
isaac_seed_finish (s);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Bob Jenkins's cryptographic random number generators, ISAAC and ISAAC64.
|
||||
/* Bob Jenkins's cryptographic random number generator, ISAAC.
|
||||
|
||||
Copyright (C) 1999-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999-2005, 2009 Free Software Foundation, Inc.
|
||||
Copyright (C) 1997, 1998, 1999 Colin Plumb.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
@@ -14,53 +14,30 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Written by Colin Plumb and Paul Eggert. */
|
||||
Written by Colin Plumb. */
|
||||
|
||||
#ifndef _GL_RAND_ISAAC_H
|
||||
#define _GL_RAND_ISAAC_H
|
||||
#ifndef RAND_ISAAC_H
|
||||
# define RAND_ISAAC_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
# include <stdint.h>
|
||||
|
||||
/* Log base 2 of the number of useful bits in an ISAAC word. It must
|
||||
be either 5 or 6. By default, this uses a value that should be
|
||||
faster for this architecture. */
|
||||
#ifndef ISAAC_BITS_LOG
|
||||
#if SIZE_MAX >> 31 >> 31 < 3 /* SIZE_MAX < 2**64 - 1 */
|
||||
#define ISAAC_BITS_LOG 5
|
||||
#else
|
||||
#define ISAAC_BITS_LOG 6
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* The number of bits in an ISAAC word. */
|
||||
#define ISAAC_BITS (1 << ISAAC_BITS_LOG)
|
||||
|
||||
#if ISAAC_BITS == 32
|
||||
typedef uint_least32_t isaac_word;
|
||||
#else
|
||||
typedef uint_least64_t isaac_word;
|
||||
#endif
|
||||
|
||||
/* Size of the state tables to use. ISAAC_WORDS_LOG should be at least 3,
|
||||
/* Size of the state tables to use. ISAAC_LOG should be at least 3,
|
||||
and smaller values give less security. */
|
||||
#define ISAAC_WORDS_LOG 8
|
||||
#define ISAAC_WORDS (1 << ISAAC_WORDS_LOG)
|
||||
#define ISAAC_BYTES (ISAAC_WORDS * sizeof (isaac_word))
|
||||
# define ISAAC_LOG 8
|
||||
# define ISAAC_WORDS (1 << ISAAC_LOG)
|
||||
# define ISAAC_BYTES (ISAAC_WORDS * sizeof (uint32_t))
|
||||
|
||||
/* State variables for the random number generator. The M member
|
||||
should be seeded with nonce data before calling isaac_seed. The
|
||||
other members are private. */
|
||||
/* RNG state variables. The members of this structure are private. */
|
||||
struct isaac_state
|
||||
{
|
||||
isaac_word m[ISAAC_WORDS]; /* Main state array */
|
||||
isaac_word a, b, c; /* Extra variables */
|
||||
uint32_t mm[ISAAC_WORDS]; /* Main state array */
|
||||
uint32_t iv[8]; /* Seeding initial vector */
|
||||
uint32_t a, b, c; /* Extra index variables */
|
||||
};
|
||||
|
||||
void isaac_seed (struct isaac_state *) _GL_ATTRIBUTE_NONNULL ();
|
||||
void isaac_refill (struct isaac_state *, isaac_word[ISAAC_WORDS])
|
||||
_GL_ATTRIBUTE_NONNULL ();
|
||||
void isaac_seed (struct isaac_state *);
|
||||
void isaac_refill (struct isaac_state *, uint32_t[ISAAC_WORDS]);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Generate random integers.
|
||||
|
||||
Copyright (C) 2006-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 2006, 2009 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
|
||||
@@ -13,7 +13,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
@@ -35,13 +35,13 @@ int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
randint i;
|
||||
randint n = strtoumax (argv[1], nullptr, 10);
|
||||
randint choices = strtoumax (argv[2], nullptr, 10);
|
||||
randint n = strtoumax (argv[1], NULL, 10);
|
||||
randint choices = strtoumax (argv[2], NULL, 10);
|
||||
char const *name = argv[3];
|
||||
struct randint_source *ints = randint_all_new (name, SIZE_MAX);
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
printf ("%ju\n", randint_choose (ints, choices));
|
||||
printf ("%"PRIuMAX"\n", randint_choose (ints, choices));
|
||||
|
||||
return (randint_all_free (ints) == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
|
||||
}
|
||||
@@ -77,14 +77,14 @@ randint_new (struct randread_source *source)
|
||||
}
|
||||
|
||||
/* Create a new randint_source by creating a randread_source from
|
||||
NAME and ESTIMATED_BYTES. Return nullptr (setting errno) if
|
||||
NAME and ESTIMATED_BYTES. Return NULL (setting errno) if
|
||||
unsuccessful. */
|
||||
|
||||
struct randint_source *
|
||||
randint_all_new (char const *name, size_t bytes_bound)
|
||||
{
|
||||
struct randread_source *source = randread_new (name, bytes_bound);
|
||||
return (source ? randint_new (source) : nullptr);
|
||||
return (source ? randint_new (source) : NULL);
|
||||
}
|
||||
|
||||
/* Return the random data source of *S. */
|
||||
@@ -106,6 +106,13 @@ static inline randint shift_left (randint x)
|
||||
return HUGE_BYTES ? 0 : x << CHAR_BIT;
|
||||
}
|
||||
|
||||
/* Return X shifted right by CHAR_BIT bits. */
|
||||
static inline randint
|
||||
shift_right (randint x)
|
||||
{
|
||||
return HUGE_BYTES ? 0 : x >> CHAR_BIT;
|
||||
}
|
||||
|
||||
|
||||
/* Consume random data from *S to generate a random number in the range
|
||||
0 .. GENMAX. */
|
||||
@@ -118,7 +125,7 @@ randint_genmax (struct randint_source *s, randint genmax)
|
||||
randint randmax = s->randmax;
|
||||
randint choices = genmax + 1;
|
||||
|
||||
while (1)
|
||||
for (;;)
|
||||
{
|
||||
if (randmax < genmax)
|
||||
{
|
||||
@@ -141,9 +148,9 @@ randint_genmax (struct randint_source *s, randint genmax)
|
||||
/* Increase RANDMAX by appending random bytes to RANDNUM and
|
||||
UCHAR_MAX to RANDMAX until RANDMAX is no less than
|
||||
GENMAX. This may lose up to CHAR_BIT bits of information
|
||||
if (HUGE_BYTES ? 0 : RANDINT_MAX >> CHAR_BIT) < GENMAX,
|
||||
but it is not worth the programming hassle of saving
|
||||
these bits since GENMAX is rarely that large in practice. */
|
||||
if shift_right (RANDINT_MAX) < GENMAX, but it is not
|
||||
worth the programming hassle of saving these bits since
|
||||
GENMAX is rarely that large in practice. */
|
||||
|
||||
i = 0;
|
||||
|
||||
@@ -198,7 +205,7 @@ randint_genmax (struct randint_source *s, randint genmax)
|
||||
void
|
||||
randint_free (struct randint_source *s)
|
||||
{
|
||||
explicit_bzero (s, sizeof *s);
|
||||
memset (s, 0, sizeof *s);
|
||||
free (s);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Generate random integers.
|
||||
|
||||
Copyright (C) 2006-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 2006, 2009 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
|
||||
@@ -13,7 +13,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
@@ -32,17 +32,10 @@ typedef uintmax_t randint;
|
||||
|
||||
struct randint_source;
|
||||
|
||||
void randint_free (struct randint_source *) _GL_ATTRIBUTE_NONNULL ();
|
||||
int randint_all_free (struct randint_source *) _GL_ATTRIBUTE_NONNULL ();
|
||||
struct randint_source *randint_new (struct randread_source *)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (randint_free, 1)
|
||||
_GL_ATTRIBUTE_NONNULL () _GL_ATTRIBUTE_RETURNS_NONNULL;
|
||||
struct randint_source *randint_all_new (char const *, size_t)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (randint_all_free, 1);
|
||||
struct randread_source *randint_get_source (struct randint_source const *)
|
||||
_GL_ATTRIBUTE_NONNULL () _GL_ATTRIBUTE_PURE;
|
||||
randint randint_genmax (struct randint_source *, randint genmax)
|
||||
_GL_ATTRIBUTE_NONNULL ();
|
||||
struct randint_source *randint_new (struct randread_source *);
|
||||
struct randint_source *randint_all_new (char const *, size_t);
|
||||
struct randread_source *randint_get_source (struct randint_source const *);
|
||||
randint randint_genmax (struct randint_source *, randint genmax);
|
||||
|
||||
/* Consume random data from *S to generate a random number in the range
|
||||
0 .. CHOICES-1. CHOICES must be nonzero. */
|
||||
@@ -52,4 +45,7 @@ randint_choose (struct randint_source *s, randint choices)
|
||||
return randint_genmax (s, choices - 1);
|
||||
}
|
||||
|
||||
void randint_free (struct randint_source *);
|
||||
int randint_all_free (struct randint_source *);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Generate random permutations.
|
||||
|
||||
Copyright (C) 2006-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 2006, 2007, 2009 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
|
||||
@@ -13,7 +13,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
@@ -22,26 +22,19 @@
|
||||
#include "randperm.h"
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "attribute.h"
|
||||
#include "count-leading-zeros.h"
|
||||
#include "hash.h"
|
||||
#include "xalloc.h"
|
||||
|
||||
/* Return the floor of the log base 2 of N. If N is zero, return -1. */
|
||||
/* Return the ceiling of the log base 2 of N. If N is zero, return
|
||||
an unspecified value. */
|
||||
|
||||
ATTRIBUTE_CONST static int
|
||||
floor_lg (size_t n)
|
||||
static size_t
|
||||
ceil_lg (size_t n)
|
||||
{
|
||||
static_assert (SIZE_WIDTH <= ULLONG_WIDTH);
|
||||
return (n == 0 ? -1
|
||||
: SIZE_WIDTH <= UINT_WIDTH
|
||||
? UINT_WIDTH - 1 - count_leading_zeros (n)
|
||||
: SIZE_WIDTH <= ULONG_WIDTH
|
||||
? ULONG_WIDTH - 1 - count_leading_zeros_l (n)
|
||||
: ULLONG_WIDTH - 1 - count_leading_zeros_ll (n));
|
||||
size_t b = 0;
|
||||
for (n--; n != 0; n /= 2)
|
||||
b++;
|
||||
return b;
|
||||
}
|
||||
|
||||
/* Return an upper bound on the number of random bytes needed to
|
||||
@@ -53,10 +46,10 @@ randperm_bound (size_t h, size_t n)
|
||||
{
|
||||
/* Upper bound on number of bits needed to generate the first number
|
||||
of the permutation. */
|
||||
uintmax_t lg_n = floor_lg (n) + 1;
|
||||
size_t lg_n = ceil_lg (n);
|
||||
|
||||
/* Upper bound on number of bits needed to generated the first H elements. */
|
||||
uintmax_t ar = lg_n * h;
|
||||
size_t ar = lg_n * h;
|
||||
|
||||
/* Convert the bit count to a byte count. */
|
||||
size_t bound = (ar + CHAR_BIT - 1) / CHAR_BIT;
|
||||
@@ -64,97 +57,9 @@ randperm_bound (size_t h, size_t n)
|
||||
return bound;
|
||||
}
|
||||
|
||||
/* Swap elements I and J in array V. */
|
||||
|
||||
static void
|
||||
swap (size_t *v, size_t i, size_t j)
|
||||
{
|
||||
size_t t = v[i];
|
||||
v[i] = v[j];
|
||||
v[j] = t;
|
||||
}
|
||||
|
||||
/* Structures and functions for a sparse_map abstract data type that's
|
||||
used to effectively swap elements I and J in array V like swap(),
|
||||
but in a more memory efficient manner (when the number of permutations
|
||||
performed is significantly less than the size of the input). */
|
||||
|
||||
struct sparse_ent_
|
||||
{
|
||||
size_t index;
|
||||
size_t val;
|
||||
};
|
||||
|
||||
static size_t
|
||||
sparse_hash_ (void const *x, size_t table_size)
|
||||
{
|
||||
struct sparse_ent_ const *ent = x;
|
||||
return ent->index % table_size;
|
||||
}
|
||||
|
||||
static bool
|
||||
sparse_cmp_ (void const *x, void const *y)
|
||||
{
|
||||
struct sparse_ent_ const *ent1 = x;
|
||||
struct sparse_ent_ const *ent2 = y;
|
||||
return ent1->index == ent2->index;
|
||||
}
|
||||
|
||||
typedef Hash_table sparse_map;
|
||||
|
||||
/* Initialize the structure for the sparse map,
|
||||
when a best guess as to the number of entries
|
||||
specified with SIZE_HINT. */
|
||||
|
||||
static sparse_map *
|
||||
sparse_new (size_t size_hint)
|
||||
{
|
||||
return hash_initialize (size_hint, nullptr, sparse_hash_, sparse_cmp_, free);
|
||||
}
|
||||
|
||||
/* Swap the values for I and J. If a value is not already present
|
||||
then assume it's equal to the index. Update the value for
|
||||
index I in array V. */
|
||||
|
||||
static void
|
||||
sparse_swap (sparse_map *sv, size_t *v, size_t i, size_t j)
|
||||
{
|
||||
struct sparse_ent_ *v1 = hash_remove (sv, &(struct sparse_ent_) {i,0});
|
||||
struct sparse_ent_ *v2 = hash_remove (sv, &(struct sparse_ent_) {j,0});
|
||||
|
||||
/* FIXME: reduce the frequency of these mallocs. */
|
||||
if (!v1)
|
||||
{
|
||||
v1 = xmalloc (sizeof *v1);
|
||||
v1->index = v1->val = i;
|
||||
}
|
||||
if (!v2)
|
||||
{
|
||||
v2 = xmalloc (sizeof *v2);
|
||||
v2->index = v2->val = j;
|
||||
}
|
||||
|
||||
size_t t = v1->val;
|
||||
v1->val = v2->val;
|
||||
v2->val = t;
|
||||
if (!hash_insert (sv, v1))
|
||||
xalloc_die ();
|
||||
if (!hash_insert (sv, v2))
|
||||
xalloc_die ();
|
||||
|
||||
v[i] = v1->val;
|
||||
}
|
||||
|
||||
static void
|
||||
sparse_free (sparse_map *sv)
|
||||
{
|
||||
hash_free (sv);
|
||||
}
|
||||
|
||||
|
||||
/* 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 nullptr if H is zero. */
|
||||
Return NULL if H is zero. */
|
||||
|
||||
size_t *
|
||||
randperm_new (struct randint_source *r, size_t h, size_t n)
|
||||
@@ -164,7 +69,7 @@ randperm_new (struct randint_source *r, size_t h, size_t n)
|
||||
switch (h)
|
||||
{
|
||||
case 0:
|
||||
v = nullptr;
|
||||
v = NULL;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
@@ -174,66 +79,21 @@ randperm_new (struct randint_source *r, size_t h, size_t n)
|
||||
|
||||
default:
|
||||
{
|
||||
/* The algorithm is essentially the same in both
|
||||
the sparse and non sparse case. In the sparse case we use
|
||||
a hash to implement sparse storage for the set of n numbers
|
||||
we're shuffling. When to use the sparse method was
|
||||
determined with the help of this script:
|
||||
|
||||
#!/bin/sh
|
||||
for n in $(seq 2 32); do
|
||||
for h in $(seq 2 32); do
|
||||
test $h -gt $n && continue
|
||||
for s in o n; do
|
||||
test $s = o && shuf=shuf || shuf=./shuf
|
||||
num=$(env time -f "$s:${h},${n} = %e,%M" \
|
||||
$shuf -i0-$((2**$n-2)) -n$((2**$h-2)) | wc -l)
|
||||
test $num = $((2**$h-2)) || echo "$s:${h},${n} = failed" >&2
|
||||
done
|
||||
done
|
||||
done
|
||||
|
||||
This showed that if sparseness = n/h, then:
|
||||
|
||||
sparseness = 128 => .125 mem used, and about same speed
|
||||
sparseness = 64 => .25 mem used, but 1.5 times slower
|
||||
sparseness = 32 => .5 mem used, but 2 times slower
|
||||
|
||||
Also the memory usage was only significant when n > 128Ki
|
||||
*/
|
||||
bool sparse = (n >= (128 * 1024)) && (n / h >= 32);
|
||||
|
||||
size_t i;
|
||||
sparse_map *sv;
|
||||
|
||||
if (sparse)
|
||||
{
|
||||
sv = sparse_new (h * 2);
|
||||
if (sv == nullptr)
|
||||
xalloc_die ();
|
||||
v = xnmalloc (h, sizeof *v);
|
||||
}
|
||||
else
|
||||
{
|
||||
sv = nullptr; /* To placate GCC's -Wuninitialized. */
|
||||
v = xnmalloc (n, sizeof *v);
|
||||
for (i = 0; i < n; i++)
|
||||
v[i] = i;
|
||||
}
|
||||
v = xnmalloc (n, sizeof *v);
|
||||
for (i = 0; i < n; i++)
|
||||
v[i] = i;
|
||||
|
||||
for (i = 0; i < h; i++)
|
||||
{
|
||||
size_t j = i + randint_choose (r, n - i);
|
||||
if (sparse)
|
||||
sparse_swap (sv, v, i, j);
|
||||
else
|
||||
swap (v, i, j);
|
||||
size_t t = v[i];
|
||||
v[i] = v[j];
|
||||
v[j] = t;
|
||||
}
|
||||
|
||||
if (sparse)
|
||||
sparse_free (sv);
|
||||
else
|
||||
v = xnrealloc (v, h, sizeof *v);
|
||||
v = xnrealloc (v, h, sizeof *v);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#include "randint.h"
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
size_t randperm_bound (size_t, size_t) _GL_ATTRIBUTE_CONST;
|
||||
size_t *randperm_new (struct randint_source *, size_t, size_t)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
size_t randperm_bound (size_t, size_t);
|
||||
size_t *randperm_new (struct randint_source *, size_t, size_t);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Generate buffers of random data.
|
||||
|
||||
Copyright (C) 2006-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 2006, 2008-2009 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
|
||||
@@ -13,13 +13,10 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
/* FIXME: Improve performance by adding support for the RDRAND machine
|
||||
instruction if available (e.g., Ivy Bridge processors). */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "randread.h"
|
||||
@@ -27,28 +24,40 @@
|
||||
#include <errno.h>
|
||||
#include <error.h>
|
||||
#include <exitfail.h>
|
||||
#include <fcntl.h>
|
||||
#include <quote.h>
|
||||
#include <quotearg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/random.h>
|
||||
|
||||
#include "gettext.h"
|
||||
#define _(msgid) gettext (msgid)
|
||||
|
||||
#include "assure.h"
|
||||
#include "minmax.h"
|
||||
#include "rand-isaac.h"
|
||||
#include "stdio-safer.h"
|
||||
#include "unlocked-io.h"
|
||||
#include "xalloc.h"
|
||||
|
||||
#if _STRING_ARCH_unaligned || _STRING_INLINE_unaligned
|
||||
# define POINTER_IS_ALIGNED(ptr, type) true
|
||||
#ifndef __attribute__
|
||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
|
||||
# define __attribute__(x) /* empty */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef ATTRIBUTE_NORETURN
|
||||
# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
# define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#if _STRING_ARCH_unaligned
|
||||
# define ALIGNED_POINTER(ptr, type) true
|
||||
#else
|
||||
# define POINTER_IS_ALIGNED(ptr, type) ((size_t) (ptr) % alignof (type) == 0)
|
||||
# define alignof(type) offsetof (struct { char c; type x; }, x)
|
||||
# define ALIGNED_POINTER(ptr, type) ((size_t) (ptr) % alignof (type) == 0)
|
||||
#endif
|
||||
|
||||
/* The maximum buffer size used for reads of random data. Using the
|
||||
@@ -91,7 +100,7 @@ struct randread_source
|
||||
/* Up to a buffer's worth of pseudorandom data. */
|
||||
union
|
||||
{
|
||||
isaac_word w[ISAAC_WORDS];
|
||||
uint32_t w[ISAAC_WORDS];
|
||||
unsigned char b[ISAAC_BYTES];
|
||||
} data;
|
||||
} isaac;
|
||||
@@ -101,13 +110,14 @@ struct randread_source
|
||||
|
||||
/* The default error handler. */
|
||||
|
||||
static void
|
||||
static void ATTRIBUTE_NORETURN
|
||||
randread_error (void const *file_name)
|
||||
{
|
||||
affirm (exit_failure);
|
||||
error (exit_failure, errno,
|
||||
errno == 0 ? _("%s: end of file") : _("%s: read error"),
|
||||
quote (file_name));
|
||||
if (file_name)
|
||||
error (exit_failure, errno,
|
||||
_(errno == 0 ? "%s: end of file" : "%s: read error"),
|
||||
quotearg_colon (file_name));
|
||||
abort ();
|
||||
}
|
||||
|
||||
/* Simply return a new randread_source object with the default error
|
||||
@@ -123,41 +133,6 @@ simple_new (FILE *source, void const *handler_arg)
|
||||
return s;
|
||||
}
|
||||
|
||||
/* Put a nonce value into BUFFER, with size BUFSIZE.
|
||||
Return true on success, false (setting errno) on failure. */
|
||||
|
||||
static bool
|
||||
get_nonce (void *buffer, size_t bufsize)
|
||||
{
|
||||
char *buf = buffer, *buflim = buf + bufsize;
|
||||
while (buf < buflim)
|
||||
{
|
||||
#if defined __sun
|
||||
# define MAX_GETRANDOM 1024
|
||||
#else
|
||||
# define MAX_GETRANDOM SIZE_MAX
|
||||
#endif
|
||||
size_t max_bytes = MIN (buflim - buf, MAX_GETRANDOM);
|
||||
ssize_t nbytes = getrandom (buf, max_bytes, 0);
|
||||
if (0 <= nbytes)
|
||||
buf += nbytes;
|
||||
else if (errno != EINTR)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Body of randread_free, broken out to pacify gcc -Wmismatched-dealloc. */
|
||||
|
||||
static int
|
||||
randread_free_body (struct randread_source *s)
|
||||
{
|
||||
FILE *source = s->source;
|
||||
explicit_bzero (s, sizeof *s);
|
||||
free (s);
|
||||
return source ? fclose (source) : 0;
|
||||
}
|
||||
|
||||
/* Create and initialize a random data source from NAME, or use a
|
||||
reasonable default source if NAME is null. BYTES_BOUND is an upper
|
||||
bound on the number of bytes that will be needed. If zero, it is a
|
||||
@@ -167,21 +142,21 @@ randread_free_body (struct randread_source *s)
|
||||
default handler. Unless a non-default handler is used, NAME's
|
||||
lifetime should be at least that of the returned value.
|
||||
|
||||
Return nullptr (setting errno) on failure. */
|
||||
Return NULL (setting errno) on failure. */
|
||||
|
||||
struct randread_source *
|
||||
randread_new (char const *name, size_t bytes_bound)
|
||||
{
|
||||
if (bytes_bound == 0)
|
||||
return simple_new (nullptr, nullptr);
|
||||
return simple_new (NULL, NULL);
|
||||
else
|
||||
{
|
||||
FILE *source = nullptr;
|
||||
FILE *source = NULL;
|
||||
struct randread_source *s;
|
||||
|
||||
if (name)
|
||||
if (! (source = fopen_safer (name, "rb")))
|
||||
return nullptr;
|
||||
return NULL;
|
||||
|
||||
s = simple_new (source, name);
|
||||
|
||||
@@ -190,14 +165,6 @@ randread_new (char const *name, size_t bytes_bound)
|
||||
else
|
||||
{
|
||||
s->buf.isaac.buffered = 0;
|
||||
if (! get_nonce (s->buf.isaac.state.m,
|
||||
MIN (sizeof s->buf.isaac.state.m, bytes_bound)))
|
||||
{
|
||||
int e = errno;
|
||||
randread_free_body (s);
|
||||
errno = e;
|
||||
return nullptr;
|
||||
}
|
||||
isaac_seed (&s->buf.isaac.state);
|
||||
}
|
||||
|
||||
@@ -232,7 +199,7 @@ randread_set_handler_arg (struct randread_source *s, void const *handler_arg)
|
||||
static void
|
||||
readsource (struct randread_source *s, unsigned char *p, size_t size)
|
||||
{
|
||||
while (true)
|
||||
for (;;)
|
||||
{
|
||||
size_t inbytes = fread (p, sizeof *p, size, s->source);
|
||||
int fread_errno = errno;
|
||||
@@ -250,14 +217,12 @@ readsource (struct randread_source *s, unsigned char *p, size_t size)
|
||||
the buffered ISAAC generator in ISAAC. */
|
||||
|
||||
static void
|
||||
readisaac (struct isaac *isaac, void *p, size_t size)
|
||||
readisaac (struct isaac *isaac, unsigned char *p, size_t size)
|
||||
{
|
||||
size_t inbytes = isaac->buffered;
|
||||
|
||||
while (true)
|
||||
for (;;)
|
||||
{
|
||||
char *char_p = p;
|
||||
|
||||
if (size <= inbytes)
|
||||
{
|
||||
memcpy (p, isaac->data.b + ISAAC_BYTES - inbytes, size);
|
||||
@@ -266,14 +231,14 @@ readisaac (struct isaac *isaac, void *p, size_t size)
|
||||
}
|
||||
|
||||
memcpy (p, isaac->data.b + ISAAC_BYTES - inbytes, inbytes);
|
||||
p = char_p + inbytes;
|
||||
p += inbytes;
|
||||
size -= inbytes;
|
||||
|
||||
/* If P is aligned, write to *P directly to avoid the overhead
|
||||
of copying from the buffer. */
|
||||
if (POINTER_IS_ALIGNED (p, isaac_word))
|
||||
if (ALIGNED_POINTER (p, uint32_t))
|
||||
{
|
||||
isaac_word *wp = p;
|
||||
uint32_t *wp = (uint32_t *) p;
|
||||
while (ISAAC_BYTES <= size)
|
||||
{
|
||||
isaac_refill (&isaac->state, wp);
|
||||
@@ -285,7 +250,7 @@ readisaac (struct isaac *isaac, void *p, size_t size)
|
||||
return;
|
||||
}
|
||||
}
|
||||
p = wp;
|
||||
p = (unsigned char *) wp;
|
||||
}
|
||||
|
||||
isaac_refill (&isaac->state, isaac->data.w);
|
||||
@@ -315,5 +280,8 @@ randread (struct randread_source *s, void *buf, size_t size)
|
||||
int
|
||||
randread_free (struct randread_source *s)
|
||||
{
|
||||
return randread_free_body (s);
|
||||
FILE *source = s->source;
|
||||
memset (s, 0, sizeof *s);
|
||||
free (s);
|
||||
return (source ? fclose (source) : 0);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Generate buffers of random data.
|
||||
|
||||
Copyright (C) 2006-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 2006, 2009 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
|
||||
@@ -13,7 +13,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
@@ -24,14 +24,10 @@
|
||||
|
||||
struct randread_source;
|
||||
|
||||
int randread_free (struct randread_source *) _GL_ATTRIBUTE_NONNULL ();
|
||||
struct randread_source *randread_new (char const *, size_t)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (randread_free, 1);
|
||||
void randread (struct randread_source *, void *, size_t)
|
||||
_GL_ATTRIBUTE_NONNULL ();
|
||||
void randread_set_handler (struct randread_source *, void (*) (void const *))
|
||||
_GL_ATTRIBUTE_NONNULL ();
|
||||
void randread_set_handler_arg (struct randread_source *, void const *)
|
||||
_GL_ATTRIBUTE_NONNULL ((1));
|
||||
struct randread_source *randread_new (char const *, size_t);
|
||||
void randread (struct randread_source *, void *, size_t);
|
||||
void randread_set_handler (struct randread_source *, void (*) (void const *));
|
||||
void randread_set_handler_arg (struct randread_source *, void const *);
|
||||
int randread_free (struct randread_source *);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* root-dev-ino.c -- get the device and inode numbers for '/'.
|
||||
Copyright (C) 2003-2024 Free Software Foundation, Inc.
|
||||
/* root-dev-ino.c -- get the device and inode numbers for `/'.
|
||||
Copyright (C) 2003, 2005, 2006, 2009 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
|
||||
@@ -12,7 +12,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Jim Meyering. */
|
||||
|
||||
@@ -22,15 +22,15 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Call lstat to get the device and inode numbers for '/'.
|
||||
Upon failure, return nullptr. Otherwise, set the members of
|
||||
/* Call lstat to get the device and inode numbers for `/'.
|
||||
Upon failure, return NULL. Otherwise, set the members of
|
||||
*ROOT_D_I accordingly and return ROOT_D_I. */
|
||||
struct dev_ino *
|
||||
get_root_dev_ino (struct dev_ino *root_d_i)
|
||||
{
|
||||
struct stat statbuf;
|
||||
if (lstat ("/", &statbuf))
|
||||
return nullptr;
|
||||
return NULL;
|
||||
root_d_i->st_ino = statbuf.st_ino;
|
||||
root_d_i->st_dev = statbuf.st_dev;
|
||||
return root_d_i;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Root device and inode number checking.
|
||||
|
||||
Copyright (C) 2003-2024 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2006, 2009 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
|
||||
@@ -13,7 +13,7 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef ROOT_DEV_INO_H
|
||||
# define ROOT_DEV_INO_H 1
|
||||
@@ -22,24 +22,24 @@
|
||||
# include "same-inode.h"
|
||||
|
||||
struct dev_ino *
|
||||
get_root_dev_ino (struct dev_ino *root_d_i) _GL_ATTRIBUTE_NONNULL ();
|
||||
get_root_dev_ino (struct dev_ino *root_d_i);
|
||||
|
||||
/* These macros are common to the programs that support the
|
||||
--preserve-root and --no-preserve-root options. */
|
||||
|
||||
# define ROOT_DEV_INO_CHECK(Root_dev_ino, Dir_statbuf) \
|
||||
(Root_dev_ino && PSAME_INODE (Dir_statbuf, Root_dev_ino))
|
||||
(Root_dev_ino && SAME_INODE (*Dir_statbuf, *Root_dev_ino))
|
||||
|
||||
# define ROOT_DEV_INO_WARN(Dirname) \
|
||||
do \
|
||||
{ \
|
||||
if (STREQ (Dirname, "/")) \
|
||||
error (0, 0, _("it is dangerous to operate recursively on %s"), \
|
||||
quoteaf (Dirname)); \
|
||||
quote (Dirname)); \
|
||||
else \
|
||||
error (0, 0, \
|
||||
_("it is dangerous to operate recursively on %s (same as %s)"), \
|
||||
quoteaf_n (0, Dirname), quoteaf_n (1, "/")); \
|
||||
quote_n (0, Dirname), quote_n (1, "/")); \
|
||||
error (0, 0, _("use --no-preserve-root to override this failsafe")); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
#include <config.h>
|
||||
#define SKIPCHARS_INLINE _GL_EXTERN_INLINE
|
||||
#include <skipchars.h>
|
||||
@@ -1,56 +0,0 @@
|
||||
/* Skipping sequences of characters satisfying a predicate
|
||||
|
||||
Copyright 2023-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "mcel.h"
|
||||
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef SKIPCHARS_INLINE
|
||||
# define SKIPCHARS_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
/* Return the address just past the leading sequence of possibly
|
||||
multi-byte characters or encoding errors G in STR that satisfy
|
||||
PREDICATE (G) if OK is true, or that do not satisfy the predicate
|
||||
call if OK is false. */
|
||||
|
||||
SKIPCHARS_INLINE char *
|
||||
skip_str_matching (char const *str, bool (*predicate) (mcel_t), bool ok)
|
||||
{
|
||||
char const *s = str;
|
||||
for (mcel_t g; *s && predicate (g = mcel_scanz (s)) == ok;
|
||||
s += g.len)
|
||||
continue;
|
||||
return (char *) s;
|
||||
}
|
||||
|
||||
/* Return the address just past the leading sequence of possibly
|
||||
multi-byte characters or encoding errors G in BUF (which ends at LIM)
|
||||
that satisfy PREDICATE (G) if OK is true, or that do not satisfy
|
||||
the predicate call if OK is false. */
|
||||
|
||||
SKIPCHARS_INLINE char *
|
||||
skip_buf_matching (char const *buf, char const *lim,
|
||||
bool (*predicate) (mcel_t), bool ok)
|
||||
{
|
||||
char const *s = buf;
|
||||
for (mcel_t g; s < lim && predicate (g = mcel_scan (s, lim)) == ok;
|
||||
s += g.len)
|
||||
continue;
|
||||
return (char *) s;
|
||||
}
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
@@ -1,44 +0,0 @@
|
||||
/* Include and determine availability of smack routines
|
||||
Copyright (C) 2013-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Here we replace or wrap the most common smack functions used by coreutils.
|
||||
Others will need to be protected by HAVE_SMACK. */
|
||||
|
||||
#ifdef HAVE_SMACK
|
||||
# include <sys/smack.h>
|
||||
#else
|
||||
static inline ssize_t
|
||||
smack_new_label_from_self (char **label)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline int
|
||||
smack_set_label_for_self (char const *label)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline bool
|
||||
is_smack_enabled (void)
|
||||
{
|
||||
#ifdef HAVE_SMACK
|
||||
return smack_smackfs_path () != nullptr;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
int strintcmp (char const *, char const *)
|
||||
_GL_ATTRIBUTE_NONNULL () _GL_ATTRIBUTE_PURE;
|
||||
int strnumcmp (char const *, char const *, int, int)
|
||||
_GL_ATTRIBUTE_NONNULL () _GL_ATTRIBUTE_PURE;
|
||||
@@ -1,118 +0,0 @@
|
||||
/* Target directory operands for coreutils
|
||||
|
||||
Copyright 2004-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#define TARGETDIR_INLINE _GL_EXTERN_INLINE
|
||||
#include <targetdir.h>
|
||||
|
||||
#include <attribute.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef O_PATH
|
||||
enum { O_PATHSEARCH = O_PATH };
|
||||
#else
|
||||
enum { O_PATHSEARCH = O_SEARCH };
|
||||
#endif
|
||||
|
||||
/* Must F designate the working directory? */
|
||||
|
||||
ATTRIBUTE_PURE static bool
|
||||
must_be_working_directory (char const *f)
|
||||
{
|
||||
/* Return true for ".", "./.", ".///./", etc. */
|
||||
while (*f++ == '.')
|
||||
{
|
||||
if (*f != '/')
|
||||
return !*f;
|
||||
while (*++f == '/')
|
||||
continue;
|
||||
if (!*f)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Return a file descriptor open to FILE, for use in openat.
|
||||
As an optimization, return AT_FDCWD if FILE must be the working directory.
|
||||
As a side effect, possibly set *ST to the file's status.
|
||||
Fail and set errno if FILE is not a directory.
|
||||
On failure return -2 if AT_FDCWD is -1, -1 otherwise. */
|
||||
|
||||
int
|
||||
target_directory_operand (char const *file, struct stat *st)
|
||||
{
|
||||
if (must_be_working_directory (file))
|
||||
return AT_FDCWD;
|
||||
|
||||
int fd = -1;
|
||||
int try_to_open = 1;
|
||||
int stat_result;
|
||||
|
||||
/* On old systems without O_DIRECTORY, like Solaris 10, check with
|
||||
stat first lest we try to open a fifo for example and hang. */
|
||||
if (!O_DIRECTORY)
|
||||
{
|
||||
stat_result = stat (file, st);
|
||||
if (stat_result == 0)
|
||||
{
|
||||
try_to_open = S_ISDIR (st->st_mode);
|
||||
errno = ENOTDIR;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* On EOVERFLOW failure, give up on checking, as there is no
|
||||
easy way to check. This should be rare. */
|
||||
try_to_open = errno == EOVERFLOW;
|
||||
}
|
||||
}
|
||||
|
||||
if (try_to_open)
|
||||
{
|
||||
fd = open (file, O_PATHSEARCH | O_DIRECTORY);
|
||||
|
||||
/* On platforms lacking O_PATH, using O_SEARCH | O_DIRECTORY to
|
||||
open an overly-protected non-directory can fail with either
|
||||
EACCES or ENOTDIR. Prefer ENOTDIR as it makes for better
|
||||
diagnostics. */
|
||||
if (O_PATHSEARCH == O_SEARCH && fd < 0 && errno == EACCES)
|
||||
errno = (((O_DIRECTORY ? stat (file, st) : stat_result) == 0
|
||||
&& !S_ISDIR (st->st_mode))
|
||||
? ENOTDIR : EACCES);
|
||||
}
|
||||
|
||||
if (!O_DIRECTORY && 0 <= fd)
|
||||
{
|
||||
/* On old systems like Solaris 10 double check type,
|
||||
to ensure we've opened a directory. */
|
||||
int err;
|
||||
if (fstat (fd, st) == 0
|
||||
? !S_ISDIR (st->st_mode) && (err = ENOTDIR, true)
|
||||
: (err = errno) != EOVERFLOW)
|
||||
{
|
||||
close (fd);
|
||||
errno = err;
|
||||
fd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
return fd - (AT_FDCWD == -1 && fd < 0);
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
/* Target directory operands for coreutils
|
||||
|
||||
Copyright 2022-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifndef _GL_INLINE_HEADER_BEGIN
|
||||
# error "Please include config.h first."
|
||||
#endif
|
||||
_GL_INLINE_HEADER_BEGIN
|
||||
#ifndef TARGETDIR_INLINE
|
||||
# define TARGETDIR_INLINE _GL_INLINE
|
||||
#endif
|
||||
|
||||
/* Return a file descriptor open to FILE, for use in openat.
|
||||
As an optimization, return AT_FDCWD if FILE must be the working directory.
|
||||
As a side effect, possibly set *ST to the file's status.
|
||||
Fail and set errno if FILE is not a directory.
|
||||
On failure return -2 if AT_FDCWD is -1, -1 otherwise. */
|
||||
extern int target_directory_operand (char const *file, struct stat *st);
|
||||
|
||||
/* Return true if FD represents success for target_directory_operand. */
|
||||
TARGETDIR_INLINE _GL_ATTRIBUTE_PURE bool
|
||||
target_dirfd_valid (int fd)
|
||||
{
|
||||
return fd != -1 - (AT_FDCWD == -1);
|
||||
}
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
294
gl/lib/tempname.c
Normal file
294
gl/lib/tempname.c
Normal file
@@ -0,0 +1,294 @@
|
||||
/* tempname.c - generate the name of a temporary file.
|
||||
|
||||
Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
2000, 2001, 2002, 2003, 2005, 2006, 2007, 2009 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Extracted from glibc sysdeps/posix/tempname.c. See also tmpdir.c. */
|
||||
|
||||
#if !_LIBC
|
||||
# include <config.h>
|
||||
# include "tempname.h"
|
||||
# include "randint.h"
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <errno.h>
|
||||
#ifndef __set_errno
|
||||
# define __set_errno(Val) errno = (Val)
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#ifndef P_tmpdir
|
||||
# define P_tmpdir "/tmp"
|
||||
#endif
|
||||
#ifndef TMP_MAX
|
||||
# define TMP_MAX 238328
|
||||
#endif
|
||||
#ifndef __GT_FILE
|
||||
# define __GT_FILE 1
|
||||
# define __GT_DIR 2
|
||||
# define __GT_NOCREATE 3
|
||||
#endif
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/time.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
#if _LIBC
|
||||
# define struct_stat64 struct stat64
|
||||
#else
|
||||
# define struct_stat64 struct stat
|
||||
# define __open open
|
||||
# define __gen_tempname gen_tempname
|
||||
# define __getpid getpid
|
||||
# define __gettimeofday gettimeofday
|
||||
# define __mkdir mkdir
|
||||
# define __lxstat64(version, file, buf) lstat (file, buf)
|
||||
# define __xstat64(version, file, buf) stat (file, buf)
|
||||
#endif
|
||||
|
||||
#if ! (HAVE___SECURE_GETENV || _LIBC)
|
||||
# define __secure_getenv getenv
|
||||
#endif
|
||||
|
||||
#if _LIBC
|
||||
/* Return nonzero if DIR is an existent directory. */
|
||||
static int
|
||||
direxists (const char *dir)
|
||||
{
|
||||
struct_stat64 buf;
|
||||
return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode);
|
||||
}
|
||||
|
||||
/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
|
||||
non-null and exists, uses it; otherwise uses the first of $TMPDIR,
|
||||
P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
|
||||
for use with mk[s]temp. Will fail (-1) if DIR is non-null and
|
||||
doesn't exist, none of the searched dirs exists, or there's not
|
||||
enough space in TMPL. */
|
||||
int
|
||||
__path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
|
||||
int try_tmpdir)
|
||||
{
|
||||
const char *d;
|
||||
size_t dlen, plen;
|
||||
|
||||
if (!pfx || !pfx[0])
|
||||
{
|
||||
pfx = "file";
|
||||
plen = 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
plen = strlen (pfx);
|
||||
if (plen > 5)
|
||||
plen = 5;
|
||||
}
|
||||
|
||||
if (try_tmpdir)
|
||||
{
|
||||
d = __secure_getenv ("TMPDIR");
|
||||
if (d != NULL && direxists (d))
|
||||
dir = d;
|
||||
else if (dir != NULL && direxists (dir))
|
||||
/* nothing */ ;
|
||||
else
|
||||
dir = NULL;
|
||||
}
|
||||
if (dir == NULL)
|
||||
{
|
||||
if (direxists (P_tmpdir))
|
||||
dir = P_tmpdir;
|
||||
else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
|
||||
dir = "/tmp";
|
||||
else
|
||||
{
|
||||
__set_errno (ENOENT);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
dlen = strlen (dir);
|
||||
while (dlen > 1 && dir[dlen - 1] == '/')
|
||||
dlen--; /* remove trailing slashes */
|
||||
|
||||
/* check we have room for "${dir}/${pfx}XXXXXX\0" */
|
||||
if (tmpl_len < dlen + 1 + plen + 6 + 1)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx);
|
||||
return 0;
|
||||
}
|
||||
#endif /* _LIBC */
|
||||
|
||||
static inline bool
|
||||
check_x_suffix (char const *s, size_t len)
|
||||
{
|
||||
return strspn (s, "X") == len;
|
||||
}
|
||||
|
||||
/* These are the characters used in temporary file names. */
|
||||
static const char letters[] =
|
||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
|
||||
/* Generate a temporary file name based on TMPL. TMPL must end in a
|
||||
a sequence of at least X_SUFFIX_LEN "X"s. The name constructed
|
||||
does not exist at the time of the call to __gen_tempname. TMPL is
|
||||
overwritten with the result.
|
||||
|
||||
KIND may be one of:
|
||||
__GT_NOCREATE: simply verify that the name does not exist
|
||||
at the time of the call.
|
||||
__GT_FILE: create the file using open(O_CREAT|O_EXCL)
|
||||
and return a read-write fd. The file is mode 0600.
|
||||
__GT_DIR: create a directory, which will be mode 0700.
|
||||
|
||||
We use a clever algorithm to get hard-to-predict names. */
|
||||
int
|
||||
gen_tempname_len (char *tmpl, int flags, int kind, size_t x_suffix_len)
|
||||
{
|
||||
size_t len;
|
||||
char *XXXXXX;
|
||||
unsigned int count;
|
||||
int fd = -1;
|
||||
int save_errno = errno;
|
||||
struct_stat64 st;
|
||||
struct randint_source *rand_src;
|
||||
|
||||
/* A lower bound on the number of temporary files to attempt to
|
||||
generate. The maximum total number of temporary file names that
|
||||
can exist for a given template is 62**6. It should never be
|
||||
necessary to try all these combinations. Instead if a reasonable
|
||||
number of names is tried (we define reasonable as 62**3) fail to
|
||||
give the system administrator the chance to remove the problems. */
|
||||
#define ATTEMPTS_MIN (62 * 62 * 62)
|
||||
|
||||
/* The number of times to attempt to generate a temporary file. To
|
||||
conform to POSIX, this must be no smaller than TMP_MAX. */
|
||||
#if ATTEMPTS_MIN < TMP_MAX
|
||||
unsigned int attempts = TMP_MAX;
|
||||
#else
|
||||
unsigned int attempts = ATTEMPTS_MIN;
|
||||
#endif
|
||||
|
||||
len = strlen (tmpl);
|
||||
if (len < x_suffix_len || ! check_x_suffix (&tmpl[len - x_suffix_len],
|
||||
x_suffix_len))
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
rand_src = randint_all_new (NULL, 8);
|
||||
if (! rand_src)
|
||||
return -1;
|
||||
|
||||
/* This is where the Xs start. */
|
||||
XXXXXX = &tmpl[len - x_suffix_len];
|
||||
|
||||
for (count = 0; count < attempts; ++count)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < x_suffix_len; i++)
|
||||
{
|
||||
XXXXXX[i] = letters[randint_genmax (rand_src, sizeof letters - 2)];
|
||||
}
|
||||
|
||||
switch (kind)
|
||||
{
|
||||
case __GT_FILE:
|
||||
fd = __open (tmpl,
|
||||
(flags & ~0777) | O_RDWR | O_CREAT | O_EXCL,
|
||||
S_IRUSR | S_IWUSR);
|
||||
break;
|
||||
|
||||
case __GT_DIR:
|
||||
fd = __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR);
|
||||
break;
|
||||
|
||||
case __GT_NOCREATE:
|
||||
/* This case is backward from the other three. This function
|
||||
succeeds if __xstat fails because the name does not exist.
|
||||
Note the continue to bypass the common logic at the bottom
|
||||
of the loop. */
|
||||
if (__lxstat64 (_STAT_VER, tmpl, &st) < 0)
|
||||
{
|
||||
if (errno == ENOENT)
|
||||
{
|
||||
__set_errno (save_errno);
|
||||
fd = 0;
|
||||
goto done;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Give up now. */
|
||||
fd = -1;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
|
||||
default:
|
||||
assert (! "invalid KIND in __gen_tempname");
|
||||
}
|
||||
|
||||
if (fd >= 0)
|
||||
{
|
||||
__set_errno (save_errno);
|
||||
goto done;
|
||||
}
|
||||
else if (errno != EEXIST)
|
||||
{
|
||||
fd = -1;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
randint_all_free (rand_src);
|
||||
|
||||
/* We got out of the loop because we ran out of combinations to try. */
|
||||
__set_errno (EEXIST);
|
||||
return -1;
|
||||
|
||||
done:
|
||||
{
|
||||
int saved_errno = errno;
|
||||
randint_all_free (rand_src);
|
||||
__set_errno (saved_errno);
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
int
|
||||
__gen_tempname (char *tmpl, int flags, int kind)
|
||||
{
|
||||
return gen_tempname_len (tmpl, flags, kind, 6);
|
||||
}
|
||||
42
gl/lib/tempname.h
Normal file
42
gl/lib/tempname.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/* Create a temporary file or directory.
|
||||
|
||||
Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* header written by Eric Blake */
|
||||
|
||||
/* In gnulib, always prefer large files. GT_FILE maps to
|
||||
__GT_BIGFILE, not __GT_FILE, for a reason. */
|
||||
#define GT_FILE 1
|
||||
#define GT_DIR 2
|
||||
#define GT_NOCREATE 3
|
||||
|
||||
/* Generate a temporary file name based on TMPL. TMPL must match the
|
||||
rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed
|
||||
does not exist at the time of the call to gen_tempname. TMPL is
|
||||
overwritten with the result.
|
||||
|
||||
KIND may be one of:
|
||||
GT_NOCREATE: simply verify that the name does not exist
|
||||
at the time of the call.
|
||||
GT_FILE: create a large file using open(O_CREAT|O_EXCL)
|
||||
and return a read-write fd. The file is mode 0600.
|
||||
GT_DIR: create a directory, which will be mode 0700.
|
||||
|
||||
We use a clever algorithm to get hard-to-predict names. */
|
||||
#include <stddef.h>
|
||||
extern int gen_tempname (char *tmpl, int flags, int kind);
|
||||
extern int gen_tempname_len (char *tmpl, int flags, int kind,
|
||||
size_t x_suffix_len);
|
||||
@@ -1,6 +0,0 @@
|
||||
#define __xdectoint xdectoimax
|
||||
#define __xnumtoint xnumtoimax
|
||||
#define __xdectoint_t intmax_t
|
||||
#define __xstrtol xstrtoimax
|
||||
#define __xdectoint_signed 1
|
||||
#include "xdectoint.c"
|
||||
@@ -1,88 +0,0 @@
|
||||
/* Convert decimal strings with bounds checking and exit on error.
|
||||
|
||||
Copyright (C) 2014-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "xdectoint.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <error.h>
|
||||
#include <quote.h>
|
||||
#include <xstrtol.h>
|
||||
|
||||
/* Parse numeric string N_STR of base BASE, and return the value.
|
||||
Exit on parse error or if MIN or MAX are exceeded.
|
||||
Strings can have multiplicative SUFFIXES if specified.
|
||||
ERR is printed along with N_STR on error. */
|
||||
|
||||
__xdectoint_t
|
||||
__xnumtoint (char const *n_str, int base, __xdectoint_t min, __xdectoint_t max,
|
||||
char const *suffixes, char const *err, int err_exit)
|
||||
{
|
||||
strtol_error s_err;
|
||||
|
||||
__xdectoint_t tnum;
|
||||
s_err = __xstrtol (n_str, nullptr, base, &tnum, suffixes);
|
||||
|
||||
if (s_err == LONGINT_OK)
|
||||
{
|
||||
if (tnum < min || max < tnum)
|
||||
{
|
||||
s_err = LONGINT_OVERFLOW;
|
||||
/* Use have the INT range as a heuristic to distinguish
|
||||
type overflow rather than other min/max limits. */
|
||||
if (tnum > INT_MAX / 2)
|
||||
errno = EOVERFLOW;
|
||||
#if __xdectoint_signed
|
||||
else if (tnum < INT_MIN / 2)
|
||||
errno = EOVERFLOW;
|
||||
#endif
|
||||
else
|
||||
errno = ERANGE;
|
||||
}
|
||||
}
|
||||
else if (s_err == LONGINT_OVERFLOW)
|
||||
errno = EOVERFLOW;
|
||||
else if (s_err == LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW)
|
||||
errno = 0; /* Don't show ERANGE errors for invalid numbers. */
|
||||
|
||||
if (s_err != LONGINT_OK)
|
||||
{
|
||||
/* EINVAL error message is redundant in this context. */
|
||||
error (err_exit ? err_exit : EXIT_FAILURE, errno == EINVAL ? 0 : errno,
|
||||
"%s: %s", err, quote (n_str));
|
||||
unreachable ();
|
||||
}
|
||||
|
||||
return tnum;
|
||||
}
|
||||
|
||||
/* Parse decimal string N_STR, and return the value.
|
||||
Exit on parse error or if MIN or MAX are exceeded.
|
||||
Strings can have multiplicative SUFFIXES if specified.
|
||||
ERR is printed along with N_STR on error. */
|
||||
|
||||
__xdectoint_t
|
||||
__xdectoint (char const *n_str, __xdectoint_t min, __xdectoint_t max,
|
||||
char const *suffixes, char const *err, int err_exit)
|
||||
{
|
||||
return __xnumtoint (n_str, 10, min, max, suffixes, err, err_exit);
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
/* Convert decimal strings with bounds checking and exit on error.
|
||||
|
||||
Copyright (C) 2014-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef XDECTOINT_H_
|
||||
# define XDECTOINT_H_ 1
|
||||
|
||||
# include <inttypes.h>
|
||||
|
||||
# define _DECLARE_XDECTOINT(name, type) \
|
||||
type name (char const *n_str, type min, type max, \
|
||||
char const *suffixes, char const *err, int err_exit) \
|
||||
_GL_ATTRIBUTE_NONNULL ((1, 5));
|
||||
# define _DECLARE_XNUMTOINT(name, type) \
|
||||
type name (char const *n_str, int base, type min, type max, \
|
||||
char const *suffixes, char const *err, int err_exit) \
|
||||
_GL_ATTRIBUTE_NONNULL ((1, 6));
|
||||
|
||||
_DECLARE_XDECTOINT (xdectoimax, intmax_t)
|
||||
_DECLARE_XDECTOINT (xdectoumax, uintmax_t)
|
||||
|
||||
_DECLARE_XNUMTOINT (xnumtoimax, intmax_t)
|
||||
_DECLARE_XNUMTOINT (xnumtoumax, uintmax_t)
|
||||
|
||||
#endif /* not XDECTOINT_H_ */
|
||||
@@ -1,6 +0,0 @@
|
||||
#define __xdectoint xdectoumax
|
||||
#define __xnumtoint xnumtoumax
|
||||
#define __xdectoint_t uintmax_t
|
||||
#define __xstrtol xstrtoumax
|
||||
#define __xdectoint_signed 0
|
||||
#include "xdectoint.c"
|
||||
41
gl/lib/xfreopen.c
Normal file
41
gl/lib/xfreopen.c
Normal file
@@ -0,0 +1,41 @@
|
||||
/* a wrapper for frepoen
|
||||
Copyright (C) 2008-2009 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
#include "xfreopen.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include "error.h"
|
||||
#include "exitfail.h"
|
||||
#include "quote.h"
|
||||
|
||||
#include "gettext.h"
|
||||
#define _(msgid) gettext (msgid)
|
||||
|
||||
void
|
||||
xfreopen (char const *filename, char const *mode, FILE *fp)
|
||||
{
|
||||
if (!freopen (filename, mode, fp))
|
||||
{
|
||||
char const *f = (filename ? filename
|
||||
: (fp == stdin ? _("stdin")
|
||||
: (fp == stdout ? _("stdout")
|
||||
: (fp == stderr ? _("stderr")
|
||||
: _("unknown stream")))));
|
||||
error (exit_failure, errno, _("failed to reopen %s with mode %s"),
|
||||
quote_n (0, f), quote_n (1, mode));
|
||||
}
|
||||
}
|
||||
2
gl/lib/xfreopen.h
Normal file
2
gl/lib/xfreopen.h
Normal file
@@ -0,0 +1,2 @@
|
||||
#include <stdio.h>
|
||||
void xfreopen (char const *filename, char const *mode, FILE *fp);
|
||||
@@ -1,64 +0,0 @@
|
||||
/* xfts.c -- a wrapper for fts_open
|
||||
|
||||
Copyright (C) 2003-2024 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Jim Meyering. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "assure.h"
|
||||
#include "xalloc.h"
|
||||
#include "xfts.h"
|
||||
|
||||
/* Fail with a proper diagnostic if fts_open fails. */
|
||||
|
||||
FTS *
|
||||
xfts_open (char * const *argv, int options,
|
||||
int (*compar) (const FTSENT **, const FTSENT **))
|
||||
{
|
||||
FTS *fts = fts_open (argv, options | FTS_CWDFD, compar);
|
||||
if (fts == nullptr)
|
||||
{
|
||||
/* This can fail in two ways: out of memory or with errno==EINVAL,
|
||||
which indicates it was called with invalid bit_flags. */
|
||||
affirm (errno != EINVAL);
|
||||
xalloc_die ();
|
||||
}
|
||||
|
||||
return fts;
|
||||
}
|
||||
|
||||
/* When fts_read returns FTS_DC to indicate a directory cycle,
|
||||
it may or may not indicate a real problem. When a program like
|
||||
chgrp performs a recursive traversal that requires traversing
|
||||
symbolic links, it is *not* a problem. However, when invoked
|
||||
with "-P -R", it deserves a warning. The fts_options member
|
||||
records the options that control this aspect of fts's behavior,
|
||||
so test that. */
|
||||
bool
|
||||
cycle_warning_required (FTS const *fts, FTSENT const *ent)
|
||||
{
|
||||
#define ISSET(Fts,Opt) ((Fts)->fts_options & (Opt))
|
||||
/* When dereferencing no symlinks, or when dereferencing only
|
||||
those listed on the command line and we're not processing
|
||||
a command-line argument, then a cycle is a serious problem. */
|
||||
return ((ISSET (fts, FTS_PHYSICAL) && !ISSET (fts, FTS_COMFOLLOW))
|
||||
|| (ISSET (fts, FTS_PHYSICAL) && ISSET (fts, FTS_COMFOLLOW)
|
||||
&& ent->fts_level != FTS_ROOTLEVEL));
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user