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
|
||||
|
||||
243
.gitignore
vendored
243
.gitignore
vendored
@@ -1,193 +1,74 @@
|
||||
*.I[12]
|
||||
*.[EIOX]
|
||||
*.bak
|
||||
*.gcda
|
||||
*.gcno
|
||||
*.o
|
||||
*/.deps/
|
||||
*/.deps
|
||||
*~
|
||||
._bootmp
|
||||
.gdb-history
|
||||
.kludge-stamp
|
||||
.tarball-version
|
||||
.version
|
||||
/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
|
||||
/config.cache
|
||||
/config.log
|
||||
/config.status
|
||||
/configure
|
||||
/coreutils-*.tar.gz
|
||||
/coreutils-*.tar.gz.sig
|
||||
/coreutils-*.tar.xz
|
||||
/coreutils-*.tar.xz.sig
|
||||
/doc/manual
|
||||
/gnulib-tests
|
||||
/lib/.dirstamp
|
||||
/lib/.gitignore
|
||||
/lib/alloca.h
|
||||
/lib/arg-nonnull.h
|
||||
/lib/arpa/inet.h
|
||||
/lib/binary-io.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/fcntl.h
|
||||
/lib/float.h
|
||||
/lib/fnmatch.h
|
||||
/lib/getopt.h
|
||||
/lib/glthread
|
||||
/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/inttypes.h
|
||||
/lib/langinfo.h
|
||||
/lib/libcoreutils.a
|
||||
/lib/limits.h
|
||||
/lib/link-warning.h
|
||||
/lib/locale.h
|
||||
/lib/math.h
|
||||
/lib/netdb.h
|
||||
/lib/netinet/in.h
|
||||
/lib/parse-datetime.c
|
||||
/lib/printf.c
|
||||
/lib/pthread.h
|
||||
/lib/ref-add.sed
|
||||
/lib/ref-del.sed
|
||||
/lib/sched.h
|
||||
/lib/se-context.h
|
||||
/lib/se-selinux.h
|
||||
/lib/selinux
|
||||
/lib/signal.h
|
||||
/lib/spawn.h
|
||||
/lib/stamp-h1
|
||||
/lib/stdalign.h
|
||||
/lib/stdarg.h
|
||||
/lib/stdbool.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/unistd.h
|
||||
/lib/unistr
|
||||
/lib/unistr.h
|
||||
/lib/unitypes.h
|
||||
/lib/uniwidth
|
||||
/lib/uniwidth.h
|
||||
/lib/unused-parameter.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_symlinks
|
||||
/src/coreutils_shebangs
|
||||
/src/cu-progs.mk
|
||||
/src/fs-latest-magic.h
|
||||
/src/libsinglebin_*.a
|
||||
/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
|
||||
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
|
||||
|
||||
43
.mailmap
43
.mailmap
@@ -1,43 +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>
|
||||
|
||||
# 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 @@
|
||||
8.25
|
||||
8.0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Suppress valgrind diagnostics we don't care about.
|
||||
|
||||
# Copyright (C) 2003-2016 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
|
||||
|
||||
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,4 +0,0 @@
|
||||
^COPYING$
|
||||
^bootstrap$
|
||||
^man/help2man$
|
||||
^tests/init\.sh$
|
||||
29
AUTHORS
29
AUTHORS
@@ -2,11 +2,9 @@ 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: Padraig Brady, Samuel Neves
|
||||
base32: Simon Josefsson
|
||||
base64: Simon Josefsson
|
||||
basename: David MacKenzie
|
||||
cat: Torbjorn Granlund, Richard M. Stallman
|
||||
cat: Torbjörn Granlund, Richard M. Stallman
|
||||
chcon: Russell Coker, Jim Meyering
|
||||
chgrp: David MacKenzie, Jim Meyering
|
||||
chmod: David MacKenzie, Jim Meyering
|
||||
@@ -14,22 +12,21 @@ chown: David MacKenzie, Jim Meyering
|
||||
chroot: Roland McGrath
|
||||
cksum: Q. Frank Xia
|
||||
comm: Richard M. Stallman, David MacKenzie
|
||||
coreutils: Alex Deymo
|
||||
cp: Torbjorn Granlund, David MacKenzie, Jim Meyering
|
||||
cp: Torbjörn Granlund, David MacKenzie, Jim Meyering
|
||||
csplit: Stuart Kemp, David MacKenzie
|
||||
cut: David M. Ihnat, David MacKenzie, Jim Meyering
|
||||
date: David MacKenzie
|
||||
dd: Paul Rubin, David MacKenzie, Stuart Kemp
|
||||
df: Torbjorn Granlund, David MacKenzie, Paul Eggert
|
||||
df: Torbjörn Granlund, David MacKenzie, Paul Eggert
|
||||
dir: Richard M. Stallman, David MacKenzie
|
||||
dircolors: H. Peter Anvin
|
||||
dirname: David MacKenzie, Jim Meyering
|
||||
du: Torbjorn Granlund, David MacKenzie, Paul Eggert, Jim Meyering
|
||||
du: Torbjörn Granlund, David MacKenzie, Paul Eggert, Jim Meyering
|
||||
echo: Brian Fox, Chet Ramey
|
||||
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
|
||||
@@ -49,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
|
||||
@@ -66,7 +61,6 @@ printf: David MacKenzie
|
||||
ptx: François Pinard
|
||||
pwd: Jim Meyering
|
||||
readlink: Dmitry V. Levin
|
||||
realpath: Padraig Brady
|
||||
rm: Paul Rubin, David MacKenzie, Richard M. Stallman, Jim Meyering
|
||||
rmdir: David MacKenzie
|
||||
runcon: Russell Coker
|
||||
@@ -80,21 +74,22 @@ shred: Colin Plumb
|
||||
shuf: Paul Eggert
|
||||
sleep: Jim Meyering, Paul Eggert
|
||||
sort: Mike Haertel, Paul Eggert
|
||||
split: Torbjorn Granlund, Richard M. Stallman
|
||||
split: Torbjörn Granlund, Richard M. Stallman
|
||||
stat: Michael Meskes
|
||||
stdbuf: Padraig Brady
|
||||
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
|
||||
test: Kevin Braunsdorf, Matthew Bradburn
|
||||
timeout: Padraig Brady
|
||||
timeout: Pádraig Brady
|
||||
touch: Paul Rubin, Arnold Robbins, Jim Kingdon, David MacKenzie, Randy Smith
|
||||
tr: Jim Meyering
|
||||
true: Jim Meyering
|
||||
truncate: Padraig Brady
|
||||
truncate: Pádraig Brady
|
||||
tsort: Mark Kettenis
|
||||
tty: David MacKenzie
|
||||
uname: David MacKenzie
|
||||
|
||||
@@ -1206,7 +1206,7 @@
|
||||
* tests/Coreutils.pm: New keywords, ENV and ENV_DEL, to support
|
||||
tests/misc/date.
|
||||
|
||||
With today's additions, the generated shell script,
|
||||
With todays additions, the generated shell script,
|
||||
tests/date/date-tests had becoming far too large (over 350KB),
|
||||
so use the superior-but-perl-requiring framework instead.
|
||||
* tests/date/Test.pm: Move all tests from here...
|
||||
@@ -9086,7 +9086,7 @@
|
||||
|
||||
split's --verbose option did nothing [broken in 4.5.10 and 5.0]
|
||||
* src/split.c (longopts): Use `1', not `0' as the value for
|
||||
&verbose. Reported by Keith Thompson.
|
||||
for &verbose. Reported by Keith Thompson.
|
||||
|
||||
Test for the above fix.
|
||||
* tests/misc/split-a: Also use --verbose and compare stderr
|
||||
@@ -11609,7 +11609,7 @@
|
||||
|
||||
-----
|
||||
|
||||
Copyright (C) 2002-2016 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2003, 2004, 2005, 2009 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without
|
||||
modification, are permitted provided the copyright notice
|
||||
|
||||
@@ -4033,7 +4033,7 @@
|
||||
|
||||
-----
|
||||
|
||||
Copyright (C) 2006-2016 Free Software Foundation, Inc.
|
||||
Copyright (C) 2006, 2009 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without
|
||||
modification, are permitted provided the copyright notice
|
||||
|
||||
@@ -3262,7 +3262,7 @@
|
||||
|
||||
rm without -f: give a better diagnostic when euidaccess fails.
|
||||
* src/remove.c (write_protected_non_symlink): Return int, not bool,
|
||||
so that we can indicate failure too (as a positive error number).
|
||||
so that we can indicate failure too (as a postive error number).
|
||||
(prompt): If write_protected_non_symlink fails, report that error
|
||||
number and fail rather than charging ahead and removing the dubious
|
||||
entry. Redo the logic of printing a diagnostic so that we need to
|
||||
@@ -4015,7 +4015,7 @@
|
||||
|
||||
-----
|
||||
|
||||
Copyright (C) 2007-2016 Free Software Foundation, Inc.
|
||||
Copyright (C) 2007, 2009 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without
|
||||
modification, are permitted provided the copyright notice
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
(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/350541>
|
||||
Suggested by Josselin Mouette in <http://bugs.debian.org/363011>
|
||||
via Bob Proulx.
|
||||
* NEWS: Mention the improvement.
|
||||
|
||||
@@ -372,7 +372,7 @@
|
||||
|
||||
-----
|
||||
|
||||
Copyright (C) 2008-2016 Free Software Foundation, Inc.
|
||||
Copyright (C) 2008-2009 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without
|
||||
modification, are permitted provided the copyright notice
|
||||
|
||||
180
HACKING
180
HACKING
@@ -21,7 +21,6 @@ Base any changes you make on the latest upstream sources.
|
||||
You can get a copy of the latest with this command:
|
||||
|
||||
git clone git://git.sv.gnu.org/coreutils
|
||||
cd coreutils
|
||||
|
||||
That downloads the entire repository, including revision control history
|
||||
dating back to 1991. The repository (the part you download, and which
|
||||
@@ -120,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:
|
||||
|
||||
@@ -235,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
|
||||
==========================================
|
||||
@@ -363,26 +248,11 @@ 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
|
||||
===================================================
|
||||
@@ -440,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 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
|
||||
@@ -480,12 +338,12 @@ 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:
|
||||
|
||||
http://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:
|
||||
|
||||
http://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.
|
||||
|
||||
@@ -509,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
|
||||
@@ -523,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:
|
||||
|
||||
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
|
||||
@@ -610,8 +472,8 @@ to generate HTML coverage reports. Follow these steps:
|
||||
# run whatever tests you want, i.e.:
|
||||
make check
|
||||
# run lcov
|
||||
lcov -t coreutils -q -d lib -b `pwd` -o lib.lcov -c
|
||||
lcov -t coreutils -q -d src -b `pwd` -o src.lcov -c
|
||||
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
|
||||
|
||||
@@ -619,11 +481,11 @@ Then just open the index.html file (in the generated lcov-html directory)
|
||||
in your favorite web browser.
|
||||
|
||||
========================================================================
|
||||
Copyright (C) 2009-2016 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.
|
||||
|
||||
168
Makefile.am
168
Makefile.am
@@ -1,6 +1,6 @@
|
||||
# Make coreutils. -*-Makefile-*-
|
||||
|
||||
# Copyright (C) 1990-2016 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
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
ALL_RECURSIVE_TARGETS =
|
||||
|
||||
SUBDIRS = po . gnulib-tests
|
||||
SUBDIRS = lib src doc man po tests gnulib-tests
|
||||
|
||||
changelog_etc = \
|
||||
ChangeLog-2005 \
|
||||
@@ -25,6 +25,7 @@ changelog_etc = \
|
||||
ChangeLog-2007 \
|
||||
ChangeLog-2008 \
|
||||
build-aux/ChangeLog-2007 \
|
||||
build-aux/update-copyright \
|
||||
doc/ChangeLog-2007 \
|
||||
lib/ChangeLog-2007 \
|
||||
m4/ChangeLog-2007 \
|
||||
@@ -38,58 +39,58 @@ changelog_etc = \
|
||||
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 = \
|
||||
$(changelog_etc) \
|
||||
.mailmap \
|
||||
$(syntax_check_exceptions) \
|
||||
.prev-version \
|
||||
.version \
|
||||
.vg-suppressions \
|
||||
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 = \
|
||||
@@ -99,29 +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.
|
||||
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)perl -pi -e '$(rm_subst)' $(distdir)/src/Makefile.in
|
||||
|
||||
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 --since=$(gen_start_date) > $(distdir)/cl-t && \
|
||||
{ rm -f $(distdir)/ChangeLog && \
|
||||
mv $(distdir)/cl-t $(distdir)/ChangeLog; } \
|
||||
--since=$(gen_start_date) > $(distdir)/cl-t; \
|
||||
rm -f $(distdir)/ChangeLog; \
|
||||
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
|
||||
fi
|
||||
|
||||
ALL_RECURSIVE_TARGETS += distcheck-hook
|
||||
@@ -152,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
|
||||
|
||||
94
README
94
README
@@ -7,15 +7,15 @@ arbitrary limits.
|
||||
|
||||
The programs that can be built with this package are:
|
||||
|
||||
[ arch b2sum base32 base64 basename 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.
|
||||
|
||||
@@ -59,9 +59,9 @@ files (man/*.x) are welcome. However, the authoritative documentation
|
||||
is in texinfo form in the doc directory.
|
||||
|
||||
|
||||
*********************************************
|
||||
*****************************************
|
||||
On Mac OS X 10.5.1 (Darwin 9.1), test failure
|
||||
---------------------------------------------
|
||||
-----------------------------------------
|
||||
|
||||
Mac OS X 10.5.1 (Darwin 9.1) provides only partial (and incompatible)
|
||||
ACL support, so although "./configure && make" succeeds, "make check"
|
||||
@@ -82,19 +82,24 @@ 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
|
||||
---------------------
|
||||
-----------------------
|
||||
|
||||
In 2009 we added this requirement:
|
||||
To build the coreutils from source, you must have a C99-conforming
|
||||
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.
|
||||
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.
|
||||
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! ;-)
|
||||
|
||||
|
||||
***********************
|
||||
@@ -102,7 +107,7 @@ 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
|
||||
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
|
||||
@@ -129,25 +134,17 @@ the best solution is to use GNU make. Otherwise, simply remove
|
||||
all mention of "[$(EXEEXT)" from src/Makefile.
|
||||
|
||||
|
||||
*************************************************
|
||||
"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.
|
||||
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
|
||||
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
|
||||
@@ -165,26 +162,20 @@ 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.
|
||||
|
||||
If you have a problem with 'sort', try running 'sort --debug', as it
|
||||
can 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, you can get even more detail by adding DEBUG=yes.
|
||||
Then include the contents of the file 'log' in your bug report.
|
||||
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.
|
||||
|
||||
***************************************
|
||||
|
||||
@@ -208,11 +199,9 @@ Here are instructions for checking out the latest development sources:
|
||||
|
||||
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
|
||||
coreutils@gnu.org including as much description and justification
|
||||
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. Please also consult the list of
|
||||
previously discussed but ultimately rejected feature requests at:
|
||||
http://www.gnu.org/software/coreutils/rejected_requests.html
|
||||
convince us that it's worth adding.
|
||||
|
||||
|
||||
WARNING: Now that we use the ./bootstrap script, you should not run
|
||||
@@ -226,7 +215,7 @@ 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.
|
||||
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.
|
||||
|
||||
@@ -234,20 +223,17 @@ For general documentation on the coding and usage 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.
|
||||
|
||||
|
||||
========================================================================
|
||||
|
||||
Copyright (C) 1998-2016 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.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
These notes intend to help people working on the checked-out sources.
|
||||
These requirements do not apply when building from a distribution tarball.
|
||||
See also HACKING for more detailed contribution guidelines.
|
||||
See also HACKING for more detailed coreutils contribution guidelines.
|
||||
|
||||
* Requirements
|
||||
|
||||
@@ -19,7 +19,7 @@ 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' should be sufficient.
|
||||
few prerequisites, later, a plain `git pull && make' should be sufficient.
|
||||
|
||||
* First GIT checkout
|
||||
|
||||
@@ -28,26 +28,14 @@ You can get a copy of the source repository like this:
|
||||
$ git clone git://git.sv.gnu.org/coreutils
|
||||
$ cd coreutils
|
||||
|
||||
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 disk space requirements:
|
||||
|
||||
$ export GNULIB_SRCDIR=/path/to/gnulib
|
||||
|
||||
The next step is to get and check other files needed to build,
|
||||
which are extracted from other source packages:
|
||||
|
||||
$ ./bootstrap
|
||||
|
||||
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
|
||||
|
||||
And there you are! Just
|
||||
|
||||
$ ./configure --quiet #[--enable-gcc-warnings] [*]
|
||||
$ ./configure #[--enable-gcc-warnings]
|
||||
$ make
|
||||
$ make check
|
||||
|
||||
@@ -60,41 +48,9 @@ should output no difference.
|
||||
|
||||
Enjoy!
|
||||
|
||||
[*] The --enable-gcc-warnings option is useful only with glibc
|
||||
and with a very recent version of gcc. You'll probably also have
|
||||
to use recent system headers. If you configure with this option,
|
||||
and spot a problem, please be sure to send the report to the bug
|
||||
reporting address of this package, and not to that of gnulib, even
|
||||
if the problem seems to originate in a gnulib-provided file.
|
||||
|
||||
* 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
|
||||
<http://www.gnu.org/software/vc-dwim/>), as follows.
|
||||
|
||||
Run the command "vc-dwim --help", copy its definition of the
|
||||
"git-changelog-symlink-init" function into your shell, and then run
|
||||
this function at the top-level directory of the package.
|
||||
|
||||
Edit the (empty) ChangeLog file that this command creates, creating a
|
||||
properly-formatted entry according to the GNU coding standards
|
||||
<http://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-2016 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
|
||||
|
||||
@@ -10,12 +10,9 @@ coreutils package, see these:
|
||||
|
||||
http://mail.gnu.org/mailman/listinfo/coreutils-announce
|
||||
http://mail.gnu.org/mailman/listinfo/bug-coreutils
|
||||
http://mail.gnu.org/mailman/listinfo/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)
|
||||
http://news.gmane.org/gmane.comp.gnu.coreutils.general
|
||||
http://mail.gnu.org/pipermail/coreutils/ (updated every 12 hours)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
This gives some notes on obtaining the tools required for development.
|
||||
I.e., the tools checked for by the bootstrap script and include:
|
||||
I.E. the tools checked for by the bootstrap script and include:
|
||||
|
||||
- Autoconf <http://www.gnu.org/software/autoconf/>
|
||||
- Automake <http://www.gnu.org/software/automake/>
|
||||
@@ -14,29 +14,18 @@ I.e., the tools checked for by the bootstrap script and include:
|
||||
- Texinfo <http://www.gnu.org/software/texinfo/>
|
||||
|
||||
Note please try to install/build official packages for your system.
|
||||
If these programs are not available use the following instructions
|
||||
to build them and install the results into a directory that you will
|
||||
then use when building this package.
|
||||
|
||||
Even if the official version of a package for your system is too old,
|
||||
please install it, as it may be required to build the newer versions.
|
||||
The examples below install into $HOME/coreutils/deps/, so if you are
|
||||
going to follow these instructions, first ensure that your $PATH is
|
||||
set correctly by running this command:
|
||||
|
||||
prefix=$HOME/coreutils/deps
|
||||
export PATH=$prefix/bin:$PATH
|
||||
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.
|
||||
|
||||
* autoconf *
|
||||
|
||||
# Note Autoconf 2.62 or newer is needed to build automake-1.11.2
|
||||
# but we specify 2.64 here as that's what coreutils requires.
|
||||
# Please use the latest stable release version as indicated by git tags.
|
||||
# Note Autoconf 2.62 or newer is needed to build automake-1.11
|
||||
git clone --depth=1 git://git.sv.gnu.org/autoconf.git
|
||||
cd autoconf
|
||||
git checkout v2.64
|
||||
git checkout v2.62
|
||||
autoreconf -vi
|
||||
./configure --prefix=$prefix
|
||||
./configure --prefix=$HOME/coreutils/deps
|
||||
make install
|
||||
|
||||
* automake *
|
||||
@@ -44,12 +33,12 @@ set correctly by running this command:
|
||||
# Note help2man is required to build automake fully
|
||||
git clone git://git.sv.gnu.org/automake.git
|
||||
cd automake
|
||||
git checkout v1.11.2
|
||||
git checkout -b branch-1.11 --track origin/branch-1.11
|
||||
./bootstrap
|
||||
./configure --prefix=$prefix
|
||||
./configure --prefix=$HOME/coreutils/deps
|
||||
make install
|
||||
|
||||
This package uses XZ utils (successor to LZMA) to create
|
||||
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.
|
||||
|
||||
@@ -58,7 +47,10 @@ requires version 1.10a or newer, as well as the xz program itself.
|
||||
git clone git://ctrl.tukaani.org/xz.git
|
||||
cd xz
|
||||
./autogen.sh
|
||||
./configure --prefix=$prefix
|
||||
./configure --prefix=$HOME/coreutils/deps
|
||||
make install
|
||||
|
||||
Now you can build this package as described in README-hacking.
|
||||
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
|
||||
|
||||
114
README-release
114
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:
|
||||
|
||||
http://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:
|
||||
http://lists.gnu.org/mailman/admindb/coreutils-announce
|
||||
|
||||
* After each non-alpha release, update the on-line manual accessible via
|
||||
|
||||
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-2016 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
|
||||
@@ -16,34 +16,26 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# 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='--supressions=/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,34 +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
|
||||
@@ -36,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
|
||||
@@ -60,20 +49,18 @@ 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://barrkel.blogspot.com/
|
||||
Bauke Jan Douma bjdouma@xs4all.nl
|
||||
@@ -81,6 +68,7 @@ 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
|
||||
@@ -88,50 +76,48 @@ 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 http://www.cray-cyber.org
|
||||
Cristian Cadar cristic@stanford.edu
|
||||
@@ -139,35 +125,30 @@ 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
|
||||
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,29 +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
|
||||
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 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
|
||||
@@ -207,7 +191,6 @@ 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 T Lofaro ftlofaro@snooks.Egr.UNLV.EDU
|
||||
Fred Fish fnf@ninemoons.com
|
||||
@@ -228,6 +211,8 @@ 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
|
||||
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
|
||||
@@ -238,7 +223,6 @@ 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
|
||||
@@ -253,8 +237,8 @@ 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
|
||||
@@ -262,16 +246,16 @@ Ian Turner vectro@pipeline.com
|
||||
Iida Yosiaki iida@gnu.org
|
||||
Ilya N. Golubev gin@mo.msk.ru
|
||||
Ingo Saitz ingo@debian.org
|
||||
Ivan Labath labath3@st.fmph.uniba.sk
|
||||
Ivo Timmermans ivo@debian.org
|
||||
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
|
||||
@@ -279,19 +263,15 @@ 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
|
||||
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
|
||||
@@ -299,15 +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
|
||||
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
|
||||
@@ -315,14 +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
|
||||
Josef Cejka jcejka@suse.com
|
||||
Joseph D. Wagner joe@josephdwagner.info
|
||||
Joseph S. Myers jsm28@cam.ac.uk
|
||||
Josh Triplett josh@freedesktop.org
|
||||
Joshua Hudson joshudson@gmail.com
|
||||
@@ -330,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
|
||||
@@ -342,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 kst@cts.com
|
||||
Ken Irving ken.irving@alaska.edu
|
||||
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
|
||||
@@ -374,9 +347,7 @@ 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 http://www.comp.nus.edu.sg/~mboehme
|
||||
Marco Franzen Marco.Franzen@Thyron.com
|
||||
Marcus Brinkmann http://www.marcus-brinkmann.de
|
||||
Marcus Daniels marcus@ee.pdx.edu
|
||||
@@ -389,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
|
||||
@@ -406,63 +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
|
||||
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 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
|
||||
@@ -471,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
|
||||
@@ -486,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
|
||||
@@ -539,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
|
||||
@@ -558,48 +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
|
||||
@@ -612,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
|
||||
@@ -626,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
|
||||
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
|
||||
@@ -638,7 +590,6 @@ Ulrich Hermisson ulrich_hermisson@hotmail.com
|
||||
Urs Thuermann urs@isnogud.escape.de
|
||||
Uwe H. Steinfeld usteinfeld@gmx.net
|
||||
Vesselin Atanasov vesselin@bgnet.bg
|
||||
Ville Skyttä ville.skytta@iki.fi
|
||||
Vin Shelton acs@alumni.princeton.edu
|
||||
Vineet Chadha chadha@acis.ufl.edu
|
||||
Vitali Lovich vlovich@gmail.com
|
||||
@@ -661,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
|
||||
38
TODO
38
TODO
@@ -12,6 +12,7 @@ Modify chmod so that it does not change an inode's st_ctime
|
||||
Discussed more recently on <http://bugs.debian.org/497514>.
|
||||
|
||||
document the following in coreutils.texi:
|
||||
mktemp
|
||||
[
|
||||
pinky
|
||||
|
||||
@@ -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,8 +45,11 @@ 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.
|
||||
|
||||
@@ -55,6 +60,10 @@ Integrate use of sendfile, suggested here:
|
||||
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
|
||||
@@ -111,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
|
||||
@@ -120,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
|
||||
@@ -140,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-2016 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
|
||||
|
||||
184
bootstrap.conf
184
bootstrap.conf
@@ -1,6 +1,6 @@
|
||||
# Bootstrap configuration.
|
||||
|
||||
# Copyright (C) 2006-2016 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
|
||||
@@ -22,11 +22,24 @@ avoided_gnulib_modules='
|
||||
--avoid=dummy
|
||||
'
|
||||
|
||||
# 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
|
||||
alignof
|
||||
alloca
|
||||
announce-gen
|
||||
areadlink-with-size
|
||||
@@ -36,12 +49,10 @@ gnulib_modules="
|
||||
autobuild
|
||||
backupfile
|
||||
base64
|
||||
base32
|
||||
buffer-lcm
|
||||
c-strcase
|
||||
c-strtod
|
||||
c-strtold
|
||||
calloc-gnu
|
||||
calloc
|
||||
canon-host
|
||||
canonicalize
|
||||
chown
|
||||
@@ -57,63 +68,44 @@ gnulib_modules="
|
||||
cycle-check
|
||||
d-ino
|
||||
d-type
|
||||
di-set
|
||||
diacrit
|
||||
dirfd
|
||||
dirname
|
||||
do-release-commit-and-tag
|
||||
dtoastr
|
||||
dup2
|
||||
environ
|
||||
error
|
||||
euidaccess
|
||||
exclude
|
||||
exitfail
|
||||
faccessat
|
||||
fadvise
|
||||
fchdir
|
||||
fchmodat
|
||||
fchownat
|
||||
fclose
|
||||
fcntl
|
||||
fcntl-safer
|
||||
fd-reopen
|
||||
fdatasync
|
||||
fdl
|
||||
fdopen
|
||||
fdutimensat
|
||||
file-has-acl
|
||||
file-type
|
||||
fileblocks
|
||||
filemode
|
||||
filenamecat
|
||||
filevercmp
|
||||
flexmember
|
||||
fnmatch-gnu
|
||||
fopen-safer
|
||||
fprintftime
|
||||
freopen
|
||||
freopen-safer
|
||||
fseeko
|
||||
fstatat
|
||||
fsusage
|
||||
fsync
|
||||
ftello
|
||||
ftoastr
|
||||
ftruncate
|
||||
fts
|
||||
full-read
|
||||
full-write
|
||||
getdate
|
||||
getgroups
|
||||
gethrxtime
|
||||
getline
|
||||
getloadavg
|
||||
getlogin
|
||||
getndelim2
|
||||
getopt-gnu
|
||||
getpagesize
|
||||
getpass-gnu
|
||||
gettext-h
|
||||
gettext
|
||||
gettime
|
||||
gettimeofday
|
||||
getugroups
|
||||
@@ -128,7 +120,6 @@ gnulib_modules="
|
||||
hard-locale
|
||||
hash
|
||||
hash-pjw
|
||||
heap
|
||||
host-os
|
||||
human
|
||||
idcache
|
||||
@@ -136,12 +127,8 @@ gnulib_modules="
|
||||
inttostr
|
||||
inttypes
|
||||
isapipe
|
||||
isatty
|
||||
isblank
|
||||
largefile
|
||||
lchmod
|
||||
lchown
|
||||
ldtoastr
|
||||
lib-ignore
|
||||
linebuffer
|
||||
link
|
||||
@@ -150,9 +137,8 @@ gnulib_modules="
|
||||
long-options
|
||||
lstat
|
||||
maintainer-makefile
|
||||
malloc-gnu
|
||||
malloc
|
||||
manywarnings
|
||||
mbrlen
|
||||
mbrtowc
|
||||
mbsalign
|
||||
mbswidth
|
||||
@@ -165,43 +151,35 @@ gnulib_modules="
|
||||
mkancesdirs
|
||||
mkdir
|
||||
mkdir-p
|
||||
mkfifo
|
||||
mknod
|
||||
mkstemp
|
||||
mktime
|
||||
modechange
|
||||
mountlist
|
||||
mpsort
|
||||
netinet_in
|
||||
non-recursive-gnulib-prefix-hack
|
||||
nproc
|
||||
obstack
|
||||
parse-datetime
|
||||
pathmax
|
||||
perl
|
||||
physmem
|
||||
pipe-posix
|
||||
posix-shell
|
||||
posixtm
|
||||
posixver
|
||||
priv-set
|
||||
progname
|
||||
propername
|
||||
pthread
|
||||
putenv
|
||||
quote
|
||||
quotearg
|
||||
raise
|
||||
randint
|
||||
randperm
|
||||
read-file
|
||||
readlink
|
||||
readtokens
|
||||
readtokens0
|
||||
readutmp
|
||||
realloc-gnu
|
||||
realloc
|
||||
regex
|
||||
remove
|
||||
rename
|
||||
rename-dest-slash
|
||||
rmdir
|
||||
root-dev-ino
|
||||
rpmatch
|
||||
@@ -211,15 +189,11 @@ gnulib_modules="
|
||||
savedir
|
||||
savewd
|
||||
selinux-at
|
||||
setenv
|
||||
settime
|
||||
sig2str
|
||||
sigaction
|
||||
smack
|
||||
ssize_t
|
||||
statat
|
||||
stat-macros
|
||||
stat-size
|
||||
stat-time
|
||||
stdbool
|
||||
stdlib-safer
|
||||
@@ -227,31 +201,20 @@ gnulib_modules="
|
||||
stpncpy
|
||||
strdup-posix
|
||||
strftime
|
||||
strncat
|
||||
strnumcmp
|
||||
strpbrk
|
||||
strsignal
|
||||
strtod
|
||||
strtoimax
|
||||
strtoumax
|
||||
strverscmp
|
||||
symlink
|
||||
sys_ioctl
|
||||
sys_resource
|
||||
sys_stat
|
||||
sys_wait
|
||||
tempname
|
||||
termios
|
||||
time_rz
|
||||
timer-time
|
||||
timespec
|
||||
tzset
|
||||
uname
|
||||
unicodeio
|
||||
unistd-safer
|
||||
unlink-busy
|
||||
unlinkat
|
||||
unlocked-io
|
||||
unsetenv
|
||||
update-copyright
|
||||
uptime
|
||||
useless-if-before-free
|
||||
@@ -263,23 +226,20 @@ gnulib_modules="
|
||||
verify
|
||||
verror
|
||||
version-etc-fsf
|
||||
wcswidth
|
||||
warnings
|
||||
wcwidth
|
||||
winsz-ioctl
|
||||
winsz-termios
|
||||
write-any-file
|
||||
xalloc
|
||||
xfreopen
|
||||
xfts
|
||||
xgetcwd
|
||||
xgetgroups
|
||||
xgethostname
|
||||
xmemcoll
|
||||
xnanosleep
|
||||
xprintf
|
||||
xprintf-posix
|
||||
xreadlink
|
||||
xdectoint
|
||||
xstrtod
|
||||
xstrtoimax
|
||||
xstrtol
|
||||
@@ -316,77 +276,57 @@ XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
|
||||
--keyword=proper_name_utf8:1,'"$see_manual"'\\\
|
||||
'
|
||||
|
||||
gnulib_tool_option_extras="--tests-base=gnulib-tests --with-tests --symlink\
|
||||
--makefile-name=gnulib.mk
|
||||
"
|
||||
# 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 -
|
||||
makeinfo 4.13
|
||||
patch -
|
||||
makeinfo -
|
||||
perl 5.5
|
||||
rsync -
|
||||
tar -
|
||||
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)
|
||||
|
||||
# Massage lib/gnulib.mk before using it later in the bootstrapping process.
|
||||
build-aux/prefix-gnulib-mk --lib-name=$gnulib_name lib/$gnulib_mk
|
||||
|
||||
# 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
|
||||
|
||||
# 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
|
||||
}
|
||||
|
||||
@@ -234,7 +234,7 @@
|
||||
|
||||
-----
|
||||
|
||||
Copyright (C) 2002-2016 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002-2009 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without
|
||||
modification, are permitted provided the copyright notice
|
||||
|
||||
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,195 +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
|
||||
uptime
|
||||
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
|
||||
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
|
||||
timeout
|
||||
touch
|
||||
tr
|
||||
true
|
||||
truncate
|
||||
tsort
|
||||
tty
|
||||
uname
|
||||
unexpand
|
||||
uniq
|
||||
unlink
|
||||
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,111 +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_\w+ +\+?=' > /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 dir and vdir. We use a smaller version of dir and
|
||||
# vdir that relies on the ls main.
|
||||
src_dir_SOURCES="src/coreutils-dir.c"
|
||||
src_dir_LDADD="$src_dir_LDADD src/libsinglebin_ls.a"
|
||||
echo src_libsinglebin_dir_a_DEPENDENCIES = src/libsinglebin_ls.a
|
||||
src_vdir_SOURCES="src/coreutils-vdir.c"
|
||||
src_vdir_LDADD="$src_vdir_LDADD src/libsinglebin_ls.a"
|
||||
echo src_libsinglebin_vdir_a_DEPENDENCIES = src/libsinglebin_ls.a
|
||||
|
||||
# Override the sources for arch likewise, using the main from uname.
|
||||
src_arch_SOURCES="src/coreutils-arch.c"
|
||||
src_arch_LDADD="$src_arch_LDADD src/libsinglebin_uname.a"
|
||||
echo src_libsinglebin_arch_a_DEPENDENCIES = src/libsinglebin_uname.a
|
||||
|
||||
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
|
||||
|
||||
# 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,57 +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.
|
||||
|
||||
3a169f4c5d9159283548178668d2fae6fced3030
|
||||
# fix title:
|
||||
s/all tile types/all file types/
|
||||
|
||||
e181802521d4e19e367dbe8cfa877296bb5dafb2
|
||||
# fix the title!
|
||||
s,seq:,factor:,
|
||||
|
||||
3ece0355d52e41a1b079c0c46477a32250278c11
|
||||
# correct the URL
|
||||
s,<http.+?>,<http://bugs.debian.org/412688>,
|
||||
|
||||
# This is wrong now only in the git log. The ChangeLog-2008
|
||||
# entry was also erroneous, but has been corrected.
|
||||
# ed5c4e770a27862813c0182be8680abeb005d15b
|
||||
# # Wrong bug ID:
|
||||
# s,/363011,/350541,
|
||||
# # in this:
|
||||
# # Suggested by Josselin Mouette in <http://bugs.debian.org/363011>
|
||||
|
||||
# This was wrong only in the git log. The ChangeLog entry was
|
||||
# is from 2007, and so was recorded (correctly) in ChangeLog-2007.
|
||||
# 1379ed974f1fa39b12e2ffab18b3f7a607082202
|
||||
# # Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself.
|
||||
# # Change the author to be Paul. Note the escaped "@":
|
||||
# s,Jim .*>,Paul Eggert <eggert\@cs.ucla.edu>,
|
||||
|
||||
209850fd7e1e89cf8937310878bd22d70e3588a5
|
||||
s/isspace/isblank/
|
||||
# in this:
|
||||
# * tests/misc/uniq: New file. Test for the above, but only
|
||||
# when isspace(0240).
|
||||
|
||||
760bc6f7e73014e934a744a9d46ea8dbf5ba25c8
|
||||
s/Now, each/Now, the/;
|
||||
s!(elicits.*)\.!first $1, and the second works properly.!
|
||||
# change the log from this:
|
||||
# Without this, `truncate -s '> -1' F` would truncate F to length 0,
|
||||
# and `truncate -s " +1" F` would truncate F to 1 byte. Now, each
|
||||
# elicits a diagnostic.
|
||||
# to this:
|
||||
# Without this, `truncate -s '> -1' F` would truncate F to length 0,
|
||||
# and `truncate -s " +1" F` would truncate F to 1 byte. Now, the
|
||||
# first elicits a diagnostic, and the second works properly.
|
||||
|
||||
# Credit initial reporter of a related issue, now that the BZ is public.
|
||||
1e18d8416f9ef43bf08982cabe54220587061a08
|
||||
s,by ,by Nao Nishijima in http://bugzilla.redhat.com/766461\nand by ,
|
||||
|
||||
# I was unable to apply the c-set using normal methods, so
|
||||
# applied it with patch and then forgot to reset the Author.
|
||||
51a4b04954ad5ad12de1d1b82a3603fc350a3bfa
|
||||
s,Jim .*>,Ondrej Oprala <ooprala\@redhat.com>,
|
||||
901
cfg.mk
901
cfg.mk
@@ -1,5 +1,5 @@
|
||||
# Customize maint.mk -*- makefile -*-
|
||||
# Copyright (C) 2003-2016 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2003-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,19 +14,24 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Use alpha.gnu.org for alpha and beta releases.
|
||||
# Use ftp.gnu.org for major releases.
|
||||
gnu_ftp_host-alpha = alpha.gnu.org
|
||||
gnu_ftp_host-beta = alpha.gnu.org
|
||||
gnu_ftp_host-major = ftp.gnu.org
|
||||
gnu_rel_host = $(gnu_ftp_host-$(RELEASE_TYPE))
|
||||
|
||||
# Used in maint.mk's web-manual rule
|
||||
manual_title = Core GNU utilities
|
||||
|
||||
# Use the direct link. This is guaranteed to work immediately, while
|
||||
# it can take a while for the faster mirror links to become usable.
|
||||
url_dir_list = http://ftp.gnu.org/gnu/$(PACKAGE)
|
||||
url_dir_list = \
|
||||
ftp://$(gnu_rel_host)/gnu/$(PACKAGE)
|
||||
|
||||
# Exclude bundled external projects from syntax checks
|
||||
VC_LIST_ALWAYS_EXCLUDE_REGEX = src/blake2/.*$$
|
||||
# The GnuPG ID of the key used to sign the tarballs.
|
||||
gpg_key_ID = B9AB9A16
|
||||
|
||||
# Tests not to run as part of "make distcheck".
|
||||
local-checks-to-skip = \
|
||||
sc_proper_name_utf8_requires_ICONV
|
||||
local-checks-to-skip =
|
||||
|
||||
# Tools used to bootstrap this package, used for "announcement".
|
||||
bootstrap-tools = autoconf,automake,gnulib,bison
|
||||
@@ -34,41 +39,21 @@ bootstrap-tools = autoconf,automake,gnulib,bison
|
||||
# Now that we have better tests, make this the default.
|
||||
export VERBOSE = yes
|
||||
|
||||
# Comparing tarball sizes compressed using different xz presets, we see that
|
||||
# an -8e-compressed tarball is only 9KiB larger than the -9e-compressed one.
|
||||
# Using -8e is preferred, since that lets the decompression process use half
|
||||
# the memory (32MiB rather than 64MiB).
|
||||
# $ for i in {7,8,9}{e,}; do \
|
||||
# (n=$(xz -$i < coreutils-8.15*.tar|wc -c);echo $n $i) & done |sort -nr
|
||||
# 5129388 7
|
||||
# 5036524 7e
|
||||
# 5017476 8
|
||||
# 5010604 9
|
||||
# 4923016 8e
|
||||
# 4914152 9e
|
||||
export XZ_OPT = -8e
|
||||
|
||||
old_NEWS_hash = 4cdc662ed636425161a383b9aa85b2eb
|
||||
|
||||
# Add an exemption for sc_makefile_at_at_check.
|
||||
_makefile_at_at_check_exceptions = ' && !/^cu_install_prog/ && !/dynamic-dep/'
|
||||
|
||||
# Our help-version script is in a slightly different location.
|
||||
_hv_file ?= $(srcdir)/tests/misc/help-version
|
||||
old_NEWS_hash = 785e51bc9af87e7eb004f9ba24a0ca27
|
||||
|
||||
# Ensure that the list of O_ symbols used to compute O_FULLBLOCK is complete.
|
||||
dd = $(srcdir)/src/dd.c
|
||||
sc_dd_O_FLAGS:
|
||||
@rm -f $@.1 $@.2
|
||||
@{ echo O_FULLBLOCK; echo O_NOCACHE; \
|
||||
perl -nle '/^ +\| (O_\w*)$$/ and print $$1' $(dd); } | sort > $@.1
|
||||
@{ echo O_FULLBLOCK; perl -nle '/^ +\| (O_\w*)$$/ and print $$1' \
|
||||
$(dd); } | sort > $@.1
|
||||
@{ echo O_NOFOLLOW; perl -nle '/{"[a-z]+",\s*(O_\w+)},/ and print $$1' \
|
||||
$(dd); } | sort > $@.2
|
||||
@diff -u $@.1 $@.2; diff=$$?; \
|
||||
@diff -u $@.1 $@.2 || diff=1 || diff=; \
|
||||
rm -f $@.1 $@.2; \
|
||||
test "$$diff" = 0 \
|
||||
|| { echo '$(ME): $(dd) has inconsistent O_ flag lists'>&2; \
|
||||
exit 1; }
|
||||
test "$$diff" \
|
||||
&& { echo '$(ME): $(dd) has inconsistent O_ flag lists'>&2; \
|
||||
exit 1; } || :
|
||||
|
||||
# Ensure that dd's definition of LONGEST_SYMBOL stays in sync
|
||||
# with the strings from the two affected variables.
|
||||
@@ -77,16 +62,17 @@ sc_dd_max_sym_length:
|
||||
ifneq ($(wildcard $(dd_c)),)
|
||||
@len=$$( (sed -n '/conversions\[\] =$$/,/^};/p' $(dd_c);\
|
||||
sed -n '/flags\[\] =$$/,/^};/p' $(dd_c) ) \
|
||||
|sed -n '/"/s/^[^"]*"\([^"]*\)".*/\1/p'| wc -L);\
|
||||
|sed -n '/"/s/^[^"]*"\([^"]*\)".*/\1/p' \
|
||||
| wc --max-line-length); \
|
||||
max=$$(sed -n '/^#define LONGEST_SYMBOL /s///p' $(dd_c) \
|
||||
|tr -d '"' | wc -L); \
|
||||
|tr -d '"' | wc --max-line-length); \
|
||||
if test "$$len" = "$$max"; then :; else \
|
||||
echo 'dd.c: LONGEST_SYMBOL is not longest' 1>&2; \
|
||||
exit 1; \
|
||||
fi
|
||||
endif
|
||||
|
||||
# Many m4 macros names once began with 'jm_'.
|
||||
# Many m4 macros names once began with `jm_'.
|
||||
# On 2004-04-13, they were all changed to start with gl_ instead.
|
||||
# Make sure that none are inadvertently reintroduced.
|
||||
sc_prohibit_jm_in_m4:
|
||||
@@ -97,59 +83,67 @@ sc_prohibit_jm_in_m4:
|
||||
|
||||
# Ensure that each root-requiring test is run via the "check-root" rule.
|
||||
sc_root_tests:
|
||||
@t1=sc-root.expected; t2=sc-root.actual; \
|
||||
grep -nl '^ *require_root_$$' `$(VC_LIST) tests` | \
|
||||
sed 's|.*/tests/|tests/|' | sort > $$t1; \
|
||||
for t in $(all_root_tests); do echo $$t; done | sort > $$t2; \
|
||||
st=0; diff -u $$t1 $$t2 || st=1; \
|
||||
@if test -d tests \
|
||||
&& grep check-root tests/Makefile.am>/dev/null 2>&1; then \
|
||||
t1=sc-root.expected; t2=sc-root.actual; \
|
||||
grep -nl '^require_root_$$' \
|
||||
$$($(VC_LIST) tests) |sed s,tests/,, |sort > $$t1; \
|
||||
sed -n '/^root_tests =[ ]*\\$$/,/[^\]$$/p' \
|
||||
$(srcdir)/tests/Makefile.am \
|
||||
| sed 's/^ *//;/^root_tests =/d' \
|
||||
| tr -s '\012\\' ' ' | fmt -1 | sort > $$t2; \
|
||||
diff -u $$t1 $$t2 || diff=1 || diff=; \
|
||||
rm -f $$t1 $$t2; \
|
||||
exit $$st
|
||||
test "$$diff" \
|
||||
&& { echo 'tests/Makefile.am: missing check-root action'>&2; \
|
||||
exit 1; } || :; \
|
||||
fi
|
||||
|
||||
# Ensure that all version-controlled test cases are listed in $(all_tests).
|
||||
sc_tests_list_consistency:
|
||||
@bs="\\"; \
|
||||
test_extensions_rx=`echo $(TEST_EXTENSIONS) \
|
||||
| sed -e "s/ /|/g" -e "s/$$bs./$$bs$$bs./g"`; \
|
||||
{ \
|
||||
for t in $(all_tests); do echo $$t; done; \
|
||||
cd $(top_srcdir); \
|
||||
$(SHELL) build-aux/vc-list-files tests \
|
||||
| grep -Ev '^tests/(factor/(run|create-test)|init)\.sh$$' \
|
||||
| $(EGREP) "$$test_extensions_rx\$$"; \
|
||||
} | sort | uniq -u | grep . && exit 1; :
|
||||
# Ensure that the syntax_check_exceptions file list in Makefile.am
|
||||
# stays in sync with corresponding files in the repository.
|
||||
sce = syntax_check_exceptions
|
||||
sc_x_sc_dist_check:
|
||||
@test "$$( ($(VC_LIST) | sed -n '/^.x-sc_/p'; \
|
||||
sed -n '/^$(sce) =[ ]*\\$$/,/[^\]$$/p' \
|
||||
$(srcdir)/Makefile.am \
|
||||
| sed 's/^ *//;/^$(sce) =/d' \
|
||||
| tr -s '\012\\' ' ' | fmt -1 \
|
||||
) | sort | uniq -u)" \
|
||||
&& { echo 'Makefile.am: $(sce) mismatch' >&2; exit 1; } || :;
|
||||
|
||||
# Ensure that all version-controlled test scripts are executable.
|
||||
sc_tests_executable:
|
||||
@set -o noglob 2>/dev/null || set -f; \
|
||||
find_ext="-name '' "`printf -- "-o -name *%s " $(TEST_EXTENSIONS)`;\
|
||||
find $(srcdir)/tests/ \( $$find_ext \) \! -perm -u+x -print \
|
||||
| { sed "s|^$(srcdir)/||"; git ls-files $(srcdir)/tests/; } \
|
||||
| sort | uniq -d \
|
||||
| sed -e "s/^/$(ME): Please make test executable: /" | grep . \
|
||||
&& exit 1; :
|
||||
headers_with_interesting_macro_defs = \
|
||||
exit.h \
|
||||
fcntl_.h \
|
||||
fnmatch_.h \
|
||||
intprops.h \
|
||||
inttypes_.h \
|
||||
lchown.h \
|
||||
openat.h \
|
||||
stat-macros.h \
|
||||
stdint_.h
|
||||
|
||||
# Ensure all gnulib patches apply cleanly
|
||||
sc_ensure_gl_diffs_apply_cleanly:
|
||||
@find $(srcdir)/gl/ -name '*.diff' | while read p; do \
|
||||
patch --fuzz=0 -f -s -d $(srcdir)/gnulib/ -p1 --dry-run < "$$p" >&2 \
|
||||
|| { echo "$$p" >&2; echo 'To refresh all gl patches run:' \
|
||||
'make refresh-gnulib-patches' >&2; exit 1; } \
|
||||
done
|
||||
# Create a list of regular expressions matching the names
|
||||
# of macros that are guaranteed by parts of gnulib to be defined.
|
||||
.re-defmac:
|
||||
@(cd $(srcdir)/lib; \
|
||||
for f in $(headers_with_interesting_macro_defs); do \
|
||||
test -f $$f && \
|
||||
sed -n '/^# *define \([^_ (][^ (]*\)[ (].*/s//\1/p' $$f; \
|
||||
done; \
|
||||
) | sort -u \
|
||||
| grep -Ev 'ATTRIBUTE_NORETURN|SIZE_MAX' \
|
||||
| sed 's/^/^# *define /' \
|
||||
> $@-t
|
||||
@mv $@-t $@
|
||||
|
||||
# Avoid :>file which doesn't propagate errors
|
||||
sc_prohibit_colon_redirection:
|
||||
@cd $(srcdir)/tests && GIT_PAGER= git grep -n ': *>.*||' \
|
||||
&& { echo '$(ME): '"The leading colon in :> will hide errors" 1>&2; \
|
||||
exit 1; } \
|
||||
|| :
|
||||
|
||||
# Ensure emit_mandatory_arg_note() is called if required
|
||||
sc_ensure_emit_mandatory_arg_note:
|
||||
@cd $(srcdir)/src && GIT_PAGER= git \
|
||||
grep -l -- '^ *-[^-].*--.*[^[]=' *.c \
|
||||
| xargs grep -L emit_mandatory_arg_note | grep . \
|
||||
&& { echo '$(ME): '"emit_mandatory_arg_note() missing" 1>&2; \
|
||||
exit 1; } || :
|
||||
# Don't define macros that we already get from gnulib header files.
|
||||
sc_always_defined_macros: .re-defmac
|
||||
@if test -f $(srcdir)/src/system.h; then \
|
||||
trap 'rc=$$?; rm -f .re-defmac; exit $$rc' 0 1 2 3 15; \
|
||||
grep -f .re-defmac $$($(VC_LIST)) \
|
||||
&& { echo '$(ME): define the above via some gnulib .h file' \
|
||||
1>&2; exit 1; } || :; \
|
||||
fi
|
||||
|
||||
# Create a list of regular expressions matching the names
|
||||
# of files included from system.h. Exclude a couple.
|
||||
@@ -160,96 +154,17 @@ sc_ensure_emit_mandatory_arg_note:
|
||||
> $@-t
|
||||
@mv $@-t $@
|
||||
|
||||
define gl_trap_
|
||||
Exit () { set +e; (exit $$1); exit $$1; }; \
|
||||
for sig in 1 2 3 13 15; do \
|
||||
eval "trap 'Exit $$(expr $$sig + 128)' $$sig"; \
|
||||
done
|
||||
endef
|
||||
|
||||
# Files in src/ should not include directly any of
|
||||
# the headers already included via system.h.
|
||||
sc_system_h_headers: .re-list
|
||||
@if test -f $(srcdir)/src/system.h; then \
|
||||
trap 'rc=$$?; rm -f .re-list; exit $$rc' 0; \
|
||||
$(gl_trap_); \
|
||||
trap 'rc=$$?; rm -f .re-list; exit $$rc' 0 1 2 3 15; \
|
||||
grep -nE -f .re-list \
|
||||
$$($(VC_LIST_EXCEPT) | grep '^\($(srcdir)/\)\?src/') \
|
||||
$$($(VC_LIST_EXCEPT) | grep '^src/') \
|
||||
&& { echo '$(ME): the above are already included via system.h'\
|
||||
1>&2; exit 1; } || :; \
|
||||
fi
|
||||
|
||||
# Files in src/ should not use '%s' notation in format strings,
|
||||
# i.e., single quotes around %s (or similar) should be avoided.
|
||||
sc_prohibit_quotes_notation:
|
||||
@cd $(srcdir)/src && GIT_PAGER= git grep -n "\".*[\`']%s'.*\"" *.c \
|
||||
&& { echo '$(ME): '"Use quote() to avoid quoted '%s' notation" 1>&2; \
|
||||
exit 1; } \
|
||||
|| :
|
||||
|
||||
# Files in src/ should quote all strings in error() output, so that
|
||||
# unexpected input chars like \r etc. don't corrupt the error.
|
||||
# In edge cases this can be avoided by putting the format string
|
||||
# on a separate line to the following arguments.
|
||||
sc_error_quotes:
|
||||
@cd $(srcdir)/src && GIT_PAGER= git grep -n 'error *(.*%s.*, [^(]*);$$'\
|
||||
*.c | grep -v ', q' \
|
||||
&& { echo '$(ME): '"Use quote() for error string arguments" 1>&2; \
|
||||
exit 1; } \
|
||||
|| :
|
||||
|
||||
# Files in src/ should quote all file names in error() output
|
||||
# using quotef(), to provide quoting only when necessary,
|
||||
# but also provide better support for copy and paste when used.
|
||||
sc_error_shell_quotes:
|
||||
@cd $(srcdir)/src && \
|
||||
{ GIT_PAGER= git grep -E \
|
||||
'error \(.*%s[:"], .*(name|file)[^"]*\);$$' *.c; \
|
||||
GIT_PAGER= git grep -E \
|
||||
' quote[ _].*file' *.c; } \
|
||||
| grep -Ev '(quotef|q[^ ]*name)' \
|
||||
&& { echo '$(ME): '"Use quotef() for colon delimited names" 1>&2; \
|
||||
exit 1; } \
|
||||
|| :
|
||||
|
||||
# Files in src/ should quote all file names in error() output
|
||||
# using quoteaf() when the name is separated with spaces,
|
||||
# to distinguish the file name at issue and
|
||||
# to provide better support for copy and paste.
|
||||
sc_error_shell_always_quotes:
|
||||
@cd $(srcdir)/src && GIT_PAGER= git grep -E \
|
||||
'error \(.*[^:] %s[ "].*, .*(name|file)[^"]*\);$$' \
|
||||
*.c | grep -Ev '(quoteaf|q[^ ]*name)' \
|
||||
&& { echo '$(ME): '"Use quoteaf() for space delimited names" 1>&2; \
|
||||
exit 1; } \
|
||||
|| :
|
||||
@cd $(srcdir)/src && GIT_PAGER= git grep -E -A1 \
|
||||
'error \([^%]*[^:] %s[ "]' *.c | grep 'quotef' \
|
||||
&& { echo '$(ME): '"Use quoteaf() for space delimited names" 1>&2; \
|
||||
exit 1; } \
|
||||
|| :
|
||||
|
||||
# Usage of error() with an exit constant, should instead use die(),
|
||||
# as that avoids warnings and may generate better code, due to being apparent
|
||||
# to the compiler that it doesn't return.
|
||||
sc_die_EXIT_FAILURE:
|
||||
@cd $(srcdir)/src && GIT_PAGER= git grep -E \
|
||||
'error \(.*_(FAILURE|INVALID)' \
|
||||
&& { echo '$(ME): '"Use die() instead of error" 1>&2; \
|
||||
exit 1; } \
|
||||
|| :
|
||||
|
||||
# Avoid unstyled quoting to internal slots and thus destined for diagnostics
|
||||
# as that can leak unescaped control characters to the output, when using
|
||||
# the default "literal" quoting style.
|
||||
# Instead use quotef(), or quoteaf() or in edge cases quotearg_n_style_colon().
|
||||
# A more general PCRE would be @prohibit='quotearg_.*(?!(style|buffer))'
|
||||
sc_prohibit-quotearg:
|
||||
@prohibit='quotearg(_n)?(|_colon|_char|_mem) ' \
|
||||
in_vc_files='\.c$$' \
|
||||
halt='Unstyled diagnostic quoting detected' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_sun_os_names:
|
||||
@grep -nEi \
|
||||
'solaris[^[:alnum:]]*2\.(7|8|9|[1-9][0-9])|sunos[^[:alnum:]][6-9]' \
|
||||
@@ -257,646 +172,50 @@ sc_sun_os_names:
|
||||
{ echo '$(ME): found misuse of Sun OS version numbers' 1>&2; \
|
||||
exit 1; } || :
|
||||
|
||||
# Ensure that the list of programs and author names is accurate.
|
||||
# We need a UTF8 locale. If a lack of locale support or a missing
|
||||
# translation inhibits printing of UTF-8 names, just skip this test.
|
||||
au_dotdot = authors-dotdot
|
||||
au_actual = authors-actual
|
||||
sc_check-AUTHORS: $(all_programs)
|
||||
@locale=en_US.UTF-8; \
|
||||
LC_ALL=$$locale ./src/factor --version \
|
||||
| grep ' Torbjorn ' > /dev/null \
|
||||
&& { echo "$@: skipping this check"; exit 0; }; \
|
||||
rm -f $(au_actual) $(au_dotdot); \
|
||||
for i in `ls $(all_programs) \
|
||||
| sed -e 's,^src/,,' -e 's,$(EXEEXT)$$,,' \
|
||||
| sed /libstdbuf/d \
|
||||
| $(ASSORT) -u`; do \
|
||||
test "$$i" = '[' && continue; \
|
||||
exe=$$i; \
|
||||
if test "$$i" = install; then \
|
||||
exe=ginstall; \
|
||||
elif test "$$i" = test; then \
|
||||
exe='['; \
|
||||
fi; \
|
||||
LC_ALL=$$locale ./src/$$exe --version \
|
||||
| perl -0 -p -e 's/,\n/, /gm' \
|
||||
| sed -n -e '/Written by /{ s//'"$$i"': /;' \
|
||||
-e 's/,* and /, /; s/\.$$//; p; }'; \
|
||||
done > $(au_actual) && \
|
||||
sed -n '/^[^ ][^ ]*:/p' $(srcdir)/AUTHORS > $(au_dotdot) \
|
||||
&& diff $(au_actual) $(au_dotdot) \
|
||||
&& rm -f $(au_actual) $(au_dotdot)
|
||||
ALL_RECURSIVE_TARGETS += sc_tight_scope
|
||||
sc_tight_scope:
|
||||
@$(MAKE) -C src $@
|
||||
|
||||
# Each program with a non-ASCII author name must link with LIBICONV.
|
||||
sc_check-I18N-AUTHORS:
|
||||
@cd $(srcdir)/src && \
|
||||
for i in $$(git grep -l -w proper_name_utf8 *.c|sed 's/\.c//'); do \
|
||||
grep -E "^src_$${i}_LDADD"' .?= .*\$$\(LIBICONV\)' local.mk \
|
||||
> /dev/null \
|
||||
|| { echo "$(ME): link rules for $$i do not include" \
|
||||
'$$(LIBICONV)' 1>&2; exit 1; }; \
|
||||
done
|
||||
ALL_RECURSIVE_TARGETS += sc_check-AUTHORS
|
||||
sc_check-AUTHORS:
|
||||
@$(MAKE) -C src $@
|
||||
|
||||
# Disallow the C99 printf size specifiers %z and %j as they're not portable.
|
||||
# The gnulib printf replacement does support them, however the printf
|
||||
# replacement is not currently explicitly depended on by the gnulib error()
|
||||
# module for example. Also we use fprintf() in a few places to output simple
|
||||
# formats but don't use the gnulib module as it is seen as overkill at present.
|
||||
# We'd have to adjust the above gnulib items before disabling this.
|
||||
sc_prohibit-c99-printf-format:
|
||||
@cd $(srcdir)/src && GIT_PAGER= git grep -n '%[0*]*[jz][udx]' *.c \
|
||||
&& { echo '$(ME): Use PRI*MAX instead of %j or %z' 1>&2; exit 1; } \
|
||||
|| :
|
||||
|
||||
# Ensure the alternative __attribute (keyword) form isn't used as
|
||||
# that form is not elided where required. Also ensure that we don't
|
||||
# directly use attributes already defined by gnulib.
|
||||
# TODO: move the check for _GL... attributes to gnulib.
|
||||
sc_prohibit-gl-attributes:
|
||||
@prohibit='__attribute |__(unused|pure|const)__' \
|
||||
in_vc_files='\.[ch]$$' \
|
||||
halt='Use _GL... attribute macros' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Look for lines longer than 80 characters, except omit:
|
||||
# - program-generated long lines in diff headers,
|
||||
# - the help2man script copied from upstream,
|
||||
# - tests involving long checksum lines, and
|
||||
# - the 'pr' test cases.
|
||||
FILTER_LONG_LINES = \
|
||||
\|^[^:]*man/help2man:| d; \
|
||||
\|^[^:]*tests/misc/sha[0-9]*sum.*\.pl[-:]| d; \
|
||||
\|^[^:]*tests/pr/|{ \|^[^:]*tests/pr/pr-tests:| !d; };
|
||||
sc_long_lines:
|
||||
@wc -L /dev/null >/dev/null 2>/dev/null \
|
||||
|| { echo "$@: skipping: wc -L not supported"; exit 0; }; \
|
||||
sed -r 1q /dev/null 2>/dev/null \
|
||||
|| { echo "$@: skipping: sed -r not supported"; exit 0; }; \
|
||||
files=$$($(VC_LIST_EXCEPT) | xargs wc -L | sed -rn '/ total$$/d;\
|
||||
s/^ *(8[1-9]|9[0-9]|[0-9]{3,}) //p'); \
|
||||
halt='line(s) with more than 80 characters; reindent'; \
|
||||
for file in $$files; do \
|
||||
expand $$file | grep -nE '^.{80}.' | \
|
||||
sed -e "s|^|$$file:|" -e '$(FILTER_LONG_LINES)'; \
|
||||
done | grep . && { msg="$$halt" $(_sc_say_and_exit) } || :
|
||||
|
||||
# Option descriptions should not start with a capital letter.
|
||||
# One could grep source directly as follows:
|
||||
# grep -E " {2,6}-.*[^.] [A-Z][a-z]" $$($(VC_LIST_EXCEPT) | grep '\.c$$')
|
||||
# but that would miss descriptions not on the same line as the -option.
|
||||
sc_option_desc_uppercase: $(ALL_MANS)
|
||||
@grep '^\\fB\\-' -A1 man/*.1 | LC_ALL=C grep '\.1.[A-Z][a-z]' \
|
||||
&& { echo 1>&2 '$@: found initial capitals in --help'; exit 1; } || :
|
||||
|
||||
# Ensure all man/*.[1x] files are present.
|
||||
sc_man_file_correlation: check-x-vs-1 check-programs-vs-x
|
||||
|
||||
# Ensure that for each .x file in the 'man/' subdirectory, there is a
|
||||
# corresponding .1 file in the definition of $(EXTRA_MANS).
|
||||
# But since that expansion usually lacks programs like arch and hostname,
|
||||
# add them here manually.
|
||||
.PHONY: check-x-vs-1
|
||||
check-x-vs-1:
|
||||
@PATH=./src$(PATH_SEPARATOR)$$PATH; export PATH; \
|
||||
t=$@-t; \
|
||||
(cd $(srcdir)/man && ls -1 *.x) \
|
||||
| sed 's/\.x$$//' | $(ASSORT) > $$t; \
|
||||
(echo $(patsubst man/%,%,$(ALL_MANS)) \
|
||||
| tr -s ' ' '\n' | sed 's/\.1$$//') \
|
||||
| $(ASSORT) -u | diff - $$t || { rm $$t; exit 1; }; \
|
||||
rm $$t
|
||||
|
||||
# Ensure that non-trivial .x files in the 'man/' subdirectory,
|
||||
# i.e., files exceeding a line count of 20 or a byte count of 1000,
|
||||
# contain a Copyright notice.
|
||||
.PHONY: sc_man_check_x_copyright
|
||||
sc_man_check_x_copyright:
|
||||
@status=0; \
|
||||
cd $(srcdir) && wc -cl man/*.x | head -n-1 \
|
||||
| awk '$$1 >= 20 || $$2 >= 1000 {print $$3}' \
|
||||
| xargs grep -L 'Copyright .* Free Software Foundation' \
|
||||
| grep . \
|
||||
&& { echo 1>&2 '$@: exceeding file size/line count limit' \
|
||||
'- please add a copyright note'; status=1; }; \
|
||||
exit $$status
|
||||
|
||||
# Writing a portable rule to generate a manpage like '[.1' would be
|
||||
# a nightmare, so filter that out.
|
||||
all-progs-but-lbracket = $(filter-out [,$(patsubst src/%,%,$(all_programs)))
|
||||
|
||||
# Ensure that for each coreutils program there is a corresponding
|
||||
# '.x' file in the 'man/' subdirectory.
|
||||
.PHONY: check-programs-vs-x
|
||||
check-programs-vs-x:
|
||||
@status=0; \
|
||||
for p in dummy $(all-progs-but-lbracket); do \
|
||||
case $$p in *.so) continue;; esac; \
|
||||
test $$p = dummy && continue; \
|
||||
test $$p = ginstall && p=install || : ; \
|
||||
test -f $(srcdir)/man/$$p.x \
|
||||
|| { echo missing $$p.x 1>&2; status=1; }; \
|
||||
done; \
|
||||
exit $$status
|
||||
|
||||
# Ensure we can check out on case insensitive file systems
|
||||
sc_case_insensitive_file_names: src/uniq
|
||||
@git ls-files | sort -f | src/uniq -Di | grep . && \
|
||||
{ echo "$(ME): the above file(s) conflict on case insensitive" \
|
||||
" file systems" 1>&2; exit 1; } || :
|
||||
|
||||
# Ensure that the end of each release's section is marked by two empty lines.
|
||||
sc_NEWS_two_empty_lines:
|
||||
@sed -n 4,/Noteworthy/p $(srcdir)/NEWS \
|
||||
| perl -n0e '/(^|\n)\n\n\* Noteworthy/ or exit 1' \
|
||||
|| { echo '$(ME): use two empty lines to separate NEWS sections' \
|
||||
1>&2; exit 1; } || :
|
||||
|
||||
# With split lines, don't leave an operator at end of line.
|
||||
# Instead, put it on the following line, where it is more apparent.
|
||||
# Don't bother checking for "*" at end of line, since it provokes
|
||||
# far too many false positives, matching constructs like "TYPE *".
|
||||
# Similarly, omit "=" (initializers).
|
||||
binop_re_ ?= [-/+^!<>]|[-/+*^!<>=]=|&&?|\|\|?|<<=?|>>=?
|
||||
sc_prohibit_operator_at_end_of_line:
|
||||
@prohibit='. ($(binop_re_))$$' \
|
||||
in_vc_files='\.[chly]$$' \
|
||||
halt='found operator at end of line' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Don't use "readlink" or "readlinkat" directly
|
||||
sc_prohibit_readlink:
|
||||
@prohibit='\<readlink(at)? \(' \
|
||||
halt='do not use readlink(at); use via xreadlink or areadlink*' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Don't use address of "stat" or "lstat" functions
|
||||
sc_prohibit_stat_macro_address:
|
||||
@prohibit='\<l?stat '':|&l?stat\>' \
|
||||
halt='stat() and lstat() may be function-like macros' \
|
||||
$(_sc_search_regexp)
|
||||
# Perl-based tests used to exec perl from a #!/bin/sh script.
|
||||
# Now they all start with #!/usr/bin/perl and the portability
|
||||
# infrastructure is in tests/Makefile.am. Make sure no old-style
|
||||
# script sneaks back in.
|
||||
sc_no_exec_perl_coreutils:
|
||||
@if test -f $(srcdir)/tests/Coreutils.pm; then \
|
||||
grep '^exec *\$$PERL.*MCoreutils' $$($(VC_LIST) tests) && \
|
||||
{ echo 1>&2 '$(ME): found anachronistic Perl-based tests'; \
|
||||
exit 1; } || :; \
|
||||
fi
|
||||
|
||||
# Ensure that date's --help output stays in sync with the info
|
||||
# documentation for GNU strftime. The only exception is %N and %q,
|
||||
# documentation for GNU strftime. The only exception is %N,
|
||||
# which date accepts but GNU strftime does not.
|
||||
extract_char = sed 's/^[^%][^%]*%\(.\).*/\1/'
|
||||
sc_strftime_check:
|
||||
@if test -f $(srcdir)/src/date.c; then \
|
||||
grep '^ %. ' $(srcdir)/src/date.c | sort \
|
||||
| $(extract_char) > $@-src; \
|
||||
{ echo N; echo q; \
|
||||
info libc date calendar format 2>/dev/null \
|
||||
| grep "^ *['\`]%.'$$"| $(extract_char); }| sort >$@-info;\
|
||||
if test $$(stat --format %s $@-info) != 2; then \
|
||||
diff -u $@-src $@-info || exit 1; \
|
||||
else \
|
||||
echo '$(ME): skipping $@: libc info not installed' 1>&2; \
|
||||
fi; \
|
||||
{ echo N; \
|
||||
info libc date calendar format | grep '^ `%.'\' \
|
||||
| $(extract_char); } | sort > $@-info; \
|
||||
diff -u $@-src $@-info || exit 1; \
|
||||
rm -f $@-src $@-info; \
|
||||
fi
|
||||
|
||||
# Indent only with spaces.
|
||||
sc_prohibit_tab_based_indentation:
|
||||
@prohibit='^ * ' \
|
||||
halt='TAB in indentation; use only spaces' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Enforce lowercase 'e' in "I.e.".
|
||||
sc_prohibit_uppercase_id_est:
|
||||
@prohibit='I\.E\.' \
|
||||
halt='Uppercase "Id Est" abbreviation; use "I.e.," instead' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Enforce double-space before "I.e." at the beginning of a sentence.
|
||||
sc_ensure_dblspace_after_dot_before_id_est:
|
||||
@prohibit='\. I\.e\.' \
|
||||
halt='Single space after dot before "i.e."; use ". i.e." instead' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Enforce comma after "i.e." (at least before a blank or at EOL).
|
||||
sc_ensure_comma_after_id_est:
|
||||
@prohibit='[Ii]\.e\.( |$$)' \
|
||||
halt='Missing comma after "i.e."; use "i.e.," instead' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# The SEE ALSO section of a man page should not be terminated with
|
||||
# a period. Check the first line after each "SEE ALSO" line in man/*.x:
|
||||
sc_prohibit_man_see_also_period:
|
||||
@grep -nB1 '\.$$' $$($(VC_LIST_EXCEPT) | grep 'man/.*\.x$$') \
|
||||
| grep -A1 -e '-\[SEE ALSO\]' | grep '\.$$' && \
|
||||
{ echo '$(ME): do not end "SEE ALSO" section with a period' \
|
||||
1>&2; exit 1; } || :
|
||||
@re='^ * ' \
|
||||
msg='TAB in indentation; use only spaces' \
|
||||
$(_prohibit_regexp)
|
||||
|
||||
# Don't use "indent-tabs-mode: nil" anymore. No longer needed.
|
||||
sc_prohibit_emacs__indent_tabs_mode__setting:
|
||||
@prohibit='^( *[*#] *)?indent-tabs-mode:' \
|
||||
halt='use of emacs indent-tabs-mode: setting' \
|
||||
$(_sc_search_regexp)
|
||||
@re='^( *[*#] *)?indent-tabs-mode:' \
|
||||
msg='use of emacs indent-tabs-mode: setting' \
|
||||
$(_prohibit_regexp)
|
||||
|
||||
# Ensure that tests don't include a redundant fail=0.
|
||||
sc_prohibit_fail_0:
|
||||
@prohibit='\<fail=0\>' \
|
||||
halt='fail=0 initialization' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Ensure that tests don't use `cmd ... && fail=1` as that hides crashes.
|
||||
# The "exclude" expression allows common idioms like `test ... && fail=1`
|
||||
# and the 2>... portion allows commands that redirect stderr and so probably
|
||||
# independently check its contents and thus detect any crash messages.
|
||||
sc_prohibit_and_fail_1:
|
||||
@prohibit='&& fail=1' \
|
||||
exclude='(returns_|stat|kill|test |EGREP|grep|compare|2> *[^/])' \
|
||||
halt='&& fail=1 detected. Please use: returns_ 1 ... || fail=1' \
|
||||
in_vc_files='^tests/' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Ensure that env vars are not passed through returns_ as
|
||||
# that was seen to fail on FreeBSD /bin/sh at least
|
||||
sc_prohibit_env_returns:
|
||||
@prohibit='=[^ ]* returns_ ' \
|
||||
halt='Passing env vars to returns_ is non portable' \
|
||||
in_vc_files='^tests/' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# The mode part of a setfacl -m option argument must be three bytes long.
|
||||
# I.e., an argument of user:bin:rw or user:bin:r will make Solaris 10's
|
||||
# setfacl reject it with: "Unrecognized character found in mode field".
|
||||
# Use hyphens to give it a length of 3: "...:rw-" or "...:r--".
|
||||
sc_prohibit_short_facl_mode_spec:
|
||||
@prohibit='\<setfacl .*-m.*:.*:[rwx-]{1,2} ' \
|
||||
halt='setfacl mode string length < 3; extend with hyphen(s)' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Ensure that "stdio--.h" is used where appropriate.
|
||||
sc_require_stdio_safer:
|
||||
@if $(VC_LIST_EXCEPT) | grep -l '\.[ch]$$' > /dev/null; then \
|
||||
files=$$(grep -l '\bfreopen \?(' $$($(VC_LIST_EXCEPT) \
|
||||
| grep '\.[ch]$$')); \
|
||||
test -n "$$files" && grep -LE 'include "stdio--.h"' $$files \
|
||||
| grep . && \
|
||||
{ echo '$(ME): the above files should use "stdio--.h"' \
|
||||
1>&2; exit 1; } || :; \
|
||||
else :; \
|
||||
fi
|
||||
|
||||
sc_prohibit_perl_hash_quotes:
|
||||
@prohibit="\{'[A-Z_]+' *[=}]" \
|
||||
halt="in Perl code, write \$$hash{KEY}, not \$$hash{'K''EY'}" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Prefer xnanosleep over other less-precise sleep methods
|
||||
sc_prohibit_sleep:
|
||||
@prohibit='\<(nano|u)?sleep \(' \
|
||||
halt='prefer xnanosleep over other sleep interfaces' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Use print_ver_ (from init.cfg), not open-coded $VERBOSE check.
|
||||
sc_prohibit_verbose_version:
|
||||
@prohibit='test "\$$VERBOSE" = yes && .* --version' \
|
||||
halt='use the print_ver_ function instead...' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Enforce print_ver_ tracking of dependencies
|
||||
# Each coreutils specific program a test requires
|
||||
# should be tagged by calling through env(1).
|
||||
sc_env_test_dependencies:
|
||||
@cd $(top_srcdir) && GIT_PAGER= git grep -E \
|
||||
"env ($$(build-aux/gen-lists-of-programs.sh --list-progs | \
|
||||
grep -vF '[' |paste -d'|' -s))" tests | \
|
||||
sed "s/\([^:]\):.*env \([^)' ]*\).*/\1 \2/" | uniq | \
|
||||
while read test prog; do \
|
||||
printf '%s' $$test | grep -q '\.pl$$' && continue; \
|
||||
grep -q "print_ver_.* $$prog" $$test \
|
||||
|| echo $$test should call: print_ver_ $$prog; \
|
||||
done | grep . && exit 1 || :
|
||||
|
||||
# Use framework_failure_, not the old name without the trailing underscore.
|
||||
sc_prohibit_framework_failure:
|
||||
@prohibit='\<framework_''failure\>' \
|
||||
halt='use framework_failure_ instead' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Prohibit the use of `...` in tests/. Use $(...) instead.
|
||||
sc_prohibit_test_backticks:
|
||||
@prohibit='`' in_vc_files='^tests/' \
|
||||
halt='use $$(...), not `...` in tests/' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Ensure that compare is used to check empty files
|
||||
# so that the unexpected contents are displayed
|
||||
sc_prohibit_test_empty:
|
||||
@prohibit='test -s.*&&' in_vc_files='^tests/' \
|
||||
halt='use `compare /dev/null ...`, not `test -s ...` in tests/' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Ensure that expr doesn't work directly on various unsigned int types,
|
||||
# as that's not generally supported without GMP.
|
||||
sc_prohibit_expr_unsigned:
|
||||
@prohibit='expr .*(UINT|ULONG|[^S]SIZE|[UGP]ID|UINTMAX)' \
|
||||
halt='avoid passing unsigned limits to `expr` (without GMP)' \
|
||||
in_vc_files='^tests/' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Programs like sort, ls, expr use PROG_FAILURE in place of EXIT_FAILURE.
|
||||
# Others, use the EXIT_CANCELED, EXIT_ENOENT, etc. macros defined in system.h.
|
||||
# In those programs, ensure that EXIT_FAILURE is not used by mistake.
|
||||
sc_some_programs_must_avoid_exit_failure:
|
||||
@grep -nw EXIT_FAILURE \
|
||||
$$(git grep -El '[^T]_FAILURE|EXIT_CANCELED' $(srcdir)/src) \
|
||||
| grep -vE '= EXIT_FAILURE|return .* \?' | grep . \
|
||||
&& { echo '$(ME): do not use EXIT_FAILURE in the above' \
|
||||
1>&2; exit 1; } || :
|
||||
|
||||
# Ensure that tests call the get_min_ulimit_v_ function if using ulimit -v
|
||||
sc_prohibit_test_ulimit_without_require_:
|
||||
@(git grep -l get_min_ulimit_v_ $(srcdir)/tests; \
|
||||
git grep -l 'ulimit -v' $(srcdir)/tests) \
|
||||
| sort | uniq -u | grep . && { echo "$(ME): the above test(s)"\
|
||||
" should match get_min_ulimit_v_ with ulimit -v" 1>&2; exit 1; } || :
|
||||
|
||||
# Ensure that tests call the cleanup_ function if using background processes
|
||||
sc_prohibit_test_background_without_cleanup_:
|
||||
@(git grep -El '( &$$|&[^&]*=\$$!)' $(srcdir)/tests; \
|
||||
git grep -l 'cleanup_()' $(srcdir)/tests | sed p) \
|
||||
| sort | uniq -u | grep . && { echo "$(ME): the above test(s)"\
|
||||
" should use cleanup_ for background processes" 1>&2; exit 1; } || :
|
||||
|
||||
# Ensure that tests call the print_ver_ function for programs which are
|
||||
# actually used in that test.
|
||||
sc_prohibit_test_calls_print_ver_with_irrelevant_argument:
|
||||
@git grep -w print_ver_ $(srcdir)/tests \
|
||||
| sed 's#:print_ver_##' \
|
||||
| { fail=0; \
|
||||
while read file name; do \
|
||||
for i in $$name; do \
|
||||
case "$$i" in install) i=ginstall;; esac; \
|
||||
grep -w "$$i" $$file|grep -vw print_ver_|grep -q . \
|
||||
|| { fail=1; \
|
||||
echo "*** Test: $$file, offending: $$i." 1>&2; };\
|
||||
done; \
|
||||
done; \
|
||||
test $$fail = 0 || exit 1; \
|
||||
} || { echo "$(ME): the above test(s) call print_ver_ for" \
|
||||
"program(s) they don't use" 1>&2; exit 1; }
|
||||
|
||||
# Exempt the contents of any usage function from the following.
|
||||
_continued_string_col_1 = \
|
||||
s/^usage .*?\n}//ms;/\\\n\w/ and print ("$$ARGV\n"),$$e=1;END{$$e||=0;exit $$e}
|
||||
# Ding any source file that has a continued string with an alphabetic in the
|
||||
# first column of the following line. We prohibit them because they usually
|
||||
# trigger false positives in tools that try to map an arbitrary line number
|
||||
# to the enclosing function name. Of course, very many strings do precisely
|
||||
# this, *when they are part of the usage function*. That is why we exempt
|
||||
# the contents of any function named "usage".
|
||||
sc_prohibit_continued_string_alpha_in_column_1:
|
||||
@perl -0777 -ne '$(_continued_string_col_1)' \
|
||||
$$($(VC_LIST_EXCEPT) | grep '\.[ch]$$') \
|
||||
|| { echo '$(ME): continued string with word in first column' \
|
||||
1>&2; exit 1; } || :
|
||||
# Use this to list offending lines:
|
||||
# git ls-files |grep '\.[ch]$' | xargs \
|
||||
# perl -n -0777 -e 's/^usage.*?\n}//ms;/\\\n\w/ and print "$ARGV\n"' \
|
||||
# | xargs grep -A1 '\\$'|grep '\.[ch][:-][_a-zA-Z]'
|
||||
|
||||
|
||||
###########################################################
|
||||
_p0 = \([^"'/]\|"\([^\"]\|[\].\)*"\|'\([^\']\|[\].\)*'
|
||||
_pre = $(_p0)\|[/][^"'/*]\|[/]"\([^\"]\|[\].\)*"\|[/]'\([^\']\|[\].\)*'\)*
|
||||
_pre_anchored = ^\($(_pre)\)
|
||||
_comment_and_close = [^*]\|[*][^/*]\)*[*][*]*/
|
||||
# help font-lock mode: '
|
||||
|
||||
# A sed expression that removes ANSI C and ISO C99 comments.
|
||||
# Derived from the one in GNU gettext's 'moopp' preprocessor.
|
||||
_sed_remove_comments = \
|
||||
/[/][/*]/{ \
|
||||
ta; \
|
||||
:a; \
|
||||
s,$(_pre_anchored)//.*,\1,; \
|
||||
te; \
|
||||
s,$(_pre_anchored)/[*]\($(_comment_and_close),\1 ,; \
|
||||
ta; \
|
||||
/^$(_pre)[/][*]/{ \
|
||||
s,$(_pre_anchored)/[*].*,\1 ,; \
|
||||
tu; \
|
||||
:u; \
|
||||
n; \
|
||||
s,^\($(_comment_and_close),,; \
|
||||
tv; \
|
||||
s,^.*$$,,; \
|
||||
bu; \
|
||||
:v; \
|
||||
}; \
|
||||
:e; \
|
||||
}
|
||||
# Quote all single quotes.
|
||||
_sed_rm_comments_q = $(subst ','\'',$(_sed_remove_comments))
|
||||
# help font-lock mode: '
|
||||
|
||||
_space_before_paren_exempt =? \\n\\$$
|
||||
_space_before_paren_exempt = \
|
||||
(^ *\#|\\n\\$$|%s\(to %s|(date|group|character)\(s\))
|
||||
# Ensure that there is a space before each open parenthesis in C code.
|
||||
sc_space_before_open_paren:
|
||||
@if $(VC_LIST_EXCEPT) | grep -l '\.[ch]$$' > /dev/null; then \
|
||||
fail=0; \
|
||||
for c in $$($(VC_LIST_EXCEPT) | grep '\.[ch]$$'); do \
|
||||
sed '$(_sed_rm_comments_q)' $$c 2>/dev/null \
|
||||
| grep -i '[[:alnum:]](' \
|
||||
| grep -vE '$(_space_before_paren_exempt)' \
|
||||
| grep . && { fail=1; echo "*** $$c"; }; \
|
||||
done; \
|
||||
test $$fail = 1 && \
|
||||
{ echo '$(ME): the above files lack a space-before-open-paren' \
|
||||
1>&2; exit 1; } || :; \
|
||||
else :; \
|
||||
fi
|
||||
|
||||
# Similar to the gnulib maint.mk rule for sc_prohibit_strcmp
|
||||
# Use STREQ_LEN or STRPREFIX rather than comparing strncmp == 0, or != 0.
|
||||
sc_prohibit_strncmp:
|
||||
@prohibit='^[^#].*str''ncmp *\(' \
|
||||
halt='use STREQ_LEN or STRPREFIX instead of str''ncmp' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Enforce recommended preprocessor indentation style.
|
||||
sc_preprocessor_indentation:
|
||||
@if cppi --version >/dev/null 2>&1; then \
|
||||
$(VC_LIST_EXCEPT) | grep '\.[ch]$$' | xargs cppi -a -c \
|
||||
|| { echo '$(ME): incorrect preprocessor indentation' 1>&2; \
|
||||
exit 1; }; \
|
||||
else \
|
||||
echo '$(ME): skipping test $@: cppi not installed' 1>&2; \
|
||||
fi
|
||||
|
||||
# THANKS.in is a list of name/email pairs for people who are mentioned in
|
||||
# commit logs (and generated ChangeLog), but who are not also listed as an
|
||||
# author of a commit. Name/email pairs of commit authors are automatically
|
||||
# extracted from the repository. As a very minor factorization, when
|
||||
# someone who was initially listed only in THANKS.in later authors a commit,
|
||||
# this rule detects that their pair may now be removed from THANKS.in.
|
||||
sc_THANKS_in_duplicates:
|
||||
@{ git log --pretty=format:%aN | sort -u; \
|
||||
cut -b-36 $(srcdir)/THANKS.in \
|
||||
| sed '/^$$/,/^$$/!d;/^$$/d;s/ *$$//'; } \
|
||||
| sort | uniq -d | grep . \
|
||||
&& { echo '$(ME): remove the above names from THANKS.in' \
|
||||
1>&2; exit 1; } || :
|
||||
|
||||
# Ensure the contributor list stays sorted. However, if the system's
|
||||
# en_US.UTF-8 locale data is erroneous, give a diagnostic and skip
|
||||
# this test. This affects OS X, up to at least 10.11.6.
|
||||
# Use our sort as other implementations may result in a different order.
|
||||
sc_THANKS_in_sorted:
|
||||
@printf 'a\n.b\n'|LC_ALL=en_US.UTF-8 src/sort -c 2> /dev/null \
|
||||
&& { \
|
||||
sed '/^$$/,/^$$/!d;/^$$/d' $(srcdir)/THANKS.in > $@.1 && \
|
||||
LC_ALL=en_US.UTF-8 src/sort -f -k1,1 $@.1 > $@.2 && \
|
||||
diff -u $@.1 $@.2; diff=$$?; \
|
||||
rm -f $@.1 $@.2; \
|
||||
test "$$diff" = 0 \
|
||||
|| { echo '$(ME): THANKS.in is unsorted' 1>&2; exit 1; }; \
|
||||
} \
|
||||
|| { echo '$(ME): this system has erroneous locale data;' \
|
||||
'skipping $@' 1>&2; }
|
||||
|
||||
# Look for developer diagnostics that are marked for translation.
|
||||
# This won't find any for which devmsg's format string is on a separate line.
|
||||
sc_marked_devdiagnostics:
|
||||
@prohibit='\<devmsg *\(.*_\(' \
|
||||
halt='found marked developer diagnostic(s)' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Ensure we keep hex constants as 4 or 8 bytes for consistency
|
||||
# and so that make src/fs-magic-compare works consistently
|
||||
sc_fs-magic-compare:
|
||||
@sed -n 's|.*/\* \(0x[0-9A-Fa-f]\{1,\}\) .*\*/|\1|p' \
|
||||
$(srcdir)/src/stat.c | grep -Ev '^0x([0-9A-F]{4}){1,2}$$' \
|
||||
&& { echo '$(ME): Constants in src/stat.c should be 4 or 8' \
|
||||
'upper-case chars' 1>&2; exit 1; } || :
|
||||
|
||||
# Ensure gnulib generated files are ignored
|
||||
# TODO: Perhaps augment gnulib-tool to do this in lib/.gitignore?
|
||||
sc_gitignore_missing:
|
||||
@{ sed -n '/^\/lib\/.*\.h$$/{p;p}' $(srcdir)/.gitignore; \
|
||||
find lib -name '*.in*' ! -name '*~' ! -name 'sys_*' | \
|
||||
sed 's|^|/|; s|_\(.*in\.h\)|/\1|; s/\.in//'; } | \
|
||||
sort | uniq -u | grep . && { echo '$(ME): Add above' \
|
||||
'entries to .gitignore' >&2; exit 1; } || :
|
||||
|
||||
# Flag redundant entries in .gitignore
|
||||
sc_gitignore_redundant:
|
||||
@{ grep ^/lib $(srcdir)/.gitignore; \
|
||||
sed 's|^|/lib|' $(srcdir)/lib/.gitignore; } | \
|
||||
sort | uniq -d | grep . && { echo '$(ME): Remove above' \
|
||||
'entries from .gitignore' >&2; exit 1; } || :
|
||||
|
||||
sc_prohibit-form-feed:
|
||||
@prohibit=$$'\f' \
|
||||
in_vc_files='\.[chly]$$' \
|
||||
halt='Form Feed (^L) detected' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Override the default Cc: used in generating an announcement.
|
||||
announcement_Cc_ = $(translation_project_), \
|
||||
coreutils@gnu.org, coreutils-announce@gnu.org
|
||||
|
||||
-include $(srcdir)/dist-check.mk
|
||||
|
||||
update-copyright-env = \
|
||||
UPDATE_COPYRIGHT_FORCE=1 \
|
||||
UPDATE_COPYRIGHT_USE_INTERVALS=2 \
|
||||
UPDATE_COPYRIGHT_MAX_LINE_LENGTH=79
|
||||
|
||||
# List syntax-check exemptions.
|
||||
exclude_file_name_regexp--sc_space_tab = \
|
||||
^(tests/pr/|tests/misc/nl\.sh$$|gl/.*\.diff$$|man/help2man$$)
|
||||
exclude_file_name_regexp--sc_bindtextdomain = \
|
||||
^(gl/.*|lib/euidaccess-stat|src/make-prime-list)\.c$$
|
||||
exclude_file_name_regexp--sc_trailing_blank = \
|
||||
^(tests/pr/|gl/.*\.diff$$|man/help2man)
|
||||
exclude_file_name_regexp--sc_system_h_headers = \
|
||||
^src/((die|system|copy)\.h|make-prime-list\.c)$$
|
||||
|
||||
_src = (false|lbracket|ls-(dir|ls|vdir)|tac-pipe|uname-(arch|uname))
|
||||
exclude_file_name_regexp--sc_require_config_h_first = \
|
||||
(^lib/buffer-lcm\.c|gl/lib/xdecto.max\.c|src/$(_src)\.c)$$
|
||||
exclude_file_name_regexp--sc_require_config_h = \
|
||||
$(exclude_file_name_regexp--sc_require_config_h_first)
|
||||
|
||||
exclude_file_name_regexp--sc_po_check = ^(gl/|man/help2man)
|
||||
exclude_file_name_regexp--sc_prohibit_always-defined_macros = \
|
||||
^src/(seq|remove)\.c$$
|
||||
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = ^tests/pr/
|
||||
exclude_file_name_regexp--sc_program_name = \
|
||||
^(gl/.*|lib/euidaccess-stat|src/make-prime-list)\.c$$
|
||||
exclude_file_name_regexp--sc_file_system = \
|
||||
NEWS|^(init\.cfg|src/df\.c|tests/df/df-P\.sh|tests/df/df-output\.sh)$$
|
||||
exclude_file_name_regexp--sc_prohibit_always_true_header_tests = \
|
||||
^m4/stat-prog\.m4$$
|
||||
exclude_file_name_regexp--sc_prohibit_fail_0 = \
|
||||
(^.*/git-hooks/commit-msg|^tests/init\.sh|Makefile\.am|\.mk|.*\.texi)$$
|
||||
exclude_file_name_regexp--sc_prohibit_test_minus_ao = *\.texi$$
|
||||
exclude_file_name_regexp--sc_prohibit_atoi_atof = ^lib/euidaccess-stat\.c$$
|
||||
|
||||
# longlong.h is maintained elsewhere.
|
||||
_ll = ^src/longlong\.h$$
|
||||
exclude_file_name_regexp--sc_useless_cpp_parens = $(_ll)
|
||||
exclude_file_name_regexp--sc_space_before_open_paren = $(_ll)
|
||||
|
||||
tbi_1 = ^tests/pr/|(\.mk|^man/help2man)$$
|
||||
tbi_2 = ^scripts/git-hooks/(pre-commit|pre-applypatch|applypatch-msg)$$
|
||||
tbi_3 = (GNU)?[Mm]akefile(\.am)?$$|$(_ll)
|
||||
exclude_file_name_regexp--sc_prohibit_tab_based_indentation = \
|
||||
$(tbi_1)|$(tbi_2)|$(tbi_3)
|
||||
|
||||
exclude_file_name_regexp--sc_preprocessor_indentation = \
|
||||
^(gl/lib/rand-isaac\.[ch]|gl/tests/test-rand-isaac\.c)$$|$(_ll)
|
||||
exclude_file_name_regexp--sc_prohibit_stat_st_blocks = \
|
||||
^(src/system\.h|tests/du/2g\.sh)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_continued_string_alpha_in_column_1 = \
|
||||
^src/(system\.h|od\.c|printf\.c|getlimits\.c)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_test_backticks = \
|
||||
^tests/(local\.mk|(init|misc/stdbuf|factor/create-test)\.sh)$$
|
||||
|
||||
# Exempt test.c, since it's nominally shared, and relatively static.
|
||||
exclude_file_name_regexp--sc_prohibit_operator_at_end_of_line = \
|
||||
^src/(ptx|test|head)\.c$$
|
||||
|
||||
exclude_file_name_regexp--sc_error_message_uppercase = ^src/factor\.c$$
|
||||
exclude_file_name_regexp--sc_prohibit_atoi_atof = ^src/make-prime-list\.c$$
|
||||
|
||||
# Exception here as we don't want __attribute elided on non GCC
|
||||
exclude_file_name_regexp--sc_prohibit-gl-attributes = ^src/libstdbuf\.c$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_uppercase_id_est = \.diff$$
|
||||
exclude_file_name_regexp--sc_ensure_dblspace_after_dot_before_id_est = \.diff$$
|
||||
exclude_file_name_regexp--sc_ensure_comma_after_id_est = \.diff|$(_ll)$$
|
||||
exclude_file_name_regexp--sc_long_lines = \.diff$$|$(_ll)
|
||||
|
||||
# Augment AM_CFLAGS to include our per-directory options:
|
||||
AM_CFLAGS += $($(@D)_CFLAGS)
|
||||
|
||||
src_CFLAGS = $(WARN_CFLAGS)
|
||||
lib_CFLAGS = $(GNULIB_WARN_CFLAGS)
|
||||
gnulib-tests_CFLAGS = $(GNULIB_TEST_WARN_CFLAGS)
|
||||
|
||||
# Configuration to make the tight-scope syntax-check rule work with
|
||||
# non-recursive make.
|
||||
# Note _gl_TS_headers use _single line_ extern function declarations,
|
||||
# while *_SOURCES use the _two line_ form.
|
||||
export _gl_TS_headers = $(noinst_HEADERS)
|
||||
# Add exceptions for --enable-single-binary renamed functions.
|
||||
_gl_TS_unmarked_extern_functions = main usage
|
||||
_gl_TS_unmarked_extern_functions += single_binary_main_.* _usage_.*
|
||||
# Headers to search for single line extern _data_ declarations.
|
||||
_gl_TS_other_headers = $(srcdir)/src/*.h src/*.h
|
||||
# Tell the tight_scope rule about an exceptional "extern" variable.
|
||||
# Normally, the rule would detect its declaration, but that uses a
|
||||
# different name, __clz_tab.
|
||||
_gl_TS_unmarked_extern_vars = factor_clz_tab
|
||||
# Other tight_scope settings
|
||||
_gl_TS_dir = .
|
||||
_gl_TS_obj_files = src/*.$(OBJEXT)
|
||||
include $(srcdir)/dist-check.mk
|
||||
|
||||
405
configure.ac
405
configure.ac
@@ -1,7 +1,7 @@
|
||||
# -*- autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
# Copyright (C) 1991-2016 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
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
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)
|
||||
@@ -32,24 +32,9 @@ 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 no-dist-gzip 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_STDC
|
||||
AM_PROG_CC_C_O
|
||||
AC_PROG_CPP
|
||||
@@ -60,49 +45,15 @@ gl_EARLY
|
||||
gl_INIT
|
||||
coreutils_MACROS
|
||||
|
||||
# The test suite needs to know if we have a working perl.
|
||||
# FIXME: this is suboptimal. Ideally, we would be able to call gl_PERL
|
||||
# with an ACTION-IF-NOT-FOUND argument ...
|
||||
cu_have_perl=yes
|
||||
case $PERL in *"/missing "*) cu_have_perl=no;; esac
|
||||
AM_CONDITIONAL([HAVE_PERL], [test $cu_have_perl = yes])
|
||||
|
||||
# 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([gcc-warnings],
|
||||
[AS_HELP_STRING([--enable-gcc-warnings],
|
||||
[turn on many GCC warnings (for developers; best with GNU make)])],
|
||||
[turn on lots of GCC warnings (for developers)])],
|
||||
[case $enableval in
|
||||
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]
|
||||
)
|
||||
|
||||
if test "$gl_gcc_warnings" = yes; then
|
||||
@@ -125,126 +76,45 @@ if test "$gl_gcc_warnings" = yes; 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" # Too many warnings until GCC 4.8.0
|
||||
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 -Wtype-limits" # False alarms for portable code
|
||||
# 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 -Wsuggest-attribute=format" # warns about copy.c and factor.c
|
||||
|
||||
# Using -Wstrict-overflow is a pain, but the alternative is worse.
|
||||
# For an example, see the code that provoked this report:
|
||||
# http://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-type-limits]) # False alarms for portable code
|
||||
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])
|
||||
|
||||
# Enable this warning only with gcc-4.8 and newer. Before that
|
||||
# bounds checking as done in truncate.c was incorrectly flagged.
|
||||
# See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43772
|
||||
gl_GCC_VERSION_IFELSE([4], [8], [gl_WARN_ADD([-Wlogical-op])])
|
||||
|
||||
# clang is unduly picky about some things.
|
||||
AC_CACHE_CHECK([whether the compiler is clang], [utils_cv_clang],
|
||||
[AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([[
|
||||
#ifndef __clang__
|
||||
#error "not clang"
|
||||
#endif
|
||||
]])],
|
||||
[utils_cv_clang=yes],
|
||||
[utils_cv_clang=no])])
|
||||
if test $utils_cv_clang = yes; then
|
||||
gl_WARN_ADD([-Wno-format-extra-args])
|
||||
gl_WARN_ADD([-Wno-tautological-constant-out-of-range-compare])
|
||||
fi
|
||||
# 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=
|
||||
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"
|
||||
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=pure"
|
||||
gl_MANYWARN_COMPLEMENT([GNULIB_TEST_WARN_CFLAGS],
|
||||
[$GNULIB_WARN_CFLAGS], [$nw])
|
||||
AC_SUBST([GNULIB_TEST_WARN_CFLAGS])
|
||||
fi
|
||||
|
||||
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_FUNC_FORK
|
||||
|
||||
optional_bin_progs=
|
||||
@@ -275,18 +145,18 @@ 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],
|
||||
@@ -302,13 +172,6 @@ if test $utils_cv_localtime_cache = yes; then
|
||||
AC_DEFINE([LOCALTIME_CACHE], [1], [FIXME])
|
||||
fi
|
||||
|
||||
# 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
|
||||
|
||||
# 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
|
||||
@@ -356,9 +219,7 @@ 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;
|
||||
int s = sizeof ut.ut_host;]])],
|
||||
#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])
|
||||
@@ -371,9 +232,7 @@ 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;
|
||||
int s = sizeof ut.ut_host;]])],
|
||||
#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])
|
||||
@@ -410,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])
|
||||
@@ -455,6 +312,7 @@ 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.
|
||||
@@ -462,155 +320,118 @@ 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
|
||||
# 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"
|
||||
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;]])
|
||||
],
|
||||
[stdbuf_supported=yes])
|
||||
AC_MSG_RESULT([$stdbuf_supported])
|
||||
if test "$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
|
||||
|
||||
############################################################################
|
||||
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 @@
|
||||
/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
|
||||
/parse-datetime.texi
|
||||
/stamp-vti
|
||||
/version.texi
|
||||
/.dirstamp
|
||||
/gendocs_template_min
|
||||
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
|
||||
|
||||
@@ -2002,7 +2002,7 @@
|
||||
|
||||
-----
|
||||
|
||||
Copyright (C) 2001-2016 Free Software Foundation, Inc.
|
||||
Copyright (C) 2001-2009 Free Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without
|
||||
modification, are permitted provided the copyright notice
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# Make coreutils documentation. -*-Makefile-*-
|
||||
# This is included by the top-level Makefile.am.
|
||||
|
||||
# Copyright (C) 1995-2016 Free Software Foundation, Inc.
|
||||
# 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
|
||||
@@ -16,13 +15,9 @@
|
||||
# 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 = doc/coreutils.texi
|
||||
info_TEXINFOS = coreutils.texi
|
||||
|
||||
doc_coreutils_TEXINFOS = \
|
||||
doc/perm.texi \
|
||||
doc/parse-datetime.texi \
|
||||
doc/constants.texi \
|
||||
doc/fdl.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,
|
||||
@@ -34,94 +29,93 @@ doc_coreutils_TEXINFOS = \
|
||||
# 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; }
|
||||
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 += doc/constants.texi
|
||||
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-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
|
||||
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{' $(texi_files) && fail=1; \
|
||||
grep '\$$@"' $(texi_files) && fail=1; \
|
||||
grep -n '[^[:punct:]]@footnote' $(texi_files) && fail=1; \
|
||||
grep -n filename $(texi_files) \
|
||||
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
|
||||
|
||||
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".
|
||||
# Use `time zone', not `timezone'.
|
||||
sc-avoid-timezone:
|
||||
$(AM_V_GEN)$(EGREP) timezone $(texi_files) && exit 1 || :
|
||||
$(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]' $(texi_files) && exit 1 || :
|
||||
$(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_)' $(texi_files) && exit 1 || :
|
||||
$(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 $(texi_files) && exit 1 || :
|
||||
$(AM_V_GEN)$(EGREP) non-zero $(srcdir)/*.texi && exit 1 || :
|
||||
|
||||
# Use "zeros", not "zeroes" (nothing wrong with "zeroes"; just be consistent).
|
||||
# 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 || :
|
||||
$(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) \
|
||||
'/\@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}'
|
||||
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 || { echo $@: skipping test; exit 0; }; \
|
||||
$(PERL) -lne $(find_upper_case_var) $(texi_files)
|
||||
$(AM_V_GEN)$(PERL) -e 1 \
|
||||
&& $(PERL) -lne $(find_upper_case_var) $(srcdir)/*.texi
|
||||
|
||||
check-local: check-texinfo
|
||||
check: check-texinfo
|
||||
5025
doc/coreutils.texi
5025
doc/coreutils.texi
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
||||
@c File mode bits
|
||||
|
||||
@c Copyright (C) 1994-2016 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
|
||||
|
||||
@@ -112,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
|
||||
@@ -148,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
|
||||
@@ -345,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}.
|
||||
|
||||
@@ -496,16 +496,13 @@ 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}. (However, modes of five digits or more, such as
|
||||
@samp{00055}, are sometimes special. @xref{Directory Setuid and Setgid}.)
|
||||
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.
|
||||
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}.
|
||||
(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,
|
||||
@@ -545,26 +542,6 @@ For example, numeric mode @samp{4755} corresponds to symbolic mode
|
||||
@samp{ug=rw,o=r}. Numeric mode @samp{0} corresponds to symbolic mode
|
||||
@samp{a=}.
|
||||
|
||||
@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
|
||||
|
||||
@@ -583,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
|
||||
@@ -608,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,2 +0,0 @@
|
||||
#include <stddef.h>
|
||||
size_t buffer_lcm (size_t, size_t, size_t) _GL_ATTRIBUTE_CONST;
|
||||
@@ -1,43 +0,0 @@
|
||||
/* Declare an access pattern hint for files.
|
||||
Copyright (C) 2010-2016 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/>. */
|
||||
|
||||
/* Without this pragma, gcc suggests that (given !HAVE_POSIX_FADVISE)
|
||||
the fdadvise function might be a candidate for attribute 'const'. */
|
||||
#if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
|
||||
# pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
|
||||
#endif
|
||||
|
||||
#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,72 +0,0 @@
|
||||
/* Declare an access pattern hint for files.
|
||||
Copyright (C) 2010-2016 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 <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-2016 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/>. */
|
||||
|
||||
/* 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] = NULL;
|
||||
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 NULL;
|
||||
|
||||
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,26 +0,0 @@
|
||||
/* Barebones heap implementation supporting only insert and pop.
|
||||
|
||||
Copyright (C) 2010-2016 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/>. */
|
||||
|
||||
/* Full implementation: GDSL (http://gna.org/projects/gdsl/) by Nicolas
|
||||
Darnis <ndarnis@free.fr>. Adapted by Gene Auyeung. */
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
struct heap *heap_alloc (int (*) (void const *, void const *), size_t);
|
||||
void heap_free (struct heap *);
|
||||
int heap_insert (struct heap *heap, void *item);
|
||||
void *heap_remove_top (struct heap *heap);
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Align/Truncate a string in a given screen width
|
||||
Copyright (C) 2009-2016 Free Software Foundation, Inc.
|
||||
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
|
||||
@@ -22,7 +22,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <limits.h>
|
||||
#include <wchar.h>
|
||||
@@ -33,7 +32,6 @@
|
||||
#endif
|
||||
|
||||
/* Replace non printable chars.
|
||||
Note \t and \n etc. are non printable.
|
||||
Return 1 if replacement made, 0 otherwise. */
|
||||
|
||||
static bool
|
||||
@@ -79,6 +77,27 @@ wc_truncate (wchar_t *wc, size_t width)
|
||||
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.
|
||||
@@ -100,19 +119,19 @@ mbs_align_pad (char *dest, const char* dest_end, size_t n_spaces)
|
||||
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.
|
||||
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_MAX upon error (invalid multi-byte sequence in SRC,
|
||||
or malloc failure), unless MBA_UNIBYTE_FALLBACK is specified.
|
||||
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 = SIZE_MAX;
|
||||
size_t ret = -1;
|
||||
size_t src_size = strlen (src) + 1;
|
||||
char *newstr = NULL;
|
||||
wchar_t *str_wc = NULL;
|
||||
@@ -126,111 +145,82 @@ mbsalign (const char *src, char *dest, size_t dest_size,
|
||||
/* In multi-byte locales convert to wide characters
|
||||
to allow easy truncation. Also determine number
|
||||
of screen columns used. */
|
||||
if (!(flags & MBA_UNIBYTE_ONLY) && MB_CUR_MAX > 1)
|
||||
if (MB_CUR_MAX > 1)
|
||||
{
|
||||
size_t src_chars = mbstowcs (NULL, src, 0);
|
||||
if (src_chars == SIZE_MAX)
|
||||
{
|
||||
if (flags & MBA_UNIBYTE_FALLBACK)
|
||||
goto mbsalign_unibyte;
|
||||
else
|
||||
goto mbsalign_cleanup;
|
||||
}
|
||||
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)
|
||||
{
|
||||
if (flags & MBA_UNIBYTE_FALLBACK)
|
||||
goto mbsalign_unibyte;
|
||||
else
|
||||
goto mbsalign_cleanup;
|
||||
}
|
||||
if (mbstowcs (str_wc, src, src_chars) != 0)
|
||||
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 = wcswidth (str_wc, src_chars);
|
||||
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 (wc_enabled && (conversion || (n_cols > *width)))
|
||||
if (conversion || (n_cols > *width))
|
||||
{
|
||||
if (conversion)
|
||||
{
|
||||
/* May have increased the size by converting
|
||||
\t to \uFFFD for example. */
|
||||
src_size = wcstombs (NULL, str_wc, 0) + 1;
|
||||
}
|
||||
newstr = malloc (src_size);
|
||||
if (newstr == NULL)
|
||||
newstr = malloc (src_size);
|
||||
if (newstr == NULL)
|
||||
goto mbsalign_cleanup;
|
||||
str_to_print = newstr;
|
||||
if (wc_enabled)
|
||||
{
|
||||
if (flags & MBA_UNIBYTE_FALLBACK)
|
||||
goto mbsalign_unibyte;
|
||||
else
|
||||
goto mbsalign_cleanup;
|
||||
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';
|
||||
}
|
||||
str_to_print = newstr;
|
||||
n_cols = wc_truncate (str_wc, *width);
|
||||
n_used_bytes = wcstombs (newstr, str_wc, src_size);
|
||||
}
|
||||
|
||||
mbsalign_unibyte:
|
||||
|
||||
if (n_cols > *width) /* Unibyte truncation required. */
|
||||
{
|
||||
n_cols = *width;
|
||||
n_used_bytes = n_cols;
|
||||
}
|
||||
|
||||
if (*width > n_cols) /* Padding required. */
|
||||
if (*width > n_cols)
|
||||
n_spaces = *width - n_cols;
|
||||
|
||||
/* indicate to caller how many cells needed (not including padding). */
|
||||
*width = n_cols;
|
||||
|
||||
{
|
||||
size_t start_spaces, end_spaces;
|
||||
/* indicate to caller how many bytes needed (not including NUL). */
|
||||
ret = n_used_bytes + (n_spaces * 1);
|
||||
|
||||
switch (align)
|
||||
{
|
||||
case MBS_ALIGN_LEFT:
|
||||
start_spaces = 0;
|
||||
end_spaces = n_spaces;
|
||||
break;
|
||||
case MBS_ALIGN_RIGHT:
|
||||
start_spaces = n_spaces;
|
||||
end_spaces = 0;
|
||||
break;
|
||||
case MBS_ALIGN_CENTER:
|
||||
default:
|
||||
start_spaces = n_spaces / 2 + n_spaces % 2;
|
||||
end_spaces = n_spaces / 2;
|
||||
break;
|
||||
}
|
||||
/* 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;
|
||||
|
||||
if (flags & MBA_NO_LEFT_PAD)
|
||||
start_spaces = 0;
|
||||
if (flags & MBA_NO_RIGHT_PAD)
|
||||
end_spaces = 0;
|
||||
|
||||
/* Write as much NUL terminated output to DEST as possible. */
|
||||
if (dest_size != 0)
|
||||
switch (align)
|
||||
{
|
||||
size_t space_left;
|
||||
char *dest_end = dest + dest_size - 1;
|
||||
|
||||
dest = mbs_align_pad (dest, dest_end, start_spaces);
|
||||
space_left = dest_end - dest;
|
||||
dest = mempcpy (dest, str_to_print, MIN (n_used_bytes, space_left));
|
||||
mbs_align_pad (dest, dest_end, end_spaces);
|
||||
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;
|
||||
}
|
||||
|
||||
/* indicate to caller how many bytes needed (not including NUL). */
|
||||
ret = n_used_bytes + ((start_spaces + end_spaces) * 1);
|
||||
}
|
||||
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:
|
||||
|
||||
@@ -239,40 +229,3 @@ mbsalign_cleanup:
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* A wrapper around mbsalign() to dynamically allocate the
|
||||
minimum amount of memory to store the result.
|
||||
Return NULL on failure. */
|
||||
|
||||
char *
|
||||
ambsalign (const char *src, size_t *width, mbs_align_t align, int flags)
|
||||
{
|
||||
size_t orig_width = *width;
|
||||
size_t size = *width; /* Start with enough for unibyte mode. */
|
||||
size_t req = size;
|
||||
char *buf = NULL;
|
||||
|
||||
while (req >= size)
|
||||
{
|
||||
char *nbuf;
|
||||
size = req + 1; /* Space for NUL. */
|
||||
nbuf = realloc (buf, size);
|
||||
if (nbuf == NULL)
|
||||
{
|
||||
free (buf);
|
||||
buf = NULL;
|
||||
break;
|
||||
}
|
||||
buf = nbuf;
|
||||
*width = orig_width;
|
||||
req = mbsalign (src, buf, size, width, align, flags);
|
||||
if (req == SIZE_MAX)
|
||||
{
|
||||
free (buf);
|
||||
buf = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Align/Truncate a string in a given screen width
|
||||
Copyright (C) 2009-2016 Free Software Foundation, Inc.
|
||||
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
|
||||
@@ -18,42 +18,6 @@
|
||||
|
||||
typedef enum { MBS_ALIGN_LEFT, MBS_ALIGN_RIGHT, MBS_ALIGN_CENTER } mbs_align_t;
|
||||
|
||||
enum {
|
||||
/* Use unibyte mode for invalid multibyte strings
|
||||
or when heap memory is exhausted. */
|
||||
MBA_UNIBYTE_FALLBACK = 0x0001,
|
||||
|
||||
/* As an optimization, don't do multibyte processing
|
||||
when we know no multibyte characters are present. */
|
||||
MBA_UNIBYTE_ONLY = 0x0002,
|
||||
|
||||
/* Don't add leading padding. */
|
||||
MBA_NO_LEFT_PAD = 0x0004,
|
||||
|
||||
/* Don't add trailing padding. */
|
||||
MBA_NO_RIGHT_PAD = 0x0008
|
||||
|
||||
#if 0 /* Other possible options. */
|
||||
/* Skip invalid multibyte chars rather than failing. */
|
||||
MBA_IGNORE_INVALID
|
||||
|
||||
/* Align multibyte strings using "figure space" (\u2007). */
|
||||
MBA_USE_FIGURE_SPACE
|
||||
|
||||
/* Don't truncate. */
|
||||
MBA_NO_TRUNCATE
|
||||
|
||||
/* Ensure no leading whitespace. */
|
||||
MBA_LSTRIP
|
||||
|
||||
/* Ensure no trailing whitespace. */
|
||||
MBA_RSTRIP
|
||||
#endif
|
||||
};
|
||||
|
||||
size_t
|
||||
mbsalign (const char *src, char *dest, size_t dest_size,
|
||||
size_t *width, mbs_align_t align, int flags);
|
||||
|
||||
char *
|
||||
ambsalign (const char *src, 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 @@
|
||||
/* find-mount-point.h -- find the root mount point for a file.
|
||||
Copyright (C) 2010-2016 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
|
||||
@@ -14,4 +14,6 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
extern char *find_mount_point (char const *, struct stat const *);
|
||||
#include <sys/types.h>
|
||||
|
||||
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-2016 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
|
||||
@@ -16,7 +16,7 @@
|
||||
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 Colin Plumb and Paul Eggert. */
|
||||
Written by Colin Plumb. */
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------
|
||||
@@ -34,112 +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"
|
||||
|
||||
/* The minimum of two sizes A and B. */
|
||||
static inline size_t
|
||||
min (size_t a, size_t b)
|
||||
|
||||
/* 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])
|
||||
{
|
||||
return (a < b ? a : b);
|
||||
}
|
||||
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 */
|
||||
|
||||
/* 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)
|
||||
{
|
||||
isaac_word desired_bits = ((isaac_word) 1 << 1 << (ISAAC_BITS - 1)) - 1;
|
||||
return a & desired_bits;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
@@ -148,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-2016 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
|
||||
@@ -16,50 +16,28 @@
|
||||
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 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 *);
|
||||
void isaac_refill (struct isaac_state *, isaac_word[ISAAC_WORDS]);
|
||||
void isaac_refill (struct isaac_state *, uint32_t[ISAAC_WORDS]);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Generate random integers.
|
||||
|
||||
Copyright (C) 2006-2016 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
|
||||
@@ -125,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)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Generate random integers.
|
||||
|
||||
Copyright (C) 2006-2016 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
|
||||
@@ -34,8 +34,7 @@ struct randint_source;
|
||||
|
||||
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 *)
|
||||
_GL_ATTRIBUTE_PURE;
|
||||
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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Generate random permutations.
|
||||
|
||||
Copyright (C) 2006-2016 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
|
||||
@@ -19,18 +19,16 @@
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "hash.h"
|
||||
#include "randperm.h"
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "xalloc.h"
|
||||
|
||||
/* Return the ceiling of the log base 2 of N. If N is zero, return
|
||||
an unspecified value. */
|
||||
|
||||
static size_t _GL_ATTRIBUTE_CONST
|
||||
static size_t
|
||||
ceil_lg (size_t n)
|
||||
{
|
||||
size_t b = 0;
|
||||
@@ -59,94 +57,6 @@ 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, NULL, 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_delete (sv, &(struct sparse_ent_) {i,0});
|
||||
struct sparse_ent_ *v2 = hash_delete (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 NULL if H is zero. */
|
||||
@@ -169,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 == NULL)
|
||||
xalloc_die ();
|
||||
v = xnmalloc (h, sizeof *v);
|
||||
}
|
||||
else
|
||||
{
|
||||
sv = NULL; /* 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,4 +1,4 @@
|
||||
#include "randint.h"
|
||||
#include <stddef.h>
|
||||
size_t randperm_bound (size_t, size_t) _GL_ATTRIBUTE_CONST;
|
||||
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-2016 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
|
||||
@@ -17,9 +17,6 @@
|
||||
|
||||
/* 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,16 +24,12 @@
|
||||
#include <errno.h>
|
||||
#include <error.h>
|
||||
#include <exitfail.h>
|
||||
#include <fcntl.h>
|
||||
#include <quote.h>
|
||||
#include <stdalign.h>
|
||||
#include <quotearg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "gettext.h"
|
||||
#define _(msgid) gettext (msgid)
|
||||
@@ -60,16 +53,13 @@
|
||||
# define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#if _STRING_ARCH_unaligned || _STRING_INLINE_unaligned
|
||||
#if _STRING_ARCH_unaligned
|
||||
# define ALIGNED_POINTER(ptr, type) true
|
||||
#else
|
||||
# define alignof(type) offsetof (struct { char c; type x; }, x)
|
||||
# define ALIGNED_POINTER(ptr, type) ((size_t) (ptr) % alignof (type) == 0)
|
||||
#endif
|
||||
|
||||
#ifndef NAME_OF_NONCE_DEVICE
|
||||
# define NAME_OF_NONCE_DEVICE "/dev/urandom"
|
||||
#endif
|
||||
|
||||
/* The maximum buffer size used for reads of random data. Using the
|
||||
value 2 * ISAAC_BYTES makes this the largest power of two that
|
||||
would not otherwise cause struct randread_source to grow. */
|
||||
@@ -110,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;
|
||||
@@ -125,8 +115,8 @@ randread_error (void const *file_name)
|
||||
{
|
||||
if (file_name)
|
||||
error (exit_failure, errno,
|
||||
errno == 0 ? _("%s: end of file") : _("%s: read error"),
|
||||
quote (file_name));
|
||||
_(errno == 0 ? "%s: end of file" : "%s: read error"),
|
||||
quotearg_colon (file_name));
|
||||
abort ();
|
||||
}
|
||||
|
||||
@@ -143,52 +133,6 @@ simple_new (FILE *source, void const *handler_arg)
|
||||
return s;
|
||||
}
|
||||
|
||||
/* Put a nonce value into BUFFER, with size BUFSIZE, but do not get
|
||||
more than BYTES_BOUND bytes' worth of random information from any
|
||||
nonce device. */
|
||||
|
||||
static void
|
||||
get_nonce (void *buffer, size_t bufsize, size_t bytes_bound)
|
||||
{
|
||||
char *buf = buffer;
|
||||
ssize_t seeded = 0;
|
||||
|
||||
/* Get some data from FD if available. */
|
||||
int fd = open (NAME_OF_NONCE_DEVICE, O_RDONLY | O_BINARY);
|
||||
if (0 <= fd)
|
||||
{
|
||||
seeded = read (fd, buf, MIN (bufsize, bytes_bound));
|
||||
if (seeded < 0)
|
||||
seeded = 0;
|
||||
close (fd);
|
||||
}
|
||||
|
||||
/* If there's no nonce device, use a poor approximation
|
||||
by getting the time of day, etc. */
|
||||
#define ISAAC_SEED(type, initialize_v) \
|
||||
if (seeded < bufsize) \
|
||||
{ \
|
||||
type v; \
|
||||
size_t nbytes = MIN (sizeof v, bufsize - seeded); \
|
||||
initialize_v; \
|
||||
memcpy (buf + seeded, &v, nbytes); \
|
||||
seeded += nbytes; \
|
||||
}
|
||||
ISAAC_SEED (struct timeval, gettimeofday (&v, NULL));
|
||||
ISAAC_SEED (pid_t, v = getpid ());
|
||||
ISAAC_SEED (pid_t, v = getppid ());
|
||||
ISAAC_SEED (uid_t, v = getuid ());
|
||||
ISAAC_SEED (uid_t, v = getgid ());
|
||||
|
||||
#ifdef lint
|
||||
/* Normally we like having the extra randomness from uninitialized
|
||||
parts of BUFFER. However, omit this randomness if we want to
|
||||
avoid false-positives from memory-checking debugging tools. */
|
||||
memset (buf + seeded, 0, bufsize - seeded);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* 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
|
||||
@@ -221,8 +165,6 @@ randread_new (char const *name, size_t bytes_bound)
|
||||
else
|
||||
{
|
||||
s->buf.isaac.buffered = 0;
|
||||
get_nonce (s->buf.isaac.state.m, sizeof s->buf.isaac.state.m,
|
||||
bytes_bound);
|
||||
isaac_seed (&s->buf.isaac.state);
|
||||
}
|
||||
|
||||
@@ -257,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;
|
||||
@@ -275,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);
|
||||
@@ -291,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 (ALIGNED_POINTER (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);
|
||||
@@ -310,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);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Generate buffers of random data.
|
||||
|
||||
Copyright (C) 2006-2016 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
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* root-dev-ino.c -- get the device and inode numbers for '/'.
|
||||
Copyright (C) 2003-2016 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
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Call lstat to get the device and inode numbers for '/'.
|
||||
/* 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 *
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Root device and inode number checking.
|
||||
|
||||
Copyright (C) 2003-2016 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
|
||||
@@ -35,11 +35,11 @@ get_root_dev_ino (struct dev_ino *root_d_i);
|
||||
{ \
|
||||
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,46 +0,0 @@
|
||||
/* Include and determine availability of smack routines
|
||||
Copyright (C) 2013-2016 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/>. */
|
||||
|
||||
/* Here we replace or wrap the most common smack functions used by coreutils.
|
||||
Others will need to be protected by HAVE_SMACK. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#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 (const char *label)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline bool
|
||||
is_smack_enabled (void)
|
||||
{
|
||||
#ifdef HAVE_SMACK
|
||||
return smack_smackfs_path () != NULL;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
int strintcmp (char const *, char const *) _GL_ATTRIBUTE_PURE;
|
||||
int strnumcmp (char const *, char const *, int, int);
|
||||
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);
|
||||
}
|
||||
@@ -1,189 +0,0 @@
|
||||
diff --git a/lib/tempname.c b/lib/tempname.c
|
||||
index 69c572f..1920274 100644
|
||||
--- a/lib/tempname.c
|
||||
+++ b/lib/tempname.c
|
||||
@@ -20,6 +20,7 @@
|
||||
#if !_LIBC
|
||||
# include <config.h>
|
||||
# include "tempname.h"
|
||||
+# include "randint.h"
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
@@ -47,6 +48,7 @@
|
||||
# error report this to bug-gnulib@gnu.org
|
||||
#endif
|
||||
|
||||
+#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -173,28 +175,34 @@ __path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
|
||||
}
|
||||
#endif /* _LIBC */
|
||||
|
||||
+static inline bool _GL_ATTRIBUTE_PURE
|
||||
+check_x_suffix (char const *s, size_t len)
|
||||
+{
|
||||
+ return len <= strspn (s, "X");
|
||||
+}
|
||||
+
|
||||
/* These are the characters used in temporary file names. */
|
||||
static const char letters[] =
|
||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
|
||||
int
|
||||
-__try_tempname (char *tmpl, int suffixlen, void *args,
|
||||
- int (*tryfunc) (char *, void *))
|
||||
+try_tempname_len (char *tmpl, int suffixlen, void *args,
|
||||
+ int (*tryfunc) (char *, void *), size_t x_suffix_len)
|
||||
{
|
||||
- int len;
|
||||
+ size_t len;
|
||||
char *XXXXXX;
|
||||
- static uint64_t value;
|
||||
- uint64_t random_time_bits;
|
||||
unsigned int count;
|
||||
int fd = -1;
|
||||
int save_errno = errno;
|
||||
+ 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 of 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. */
|
||||
+ give the system administrator the chance to remove the problems.
|
||||
+ This value requires that X_SUFFIX_LEN be at least 3. */
|
||||
#define ATTEMPTS_MIN (62 * 62 * 62)
|
||||
|
||||
/* The number of times to attempt to generate a temporary file. To
|
||||
@@ -206,57 +214,55 @@ __try_tempname (char *tmpl, int suffixlen, void *args,
|
||||
#endif
|
||||
|
||||
len = strlen (tmpl);
|
||||
- if (len < 6 + suffixlen || memcmp (&tmpl[len - 6 - suffixlen], "XXXXXX", 6))
|
||||
+ if (len < x_suffix_len + suffixlen
|
||||
+ || ! check_x_suffix (&tmpl[len - x_suffix_len - suffixlen],
|
||||
+ x_suffix_len))
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* This is where the Xs start. */
|
||||
- XXXXXX = &tmpl[len - 6 - suffixlen];
|
||||
+ XXXXXX = &tmpl[len - x_suffix_len - suffixlen];
|
||||
|
||||
/* Get some more or less random data. */
|
||||
-#ifdef RANDOM_BITS
|
||||
- RANDOM_BITS (random_time_bits);
|
||||
-#else
|
||||
- {
|
||||
- struct timeval tv;
|
||||
- __gettimeofday (&tv, NULL);
|
||||
- random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec;
|
||||
- }
|
||||
-#endif
|
||||
- value += random_time_bits ^ __getpid ();
|
||||
+ rand_src = randint_all_new (NULL, x_suffix_len);
|
||||
+ if (! rand_src)
|
||||
+ return -1;
|
||||
|
||||
- for (count = 0; count < attempts; value += 7777, ++count)
|
||||
+ for (count = 0; count < attempts; ++count)
|
||||
{
|
||||
- uint64_t v = value;
|
||||
-
|
||||
- /* Fill in the random bits. */
|
||||
- XXXXXX[0] = letters[v % 62];
|
||||
- v /= 62;
|
||||
- XXXXXX[1] = letters[v % 62];
|
||||
- v /= 62;
|
||||
- XXXXXX[2] = letters[v % 62];
|
||||
- v /= 62;
|
||||
- XXXXXX[3] = letters[v % 62];
|
||||
- v /= 62;
|
||||
- XXXXXX[4] = letters[v % 62];
|
||||
- v /= 62;
|
||||
- XXXXXX[5] = letters[v % 62];
|
||||
+ size_t i;
|
||||
+
|
||||
+ for (i = 0; i < x_suffix_len; i++)
|
||||
+ XXXXXX[i] = letters[randint_genmax (rand_src, sizeof letters - 2)];
|
||||
|
||||
fd = tryfunc (tmpl, args);
|
||||
if (fd >= 0)
|
||||
{
|
||||
__set_errno (save_errno);
|
||||
- return fd;
|
||||
+ goto done;
|
||||
}
|
||||
else if (errno != EEXIST)
|
||||
- return -1;
|
||||
+ {
|
||||
+ 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;
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -285,9 +291,10 @@ try_nocreate (char *tmpl, void *flags _GL_UNUSED)
|
||||
}
|
||||
|
||||
/* Generate a temporary file name based on TMPL. TMPL must match the
|
||||
- rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix).
|
||||
+ rules for mk[s]temp (i.e., end in at least X_SUFFIX_LEN "X"s,
|
||||
+ possibly with a suffix).
|
||||
The name constructed does not exist at the time of the call to
|
||||
- __gen_tempname. TMPL is overwritten with the result.
|
||||
+ this function. TMPL is overwritten with the result.
|
||||
|
||||
KIND may be one of:
|
||||
__GT_NOCREATE: simply verify that the name does not exist
|
||||
@@ -298,7 +305,8 @@ try_nocreate (char *tmpl, void *flags _GL_UNUSED)
|
||||
|
||||
We use a clever algorithm to get hard-to-predict names. */
|
||||
int
|
||||
-__gen_tempname (char *tmpl, int suffixlen, int flags, int kind)
|
||||
+gen_tempname_len (char *tmpl, int suffixlen, int flags, int kind,
|
||||
+ size_t x_suffix_len)
|
||||
{
|
||||
int (*tryfunc) (char *, void *);
|
||||
|
||||
@@ -320,5 +328,18 @@ __gen_tempname (char *tmpl, int suffixlen, int flags, int kind)
|
||||
assert (! "invalid KIND in __gen_tempname");
|
||||
abort ();
|
||||
}
|
||||
- return __try_tempname (tmpl, suffixlen, &flags, tryfunc);
|
||||
+ return try_tempname_len (tmpl, suffixlen, &flags, tryfunc, x_suffix_len);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+__gen_tempname (char *tmpl, int suffixlen, int flags, int kind)
|
||||
+{
|
||||
+ return gen_tempname_len (tmpl, suffixlen, flags, kind, 6);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+__try_tempname (char *tmpl, int suffixlen, void *args,
|
||||
+ int (*tryfunc) (char *, void *))
|
||||
+{
|
||||
+ return try_tempname_len (tmpl, suffixlen, args, tryfunc, 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,23 +0,0 @@
|
||||
diff --git a/lib/tempname.h b/lib/tempname.h
|
||||
index e609360..6029b9f 100644
|
||||
--- a/lib/tempname.h
|
||||
+++ b/lib/tempname.h
|
||||
@@ -50,6 +50,8 @@ extern "C" {
|
||||
|
||||
We use a clever algorithm to get hard-to-predict names. */
|
||||
extern int gen_tempname (char *tmpl, int suffixlen, int flags, int kind);
|
||||
+extern int gen_tempname_len (char *tmpl, int suffixlen, int flags, int kind,
|
||||
+ size_t x_suffix_len);
|
||||
|
||||
/* Similar to gen_tempname, but TRYFUNC is called for each temporary
|
||||
name to try. If TRYFUNC returns a non-negative number, TRY_GEN_TEMPNAME
|
||||
@@ -57,6 +59,9 @@ extern int gen_tempname (char *tmpl, int suffixlen, int flags, int kind);
|
||||
name is tried, or else TRY_GEN_TEMPNAME returns -1. */
|
||||
extern int try_tempname (char *tmpl, int suffixlen, void *args,
|
||||
int (*tryfunc) (char *, void *));
|
||||
+extern int try_tempname_len (char *tmpl, int suffixlen, void *args,
|
||||
+ int (*tryfunc) (char *, void *),
|
||||
+ size_t x_suffix_len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
@@ -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,86 +0,0 @@
|
||||
/* Convert decimal strings with bounds checking and exit on error.
|
||||
|
||||
Copyright (C) 2014-2016 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 "xdectoint.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <inttypes.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 (const char *n_str, int base, __xdectoint_t min, __xdectoint_t max,
|
||||
const char *suffixes, const char *err, int err_exit)
|
||||
{
|
||||
strtol_error s_err;
|
||||
|
||||
__xdectoint_t tnum;
|
||||
s_err = __xstrtol (n_str, NULL, 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));
|
||||
}
|
||||
|
||||
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 (const char *n_str, __xdectoint_t min, __xdectoint_t max,
|
||||
const char *suffixes, const char *err, int err_exit)
|
||||
{
|
||||
return __xnumtoint (n_str, 10, min, max, suffixes, err, err_exit);
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/* Convert decimal strings with bounds checking and exit on error.
|
||||
|
||||
Copyright (C) 2014-2016 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/>. */
|
||||
|
||||
#ifndef XDECTOINT_H_
|
||||
# define XDECTOINT_H_ 1
|
||||
|
||||
# include <inttypes.h>
|
||||
|
||||
# define _DECLARE_XDECTOINT(name, type) \
|
||||
type name (const char *n_str, type min, type max, \
|
||||
const char *suffixes, const char *err, int err_exit);
|
||||
# define _DECLARE_XNUMTOINT(name, type) \
|
||||
type name (const char *n_str, int base, type min, type max, \
|
||||
const char *suffixes, const char *err, int err_exit);
|
||||
|
||||
_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,65 +0,0 @@
|
||||
/* xfts.c -- a wrapper for fts_open
|
||||
|
||||
Copyright (C) 2003-2016 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 Jim Meyering. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <assert.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 == NULL)
|
||||
{
|
||||
/* This can fail in two ways: out of memory or with errno==EINVAL,
|
||||
which indicates it was called with invalid bit_flags. */
|
||||
assert (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));
|
||||
}
|
||||
11
gl/m4/mgetgroups.m4
Normal file
11
gl/m4/mgetgroups.m4
Normal file
@@ -0,0 +1,11 @@
|
||||
#serial 3
|
||||
dnl Copyright (C) 2007-2009 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
AC_DEFUN([gl_MGETGROUPS],
|
||||
[
|
||||
AC_CHECK_FUNCS([getgrouplist])
|
||||
AC_LIBOBJ([mgetgroups])
|
||||
])
|
||||
14
gl/m4/root-dev-ino.m4
Normal file
14
gl/m4/root-dev-ino.m4
Normal file
@@ -0,0 +1,14 @@
|
||||
#serial 3
|
||||
dnl Copyright (C) 2005, 2006, 2009 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
AC_DEFUN([gl_ROOT_DEV_INO],
|
||||
[
|
||||
AC_LIBOBJ([root-dev-ino])
|
||||
|
||||
dnl Prerequisites
|
||||
AC_REQUIRE([AC_FUNC_LSTAT])
|
||||
:
|
||||
])
|
||||
@@ -1,23 +0,0 @@
|
||||
Description:
|
||||
Compute a good buffer size for dealing with two files.
|
||||
|
||||
Files:
|
||||
lib/buffer-lcm.c
|
||||
lib/buffer-lcm.h
|
||||
|
||||
Depends-on:
|
||||
stddef
|
||||
|
||||
configure.ac:
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += buffer-lcm.c buffer-lcm.h
|
||||
|
||||
Include:
|
||||
"buffer-lcm.h"
|
||||
|
||||
License:
|
||||
GPL
|
||||
|
||||
Maintainer:
|
||||
Paul Eggert
|
||||
@@ -1,24 +0,0 @@
|
||||
Description:
|
||||
Declare an access pattern hint for files.
|
||||
|
||||
Files:
|
||||
lib/fadvise.c
|
||||
lib/fadvise.h
|
||||
|
||||
Depends-on:
|
||||
ignore-value
|
||||
|
||||
configure.ac:
|
||||
AC_CHECK_FUNCS_ONCE([posix_fadvise])
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += fadvise.c fadvise.h
|
||||
|
||||
Include:
|
||||
"fadvise.h"
|
||||
|
||||
License:
|
||||
LGPL
|
||||
|
||||
Maintainer:
|
||||
Pádraig Brady
|
||||
@@ -1,10 +0,0 @@
|
||||
Files:
|
||||
tests/test-fadvise.c
|
||||
|
||||
Depends-on:
|
||||
|
||||
configure.ac:
|
||||
|
||||
Makefile.am:
|
||||
TESTS += test-fadvise
|
||||
check_PROGRAMS += test-fadvise
|
||||
@@ -1,23 +0,0 @@
|
||||
Description:
|
||||
Open a file to a particular file descriptor.
|
||||
|
||||
Files:
|
||||
lib/fd-reopen.c
|
||||
lib/fd-reopen.h
|
||||
|
||||
Depends-on:
|
||||
fcntl-h
|
||||
|
||||
configure.ac:
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += fd-reopen.c fd-reopen.h
|
||||
|
||||
Include:
|
||||
"fd-reopen.h"
|
||||
|
||||
License:
|
||||
GPL
|
||||
|
||||
Maintainer:
|
||||
Paul Eggert
|
||||
13
gl/modules/getloadavg.diff
Normal file
13
gl/modules/getloadavg.diff
Normal file
@@ -0,0 +1,13 @@
|
||||
diff --git a/modules/getloadavg b/modules/getloadavg
|
||||
index 2fbeb40..b79aaca 100644
|
||||
--- a/modules/getloadavg
|
||||
+++ b/modules/getloadavg
|
||||
@@ -16,7 +16,7 @@ stdbool
|
||||
fcntl-safer
|
||||
|
||||
configure.ac:
|
||||
-gl_GETLOADAVG([$gl_source_base])
|
||||
+gl_GETLOADAVG([lib])
|
||||
gl_STDLIB_MODULE_INDICATOR([getloadavg])
|
||||
|
||||
Makefile.am:
|
||||
@@ -1,24 +0,0 @@
|
||||
Description:
|
||||
Binary heap with minimal number of methods. Used in sort.
|
||||
|
||||
Files:
|
||||
lib/heap.c
|
||||
lib/heap.h
|
||||
|
||||
Depends-on:
|
||||
stdlib-safer
|
||||
xalloc
|
||||
|
||||
configure.ac:
|
||||
|
||||
Makefile.am:
|
||||
lib_SOURCES += heap.c heap.h
|
||||
|
||||
Include:
|
||||
"heap.h"
|
||||
|
||||
License:
|
||||
GPL
|
||||
|
||||
Maintainer:
|
||||
Gene Auyeung
|
||||
@@ -1,9 +0,0 @@
|
||||
diff --git a/modules/link-tests b/modules/link-tests
|
||||
index 5b1978e..039e97f 100644
|
||||
--- a/modules/link-tests
|
||||
+++ b/modules/link-tests
|
||||
@@ -15,3 +15,4 @@ configure.ac:
|
||||
Makefile.am:
|
||||
TESTS += test-link
|
||||
check_PROGRAMS += test-link
|
||||
+test_link_LDADD = $(LDADD) @LIBINTL@
|
||||
@@ -10,7 +10,6 @@ wchar
|
||||
wctype
|
||||
wcwidth
|
||||
mempcpy
|
||||
stdint
|
||||
|
||||
configure.ac:
|
||||
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
Files:
|
||||
tests/test-mbsalign.c
|
||||
tests/macros.h
|
||||
|
||||
Depends-on:
|
||||
|
||||
configure.ac:
|
||||
|
||||
Makefile.am:
|
||||
TESTS += test-mbsalign
|
||||
check_PROGRAMS += test-mbsalign
|
||||
24
gl/modules/mgetgroups
Normal file
24
gl/modules/mgetgroups
Normal file
@@ -0,0 +1,24 @@
|
||||
Description:
|
||||
Return the group IDs of a user in malloc'd storage.
|
||||
|
||||
Files:
|
||||
lib/mgetgroups.c
|
||||
lib/mgetgroups.h
|
||||
m4/mgetgroups.m4
|
||||
|
||||
Depends-on:
|
||||
getugroups
|
||||
xalloc
|
||||
|
||||
configure.ac:
|
||||
gl_MGETGROUPS
|
||||
|
||||
Makefile.am:
|
||||
|
||||
Include:
|
||||
|
||||
License:
|
||||
LGPL
|
||||
|
||||
Maintainer:
|
||||
Jim Meyering
|
||||
@@ -17,7 +17,7 @@ lib_SOURCES += randint.c randint.h
|
||||
Include:
|
||||
"randint.h"
|
||||
|
||||
License:
|
||||
License
|
||||
GPL
|
||||
|
||||
Maintainer:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user