mirror of
https://git.savannah.gnu.org/git/coreutils.git
synced 2025-09-10 07:59:52 +02:00
Compare commits
234 Commits
v6.2
...
COREUTILS-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f044d2d51c | ||
|
|
565b165115 | ||
|
|
9f1b96313e | ||
|
|
fc92148eac | ||
|
|
a4f7b723f0 | ||
|
|
e7f7dcb9d1 | ||
|
|
545df07893 | ||
|
|
8406e92795 | ||
|
|
1ea616697a | ||
|
|
5e585ffe84 | ||
|
|
370370c8e4 | ||
|
|
ba45154d8e | ||
|
|
6e7e2709c8 | ||
|
|
aa0fb1e032 | ||
|
|
1ddf7faf11 | ||
|
|
db7092bed3 | ||
|
|
97136cb93f | ||
|
|
9b06af3367 | ||
|
|
a45772d52d | ||
|
|
a43ee65ee5 | ||
|
|
549bbdf7b4 | ||
|
|
5e2f415d17 | ||
|
|
d6a37dfa3b | ||
|
|
8ec7811e82 | ||
|
|
08dcc35470 | ||
|
|
17a7d2c81b | ||
|
|
a23c91026d | ||
|
|
1ce71652fc | ||
|
|
1b95d5ee81 | ||
|
|
6b7c67ad88 | ||
|
|
02e24f2593 | ||
|
|
5891b7ce21 | ||
|
|
c8092e5db0 | ||
|
|
8cafe0070a | ||
|
|
d0275e280e | ||
|
|
37012effc9 | ||
|
|
a409011bba | ||
|
|
a3ae3e8085 | ||
|
|
3ccd02d5b9 | ||
|
|
5272c6daa1 | ||
|
|
e750c5cac8 | ||
|
|
92210636da | ||
|
|
46710dd82a | ||
|
|
efab0d7989 | ||
|
|
659e5f5edc | ||
|
|
b076de8551 | ||
|
|
7719e67e36 | ||
|
|
d66091126a | ||
|
|
41b5fe3246 | ||
|
|
e9a8c140da | ||
|
|
279c41d79c | ||
|
|
81ebd46046 | ||
|
|
318fb0502d | ||
|
|
ad2a81ce8b | ||
|
|
497a5cf465 | ||
|
|
1efc5bda6c | ||
|
|
0cafba44bb | ||
|
|
1a0333565f | ||
|
|
a73fdeb2ce | ||
|
|
751f6acf54 | ||
|
|
8b139ff78c | ||
|
|
b6b438c45d | ||
|
|
fc9b802e3d | ||
|
|
e189a79efd | ||
|
|
56206ccb80 | ||
|
|
3ef2f939f7 | ||
|
|
1b00a69ff2 | ||
|
|
7932d2e2d4 | ||
|
|
2061f04847 | ||
|
|
d5d00c7f9f | ||
|
|
84268dae4e | ||
|
|
78a1d22aa0 | ||
|
|
597bfeb851 | ||
|
|
c24e93d926 | ||
|
|
75be540f7d | ||
|
|
28c7ef509e | ||
|
|
7c96936a04 | ||
|
|
e24ce7c58d | ||
|
|
876e46bce7 | ||
|
|
a0db0def2d | ||
|
|
0766fb8b54 | ||
|
|
b40b5b6917 | ||
|
|
95954ad583 | ||
|
|
e81a82b74f | ||
|
|
3e9cc76189 | ||
|
|
693311a5c3 | ||
|
|
5e42576c01 | ||
|
|
ba6b1acefd | ||
|
|
a3c4e0b94c | ||
|
|
7e4eef7e40 | ||
|
|
a002111341 | ||
|
|
0fdbf2e8c7 | ||
|
|
9b17e1d7d4 | ||
|
|
7054512f14 | ||
|
|
479648040d | ||
|
|
0c0121ed20 | ||
|
|
33d52dbc43 | ||
|
|
9b34202141 | ||
|
|
2457af43cf | ||
|
|
f5417daca0 | ||
|
|
b1289b8716 | ||
|
|
dcf5b47708 | ||
|
|
46775398f2 | ||
|
|
a75684d6ea | ||
|
|
86719b3cd8 | ||
|
|
8d8af1248d | ||
|
|
64e75cf0ed | ||
|
|
e116c805bf | ||
|
|
76a7aea9b6 | ||
|
|
14f131ea57 | ||
|
|
177913f5b8 | ||
|
|
86823158eb | ||
|
|
81afea0110 | ||
|
|
7bc17873e5 | ||
|
|
11cf1d39f2 | ||
|
|
f594f1fb38 | ||
|
|
a186e9eda6 | ||
|
|
d1ea87316f | ||
|
|
8029cc8b5a | ||
|
|
7a0f8b0487 | ||
|
|
dd8398a3c6 | ||
|
|
443d509578 | ||
|
|
e0b2cb892a | ||
|
|
ebcf61da0f | ||
|
|
1491ae9ceb | ||
|
|
f3fbb64189 | ||
|
|
32cfc1ffec | ||
|
|
46693ba15b | ||
|
|
269263a5f7 | ||
|
|
34b35b1a3e | ||
|
|
e2c177710a | ||
|
|
8a2e111207 | ||
|
|
095c1c83eb | ||
|
|
0dc7f78986 | ||
|
|
779168820b | ||
|
|
965232b5b9 | ||
|
|
5dea5d07cd | ||
|
|
f2c088fa10 | ||
|
|
dc9790379c | ||
|
|
8552234cb5 | ||
|
|
b985c478d6 | ||
|
|
1471e1e61f | ||
|
|
8dda1ae431 | ||
|
|
c0b262550c | ||
|
|
bad80a7223 | ||
|
|
9f70d6021b | ||
|
|
5f60ffcfcf | ||
|
|
90224c6639 | ||
|
|
8202f4d6d5 | ||
|
|
e3e4f829a1 | ||
|
|
e245a66054 | ||
|
|
489ff7f0cd | ||
|
|
2983bf7c85 | ||
|
|
34d0ffbce4 | ||
|
|
6089facdc3 | ||
|
|
181428d653 | ||
|
|
4b86e52050 | ||
|
|
dc52b433ef | ||
|
|
4767fc607e | ||
|
|
0fc6edb714 | ||
|
|
c620aeeb90 | ||
|
|
2a8efc2647 | ||
|
|
08984eef49 | ||
|
|
1fa3b50140 | ||
|
|
d78ad5cacc | ||
|
|
c5bccf11cc | ||
|
|
1d4ac49f9d | ||
|
|
a1da4a039d | ||
|
|
184dcf2caf | ||
|
|
41011fa81d | ||
|
|
2f7025ad2a | ||
|
|
9ac369c2bd | ||
|
|
da9541f18e | ||
|
|
d2e7358a9b | ||
|
|
d8086bc220 | ||
|
|
2244cc1456 | ||
|
|
10688306fa | ||
|
|
af8862ae29 | ||
|
|
37986655cf | ||
|
|
f7ecea33e4 | ||
|
|
e245139e46 | ||
|
|
2e328b0196 | ||
|
|
a38becce97 | ||
|
|
31c77a2fde | ||
|
|
af46184a80 | ||
|
|
a4d470409f | ||
|
|
344c446776 | ||
|
|
f2d5658c08 | ||
|
|
0bc935e209 | ||
|
|
b15b6fa192 | ||
|
|
665b228730 | ||
|
|
d37c3b8c6d | ||
|
|
ec3554cd95 | ||
|
|
c2de7816d8 | ||
|
|
0747af4b18 | ||
|
|
a86a56f7d1 | ||
|
|
b7c315cdda | ||
|
|
412a3ca0b0 | ||
|
|
bbab62fd27 | ||
|
|
5f65d05616 | ||
|
|
509febe18b | ||
|
|
3d524d9ab2 | ||
|
|
1cd04b34dd | ||
|
|
d3c6206631 | ||
|
|
f951057414 | ||
|
|
e05de760c2 | ||
|
|
de88ea4c5d | ||
|
|
af5967eae2 | ||
|
|
6649f01059 | ||
|
|
200aa48e15 | ||
|
|
867251d725 | ||
|
|
b4963a7f70 | ||
|
|
453c215003 | ||
|
|
328efced8b | ||
|
|
7c8dece8c6 | ||
|
|
5ffeefb1ab | ||
|
|
2a01141018 | ||
|
|
fae30e1af9 | ||
|
|
2c83d42320 | ||
|
|
396a52f790 | ||
|
|
05ce3b2986 | ||
|
|
1671b056a5 | ||
|
|
856443a97d | ||
|
|
7889cfbbc7 | ||
|
|
90616d3a8f | ||
|
|
f544d8dd1a | ||
|
|
0e3b87195a | ||
|
|
bebf83d0fd | ||
|
|
46dd4b1a8e | ||
|
|
058f319e6d | ||
|
|
87353aebd8 | ||
|
|
5a73ad8c63 | ||
|
|
c9c0dc7bc6 | ||
|
|
9c57927ad1 |
119
.gitignore
vendored
119
.gitignore
vendored
@@ -6,6 +6,8 @@
|
||||
*/.deps
|
||||
*~
|
||||
.kludge-stamp
|
||||
ABOUT-NLS
|
||||
INSTALL
|
||||
Makefile
|
||||
Makefile.in
|
||||
THANKS-to-translators
|
||||
@@ -23,123 +25,6 @@ coreutils-*.tar.gz
|
||||
coreutils-*.tar.gz.sig
|
||||
coreutils-*.xdelta
|
||||
coreutils-*.xdelta.sig
|
||||
doc/constants.texi
|
||||
doc/coreutils.info
|
||||
doc/stamp-vti
|
||||
doc/version.texi
|
||||
lib/alloca.h
|
||||
lib/charset.alias
|
||||
lib/getdate.c
|
||||
lib/libcoreutils.a
|
||||
lib/ref-add.sed
|
||||
lib/ref-del.sed
|
||||
lib/stdint.h
|
||||
lib/t-fpending
|
||||
po/Makefile.in
|
||||
po/POTFILES
|
||||
po/coreutils.pot
|
||||
po/stamp-po
|
||||
src/\[
|
||||
src/base64
|
||||
src/basename
|
||||
src/cat
|
||||
src/chgrp
|
||||
src/chmod
|
||||
src/chown
|
||||
src/chroot
|
||||
src/cksum
|
||||
src/comm
|
||||
src/cp
|
||||
src/csplit
|
||||
src/cut
|
||||
src/date
|
||||
src/dd
|
||||
src/df
|
||||
src/dir
|
||||
src/dircolors
|
||||
src/dircolors.h
|
||||
src/dirname
|
||||
src/du
|
||||
src/echo
|
||||
src/env
|
||||
src/expand
|
||||
src/expr
|
||||
src/factor
|
||||
src/false
|
||||
src/fmt
|
||||
src/fold
|
||||
src/fs.h
|
||||
src/ginstall
|
||||
src/groups
|
||||
src/head
|
||||
src/hostid
|
||||
src/hostname
|
||||
src/id
|
||||
src/join
|
||||
src/kill
|
||||
src/link
|
||||
src/ln
|
||||
src/localedir.h
|
||||
src/logname
|
||||
src/ls
|
||||
src/md5sum
|
||||
src/mkdir
|
||||
src/mkfifo
|
||||
src/mknod
|
||||
src/mv
|
||||
src/nice
|
||||
src/nl
|
||||
src/nohup
|
||||
src/od
|
||||
src/paste
|
||||
src/pathchk
|
||||
src/pinky
|
||||
src/pr
|
||||
src/printenv
|
||||
src/printf
|
||||
src/ptx
|
||||
src/pwd
|
||||
src/readlink
|
||||
src/rm
|
||||
src/rmdir
|
||||
src/seq
|
||||
src/setuidgid
|
||||
src/sha1sum
|
||||
src/sha224sum
|
||||
src/sha256sum
|
||||
src/sha384sum
|
||||
src/sha512sum
|
||||
src/shred
|
||||
src/sleep
|
||||
src/sort
|
||||
src/split
|
||||
src/stat
|
||||
src/stty
|
||||
src/su
|
||||
src/sum
|
||||
src/sync
|
||||
src/tac
|
||||
src/tail
|
||||
src/tee
|
||||
src/test
|
||||
src/touch
|
||||
src/tr
|
||||
src/true
|
||||
src/tsort
|
||||
src/tty
|
||||
src/uname
|
||||
src/unexpand
|
||||
src/uniq
|
||||
src/unlink
|
||||
src/uptime
|
||||
src/users
|
||||
src/vdir
|
||||
src/wc
|
||||
src/wheel-size.h
|
||||
src/wheel.h
|
||||
src/who
|
||||
src/whoami
|
||||
src/yes
|
||||
stamp-h1
|
||||
tests/cut/cut-tests
|
||||
tests/head/head-tests
|
||||
|
||||
@@ -1 +1 @@
|
||||
6.1
|
||||
6.6
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Suppress valgrind diagnostics we don't care about.
|
||||
|
||||
# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -49,3 +49,31 @@
|
||||
sigaction(act)
|
||||
fun:__libc_sigaction
|
||||
}
|
||||
|
||||
{
|
||||
libc_expand_dynamic_string_token
|
||||
Memcheck:Cond
|
||||
fun:strlen
|
||||
fun:expand_dynamic_string_token
|
||||
obj:*
|
||||
obj:*
|
||||
obj:*
|
||||
obj:*
|
||||
obj:*
|
||||
}
|
||||
{
|
||||
libc__dl_new_object
|
||||
Memcheck:Cond
|
||||
fun:strlen
|
||||
fun:_dl_new_object
|
||||
obj:*
|
||||
obj:*
|
||||
obj:*
|
||||
obj:*
|
||||
}
|
||||
{
|
||||
libc_fillin_rpath
|
||||
Memcheck:Cond
|
||||
fun:strlen
|
||||
fun:fillin_rpath
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
ChangeLog(-[0-9]+)?$
|
||||
^old/
|
||||
^src/c99-to-c98\.diff$
|
||||
^gl/.*
|
||||
|
||||
@@ -1,5 +1 @@
|
||||
Makefile\.in$
|
||||
\.po$
|
||||
^build-aux/texinfo\.tex$
|
||||
^src/c99-to-c89\.diff
|
||||
^tests/pr/
|
||||
|
||||
25
Makefile.am
25
Makefile.am
@@ -20,30 +20,32 @@
|
||||
|
||||
SUBDIRS = lib src doc man po tests
|
||||
EXTRA_DIST = Makefile.cfg Makefile.maint GNUmakefile \
|
||||
.hgignore \
|
||||
.gitignore \
|
||||
.hgignore \
|
||||
.kludge-stamp .prev-version THANKS-to-translators THANKStt.in \
|
||||
.vg-suppressions \
|
||||
.x-po-check \
|
||||
.x-sc_space_tab .x-sc_sun_os_names \
|
||||
.x-sc_file_system .x-sc_obsolete_symbols \
|
||||
.x-sc_prohibit_atoi_atof \
|
||||
.x-sc_require_config_h \
|
||||
.x-sc_space_tab .x-sc_sun_os_names \
|
||||
.x-sc_trailing_blank \
|
||||
.x-sc_unmarked_diagnostics \
|
||||
.x-sc_useless_cpp_parens \
|
||||
.x-sc_require_config_h \
|
||||
.x-sc_prohibit_atoi_atof \
|
||||
.x-sc_trailing_blank \
|
||||
announce-gen \
|
||||
ChangeLog-2005 \
|
||||
bootstrap \
|
||||
bootstrap.conf \
|
||||
build-aux/cvsu \
|
||||
build-aux/vc-list-files \
|
||||
gl/modules/getloadavg.diff \
|
||||
m4/ChangeLog \
|
||||
ChangeLog-2005 \
|
||||
old/fileutils/ChangeLog \
|
||||
old/fileutils/ChangeLog-1997 \
|
||||
old/fileutils/NEWS \
|
||||
old/sh-utils/ChangeLog \
|
||||
old/sh-utils/ChangeLog.0 \
|
||||
old/textutils/ChangeLog \
|
||||
old/fileutils/NEWS \
|
||||
old/sh-utils/NEWS \
|
||||
old/textutils/ChangeLog \
|
||||
old/textutils/NEWS
|
||||
|
||||
install-root:
|
||||
@@ -71,16 +73,17 @@ distcheck-hook:
|
||||
|
||||
rm_subst = \
|
||||
s!(rm -f (rm|\$$\(bin_PROGRAMS\)))$$!$$1 > /dev/null 2>&1 || /bin/$$1!
|
||||
MAINTAINERCLEANFILES = .kludge-stamp
|
||||
.kludge-stamp: $(srcdir)/src/Makefile.in
|
||||
perl -pi -e '$(rm_subst)' $(srcdir)/src/Makefile.in
|
||||
touch $@
|
||||
|
||||
|
||||
MAINTAINERCLEANFILES = THANKS-to-translators
|
||||
MAINTAINERCLEANFILES += THANKS-to-translators
|
||||
THANKS-to-translators: po/LINGUAS THANKStt.in
|
||||
( \
|
||||
cat $(srcdir)/THANKStt.in; \
|
||||
for lang in `cat po/LINGUAS`; do \
|
||||
for lang in `cat $(srcdir)/po/LINGUAS`; do \
|
||||
echo http://www.iro.umontreal.ca/contrib/po/HTML/team-$$lang.html; \
|
||||
done; \
|
||||
) > $@-tmp && mv $@-tmp $@
|
||||
|
||||
21
Makefile.cfg
21
Makefile.cfg
@@ -26,27 +26,6 @@ gnu_rel_host = $(gnu_ftp_host-$(RELEASE_TYPE))
|
||||
url_dir_list = \
|
||||
ftp://$(gnu_rel_host)/gnu/coreutils
|
||||
|
||||
# Files to update automatically.
|
||||
wget_files = \
|
||||
$(srcdir)/build-aux/config.guess \
|
||||
$(srcdir)/build-aux/config.sub \
|
||||
$(srcdir)/build-aux/texinfo.tex
|
||||
# Of the above, texinfo.tex is out of date,
|
||||
# and the other two are not available.
|
||||
wget_files =
|
||||
|
||||
cvs_files = \
|
||||
$(srcdir)/build-aux/elisp-comp \
|
||||
$(srcdir)/build-aux/depcomp \
|
||||
$(srcdir)/build-aux/mdate-sh \
|
||||
$(srcdir)/build-aux/missing \
|
||||
$(srcdir)/build-aux/install-sh \
|
||||
$(srcdir)/build-aux/mkinstalldirs
|
||||
|
||||
# $(srcdir)/src/ansi2knr.c
|
||||
|
||||
local_updates = wget-update cvs-update
|
||||
|
||||
# The GnuPG ID of the key used to sign the tarballs.
|
||||
gpg_key_ID = D333CBA1
|
||||
|
||||
|
||||
184
Makefile.maint
184
Makefile.maint
@@ -30,8 +30,9 @@ gzip_rsyncable := \
|
||||
GZIP_ENV = '--no-name --best $(gzip_rsyncable)'
|
||||
|
||||
CVS = cvs
|
||||
GIT = git
|
||||
VC = $(GIT)
|
||||
|
||||
# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/
|
||||
CVS_LIST = build-aux/vc-list-files
|
||||
|
||||
CVS_LIST_EXCEPT = \
|
||||
@@ -46,7 +47,7 @@ VERSION_REGEXP = $(subst .,\.,$(VERSION))
|
||||
|
||||
tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]')
|
||||
tag-this-version = $(subst .,_,$(VERSION))
|
||||
this-cvs-tag = $(tag-package)-$(tag-this-version)
|
||||
this-vc-tag = $(tag-package)-$(tag-this-version)
|
||||
my_distdir = $(PACKAGE)-$(VERSION)
|
||||
|
||||
# Old releases are stored here.
|
||||
@@ -101,7 +102,8 @@ sc_cast_of_argument_to_free:
|
||||
exit 1; } || :
|
||||
|
||||
sc_cast_of_x_alloc_return_value:
|
||||
@grep -nE --exclude=$(srcdir)/lib/regex.c \
|
||||
@grep -nE --exclude=$(srcdir)/lib/xalloc.h \
|
||||
--exclude=$(srcdir)/lib/regex.c \
|
||||
'\*\) *x(m|c|re)alloc\>' \
|
||||
$(srcdir)/{lib,src}/*.[chy] && \
|
||||
{ echo '$(ME): don'\''t cast x*alloc return value' 1>&2; \
|
||||
@@ -220,6 +222,40 @@ sc_root_tests:
|
||||
&& { echo 'tests/Makefile.am: missing check-root action'>&2; \
|
||||
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
|
||||
|
||||
# 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 $@
|
||||
|
||||
# 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 $$($(CVS_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.
|
||||
.re-list:
|
||||
@@ -294,10 +330,16 @@ patch-check:
|
||||
cp -a src src-c89
|
||||
(cd src-c89; patch -V never --fuzz=0) < src/c99-to-c89.diff \
|
||||
> $@.1 2>&1
|
||||
if test "$${REGEN_PATCH+set}" = set; then \
|
||||
diff -upr src src-c89 > new-diff || : ; fi
|
||||
grep -v '^patching file ' $@.1 > $@.2 || :
|
||||
fail=0; test -s $@.2 && fail=1 || : ; \
|
||||
rm -rf src-c89 $@.1 $@.2; \
|
||||
test $$fail = 0
|
||||
msg=ok; test -s $@.2 && msg='fuzzy patch' || : ; \
|
||||
rm -f src-c89/*.o || msg='rm failed'; \
|
||||
$(MAKE) -C src-c89 CFLAGS='-Wdeclaration-after-statement -Werror' \
|
||||
|| msg='compile failure with extra options'; \
|
||||
rm -rf src-c89 $@.1 $@.2; \
|
||||
test $$msg = ok && : || echo "$$msg" 1>&2; \
|
||||
test $$msg = ok
|
||||
|
||||
# Ensure that date's --help output stays in sync with the info
|
||||
# documentation for GNU strftime. The only exception is %N,
|
||||
@@ -366,7 +408,8 @@ po-check:
|
||||
esac; \
|
||||
files="$$files $$file"; \
|
||||
done; \
|
||||
grep -E -l '\bN?_\([^)"]*("|$$)' $$files | sort -u > $@-2; \
|
||||
grep -E -l '\b(N?_|gettext *)\([^)"]*("|$$)' $$files \
|
||||
| sort -u > $@-2; \
|
||||
diff -u $@-1 $@-2 || exit 1; \
|
||||
rm -f $@-1 $@-2; \
|
||||
fi
|
||||
@@ -415,24 +458,32 @@ copyright-check:
|
||||
fi
|
||||
|
||||
|
||||
# Sanity checks with the CVS repository.
|
||||
cvs-tag-check:
|
||||
echo $(this-cvs-tag); \
|
||||
if $(CVS) -n log -h README | grep -e $(this-cvs-tag): >/dev/null; then \
|
||||
echo "$(this-cvs-tag) as already been used; not tagging" 1>&2; \
|
||||
exit 1; \
|
||||
else :; fi
|
||||
|
||||
cvs-diff-check:
|
||||
if $(CVS) diff >cvs-diffs; then \
|
||||
rm cvs-diffs; \
|
||||
else \
|
||||
echo "Some files are locally modified:" 1>&2; \
|
||||
cat cvs-diffs; \
|
||||
exit 1; \
|
||||
# Sanity checks with the repository.
|
||||
# Abort early if this tag has already been used.
|
||||
vc-tag-check:
|
||||
used=no; \
|
||||
if $(VC) --help | grep CVS; then \
|
||||
$(CVS) -n log -h README|grep -e $(this-vc-tag): >/dev/null \
|
||||
&& used=yes; \
|
||||
else \
|
||||
$(GIT) tag -l '^$(this-vc-tag)$$' && used=yes; \
|
||||
fi; \
|
||||
if test "$$used" = yes; then \
|
||||
echo "$(this-vc-tag) has already been used; not tagging" 1>&2; \
|
||||
exit 1; \
|
||||
fi
|
||||
|
||||
cvs-check: cvs-diff-check cvs-tag-check
|
||||
vc-diff-check:
|
||||
$(VC) diff > vc-diffs || :
|
||||
if test -s vc-diffs; then \
|
||||
cat vc-diffs; \
|
||||
echo "Some files are locally modified:" 1>&2; \
|
||||
exit 1; \
|
||||
else \
|
||||
rm vc-diffs; \
|
||||
fi
|
||||
|
||||
cvs-check: vc-diff-check vc-tag-check
|
||||
|
||||
maintainer-distcheck:
|
||||
$(MAKE) distcheck
|
||||
@@ -442,9 +493,8 @@ maintainer-distcheck:
|
||||
# Tag before making distribution. Also, don't make a distribution if
|
||||
# checks fail. Also, make sure the NEWS file is up-to-date.
|
||||
# FIXME: use dist-hook/my-dist like distcheck-hook/my-distcheck.
|
||||
cvs-dist: $(local-check) cvs-check maintainer-distcheck
|
||||
$(CVS) update po
|
||||
$(CVS) tag -c $(this-cvs-tag)
|
||||
vc-dist: $(local-check) cvs-check maintainer-distcheck
|
||||
$(VC) tag $(this-vc-tag)
|
||||
$(MAKE) dist
|
||||
|
||||
# Use this to make sure we don't run these programs when building
|
||||
@@ -479,6 +529,11 @@ my-distcheck: $(local-check) $(release_archive_dir)/$(prev-tgz)
|
||||
(cd $(t) && mv $(distdir) $(distdir).old \
|
||||
&& $(AMTAR) -zxf - ) < $(distdir).tar.gz
|
||||
diff -ur $(t)/$(distdir).old $(t)/$(distdir)
|
||||
cd $(t)/$(distdir) \
|
||||
&& (cd src && patch -V never --fuzz=0 <c99-to-c89.diff) \
|
||||
&& ./configure --disable-largefile \
|
||||
CFLAGS='-Werror -ansi -pedantic -Wno-long-long' \
|
||||
&& $(MAKE)
|
||||
-rm -rf $(t)
|
||||
@echo "========================"; \
|
||||
echo "$(distdir).tar.gz is ready for distribution"; \
|
||||
@@ -501,12 +556,11 @@ xd-delta = $(PACKAGE)-$(PREV_VERSION)-$(VERSION).xdelta
|
||||
|
||||
rel-files = $(xd-delta) $(DIST_ARCHIVES)
|
||||
announcement: NEWS ChangeLog $(rel-files)
|
||||
@./announce-gen \
|
||||
@./build-aux/announce-gen \
|
||||
--release-type=$(RELEASE_TYPE) \
|
||||
--package=$(PACKAGE) \
|
||||
--prev=$(PREV_VERSION) \
|
||||
--curr=$(VERSION) \
|
||||
--release-archive-directory=$(release_archive_dir) \
|
||||
--gpg-key-id=$(gpg_key_ID) \
|
||||
--news=NEWS \
|
||||
$(addprefix --url-dir=, $(url_dir_list)) \
|
||||
@@ -522,74 +576,6 @@ www-gnu = http://www.gnu.org
|
||||
# Use mv, if you don't have/want move-if-change.
|
||||
move_if_change ?= move-if-change
|
||||
|
||||
|
||||
# --------------------- #
|
||||
# Updating everything. #
|
||||
# --------------------- #
|
||||
|
||||
.PHONY: update
|
||||
local_updates ?= wget-update cvs-update
|
||||
update: $(local_updates)
|
||||
|
||||
|
||||
# -------------------------- #
|
||||
# Updating GNU build tools. #
|
||||
# -------------------------- #
|
||||
|
||||
# The following pseudo table associates a local directory and a URL
|
||||
# with each of the files that belongs to some other package and is
|
||||
# regularly updated from the specified URL.
|
||||
wget_files ?= \
|
||||
$(srcdir)/build-aux/config.guess \
|
||||
$(srcdir)/build-aux/config.sub \
|
||||
$(srcdir)/build-aux/texinfo.tex \
|
||||
$(srcdir)/src/ansi2knr.c
|
||||
|
||||
get-targets = $(patsubst %, get-%, $(wget_files))
|
||||
|
||||
config.guess-url_prefix = $(ftp-gnu)/build-aux/
|
||||
config.sub-url_prefix = $(ftp-gnu)/build-aux/
|
||||
|
||||
ansi2knr.c-url_prefix = ftp://ftp.cs.wisc.edu/ghost/
|
||||
|
||||
texinfo.tex-url_prefix = $(ftp-gnu)/texinfo/
|
||||
|
||||
standards.texi-url_prefix = $(www-gnu)/prep/
|
||||
make-stds.texi-url_prefix = $(standards.texi-url_prefix)
|
||||
|
||||
target = $(patsubst get-%, %, $@)
|
||||
url = $($(notdir $(target))-url_prefix)$(notdir $(target))
|
||||
|
||||
.PHONY: $(get-targets)
|
||||
$(get-targets):
|
||||
$(WGET) $(WGETFLAGS) $(url) -O $(target).t \
|
||||
&& $(move_if_change) $(target).t $(target)
|
||||
|
||||
cvs_files ?= \
|
||||
$(srcdir)/build-aux/depcomp \
|
||||
$(srcdir)/build-aux/install-sh \
|
||||
$(srcdir)/build-aux/missing \
|
||||
$(srcdir)/build-aux/mkinstalldirs \
|
||||
$(srcdir)/src/ansi2knr.c
|
||||
automake_repo=:pserver:anoncvs:anoncvs@sources.redhat.com:/cvs/automake
|
||||
.PHONY: wget-update
|
||||
wget-update: $(get-targets)
|
||||
|
||||
.PHONY: cvs-update
|
||||
cvs-update:
|
||||
fail=; \
|
||||
for f in $(cvs_files); do \
|
||||
test -f $$f || { echo "*** skipping $$f" 1>&2; continue; }; \
|
||||
cvs diff $$f > /dev/null \
|
||||
|| { echo "*** $$f is locally modified; skipping it" 1>&2; \
|
||||
fail=yes; continue; }; \
|
||||
file=$$(basename $$f); \
|
||||
echo checking out $$file...; \
|
||||
$(CVS) -d $(automake_repo) co -p automake/lib/$$file> $$f.t \
|
||||
&& $(move_if_change) $$f.t $$f; \
|
||||
done; \
|
||||
test "$$fail" && exit 1
|
||||
|
||||
emit_upload_commands:
|
||||
@echo =====================================
|
||||
@echo =====================================
|
||||
@@ -609,11 +595,13 @@ alpha beta major: news-date-check changelog-check $(local-check)
|
||||
&& { echo $(VERSION) | grep -E '^[0-9]+(\.[0-9]+)+$$' \
|
||||
|| { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\
|
||||
|| :
|
||||
$(MAKE) cvs-dist
|
||||
$(MAKE) vc-dist
|
||||
$(MAKE) $(xd-delta)
|
||||
$(MAKE) -s announcement RELEASE_TYPE=$@ > /tmp/announce-$(my_distdir)
|
||||
ln $(rel-files) $(release_archive_dir)
|
||||
chmod a-w $(rel-files)
|
||||
$(MAKE) -s emit_upload_commands RELEASE_TYPE=$@
|
||||
echo $(VERSION) > $(prev_version_file)
|
||||
$(CVS) ci -m. $(prev_version_file)
|
||||
$(VC) commit -m \
|
||||
'$(prev_version_file): Record previous version: $(VERSION).' \
|
||||
$(prev_version_file)
|
||||
|
||||
126
NEWS
126
NEWS
@@ -1,5 +1,129 @@
|
||||
GNU coreutils NEWS -*- outline -*-
|
||||
|
||||
* Noteworthy changes in release 6.7 (2006-12-08) [stable]
|
||||
|
||||
** Bug fixes
|
||||
|
||||
When cp -p copied a file with special mode bits set, the same bits
|
||||
were set on the copy even when ownership could not be preserved.
|
||||
This could result in files that were setuid to the wrong user.
|
||||
To fix this, special mode bits are now set in the copy only if its
|
||||
ownership is successfully preserved. Similar problems were fixed
|
||||
with mv when copying across file system boundaries. This problem
|
||||
affects all versions of coreutils through 6.6.
|
||||
|
||||
cp --preserve=ownership would create output files that temporarily
|
||||
had too-generous permissions in some cases. For example, when
|
||||
copying a file with group A and mode 644 into a group-B sticky
|
||||
directory, the output file was briefly readable by group B.
|
||||
Fix similar problems with cp options like -p that imply
|
||||
--preserve=ownership, with install -d when combined with either -o
|
||||
or -g, and with mv when copying across file system boundaries.
|
||||
This bug affects coreutils 6.0 through 6.6.
|
||||
|
||||
du --one-file-system (-x) would skip subdirectories of any directory
|
||||
listed as second or subsequent command line argument. This bug affects
|
||||
coreutils-6.4, 6.5 and 6.6.
|
||||
|
||||
|
||||
* Noteworthy changes in release 6.6 (2006-11-22) [stable]
|
||||
|
||||
** Bug fixes
|
||||
|
||||
ls would segfault (dereference a NULL pointer) for a file with a
|
||||
nameless group or owner. This bug was introduced in coreutils-6.5.
|
||||
|
||||
A bug in the latest official m4/gettext.m4 (from gettext-0.15)
|
||||
made configure fail to detect gettext support, due to the unusual
|
||||
way in which coreutils uses AM_GNU_GETTEXT.
|
||||
|
||||
** Improved robustness
|
||||
|
||||
Now, du (and the other fts clients: chmod, chgrp, chown) honor a
|
||||
trailing slash in the name of a symlink-to-directory even on
|
||||
Solaris 9, by working around its buggy fstatat implementation.
|
||||
|
||||
|
||||
* Major changes in release 6.5 (2006-11-19) [stable]
|
||||
|
||||
** Bug fixes
|
||||
|
||||
du (and the other fts clients: chmod, chgrp, chown) would exit early
|
||||
when encountering an inaccessible directory on a system with native
|
||||
openat support (i.e., linux-2.6.16 or newer along with glibc-2.4
|
||||
or newer). This bug was introduced with the switch to gnulib's
|
||||
openat-based variant of fts, for coreutils-6.0.
|
||||
|
||||
"ln --backup f f" now produces a sensible diagnostic
|
||||
|
||||
** New features
|
||||
|
||||
rm accepts a new option: --one-file-system
|
||||
|
||||
|
||||
* Major changes in release 6.4 (2006-10-22) [stable]
|
||||
|
||||
** Bug fixes
|
||||
|
||||
chgrp and chown would malfunction when invoked with both -R and -H and
|
||||
with one or more of the following: --preserve-root, --verbose, --changes,
|
||||
--from=o:g (chown only). This bug was introduced with the switch to
|
||||
gnulib's openat-based variant of fts, for coreutils-6.0.
|
||||
|
||||
cp --backup dir1 dir2, would rename an existing dir2/dir1 to dir2/dir1~.
|
||||
This bug was introduced in coreutils-6.0.
|
||||
|
||||
With --force (-f), rm no longer fails for ENOTDIR.
|
||||
For example, "rm -f existing-non-directory/anything" now exits
|
||||
successfully, ignoring the error about a nonexistent file.
|
||||
|
||||
|
||||
* Major changes in release 6.3 (2006-09-30) [stable]
|
||||
|
||||
** Improved robustness
|
||||
|
||||
pinky no longer segfaults on Darwin 7.9.0 (MacOS X 10.3.9) due to a
|
||||
buggy native getaddrinfo function.
|
||||
|
||||
rm works around a bug in Darwin 7.9.0 (MacOS X 10.3.9) that would
|
||||
sometimes keep it from removing all entries in a directory on an HFS+
|
||||
or NFS-mounted partition.
|
||||
|
||||
sort would fail to handle very large input (around 40GB) on systems with a
|
||||
mkstemp function that returns a file descriptor limited to 32-bit offsets.
|
||||
|
||||
** Bug fixes
|
||||
|
||||
chmod would fail unnecessarily in an unusual case: when an initially-
|
||||
inaccessible argument is rendered accessible by chmod's action on a
|
||||
preceding command line argument. This bug also affects chgrp, but
|
||||
it is harder to demonstrate. It does not affect chown. The bug was
|
||||
introduced with the switch from explicit recursion to the use of fts
|
||||
in coreutils-5.1.0 (2003-10-15).
|
||||
|
||||
cp -i and mv -i occasionally neglected to prompt when the copy or move
|
||||
action was bound to fail. This bug dates back to before fileutils-4.0.
|
||||
|
||||
With --verbose (-v), cp and mv would sometimes generate no output,
|
||||
or neglect to report file removal.
|
||||
|
||||
For the "groups" command:
|
||||
|
||||
"groups" no longer prefixes the output with "user :" unless more
|
||||
than one user is specified; this is for compatibility with BSD.
|
||||
|
||||
"groups user" now exits nonzero when it gets a write error.
|
||||
|
||||
"groups" now processes options like --help more compatibly.
|
||||
|
||||
shuf would infloop, given 8KB or more of piped input
|
||||
|
||||
** Portability
|
||||
|
||||
Versions of chmod, chown, chgrp, du, and rm (tools that use openat etc.)
|
||||
compiled for Solaris 8 now also work when run on Solaris 10.
|
||||
|
||||
|
||||
* Major changes in release 6.2 (2006-09-18) [stable candidate]
|
||||
|
||||
** Changes in behavior
|
||||
@@ -583,7 +707,7 @@ GNU coreutils NEWS -*- outline -*-
|
||||
|
||||
cp and mv: the --reply=X option is deprecated
|
||||
|
||||
date accepts the new option --rfc-3339=TIMESPEC. The old --iso-8602 (-I)
|
||||
date accepts the new option --rfc-3339=TIMESPEC. The old --iso-8601 (-I)
|
||||
option is deprecated; it still works, but new applications should avoid it.
|
||||
date, du, ls, and pr's time formats now support new %:z, %::z, %:::z
|
||||
specifiers for numeric time zone offsets like -07:00, -07:00:00, and -07.
|
||||
|
||||
6
README
6
README
@@ -167,6 +167,12 @@ as you can. Based on the feedback that generates, you may be able to
|
||||
convince us that it's worth adding.
|
||||
|
||||
|
||||
WARNING: Now that we use the ./bootstrap script, you should not run
|
||||
autoreconf manually. Doing that will overwrite essential source files
|
||||
with older versions, which may make the package unbuildable or introduce
|
||||
subtle bugs.
|
||||
|
||||
|
||||
WARNING: If you modify files like configure.in, m4/*.m4, aclocal.m4,
|
||||
or any Makefile.am, then don't be surprised if what gets regenerated no
|
||||
longer works. To make things work, you'll have to be using appropriate
|
||||
|
||||
@@ -11,6 +11,7 @@ stable versions of the maintainer tools we depend upon, including:
|
||||
|
||||
- Automake <http://www.gnu.org/software/automake/>
|
||||
- Autoconf <http://www.gnu.org/software/autoconf/>
|
||||
- Bison <http://www.gnu.org/software/bison/>
|
||||
- Gettext <http://www.gnu.org/software/gettext/>
|
||||
- Gzip <http://www.gnu.org/software/gzip/>
|
||||
- Tar <http://www.gnu.org/software/tar/>
|
||||
|
||||
6
THANKS
6
THANKS
@@ -198,6 +198,7 @@ Holger Berger hberger@ess.nec.de
|
||||
Hon-Yin Kok hkok@yoda.unl.edu
|
||||
Hugh Daniel hugh@xanadu.com
|
||||
Ian Bruce ian.bruce@myrealbox.com
|
||||
Iain Calder ic56@rogers.com
|
||||
Ian Jackson ijackson@chiark.greenend.org.uk
|
||||
Ian Lance Taylor ian@cygnus.com
|
||||
Ian Turner vectro@pipeline.com
|
||||
@@ -211,6 +212,7 @@ James Sneeringer jvs@ocslink.com
|
||||
James Tanis jtt@soscorp.com
|
||||
James Youngman james+usenet@free-lunch.demon.co.uk
|
||||
Jamie Lokier jamie@imbolc.ucc.ie
|
||||
Jamie McClelland jm@mayfirst.org
|
||||
Jan Fedak J.Fedak@sh.cvut.cz
|
||||
Jan Nieuwenhuizen janneke@gnu.org
|
||||
Janos Farkas chexum@shadow.banki.hu
|
||||
@@ -287,6 +289,7 @@ Manas Garg manas@cygsoft.com
|
||||
Manfred Hollstein manfred@s-direktnet.de
|
||||
Marc Boucher marc@mbsi.ca
|
||||
Marc Haber mh+debian-bugs@zugschlus.de
|
||||
Marc Lehman schmorp@schmorp.de
|
||||
Marc Olzheim marcolz@stack.nl
|
||||
Marco Franzen Marco.Franzen@Thyron.com
|
||||
Marcus Brinkmann http://www.marcus-brinkmann.de
|
||||
@@ -388,6 +391,7 @@ Paul Worrall paul@basilisk.uklinux.net
|
||||
Pawel Prokop pablo@wizard.ae.krakow.pl
|
||||
Per Cederqvist ceder@lysator.liu.se
|
||||
Per Kristian Hove perhov@math.ntnu.no
|
||||
Peter Breitenlohner peb@mppmu.mpg.de
|
||||
Peter Eriksson peter@ifm.liu.se
|
||||
Peter Fales psfales@lucent.com
|
||||
Peter Horst peter@ointment.org
|
||||
@@ -432,6 +436,7 @@ Ross Paterson rap@doc.ic.ac.uk
|
||||
Ross Ridge rridge@calum.csclub.uwaterloo.ca
|
||||
Sami Farin sfarin@ratol.fi
|
||||
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
|
||||
@@ -449,6 +454,7 @@ Stephen Eglen eglen@pcg.wustl.edu
|
||||
Stephen Gildea gildea@stop.mail-abuse.org
|
||||
Stephen Smoogen smooge@mindspring.com
|
||||
Steve McConnel steve@acadcomp.sil.org
|
||||
Steve McIntyre steve@einval.com
|
||||
Steven G. Johnson stevenj@alum.mit.edu
|
||||
Steven Mocking ufo@quicknet.nl
|
||||
Steven P Watson steven@magelico.net
|
||||
|
||||
436
announce-gen
436
announce-gen
@@ -1,436 +0,0 @@
|
||||
#!/usr/bin/perl -w
|
||||
# Generate an announcement message.
|
||||
|
||||
# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
use strict;
|
||||
|
||||
use Getopt::Long;
|
||||
use Digest::MD5;
|
||||
use Digest::SHA1;
|
||||
|
||||
(my $VERSION = '$Revision: 1.25 $ ') =~ tr/[0-9].//cd;
|
||||
(my $ME = $0) =~ s|.*/||;
|
||||
|
||||
my %valid_release_types = map {$_ => 1} qw (alpha beta major);
|
||||
|
||||
END
|
||||
{
|
||||
# Nobody ever checks the status of print()s. That's okay, because
|
||||
# if any do fail, we're guaranteed to get an indicator when we close()
|
||||
# the filehandle.
|
||||
#
|
||||
# Close stdout now, and if there were no errors, return happy status.
|
||||
# If stdout has already been closed by the script, though, do nothing.
|
||||
defined fileno STDOUT
|
||||
or return;
|
||||
close STDOUT
|
||||
and return;
|
||||
|
||||
# Errors closing stdout. Indicate that, and hope stderr is OK.
|
||||
warn "$ME: closing standard output: $!\n";
|
||||
|
||||
# Don't be so arrogant as to assume that we're the first END handler
|
||||
# defined, and thus the last one invoked. There may be others yet
|
||||
# to come. $? will be passed on to them, and to the final _exit().
|
||||
#
|
||||
# If it isn't already an error, make it one (and if it _is_ an error,
|
||||
# preserve the value: it might be important).
|
||||
$? ||= 1;
|
||||
}
|
||||
|
||||
sub usage ($)
|
||||
{
|
||||
my ($exit_code) = @_;
|
||||
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
|
||||
if ($exit_code != 0)
|
||||
{
|
||||
print $STREAM "Try `$ME --help' for more information.\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
my @types = sort keys %valid_release_types;
|
||||
print $STREAM <<EOF;
|
||||
Usage: $ME [OPTIONS]
|
||||
|
||||
OPTIONS:
|
||||
|
||||
Generate an announcement message.
|
||||
|
||||
FIXME: describe the following
|
||||
|
||||
--release-type=TYPE TYPE must be one of @types
|
||||
--package-name=PACKAGE_NAME
|
||||
--previous-version=VER
|
||||
--current-version=VER
|
||||
--gpg-key-id=ID The GnuPG ID of the key used to sign the tarballs
|
||||
--release-archive-directory=DIR
|
||||
--url-directory=URL_DIR
|
||||
--news=NEWS_FILE optional
|
||||
|
||||
--help display this help and exit
|
||||
--version output version information and exit
|
||||
|
||||
EOF
|
||||
}
|
||||
exit $exit_code;
|
||||
}
|
||||
|
||||
|
||||
=item C<%size> = C<sizes (@file)>
|
||||
|
||||
Compute the sizes of the C<@file> and return them as a hash. Return
|
||||
C<undef> if one of the computation failed.
|
||||
|
||||
=cut
|
||||
|
||||
sub sizes (@)
|
||||
{
|
||||
my (@file) = @_;
|
||||
|
||||
my $fail = 0;
|
||||
my %res;
|
||||
foreach my $f (@file)
|
||||
{
|
||||
my $cmd = "du --human $f";
|
||||
my $t = `$cmd`;
|
||||
# FIXME-someday: give a better diagnostic, a la $PROCESS_STATUS
|
||||
$@
|
||||
and (warn "$ME: command failed: `$cmd'\n"), $fail = 1;
|
||||
chomp $t;
|
||||
$t =~ s/^([\d.]+[MkK]).*/${1}B/;
|
||||
$res{$f} = $t;
|
||||
}
|
||||
return $fail ? undef : %res;
|
||||
}
|
||||
|
||||
=item C<print_locations ($title, \@url, \%size, @file)
|
||||
|
||||
Print a section C<$title> dedicated to the list of <@file>, which
|
||||
sizes are stored in C<%size>, and which are available from the C<@url>.
|
||||
|
||||
=cut
|
||||
|
||||
sub print_locations ($\@\%@)
|
||||
{
|
||||
my ($title, $url, $size, @file) = @_;
|
||||
print "Here are the $title:\n";
|
||||
foreach my $url (@{$url})
|
||||
{
|
||||
for my $file (@file)
|
||||
{
|
||||
print " $url/$file";
|
||||
print " (", $$size{$file}, ")"
|
||||
if exists $$size{$file};
|
||||
print "\n";
|
||||
}
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
|
||||
=item C<print_checksums (@file)
|
||||
|
||||
Print the MD5 and SHA1 signature section for each C<@file>.
|
||||
|
||||
=cut
|
||||
|
||||
sub print_checksums (@)
|
||||
{
|
||||
my (@file) = @_;
|
||||
|
||||
print "Here are the MD5 and SHA1 checksums:\n";
|
||||
print "\n";
|
||||
|
||||
foreach my $meth (qw (md5 sha1))
|
||||
{
|
||||
foreach my $f (@file)
|
||||
{
|
||||
open IN, '<', $f
|
||||
or die "$ME: $f: cannot open for reading: $!\n";
|
||||
binmode IN;
|
||||
my $dig =
|
||||
($meth eq 'md5'
|
||||
? Digest::MD5->new->addfile(*IN)->hexdigest
|
||||
: Digest::SHA1->new->addfile(*IN)->hexdigest);
|
||||
close IN;
|
||||
print "$dig $f\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
=item C<print_news_deltas ($news_file, $prev_version, $curr_version)
|
||||
|
||||
Print the section of the NEWS file C<$news_file> addressing changes
|
||||
between versions C<$prev_version> and C<$curr_version>.
|
||||
|
||||
=cut
|
||||
|
||||
sub print_news_deltas ($$$)
|
||||
{
|
||||
my ($news_file, $prev_version, $curr_version) = @_;
|
||||
|
||||
print "\n$news_file\n\n";
|
||||
|
||||
# Print all lines from $news_file, starting with the first one
|
||||
# that mentions $curr_version up to but not including
|
||||
# the first occurrence of $prev_version.
|
||||
my $in_items;
|
||||
|
||||
open NEWS, '<', $news_file
|
||||
or die "$ME: $news_file: cannot open for reading: $!\n";
|
||||
while (defined (my $line = <NEWS>))
|
||||
{
|
||||
if ( ! $in_items)
|
||||
{
|
||||
# Match lines like this one:
|
||||
# * Major changes in release 5.0.1:
|
||||
# but not any other line that starts with a space, *, or -.
|
||||
$line =~ /^(\* Major changes.*|[^ *-].*)\Q$curr_version\E/o
|
||||
or next;
|
||||
$in_items = 1;
|
||||
print $line;
|
||||
}
|
||||
else
|
||||
{
|
||||
# Be careful that this regexp cannot match version numbers
|
||||
# in NEWS items -- they might well say `introduced in 4.5.5',
|
||||
# and we don't want that to match.
|
||||
$line =~ /^(\* Major changes.*|[^ *-].*)\Q$prev_version\E/o
|
||||
and last;
|
||||
print $line;
|
||||
}
|
||||
}
|
||||
close NEWS;
|
||||
|
||||
$in_items
|
||||
or die "$ME: $news_file: no matching lines for `$curr_version'\n";
|
||||
}
|
||||
|
||||
sub print_changelog_deltas ($$)
|
||||
{
|
||||
my ($package_name, $prev_version) = @_;
|
||||
|
||||
# Print new ChangeLog entries.
|
||||
|
||||
# First find all CVS-controlled ChangeLog files.
|
||||
use File::Find;
|
||||
my @changelog;
|
||||
find ({wanted => sub {$_ eq 'ChangeLog' && -d 'CVS'
|
||||
and push @changelog, $File::Find::name}},
|
||||
'.');
|
||||
|
||||
# If there are no ChangeLog files, we're done.
|
||||
@changelog
|
||||
or return;
|
||||
my %changelog = map {$_ => 1} @changelog;
|
||||
|
||||
# Reorder the list of files so that if there are ChangeLog
|
||||
# files in the specified directories, they're listed first,
|
||||
# in this order:
|
||||
my @dir = qw ( . src lib m4 config doc );
|
||||
|
||||
# A typical @changelog array might look like this:
|
||||
# ./ChangeLog
|
||||
# ./po/ChangeLog
|
||||
# ./m4/ChangeLog
|
||||
# ./lib/ChangeLog
|
||||
# ./doc/ChangeLog
|
||||
# ./config/ChangeLog
|
||||
my @reordered;
|
||||
foreach my $d (@dir)
|
||||
{
|
||||
my $dot_slash = $d eq '.' ? $d : "./$d";
|
||||
my $target = "$dot_slash/ChangeLog";
|
||||
delete $changelog{$target}
|
||||
and push @reordered, $target;
|
||||
}
|
||||
|
||||
# Append any remaining ChangeLog files.
|
||||
push @reordered, sort keys %changelog;
|
||||
|
||||
# Remove leading `./'.
|
||||
@reordered = map { s!^\./!!; $_ } @reordered;
|
||||
|
||||
print "\nChangeLog entries:\n\n";
|
||||
# print join ("\n", @reordered), "\n";
|
||||
|
||||
$prev_version =~ s/\./_/g;
|
||||
my $prev_cvs_tag = "\U$package_name\E-$prev_version";
|
||||
|
||||
my $cmd = "cvs -n diff -u -r$prev_cvs_tag -rHEAD @reordered";
|
||||
open DIFF, '-|', $cmd
|
||||
or die "$ME: cannot run `$cmd': $!\n";
|
||||
# Print two types of lines, making minor changes:
|
||||
# Lines starting with `+++ ', e.g.,
|
||||
# +++ ChangeLog 22 Feb 2003 16:52:51 -0000 1.247
|
||||
# and those starting with `+'.
|
||||
# Don't print the others.
|
||||
my $prev_printed_line_empty = 1;
|
||||
while (defined (my $line = <DIFF>))
|
||||
{
|
||||
if ($line =~ /^\+\+\+ /)
|
||||
{
|
||||
my $separator = "*"x70 ."\n";
|
||||
$line =~ s///;
|
||||
$line =~ s/\s.*//;
|
||||
$prev_printed_line_empty
|
||||
or print "\n";
|
||||
print $separator, $line, $separator;
|
||||
}
|
||||
elsif ($line =~ /^\+/)
|
||||
{
|
||||
$line =~ s///;
|
||||
print $line;
|
||||
$prev_printed_line_empty = ($line =~ /^$/);
|
||||
}
|
||||
}
|
||||
close DIFF;
|
||||
|
||||
# The exit code should be 1.
|
||||
# Allow in case there are no modified ChangeLog entries.
|
||||
$? == 256 || $? == 128
|
||||
or warn "$ME: warning: `cmd' had unexpected exit code or signal ($?)\n";
|
||||
}
|
||||
|
||||
{
|
||||
# Neutralize the locale, so that, for instance, "du" does not
|
||||
# issue "1,2" instead of "1.2", what confuses our regexps.
|
||||
$ENV{LC_ALL} = "C";
|
||||
|
||||
my $release_type;
|
||||
my $package_name;
|
||||
my $prev_version;
|
||||
my $curr_version;
|
||||
my $release_archive_dir;
|
||||
my $gpg_key_id;
|
||||
my @url_dir_list;
|
||||
my @news_file;
|
||||
|
||||
GetOptions
|
||||
(
|
||||
'release-type=s' => \$release_type,
|
||||
'package-name=s' => \$package_name,
|
||||
'previous-version=s' => \$prev_version,
|
||||
'current-version=s' => \$curr_version,
|
||||
'gpg-key-id=s' => \$gpg_key_id,
|
||||
'release-archive-directory=s' => \$release_archive_dir,
|
||||
'url-directory=s' => \@url_dir_list,
|
||||
'news=s' => \@news_file,
|
||||
|
||||
help => sub { usage 0 },
|
||||
version => sub { print "$ME version $VERSION\n"; exit },
|
||||
) or usage 1;
|
||||
|
||||
my $fail = 0;
|
||||
# Ensure that sure each required option is specified.
|
||||
$release_type
|
||||
or (warn "$ME: release type not specified\n"), $fail = 1;
|
||||
$package_name
|
||||
or (warn "$ME: package name not specified\n"), $fail = 1;
|
||||
$prev_version
|
||||
or (warn "$ME: previous version string not specified\n"), $fail = 1;
|
||||
$curr_version
|
||||
or (warn "$ME: current version string not specified\n"), $fail = 1;
|
||||
$release_archive_dir
|
||||
or (warn "$ME: release directory name not specified\n"), $fail = 1;
|
||||
@url_dir_list
|
||||
or (warn "$ME: URL directory name(s) not specified\n"), $fail = 1;
|
||||
|
||||
exists $valid_release_types{$release_type}
|
||||
or (warn "$ME: `$release_type': invalid release type\n"), $fail = 1;
|
||||
|
||||
@ARGV
|
||||
and (warn "$ME: too many arguments\n"), $fail = 1;
|
||||
$fail
|
||||
and usage 1;
|
||||
|
||||
my $my_distdir = "$package_name-$curr_version";
|
||||
my $tgz = "$my_distdir.tar.gz";
|
||||
my $tbz = "$my_distdir.tar.bz2";
|
||||
my $xd = "$package_name-$prev_version-$curr_version.xdelta";
|
||||
|
||||
my %size = sizes ($tgz, $tbz, $xd);
|
||||
%size
|
||||
or exit 1;
|
||||
|
||||
# The markup is escaped as <\# so that when this script is sent by
|
||||
# mail (or part of a diff), Gnus is not triggered.
|
||||
print <<EOF;
|
||||
|
||||
Subject: $my_distdir released
|
||||
|
||||
<\#secure method=pgpmime mode=sign>
|
||||
|
||||
FIXME: put comments here
|
||||
|
||||
EOF
|
||||
|
||||
print_locations ("compressed sources", @url_dir_list, %size,
|
||||
$tgz, $tbz);
|
||||
print_locations ("xdelta-style diffs", @url_dir_list, %size,
|
||||
$xd);
|
||||
print_locations ("GPG detached signatures[*]", @url_dir_list, %size,
|
||||
"$tgz.sig", "$tbz.sig");
|
||||
|
||||
print_checksums ($tgz, $tbz, $xd);
|
||||
|
||||
print <<EOF;
|
||||
|
||||
[*] You can use either of the above signature files to verify that
|
||||
the corresponding file (without the .sig suffix) is intact. First,
|
||||
be sure to download both the .sig file and the corresponding tarball.
|
||||
Then, run a command like this:
|
||||
|
||||
gpg --verify $tgz.sig
|
||||
|
||||
If that command fails because you don't have the required public key,
|
||||
then run this command to import it:
|
||||
|
||||
gpg --keyserver wwwkeys.pgp.net --recv-keys $gpg_key_id
|
||||
|
||||
and rerun the \`gpg --verify' command.
|
||||
EOF
|
||||
|
||||
print_news_deltas ($_, $prev_version, $curr_version)
|
||||
foreach @news_file;
|
||||
|
||||
$release_type eq 'major'
|
||||
or print_changelog_deltas ($package_name, $prev_version);
|
||||
|
||||
exit 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
### Setup "GNU" style for perl-mode and cperl-mode.
|
||||
## Local Variables:
|
||||
## perl-indent-level: 2
|
||||
## perl-continued-statement-offset: 2
|
||||
## perl-continued-brace-offset: 0
|
||||
## perl-brace-offset: 0
|
||||
## perl-brace-imaginary-offset: 0
|
||||
## perl-label-offset: -2
|
||||
## cperl-indent-level: 2
|
||||
## cperl-brace-offset: 0
|
||||
## cperl-continued-brace-offset: 0
|
||||
## cperl-label-offset: -2
|
||||
## cperl-extra-newline-before-brace: t
|
||||
## cperl-merge-trailing-else: nil
|
||||
## cperl-continued-statement-offset: 2
|
||||
## End:
|
||||
207
bootstrap
207
bootstrap
@@ -29,13 +29,37 @@ nl='
|
||||
LC_ALL=C
|
||||
export LC_ALL
|
||||
|
||||
usage() {
|
||||
echo >&2 "\
|
||||
Usage: $0 [OPTION]...
|
||||
Bootstrap this package from the checked-out sources.
|
||||
|
||||
Options:
|
||||
--gnulib-srcdir=DIRNAME Specify the local directory where gnulib
|
||||
sources reside. Use this if you already
|
||||
have gnulib sources on your machine, and
|
||||
do not want to waste your bandwidth dowloading
|
||||
them again.
|
||||
--copy Copy files instead of creating symbolic links.
|
||||
--force Attempt to bootstrap even if the sources seem
|
||||
not to have been checked out.
|
||||
--skip-po Do not download po files.
|
||||
--cvs-user=USERNAME Set the CVS username to be used when accessing
|
||||
the gnulib repository.
|
||||
|
||||
If the file .bootstrap.conf exists in the current working directory, its
|
||||
contents are read as shell variables to configure the bootstrap.
|
||||
|
||||
Running without arguments will suffice in most cases.
|
||||
"
|
||||
}
|
||||
|
||||
# Configuration.
|
||||
|
||||
# List of gnulib modules needed.
|
||||
gnulib_modules=
|
||||
|
||||
# Any extra gnulib files needed.
|
||||
# Any gnulib files needed that are not in modules.
|
||||
gnulib_files=
|
||||
|
||||
# Translation Project URL, for the registry of all projects
|
||||
@@ -61,8 +85,9 @@ extract_package_name='
|
||||
'
|
||||
package=`sed -n "$extract_package_name" configure.ac` || exit
|
||||
|
||||
# Extra files from gnulib, which are not part of any module yet.
|
||||
# Extra files from gnulib, which override files from other sources.
|
||||
gnulib_extra_files='
|
||||
build-aux/announce-gen
|
||||
build-aux/install-sh
|
||||
build-aux/missing
|
||||
build-aux/mdate-sh
|
||||
@@ -86,6 +111,13 @@ XGETTEXT_OPTIONS='\\\
|
||||
# Files we don't want to import.
|
||||
excluded_files=
|
||||
|
||||
# File that should exist in the top directory of a checked out hierarchy,
|
||||
# but not in a distribution tarball.
|
||||
CVS_only_file=README-cvs
|
||||
|
||||
# Whether to use copies instead of symlinks.
|
||||
copy=false
|
||||
|
||||
# Override the default configuration, if necessary.
|
||||
test -r bootstrap.conf && . ./bootstrap.conf
|
||||
|
||||
@@ -97,7 +129,7 @@ for option
|
||||
do
|
||||
case $option in
|
||||
--help)
|
||||
echo "$0: usage: $0 [--gnulib-srcdir=DIR] [--cvs-user=USERNAME] [--skip-po]"
|
||||
usage
|
||||
exit;;
|
||||
--gnulib-srcdir=*)
|
||||
GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
|
||||
@@ -105,12 +137,21 @@ do
|
||||
CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
|
||||
--skip-po)
|
||||
SKIP_PO=t;;
|
||||
--force)
|
||||
CVS_only_file=;;
|
||||
--copy)
|
||||
copy=true;;
|
||||
*)
|
||||
echo >&2 "$0: $option: unknown option"
|
||||
exit 1;;
|
||||
esac
|
||||
done
|
||||
|
||||
if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
|
||||
echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$0: Bootstrapping CVS $package..."
|
||||
|
||||
cleanup_gnulib() {
|
||||
@@ -212,27 +253,102 @@ case $SKIP_PO in
|
||||
fi;;
|
||||
esac
|
||||
|
||||
symlink_to_gnulib()
|
||||
{
|
||||
src=$GNULIB_SRCDIR/$1
|
||||
dst=${2-$1}
|
||||
|
||||
test -f "$src" && {
|
||||
if $copy; then
|
||||
{
|
||||
test ! -h "$dst" || {
|
||||
echo "$0: rm -f $dst" &&
|
||||
rm -f "$dst"
|
||||
}
|
||||
} &&
|
||||
test -f "$dst" &&
|
||||
cmp -s "$src" "$dst" || {
|
||||
echo "$0: cp -fp $src $dst" &&
|
||||
cp -fp "$src" "$dst"
|
||||
}
|
||||
else
|
||||
test -h "$dst" &&
|
||||
src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
|
||||
dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
|
||||
test "$src_i" = "$dst_i" || {
|
||||
dot_dots=
|
||||
case $src in
|
||||
/*) ;;
|
||||
*)
|
||||
case /$dst/ in
|
||||
*//* | */../* | */./* | /*/*/*/*/*/)
|
||||
echo >&2 "$0: invalid symlink calculation: $src -> $dst"
|
||||
exit 1;;
|
||||
/*/*/*/*/) dot_dots=../../../;;
|
||||
/*/*/*/) dot_dots=../../;;
|
||||
/*/*/) dot_dots=../;;
|
||||
esac;;
|
||||
esac
|
||||
|
||||
echo "$0: ln -fs $dot_dots$src $dst" &&
|
||||
ln -fs "$dot_dots$src" "$dst"
|
||||
}
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
cp_mark_as_generated()
|
||||
{
|
||||
cp_src=$1
|
||||
cp_dst=$2
|
||||
case $cp_dst in
|
||||
*.[ch]) c1='/* '; c2=' */';;
|
||||
*.texi) c1='@c '; c2= ;;
|
||||
*.m4|*/Make*|Make*) c1='# ' ; c2= ;;
|
||||
*) c1= ; c2= ;;
|
||||
esac
|
||||
|
||||
if test -z "$c1"; then
|
||||
cp "$cp_src" "$cp_dst"
|
||||
return
|
||||
if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
|
||||
symlink_to_gnulib "$cp_dst"
|
||||
else
|
||||
case $cp_dst in
|
||||
*.[ch]) c1='/* '; c2=' */';;
|
||||
*.texi) c1='@c '; c2= ;;
|
||||
*.m4|*/Make*|Make*) c1='# ' ; c2= ;;
|
||||
*) c1= ; c2= ;;
|
||||
esac
|
||||
|
||||
if test -z "$c1"; then
|
||||
cmp -s "$cp_src" "$cp_dst" || {
|
||||
echo "$0: cp -f $cp_src $cp_dst" &&
|
||||
cp -f "$cp_src" "$cp_dst"
|
||||
}
|
||||
else
|
||||
# Copy the file first to get proper permissions if it
|
||||
# doesn't already exist. Then overwrite the copy.
|
||||
cp "$cp_src" "$cp_dst-t" &&
|
||||
(
|
||||
echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
|
||||
echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
|
||||
cat "$cp_src"
|
||||
) > $cp_dst-t &&
|
||||
if cmp -s "$cp_dst-t" "$cp_dst"; then
|
||||
rm -f "$cp_dst-t"
|
||||
else
|
||||
echo "$0: cp $cp_src $cp_dst # with edits" &&
|
||||
mv -f "$cp_dst-t" "$cp_dst"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
(
|
||||
echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2"
|
||||
echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2"
|
||||
cat "$cp_src"
|
||||
) >> "$cp_dst"
|
||||
version_controlled_file() {
|
||||
dir=$1
|
||||
file=$2
|
||||
found=no
|
||||
if test -d CVS; then
|
||||
grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
|
||||
grep '^/[^/]*/[0-9]' > /dev/null && found=yes
|
||||
elif test -d .git; then
|
||||
git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
|
||||
else
|
||||
echo "$0: no version control for $dir/$file?" >&2
|
||||
fi
|
||||
test $found = yes
|
||||
}
|
||||
|
||||
slurp() {
|
||||
@@ -245,13 +361,15 @@ slurp() {
|
||||
test "$dir/$file" = "$excluded_file" && continue 2
|
||||
done
|
||||
if test $file = Makefile.am; then
|
||||
copied=$copied${sep}gnulib.mk; sep=$nl
|
||||
echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
|
||||
rm -f $dir/gnulib.mk
|
||||
sed '/^[^#].*\/intl/s/^/#/' $1/$dir/$file >$dir/gnulib.mk
|
||||
elif test -r ${2-no/such/dir}/$dir/$file ||
|
||||
grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
|
||||
grep -q '^/[^/]*/[0-9]'; then
|
||||
copied=$copied${sep}gnulib.mk; sep=$nl
|
||||
remove_intl='/^[^#].*\/intl/s/^/#/'
|
||||
sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
|
||||
echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
|
||||
rm -f $dir/gnulib.mk &&
|
||||
sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
|
||||
}
|
||||
elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
|
||||
version_controlled_file $dir $file; then
|
||||
echo "$0: $dir/$file overrides $1/$dir/$file"
|
||||
else
|
||||
copied=$copied$sep$file; sep=$nl
|
||||
@@ -267,17 +385,18 @@ slurp() {
|
||||
AC_DEFUN([gl_LOCK_EARLY], [])
|
||||
' $1/$dir/$file >$dir/$file
|
||||
else
|
||||
rm -f $dir/$file
|
||||
cp_mark_as_generated $1/$dir/$file $dir/$file
|
||||
fi
|
||||
fi || exit
|
||||
done
|
||||
|
||||
ig=$dir/.cvsignore
|
||||
if test -n "$copied" && test -f $ig; then
|
||||
echo "$copied" | sort -u - $ig | cmp -s - $ig ||
|
||||
echo "$copied" | sort -u - $ig -o $ig || exit
|
||||
fi
|
||||
for dot_ig in .cvsignore .gitignore; do
|
||||
ig=$dir/$dot_ig
|
||||
if test -n "$copied" && test -f $ig; then
|
||||
echo "$copied" | sort -u - $ig | cmp -s - $ig ||
|
||||
echo "$copied" | sort -u - $ig -o $ig || exit
|
||||
fi
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
@@ -300,11 +419,16 @@ gnulib_tool_options="\
|
||||
--m4-base $bt/m4/\
|
||||
--source-base $bt/lib/\
|
||||
--tests-base $bt/tests\
|
||||
--local-dir gl\
|
||||
"
|
||||
echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
|
||||
$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
|
||||
slurp $bt || exit
|
||||
|
||||
for file in $gnulib_files; do
|
||||
symlink_to_gnulib $file || exit
|
||||
done
|
||||
|
||||
|
||||
# Import from gettext.
|
||||
|
||||
@@ -332,13 +456,11 @@ done
|
||||
# Get some extra files from gnulib, overriding existing files.
|
||||
|
||||
for file in $gnulib_extra_files; do
|
||||
src=$GNULIB_SRCDIR/$file
|
||||
case $file in
|
||||
*/INSTALL) dest=.;;
|
||||
*) dest=$file;;
|
||||
*/INSTALL) dst=INSTALL;;
|
||||
*) dst=$file;;
|
||||
esac
|
||||
echo "$0: cp -fp $src $dest" &&
|
||||
cp -fp $src $dest || exit
|
||||
symlink_to_gnulib $file $dst || exit
|
||||
done
|
||||
|
||||
|
||||
@@ -356,13 +478,18 @@ sed '
|
||||
' po/Makevars.template >po/Makevars
|
||||
|
||||
if test -d runtime-po; then
|
||||
# Likewise for runtime-po/Makevars, except also change a few other parameters.
|
||||
# Similarly for runtime-po/Makevars, but not quite the same.
|
||||
rm -f runtime-po/Makevars
|
||||
sed '
|
||||
s/^\(DOMAIN\) *=.*/\1 = '"$package"'-runtime/
|
||||
s/^\(subdir\) *=.*/\1 = runtime-po/
|
||||
s/^\(XGETTEXT_OPTIONS\) *=.*/\1 = '"$XGETTEXT_OPTIONS_RUNTIME"'/
|
||||
' <po/Makevars >runtime-po/Makevars
|
||||
/^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
|
||||
/^subdir *=.*/s/=.*/= runtime-po/
|
||||
/^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
|
||||
/^XGETTEXT_OPTIONS *=/{
|
||||
s/$/ \\/
|
||||
a\
|
||||
'"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
|
||||
}
|
||||
' <po/Makevars.template >runtime-po/Makevars
|
||||
|
||||
# Copy identical files from po to runtime-po.
|
||||
(cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
|
||||
|
||||
@@ -53,11 +53,13 @@ gnulib_modules="
|
||||
memrchr mkancesdirs mkdir mkdir-p mkstemp mktime modechange
|
||||
mountlist obstack pathmax perl physmem posixtm posixver putenv
|
||||
quote quotearg raise readlink readtokens readtokens0 readutmp
|
||||
realloc regex rename-dest-slash rmdir rmdir-errno rpmatch
|
||||
realloc regex rename-dest-slash rmdir rmdir-errno
|
||||
root-dev-ino
|
||||
rpmatch
|
||||
safe-read same
|
||||
save-cwd savedir savewd settime sha1 sig2str ssize_t stat-macros
|
||||
stat-time stdbool stdlib-safer stpcpy strcase strftime
|
||||
strpbrk strtoimax strtoumax strverscmp timespec tzset
|
||||
strpbrk strtoimax strtoumax strverscmp sys_stat timespec tzset
|
||||
unicodeio unistd-safer unlink-busy unlinkdir unlocked-io
|
||||
uptime userspec utimecmp utimens vasprintf verify version-etc-fsf
|
||||
wcwidth winsz-ioctl winsz-termios xalloc xgetcwd xgethostname
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
announce-gen
|
||||
compile
|
||||
config.guess
|
||||
config.rpath
|
||||
|
||||
12
build-aux/.gitignore
vendored
Normal file
12
build-aux/.gitignore
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
announce-gen
|
||||
compile
|
||||
config.guess
|
||||
config.rpath
|
||||
config.sub
|
||||
depcomp
|
||||
gnupload
|
||||
install-sh
|
||||
mdate-sh
|
||||
missing
|
||||
texinfo.tex
|
||||
ylwrap
|
||||
@@ -1,3 +1,8 @@
|
||||
2006-10-14 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* vc-list-files: Don't filter git-ls-files output through cut.
|
||||
Add a comment about cvsu.
|
||||
|
||||
2006-08-22 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* .cvsignore: New file.
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
# with no trailing slashes. In mercurial mode, it's used as part of a
|
||||
# "grep" pattern (prepend "^", append "/"), and in cvs mode, it's simply
|
||||
# used as an argument to the cvsu script.
|
||||
# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/
|
||||
|
||||
include_prefix=
|
||||
case $# in
|
||||
@@ -36,9 +37,9 @@ esac
|
||||
|
||||
if test -d .git; then
|
||||
if test "x$include_prefix" = x; then
|
||||
git-ls-files | cut -d ' ' -f 3
|
||||
git-ls-files
|
||||
else
|
||||
git-ls-files | cut -d ' ' -f 3 | grep "^$include_prefix/"
|
||||
git-ls-files | grep "^$include_prefix/"
|
||||
fi
|
||||
elif test -d .hg; then
|
||||
if test "x$include_prefix" = x; then
|
||||
|
||||
15
configure.ac
15
configure.ac
@@ -20,7 +20,7 @@
|
||||
dnl Written by Jim Meyering.
|
||||
|
||||
AC_PREREQ(2.60)
|
||||
AC_INIT([GNU coreutils],[6.2],[bug-coreutils@gnu.org])
|
||||
AC_INIT([GNU coreutils],[6.7],[bug-coreutils@gnu.org])
|
||||
AC_CONFIG_SRCDIR(src/ls.c)
|
||||
|
||||
AC_CONFIG_AUX_DIR(build-aux)
|
||||
@@ -36,7 +36,8 @@ AC_PROG_GCC_TRADITIONAL
|
||||
AC_PROG_RANLIB
|
||||
AC_PROG_LN_S
|
||||
gl_EARLY
|
||||
gl_MACROS
|
||||
gl_INIT
|
||||
coreutils_MACROS
|
||||
|
||||
AC_CHECK_FUNCS(uname,
|
||||
OPTIONAL_BIN_PROGS="$OPTIONAL_BIN_PROGS uname\$(EXEEXT)"
|
||||
@@ -58,14 +59,14 @@ AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <time.h>
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
extern char **environ;
|
||||
unset_TZ ()
|
||||
void unset_TZ (void)
|
||||
{
|
||||
char **from, **to;
|
||||
for (to = from = environ; (*to = *from); from++)
|
||||
if (! (to[0][0] == 'T' && to[0][1] == 'Z' && to[0][2] == '='))
|
||||
to++;
|
||||
}
|
||||
main()
|
||||
int main()
|
||||
{
|
||||
time_t now = time ((time_t *) 0);
|
||||
int hour_GMT0, hour_unset;
|
||||
@@ -146,7 +147,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; 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)
|
||||
@@ -159,7 +160,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; 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)
|
||||
@@ -201,7 +202,7 @@ yes
|
||||
#define _XOPEN_SOURCE
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <termios.h>]], [[struct termios t; t.c_line;]])],
|
||||
#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)
|
||||
|
||||
5
doc/.gitignore
vendored
Normal file
5
doc/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
coreutils.info
|
||||
fdl.texi
|
||||
getdate.texi
|
||||
stamp-vti
|
||||
version.texi
|
||||
@@ -1,3 +1,29 @@
|
||||
2006-11-28 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* perm.texi (Mode Structure): Fix typo: s/setgid/setuid/.
|
||||
Reported by Georg Neis as Debian bug 400778.
|
||||
|
||||
2006-10-27 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* coreutils.texi (wc invocation): When giving the order in which
|
||||
the various "counts" are listed, also mention "maximum line length".
|
||||
Prompted by a report from Vincent LeFevre.
|
||||
|
||||
2006-10-23 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* coreutils.texi (rm invocation): Describe --one-file-system.
|
||||
|
||||
2006-09-26 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* coreutils.texi (groups invocation): "groups" no longer prefixes
|
||||
the output with "user :" unless more than one user is specified.
|
||||
|
||||
2006-09-19 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* coreutils.texi (cp invocation): Say that -i and -f are
|
||||
independent. Clarify -i's behavior.
|
||||
(Disk usage): Clarify intro. Problem reported by Van Ly.
|
||||
|
||||
2006-09-08 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* coreutils.texi (tail invocation): Ignore -f when standard input
|
||||
|
||||
@@ -2950,7 +2950,8 @@ wc [@var{option}]@dots{} [@var{file}]@dots{}
|
||||
given as an argument, it prints the file name following the counts. If
|
||||
more than one @var{file} is given, @command{wc} prints a final line
|
||||
containing the cumulative counts, with the file name @file{total}. The
|
||||
counts are printed in this order: newlines, words, characters, bytes.
|
||||
counts are printed in this order: newlines, words, characters, bytes,
|
||||
maximum line length.
|
||||
Each count is printed right-justified in a field with at least one
|
||||
space between fields so that the numbers and file names normally line
|
||||
up nicely in columns. The width of the count fields varies depending
|
||||
@@ -6890,6 +6891,9 @@ tries to open it again. Contrast this behavior with that enabled by
|
||||
is never opened but rather is unlinked unconditionally. Also see the
|
||||
description of @option{--remove-destination}.
|
||||
|
||||
This option is independent of the @option{--interactive} or
|
||||
@option{-i} option: neither cancels the effect of the other.
|
||||
|
||||
@item -H
|
||||
@opindex -H
|
||||
If a command line argument specifies a symbolic link, then copy the
|
||||
@@ -6901,7 +6905,8 @@ via recursive traversal.
|
||||
@itemx --interactive
|
||||
@opindex -i
|
||||
@opindex --interactive
|
||||
Prompt whether to overwrite existing regular destination files.
|
||||
When copying a file other than a directory, prompt whether to
|
||||
overwrite an existing destination file.
|
||||
|
||||
@item -l
|
||||
@itemx --link
|
||||
@@ -7768,6 +7773,24 @@ removal is requested. Equivalent to @option{-I}.
|
||||
Specifying @option{--interactive} and no @var{when} is equivalent to
|
||||
@option{--interactive=always}.
|
||||
|
||||
@itemx --one-file-system
|
||||
@opindex --one-file-system
|
||||
@cindex one file system, restricting @command{rm} to
|
||||
When removing a hierarchy recursively, skip any directory that is on a
|
||||
file system different from that of the corresponding command line argument.
|
||||
|
||||
This option is useful when removing a build ``chroot'' hierarchy,
|
||||
which normally contains no valuable data. However, it is not uncommon
|
||||
to bind-mount @file{/home} into such a hierarchy, to make it easier to
|
||||
use one's start-up file. The catch is that it's easy to forget to
|
||||
unmount @file{/home}. Then, when you use @command{rm -rf} to remove
|
||||
your normally throw-away chroot, that command will remove everything
|
||||
under @file{/home}, too.
|
||||
Use the @option{--one-file-system} option, and it will
|
||||
warn about and skip directories on other file systems.
|
||||
Of course, this will not save your @file{/home} if it and your
|
||||
chroot happen to be on the same file system.
|
||||
|
||||
@itemx --preserve-root
|
||||
@opindex --preserve-root
|
||||
@cindex root directory, disallow recursive destruction
|
||||
@@ -9225,11 +9248,9 @@ For example, use @samp{touch ./12312359 main.c} or @samp{touch -t
|
||||
|
||||
@cindex disk usage
|
||||
|
||||
No disk can hold an infinite amount of data. These commands report on
|
||||
how much disk storage is in use or available. (This has nothing much to
|
||||
do with how much @emph{main memory}, i.e., RAM, a program is using when
|
||||
it runs; for that, you want @command{ps} or @command{pstat} or @command{swap}
|
||||
or some such command.)
|
||||
No disk can hold an infinite amount of data. These commands report
|
||||
how much disk storage is in use or available, report other file and
|
||||
file status information, and write buffers to disk.
|
||||
|
||||
@menu
|
||||
* df invocation:: Report file system disk space usage.
|
||||
@@ -11971,7 +11992,8 @@ options}.
|
||||
|
||||
@command{groups} prints the names of the primary and any supplementary
|
||||
groups for each given @var{username}, or the current process if no names
|
||||
are given. If names are given, the name of each user is printed before
|
||||
are given. If more than one name is given, the name of each user is
|
||||
printed before
|
||||
the list of that user's groups. Synopsis:
|
||||
|
||||
@example
|
||||
|
||||
@@ -75,7 +75,7 @@ executable files (programs) and, on most systems, directories:
|
||||
@cindex set-user-ID
|
||||
@cindex setuid
|
||||
Set the process's effective user ID to that of the file upon execution
|
||||
(called the @dfn{set-user-ID bit}, or sometimes the @dfn{setgid bit}).
|
||||
(called the @dfn{set-user-ID bit}, or sometimes the @dfn{setuid bit}).
|
||||
For directories on a few systems, give files created in the directory
|
||||
the same owner as the directory, no matter who creates them, and set
|
||||
the set-user-ID bit of newly-created subdirectories.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#serial 2
|
||||
#serial 3
|
||||
dnl Copyright (C) 2005, 2006 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
@@ -6,7 +6,6 @@ dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
AC_DEFUN([gl_ROOT_DEV_INO],
|
||||
[
|
||||
AC_LIBSOURCES([root-dev-ino.c, root-dev-ino.h, dev-ino.h, same-inode.h])
|
||||
AC_LIBOBJ([root-dev-ino])
|
||||
|
||||
dnl Prerequisites
|
||||
16
gl/modules/getloadavg.diff
Normal file
16
gl/modules/getloadavg.diff
Normal file
@@ -0,0 +1,16 @@
|
||||
Index: modules/getloadavg
|
||||
===================================================================
|
||||
RCS file: /sources/gnulib/gnulib/modules/getloadavg,v
|
||||
retrieving revision 1.13
|
||||
diff -u -p -r1.13 getloadavg
|
||||
--- modules/getloadavg 22 Sep 2006 12:47:55 -0000 1.13
|
||||
+++ modules/getloadavg 23 Sep 2006 16:41:36 -0000
|
||||
@@ -14,7 +14,7 @@ stdbool
|
||||
fcntl-safer
|
||||
|
||||
configure.ac:
|
||||
-gl_GETLOADAVG([$gl_source_base])
|
||||
+gl_GETLOADAVG([lib])
|
||||
|
||||
Makefile.am:
|
||||
|
||||
25
gl/modules/root-dev-ino
Normal file
25
gl/modules/root-dev-ino
Normal file
@@ -0,0 +1,25 @@
|
||||
Description:
|
||||
Root device and inode number checking.
|
||||
|
||||
Files:
|
||||
lib/root-dev-ino.h
|
||||
lib/root-dev-ino.c
|
||||
m4/root-dev-ino.m4
|
||||
|
||||
Depends-on:
|
||||
dev-ino
|
||||
same-inode
|
||||
|
||||
configure.ac:
|
||||
gl_ROOT_DEV_INO
|
||||
|
||||
Makefile.am:
|
||||
|
||||
Include:
|
||||
"root-dev-ino.h"
|
||||
|
||||
License:
|
||||
GPL
|
||||
|
||||
Maintainer:
|
||||
Jim Meyering
|
||||
@@ -67,6 +67,7 @@ exclude.h
|
||||
exit.h
|
||||
exitfail.c
|
||||
exitfail.h
|
||||
fchmodat.c
|
||||
fchown-stub.c
|
||||
fcntl--.h
|
||||
fcntl-safer.h
|
||||
@@ -88,6 +89,7 @@ fopen-safer.c
|
||||
fprintftime.c
|
||||
fprintftime.h
|
||||
free.c
|
||||
fstatat.c
|
||||
fsusage.c
|
||||
fsusage.h
|
||||
ftruncate.c
|
||||
@@ -144,6 +146,8 @@ hash.c
|
||||
hash.h
|
||||
human.c
|
||||
human.h
|
||||
i-ring.c
|
||||
i-ring.h
|
||||
idcache.c
|
||||
imaxtostr.c
|
||||
inet_ntop.c
|
||||
@@ -195,6 +199,7 @@ mkdir.c
|
||||
mkdirat.c
|
||||
mkstemp-safer.c
|
||||
mkstemp.c
|
||||
mkstemp.h
|
||||
mktime.c
|
||||
modechange.c
|
||||
modechange.h
|
||||
@@ -207,6 +212,7 @@ offtostr.c
|
||||
open-safer.c
|
||||
openat-die.c
|
||||
openat-priv.h
|
||||
openat-proc.c
|
||||
openat.c
|
||||
openat.h
|
||||
pathmax.h
|
||||
@@ -248,6 +254,8 @@ regexec.c
|
||||
rename-dest-slash.c
|
||||
rename.c
|
||||
rmdir.c
|
||||
root-dev-ino.c
|
||||
root-dev-ino.h
|
||||
rpmatch.c
|
||||
safe-read.c
|
||||
safe-read.h
|
||||
@@ -315,9 +323,11 @@ strverscmp.c
|
||||
strverscmp.h
|
||||
t-fpending
|
||||
tempname.c
|
||||
tempname.h
|
||||
time_r.c
|
||||
time_r.h
|
||||
timespec.h
|
||||
uinttostr.c
|
||||
umaxtostr.c
|
||||
unicodeio.h
|
||||
unistd--.h
|
||||
|
||||
366
lib/.gitignore
vendored
Normal file
366
lib/.gitignore
vendored
Normal file
@@ -0,0 +1,366 @@
|
||||
__fpending.c
|
||||
__fpending.h
|
||||
acl.c
|
||||
acl.h
|
||||
alloca.c
|
||||
alloca.h
|
||||
alloca_.h
|
||||
allocsa.c
|
||||
allocsa.h
|
||||
allocsa.valgrind
|
||||
argmatch.c
|
||||
argmatch.h
|
||||
asnprintf.c
|
||||
asprintf.c
|
||||
at-func.c
|
||||
atexit.c
|
||||
backupfile.c
|
||||
backupfile.h
|
||||
base64.c
|
||||
base64.h
|
||||
basename.c
|
||||
c-strtod.c
|
||||
c-strtod.h
|
||||
c-strtold.c
|
||||
calloc.c
|
||||
canon-host.c
|
||||
canon-host.h
|
||||
canonicalize.c
|
||||
canonicalize.h
|
||||
charset.alias
|
||||
chdir-long.c
|
||||
chdir-long.h
|
||||
chown.c
|
||||
cloexec.c
|
||||
cloexec.h
|
||||
close-stream.c
|
||||
close-stream.h
|
||||
closeout.c
|
||||
closeout.h
|
||||
config.charset
|
||||
configmake.h
|
||||
creat-safer.c
|
||||
cycle-check.c
|
||||
cycle-check.h
|
||||
dev-ino.h
|
||||
diacrit.c
|
||||
diacrit.h
|
||||
dirchownmod.c
|
||||
dirchownmod.h
|
||||
dirfd.c
|
||||
dirfd.h
|
||||
dirname.c
|
||||
dirname.h
|
||||
dup-safer.c
|
||||
dup2.c
|
||||
error.c
|
||||
error.h
|
||||
euidaccess.c
|
||||
euidaccess.h
|
||||
exclude.c
|
||||
exclude.h
|
||||
exit.h
|
||||
exitfail.c
|
||||
exitfail.h
|
||||
fchmodat.c
|
||||
fchown-stub.c
|
||||
fcntl--.h
|
||||
fcntl-safer.h
|
||||
fcntl.h
|
||||
fcntl_.h
|
||||
fd-safer.c
|
||||
file-type.c
|
||||
file-type.h
|
||||
fileblocks.c
|
||||
filemode.c
|
||||
filemode.h
|
||||
filenamecat.c
|
||||
filenamecat.h
|
||||
fnmatch.c
|
||||
fnmatch_.h
|
||||
fnmatch_loop.c
|
||||
fopen-safer.c
|
||||
fprintftime.c
|
||||
fprintftime.h
|
||||
free.c
|
||||
fstatat.c
|
||||
fsusage.c
|
||||
fsusage.h
|
||||
ftruncate.c
|
||||
fts-cycle.c
|
||||
fts.c
|
||||
fts_.h
|
||||
full-read.c
|
||||
full-read.h
|
||||
full-write.c
|
||||
full-write.h
|
||||
gai_strerror.c
|
||||
getaddrinfo.c
|
||||
getaddrinfo.h
|
||||
getcwd.c
|
||||
getcwd.h
|
||||
getdate.c
|
||||
getdate.h
|
||||
getdate.y
|
||||
getdelim.c
|
||||
getdelim.h
|
||||
getgroups.c
|
||||
gethostname.c
|
||||
gethrxtime.c
|
||||
gethrxtime.h
|
||||
getline.c
|
||||
getline.h
|
||||
getloadavg.c
|
||||
getndelim2.c
|
||||
getndelim2.h
|
||||
getopt.c
|
||||
getopt1.c
|
||||
getopt_.h
|
||||
getopt_int.h
|
||||
getpagesize.h
|
||||
getpass.c
|
||||
getpass.h
|
||||
gettext.h
|
||||
gettime.c
|
||||
gettimeofday.c
|
||||
getugroups.c
|
||||
getusershell.c
|
||||
gnulib.mk
|
||||
group-member.c
|
||||
group-member.h
|
||||
hard-locale.c
|
||||
hard-locale.h
|
||||
hash-pjw.c
|
||||
hash-pjw.h
|
||||
hash.c
|
||||
hash.h
|
||||
human.c
|
||||
human.h
|
||||
i-ring.c
|
||||
i-ring.h
|
||||
idcache.c
|
||||
imaxtostr.c
|
||||
inet_ntop.c
|
||||
inet_ntop.h
|
||||
intprops.h
|
||||
inttostr.c
|
||||
inttostr.h
|
||||
inttypes.h
|
||||
inttypes_.h
|
||||
isapipe.c
|
||||
isapipe.h
|
||||
lchmod.h
|
||||
lchown.c
|
||||
lchown.h
|
||||
libcoreutils.a
|
||||
linebuffer.c
|
||||
linebuffer.h
|
||||
localcharset.c
|
||||
localcharset.h
|
||||
long-options.c
|
||||
long-options.h
|
||||
lstat.c
|
||||
lstat.h
|
||||
malloc.c
|
||||
mbchar.c
|
||||
mbchar.h
|
||||
mbswidth.c
|
||||
mbswidth.h
|
||||
mbuiter.h
|
||||
md5.c
|
||||
md5.h
|
||||
memcasecmp.c
|
||||
memcasecmp.h
|
||||
memchr.c
|
||||
memcmp.c
|
||||
memcoll.c
|
||||
memcoll.h
|
||||
memcpy.c
|
||||
memmove.c
|
||||
mempcpy.c
|
||||
mempcpy.h
|
||||
memrchr.c
|
||||
memrchr.h
|
||||
memset.c
|
||||
mkancesdirs.c
|
||||
mkancesdirs.h
|
||||
mkdir-p.c
|
||||
mkdir-p.h
|
||||
mkdir.c
|
||||
mkdirat.c
|
||||
mkstemp-safer.c
|
||||
mkstemp.c
|
||||
mkstemp.h
|
||||
mktime.c
|
||||
modechange.c
|
||||
modechange.h
|
||||
mountlist.c
|
||||
mountlist.h
|
||||
nanosleep.c
|
||||
obstack.c
|
||||
obstack.h
|
||||
offtostr.c
|
||||
open-safer.c
|
||||
openat-die.c
|
||||
openat-priv.h
|
||||
openat-proc.c
|
||||
openat.c
|
||||
openat.h
|
||||
pathmax.h
|
||||
physmem.c
|
||||
physmem.h
|
||||
pipe-safer.c
|
||||
posixtm.c
|
||||
posixtm.h
|
||||
posixver.c
|
||||
posixver.h
|
||||
printf-args.c
|
||||
printf-args.h
|
||||
printf-parse.h
|
||||
putenv.c
|
||||
quote.c
|
||||
quote.h
|
||||
quotearg.c
|
||||
quotearg.h
|
||||
raise.c
|
||||
readlink.c
|
||||
readtokens.c
|
||||
readtokens.h
|
||||
readtokens0.c
|
||||
readtokens0.h
|
||||
readutmp.c
|
||||
readutmp.h
|
||||
realloc.c
|
||||
ref-add.sed
|
||||
ref-add.sin
|
||||
ref-del.sed
|
||||
ref-del.sin
|
||||
regcomp.c
|
||||
regex.c
|
||||
regex.h
|
||||
regex_internal.c
|
||||
regex_internal.h
|
||||
regexec.c
|
||||
rename-dest-slash.c
|
||||
rename.c
|
||||
rmdir.c
|
||||
root-dev-ino.c
|
||||
root-dev-ino.h
|
||||
rpmatch.c
|
||||
safe-read.c
|
||||
safe-read.h
|
||||
safe-write.c
|
||||
safe-write.h
|
||||
same-inode.h
|
||||
same.c
|
||||
same.h
|
||||
save-cwd.c
|
||||
save-cwd.h
|
||||
savedir.c
|
||||
savedir.h
|
||||
savewd.c
|
||||
savewd.h
|
||||
setenv.c
|
||||
setenv.h
|
||||
settime.c
|
||||
sha1.c
|
||||
sha1.h
|
||||
sig2str.c
|
||||
sig2str.h
|
||||
snprintf.c
|
||||
snprintf.h
|
||||
socket_.h
|
||||
stat-macros.h
|
||||
stat-time.h
|
||||
stat_.h
|
||||
stdbool_.h
|
||||
stdint.h
|
||||
stdint_.h
|
||||
stdio--.h
|
||||
stdio-safer.h
|
||||
stdlib--.h
|
||||
stdlib-safer.h
|
||||
stpcpy.c
|
||||
stpcpy.h
|
||||
strcase.h
|
||||
strcasecmp.c
|
||||
strcspn.c
|
||||
strdup.c
|
||||
strdup.h
|
||||
strftime.c
|
||||
strftime.h
|
||||
stripslash.c
|
||||
strncasecmp.c
|
||||
strndup.c
|
||||
strndup.h
|
||||
strnlen.c
|
||||
strnlen.h
|
||||
strnlen1.c
|
||||
strnlen1.h
|
||||
strpbrk.c
|
||||
strpbrk.h
|
||||
strtod.c
|
||||
strtoimax.c
|
||||
strtol.c
|
||||
strtoll.c
|
||||
strtoul.c
|
||||
strtoull.c
|
||||
strtoumax.c
|
||||
strverscmp.c
|
||||
strverscmp.h
|
||||
t-fpending
|
||||
tempname.c
|
||||
tempname.h
|
||||
time_r.c
|
||||
time_r.h
|
||||
timespec.h
|
||||
uinttostr.c
|
||||
umaxtostr.c
|
||||
unicodeio.h
|
||||
unistd--.h
|
||||
unistd-safer.h
|
||||
unlinkdir.c
|
||||
unlinkdir.h
|
||||
unlocked-io.h
|
||||
unsetenv.c
|
||||
userspec.c
|
||||
userspec.h
|
||||
utime.c
|
||||
utimecmp.c
|
||||
utimecmp.h
|
||||
utimens.c
|
||||
utimens.h
|
||||
vasnprintf.h
|
||||
vasprintf.c
|
||||
vasprintf.h
|
||||
verify.h
|
||||
version-etc-fsf.c
|
||||
version-etc.c
|
||||
version-etc.h
|
||||
wcwidth.h
|
||||
xalloc-die.c
|
||||
xalloc.h
|
||||
xgetcwd.c
|
||||
xgetcwd.h
|
||||
xgethostname.c
|
||||
xgethostname.h
|
||||
xmalloc.c
|
||||
xmemcoll.c
|
||||
xmemcoll.h
|
||||
xnanosleep.c
|
||||
xnanosleep.h
|
||||
xreadlink.c
|
||||
xreadlink.h
|
||||
xstrndup.c
|
||||
xstrndup.h
|
||||
xstrtod.c
|
||||
xstrtod.h
|
||||
xstrtoimax.c
|
||||
xstrtol.c
|
||||
xstrtol.h
|
||||
xstrtold.c
|
||||
xstrtoul.c
|
||||
xstrtoumax.c
|
||||
xtime.h
|
||||
yesno.c
|
||||
yesno.h
|
||||
@@ -1,3 +1,65 @@
|
||||
2006-12-03 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* Makefile.am (libcoreutils_a_SOURCES): Remove xmemcoll.c and
|
||||
xmemcoll.h. Now, they're handled by the gnulib xmemcoll module.
|
||||
|
||||
2006-11-22 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* randread.c (__attribute__): Don't define if __attribute__ is
|
||||
already defined. Otherwise, the code won't conform to C99, since
|
||||
the macro arg is spelled differently by some include file, and the
|
||||
compilation fails with pedantic GCC.
|
||||
|
||||
2006-11-22 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* .cvsignore, .gitignore: Add fstat.c.
|
||||
|
||||
2006-11-14 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* readlink-stub.c, lstat-stub.c: Remove now-unused files.
|
||||
|
||||
2006-10-14 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Port sha512sum to hosts where uintmax_t is only 32 bits, e.g.,
|
||||
HP/Tandom NonStop OSS circa 2005 has 32-bit uintmax_t, 64-bit intmax_t.
|
||||
* u64.h: New file.
|
||||
* sha512.c (SWAP, sha512_init_ctx, sha384_init_ctx, sha512_read_ctx):
|
||||
(sha384_read_ctx, sha512_conclude_ctx, sha512_process_bytes):
|
||||
(sha512_round_constants, F2, F1, sha512_process_block):
|
||||
(S0, S1, SS0, SS1, M, R):
|
||||
Rewrite to use u64.h instead of assuming uint64_t.
|
||||
* sha512.h: Include u64.h rather than stdint.h.
|
||||
(rol64): Remove; moved to u64.h and renamed to u64rol.
|
||||
|
||||
2006-10-12 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* Makefile.am (libcoreutils_a_LIBADD): Append $(LIBOBJS),
|
||||
to accommodate the latest version of gnulib-tool.
|
||||
(libcoreutils_a_DEPENDENCIES): Likewise.
|
||||
From Bruno Haible.
|
||||
|
||||
2006-10-06 Jim Meyering <jim@meyering.net>
|
||||
|
||||
Avoid a compiler warning: const'ify and remove a cast.
|
||||
* randread.c (struct randread_source) [handler]: Make parameter "const".
|
||||
[handler_arg]: Add "const" attribute.
|
||||
(randread_error): Make parameter "const".
|
||||
(simple_new, randread_set_handler, randread_set_handler_arg): Likewise.
|
||||
(randread_new): Remove now-unnecessary cast.
|
||||
* randread.h: Adjust prototypes.
|
||||
|
||||
2006-09-29 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* .cvsignore: Add openat-proc.c.
|
||||
|
||||
2006-09-25 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* .cvsignore: Add fchmodat.c.
|
||||
|
||||
2006-09-25 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* fchmodat.c: Remove file. gnulib's copy is identical.
|
||||
|
||||
2006-09-01 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* .cvsignore: Add fcntl.h, fcntl_.h, inttypes_.h, isapipe.c,
|
||||
|
||||
@@ -26,9 +26,11 @@ LDADD = $(noinst_LIBRARIES)
|
||||
|
||||
libcoreutils_a_SOURCES += \
|
||||
buffer-lcm.c buffer-lcm.h \
|
||||
xmemcoll.c xmemcoll.h \
|
||||
xmemxfrm.c xmemxfrm.h
|
||||
|
||||
libcoreutils_a_LIBADD += $(LIBOBJS)
|
||||
libcoreutils_a_DEPENDENCIES += $(LIBOBJS)
|
||||
|
||||
check: unit-test
|
||||
|
||||
.PHONY: unit-test
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
/* Change the protections of file relative to an open directory.
|
||||
Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
/* written by Jim Meyering */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "openat.h"
|
||||
#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
|
||||
#include "save-cwd.h"
|
||||
#include "openat-priv.h"
|
||||
|
||||
#ifndef HAVE_LCHMOD
|
||||
/* Use a different name, to avoid conflicting with any
|
||||
system-supplied declaration. */
|
||||
# undef lchmod
|
||||
# define lchmod lchmod_rpl
|
||||
static int lchmod (char const *f, mode_t m) { errno = ENOSYS; return -1; }
|
||||
#endif
|
||||
|
||||
/* Solaris 10 has no function like this.
|
||||
Invoke chmod or lchmod on file, FILE, using mode MODE, in the directory
|
||||
open on descriptor FD. If possible, do it without changing the
|
||||
working directory. Otherwise, resort to using save_cwd/fchdir,
|
||||
then mkdir/restore_cwd. If either the save_cwd or the restore_cwd
|
||||
fails, then give a diagnostic and exit nonzero.
|
||||
Note that an attempt to use a FLAG value of AT_SYMLINK_NOFOLLOW
|
||||
on a system without lchmod support causes this function to fail. */
|
||||
|
||||
#define AT_FUNC_NAME fchmodat
|
||||
#define AT_FUNC_F1 lchmod
|
||||
#define AT_FUNC_F2 chmod
|
||||
#define AT_FUNC_USE_F1_COND flag == AT_SYMLINK_NOFOLLOW
|
||||
#define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode, int flag
|
||||
#define AT_FUNC_POST_FILE_ARGS , mode
|
||||
#include "at-func.c"
|
||||
@@ -1,13 +0,0 @@
|
||||
#include <config.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
/* A trivial substitute for `lstat'.
|
||||
|
||||
DJGPP 2.03 and earlier don't have `lstat' and don't support
|
||||
symlinks. */
|
||||
|
||||
int
|
||||
lstat (const char *fname, struct stat *st_buf)
|
||||
{
|
||||
return stat (fname, st_buf);
|
||||
}
|
||||
@@ -44,8 +44,10 @@
|
||||
# define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
|
||||
# define __attribute__(x)
|
||||
#ifndef __attribute__
|
||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
|
||||
# define __attribute__(x)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef ATTRIBUTE_UNUSED
|
||||
@@ -82,8 +84,8 @@ struct randread_source
|
||||
there was an error. If this function returns, it should fix the
|
||||
problem before returning. The default handler assumes that
|
||||
handler_arg is the file name of the source. */
|
||||
void (*handler) (void *);
|
||||
void *handler_arg;
|
||||
void (*handler) (void const *);
|
||||
void const *handler_arg;
|
||||
|
||||
/* The buffer for SOURCE. It's kept here to simplify storage
|
||||
allocation and to make it easier to clear out buffered random
|
||||
@@ -116,7 +118,7 @@ struct randread_source
|
||||
/* The default error handler. */
|
||||
|
||||
static void
|
||||
randread_error (void *file_name)
|
||||
randread_error (void const *file_name)
|
||||
{
|
||||
if (file_name)
|
||||
error (exit_failure, errno,
|
||||
@@ -129,7 +131,7 @@ randread_error (void *file_name)
|
||||
handler. */
|
||||
|
||||
static struct randread_source *
|
||||
simple_new (FILE *source, void *handler_arg)
|
||||
simple_new (FILE *source, void const *handler_arg)
|
||||
{
|
||||
struct randread_source *s = xmalloc (sizeof *s);
|
||||
s->source = source;
|
||||
@@ -167,7 +169,7 @@ randread_new (char const *name, size_t bytes_bound)
|
||||
file_name = NULL;
|
||||
}
|
||||
|
||||
s = simple_new (source, (void *) file_name);
|
||||
s = simple_new (source, file_name);
|
||||
|
||||
if (source)
|
||||
setvbuf (source, s->buf.c, _IOFBF, MIN (sizeof s->buf.c, bytes_bound));
|
||||
@@ -190,13 +192,13 @@ randread_new (char const *name, size_t bytes_bound)
|
||||
does not return. */
|
||||
|
||||
void
|
||||
randread_set_handler (struct randread_source *s, void (*handler) (void *))
|
||||
randread_set_handler (struct randread_source *s, void (*handler) (void const *))
|
||||
{
|
||||
s->handler = handler;
|
||||
}
|
||||
|
||||
void
|
||||
randread_set_handler_arg (struct randread_source *s, void *handler_arg)
|
||||
randread_set_handler_arg (struct randread_source *s, void const *handler_arg)
|
||||
{
|
||||
s->handler_arg = handler_arg;
|
||||
}
|
||||
|
||||
@@ -27,8 +27,8 @@ struct randread_source;
|
||||
|
||||
struct randread_source *randread_new (char const *, size_t);
|
||||
void randread (struct randread_source *, void *, size_t);
|
||||
void randread_set_handler (struct randread_source *, void (*) (void *));
|
||||
void randread_set_handler_arg (struct randread_source *, void *);
|
||||
void randread_set_handler (struct randread_source *, void (*) (void const *));
|
||||
void randread_set_handler_arg (struct randread_source *, void const *);
|
||||
int randread_free (struct randread_source *);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
#include <config.h>
|
||||
#include <stddef.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* A trivial substitute for `readlink'.
|
||||
|
||||
DJGPP 2.03 and earlier don't have `readlink' and don't support
|
||||
symlinks. */
|
||||
|
||||
int
|
||||
readlink (const char *file, char *buffer, size_t size)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
203
lib/sha512.c
203
lib/sha512.c
@@ -36,9 +36,14 @@
|
||||
# define SWAP(n) (n)
|
||||
#else
|
||||
# define SWAP(n) \
|
||||
(((n) << 56) | (((n) & 0xff00) << 40) | (((n) & 0xff0000UL) << 24) \
|
||||
| (((n) & 0xff000000UL) << 8) | (((n) >> 8) & 0xff000000UL) \
|
||||
| (((n) >> 24) & 0xff0000UL) | (((n) >> 40) & 0xff00UL) | ((n) >> 56))
|
||||
u64or (u64or (u64or (u64shl (n, 56), \
|
||||
u64shl (u64and (n, u64lo (0x0000ff00)), 40)), \
|
||||
u64or (u64shl (u64and (n, u64lo (0x00ff0000)), 24), \
|
||||
u64shl (u64and (n, u64lo (0xff000000)), 8))), \
|
||||
u64or (u64or (u64and (u64shr (n, 8), u64lo (0xff000000)), \
|
||||
u64and (u64shr (n, 24), u64lo (0x00ff0000))), \
|
||||
u64or (u64and (u64shr (n, 40), u64lo (0x0000ff00)), \
|
||||
u64shr (n, 56))))
|
||||
#endif
|
||||
|
||||
#define BLOCKSIZE 4096
|
||||
@@ -59,32 +64,32 @@ static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ };
|
||||
void
|
||||
sha512_init_ctx (struct sha512_ctx *ctx)
|
||||
{
|
||||
ctx->state[0] = 0x6a09e667f3bcc908ULL;
|
||||
ctx->state[1] = 0xbb67ae8584caa73bULL;
|
||||
ctx->state[2] = 0x3c6ef372fe94f82bULL;
|
||||
ctx->state[3] = 0xa54ff53a5f1d36f1ULL;
|
||||
ctx->state[4] = 0x510e527fade682d1ULL;
|
||||
ctx->state[5] = 0x9b05688c2b3e6c1fULL;
|
||||
ctx->state[6] = 0x1f83d9abfb41bd6bULL;
|
||||
ctx->state[7] = 0x5be0cd19137e2179ULL;
|
||||
ctx->state[0] = u64hilo (0x6a09e667, 0xf3bcc908);
|
||||
ctx->state[1] = u64hilo (0xbb67ae85, 0x84caa73b);
|
||||
ctx->state[2] = u64hilo (0x3c6ef372, 0xfe94f82b);
|
||||
ctx->state[3] = u64hilo (0xa54ff53a, 0x5f1d36f1);
|
||||
ctx->state[4] = u64hilo (0x510e527f, 0xade682d1);
|
||||
ctx->state[5] = u64hilo (0x9b05688c, 0x2b3e6c1f);
|
||||
ctx->state[6] = u64hilo (0x1f83d9ab, 0xfb41bd6b);
|
||||
ctx->state[7] = u64hilo (0x5be0cd19, 0x137e2179);
|
||||
|
||||
ctx->total[0] = ctx->total[1] = 0;
|
||||
ctx->total[0] = ctx->total[1] = u64lo (0);
|
||||
ctx->buflen = 0;
|
||||
}
|
||||
|
||||
void
|
||||
sha384_init_ctx (struct sha512_ctx *ctx)
|
||||
{
|
||||
ctx->state[0] = 0xcbbb9d5dc1059ed8ULL;
|
||||
ctx->state[1] = 0x629a292a367cd507ULL;
|
||||
ctx->state[2] = 0x9159015a3070dd17ULL;
|
||||
ctx->state[3] = 0x152fecd8f70e5939ULL;
|
||||
ctx->state[4] = 0x67332667ffc00b31ULL;
|
||||
ctx->state[5] = 0x8eb44a8768581511ULL;
|
||||
ctx->state[6] = 0xdb0c2e0d64f98fa7ULL;
|
||||
ctx->state[7] = 0x47b5481dbefa4fa4ULL;
|
||||
ctx->state[0] = u64hilo (0xcbbb9d5d, 0xc1059ed8);
|
||||
ctx->state[1] = u64hilo (0x629a292a, 0x367cd507);
|
||||
ctx->state[2] = u64hilo (0x9159015a, 0x3070dd17);
|
||||
ctx->state[3] = u64hilo (0x152fecd8, 0xf70e5939);
|
||||
ctx->state[4] = u64hilo (0x67332667, 0xffc00b31);
|
||||
ctx->state[5] = u64hilo (0x8eb44a87, 0x68581511);
|
||||
ctx->state[6] = u64hilo (0xdb0c2e0d, 0x64f98fa7);
|
||||
ctx->state[7] = u64hilo (0x47b5481d, 0xbefa4fa4);
|
||||
|
||||
ctx->total[0] = ctx->total[1] = 0;
|
||||
ctx->total[0] = ctx->total[1] = u64lo (0);
|
||||
ctx->buflen = 0;
|
||||
}
|
||||
|
||||
@@ -99,7 +104,7 @@ sha512_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
((uint64_t *) resbuf)[i] = SWAP (ctx->state[i]);
|
||||
((u64 *) resbuf)[i] = SWAP (ctx->state[i]);
|
||||
|
||||
return resbuf;
|
||||
}
|
||||
@@ -110,7 +115,7 @@ sha384_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
((uint64_t *) resbuf)[i] = SWAP (ctx->state[i]);
|
||||
((u64 *) resbuf)[i] = SWAP (ctx->state[i]);
|
||||
|
||||
return resbuf;
|
||||
}
|
||||
@@ -124,17 +129,18 @@ static void
|
||||
sha512_conclude_ctx (struct sha512_ctx *ctx)
|
||||
{
|
||||
/* Take yet unprocessed bytes into account. */
|
||||
uint64_t bytes = ctx->buflen;
|
||||
size_t bytes = ctx->buflen;
|
||||
size_t size = (bytes < 112) ? 128 / 8 : 128 * 2 / 8;
|
||||
|
||||
/* Now count remaining bytes. */
|
||||
ctx->total[0] += bytes;
|
||||
if (ctx->total[0] < bytes)
|
||||
++ctx->total[1];
|
||||
ctx->total[0] = u64plus (ctx->total[0], u64lo (bytes));
|
||||
if (u64lt (ctx->total[0], u64lo (bytes)))
|
||||
ctx->total[1] = u64plus (ctx->total[1], u64lo (1));
|
||||
|
||||
/* Put the 64-bit file length in *bits* at the end of the buffer. */
|
||||
ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 61));
|
||||
ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3);
|
||||
ctx->buffer[size - 2] = SWAP (u64or (u64shl (ctx->total[1], 3),
|
||||
u64shr (ctx->total[0], 61)));
|
||||
ctx->buffer[size - 1] = SWAP (u64shl (ctx->total[0], 3));
|
||||
|
||||
memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 8 - bytes);
|
||||
|
||||
@@ -353,7 +359,7 @@ sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
|
||||
{
|
||||
#if !_STRING_ARCH_unaligned
|
||||
# define alignof(type) offsetof (struct { char c; type x; }, x)
|
||||
# define UNALIGNED_P(p) (((size_t) p) % alignof (uint64_t) != 0)
|
||||
# define UNALIGNED_P(p) (((size_t) p) % alignof (u64) != 0)
|
||||
if (UNALIGNED_P (buffer))
|
||||
while (len > 128)
|
||||
{
|
||||
@@ -391,22 +397,52 @@ sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
|
||||
|
||||
/* SHA512 round constants */
|
||||
#define K(I) sha512_round_constants[I]
|
||||
static const uint64_t sha512_round_constants[80] = {
|
||||
0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
|
||||
0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
|
||||
0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
|
||||
0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
|
||||
0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
|
||||
0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
|
||||
0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
|
||||
0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
|
||||
0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
|
||||
0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL,
|
||||
static u64 const sha512_round_constants[80] = {
|
||||
u64init (0x428a2f98, 0xd728ae22), u64init (0x71374491, 0x23ef65cd),
|
||||
u64init (0xb5c0fbcf, 0xec4d3b2f), u64init (0xe9b5dba5, 0x8189dbbc),
|
||||
u64init (0x3956c25b, 0xf348b538), u64init (0x59f111f1, 0xb605d019),
|
||||
u64init (0x923f82a4, 0xaf194f9b), u64init (0xab1c5ed5, 0xda6d8118),
|
||||
u64init (0xd807aa98, 0xa3030242), u64init (0x12835b01, 0x45706fbe),
|
||||
u64init (0x243185be, 0x4ee4b28c), u64init (0x550c7dc3, 0xd5ffb4e2),
|
||||
u64init (0x72be5d74, 0xf27b896f), u64init (0x80deb1fe, 0x3b1696b1),
|
||||
u64init (0x9bdc06a7, 0x25c71235), u64init (0xc19bf174, 0xcf692694),
|
||||
u64init (0xe49b69c1, 0x9ef14ad2), u64init (0xefbe4786, 0x384f25e3),
|
||||
u64init (0x0fc19dc6, 0x8b8cd5b5), u64init (0x240ca1cc, 0x77ac9c65),
|
||||
u64init (0x2de92c6f, 0x592b0275), u64init (0x4a7484aa, 0x6ea6e483),
|
||||
u64init (0x5cb0a9dc, 0xbd41fbd4), u64init (0x76f988da, 0x831153b5),
|
||||
u64init (0x983e5152, 0xee66dfab), u64init (0xa831c66d, 0x2db43210),
|
||||
u64init (0xb00327c8, 0x98fb213f), u64init (0xbf597fc7, 0xbeef0ee4),
|
||||
u64init (0xc6e00bf3, 0x3da88fc2), u64init (0xd5a79147, 0x930aa725),
|
||||
u64init (0x06ca6351, 0xe003826f), u64init (0x14292967, 0x0a0e6e70),
|
||||
u64init (0x27b70a85, 0x46d22ffc), u64init (0x2e1b2138, 0x5c26c926),
|
||||
u64init (0x4d2c6dfc, 0x5ac42aed), u64init (0x53380d13, 0x9d95b3df),
|
||||
u64init (0x650a7354, 0x8baf63de), u64init (0x766a0abb, 0x3c77b2a8),
|
||||
u64init (0x81c2c92e, 0x47edaee6), u64init (0x92722c85, 0x1482353b),
|
||||
u64init (0xa2bfe8a1, 0x4cf10364), u64init (0xa81a664b, 0xbc423001),
|
||||
u64init (0xc24b8b70, 0xd0f89791), u64init (0xc76c51a3, 0x0654be30),
|
||||
u64init (0xd192e819, 0xd6ef5218), u64init (0xd6990624, 0x5565a910),
|
||||
u64init (0xf40e3585, 0x5771202a), u64init (0x106aa070, 0x32bbd1b8),
|
||||
u64init (0x19a4c116, 0xb8d2d0c8), u64init (0x1e376c08, 0x5141ab53),
|
||||
u64init (0x2748774c, 0xdf8eeb99), u64init (0x34b0bcb5, 0xe19b48a8),
|
||||
u64init (0x391c0cb3, 0xc5c95a63), u64init (0x4ed8aa4a, 0xe3418acb),
|
||||
u64init (0x5b9cca4f, 0x7763e373), u64init (0x682e6ff3, 0xd6b2b8a3),
|
||||
u64init (0x748f82ee, 0x5defb2fc), u64init (0x78a5636f, 0x43172f60),
|
||||
u64init (0x84c87814, 0xa1f0ab72), u64init (0x8cc70208, 0x1a6439ec),
|
||||
u64init (0x90befffa, 0x23631e28), u64init (0xa4506ceb, 0xde82bde9),
|
||||
u64init (0xbef9a3f7, 0xb2c67915), u64init (0xc67178f2, 0xe372532b),
|
||||
u64init (0xca273ece, 0xea26619c), u64init (0xd186b8c7, 0x21c0c207),
|
||||
u64init (0xeada7dd6, 0xcde0eb1e), u64init (0xf57d4f7f, 0xee6ed178),
|
||||
u64init (0x06f067aa, 0x72176fba), u64init (0x0a637dc5, 0xa2c898a6),
|
||||
u64init (0x113f9804, 0xbef90dae), u64init (0x1b710b35, 0x131c471b),
|
||||
u64init (0x28db77f5, 0x23047d84), u64init (0x32caab7b, 0x40c72493),
|
||||
u64init (0x3c9ebe0a, 0x15c9bebc), u64init (0x431d67c4, 0x9c100d4c),
|
||||
u64init (0x4cc5d4be, 0xcb3e42b6), u64init (0x597f299c, 0xfc657e2a),
|
||||
u64init (0x5fcb6fab, 0x3ad6faec), u64init (0x6c44198c, 0x4a475817),
|
||||
};
|
||||
|
||||
/* Round functions. */
|
||||
#define F2(A,B,C) ( ( A & B ) | ( C & ( A | B ) ) )
|
||||
#define F1(E,F,G) ( G ^ ( E & ( F ^ G ) ) )
|
||||
#define F2(A, B, C) u64or (u64and (A, B), u64and (C, u64or (A, B)))
|
||||
#define F1(E, F, G) u64xor (G, u64and (E, u64xor (F, G)))
|
||||
|
||||
/* Process LEN bytes of BUFFER, accumulating context into CTX.
|
||||
It is assumed that LEN % 128 == 0.
|
||||
@@ -415,47 +451,50 @@ static const uint64_t sha512_round_constants[80] = {
|
||||
void
|
||||
sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
|
||||
{
|
||||
const uint64_t *words = buffer;
|
||||
size_t nwords = len / sizeof (uint64_t);
|
||||
const uint64_t *endp = words + nwords;
|
||||
uint64_t x[16];
|
||||
uint64_t a = ctx->state[0];
|
||||
uint64_t b = ctx->state[1];
|
||||
uint64_t c = ctx->state[2];
|
||||
uint64_t d = ctx->state[3];
|
||||
uint64_t e = ctx->state[4];
|
||||
uint64_t f = ctx->state[5];
|
||||
uint64_t g = ctx->state[6];
|
||||
uint64_t h = ctx->state[7];
|
||||
u64 const *words = buffer;
|
||||
u64 const *endp = words + len / sizeof (u64);
|
||||
u64 x[16];
|
||||
u64 a = ctx->state[0];
|
||||
u64 b = ctx->state[1];
|
||||
u64 c = ctx->state[2];
|
||||
u64 d = ctx->state[3];
|
||||
u64 e = ctx->state[4];
|
||||
u64 f = ctx->state[5];
|
||||
u64 g = ctx->state[6];
|
||||
u64 h = ctx->state[7];
|
||||
|
||||
/* First increment the byte count. FIPS PUB 180-2 specifies the possible
|
||||
length of the file up to 2^128 bits. Here we only compute the
|
||||
number of bytes. Do a double word increment. */
|
||||
ctx->total[0] += len;
|
||||
if (ctx->total[0] < len)
|
||||
++ctx->total[1];
|
||||
ctx->total[0] = u64plus (ctx->total[0], u64lo (len));
|
||||
if (u64lt (ctx->total[0], u64lo (len)))
|
||||
ctx->total[1] = u64plus (ctx->total[1], u64lo (1));
|
||||
|
||||
#define S0(x) (rol64(x,63)^rol64(x,56)^(x>>7))
|
||||
#define S1(x) (rol64(x,45)^rol64(x,3)^(x>>6))
|
||||
#define SS0(x) (rol64(x,36)^rol64(x,30)^rol64(x,25))
|
||||
#define SS1(x) (rol64(x,50)^rol64(x,46)^rol64(x,23))
|
||||
#define S0(x) u64xor (u64rol(x, 63), u64xor (u64rol (x, 56), u64shr (x, 7)))
|
||||
#define S1(x) u64xor (u64rol (x, 45), u64xor (u64rol (x, 3), u64shr (x, 6)))
|
||||
#define SS0(x) u64xor (u64rol (x, 36), u64xor (u64rol (x, 30), u64rol (x, 25)))
|
||||
#define SS1(x) u64xor (u64rol(x, 50), u64xor (u64rol (x, 46), u64rol (x, 23)))
|
||||
|
||||
#define M(I) ( tm = S1(x[(I-2)&0x0f]) + x[(I-7)&0x0f] \
|
||||
+ S0(x[(I-15)&0x0f]) + x[I&0x0f] \
|
||||
, x[I&0x0f] = tm )
|
||||
#define M(I) (x[(I) & 15] \
|
||||
= u64plus (x[(I) & 15], \
|
||||
u64plus (S1 (x[((I) - 2) & 15]), \
|
||||
u64plus (x[((I) - 7) & 15], \
|
||||
S0 (x[((I) - 15) & 15])))))
|
||||
|
||||
#define R(A,B,C,D,E,F,G,H,K,M) do { t0 = SS0(A) + F2(A,B,C); \
|
||||
t1 = H + SS1(E) \
|
||||
+ F1(E,F,G) \
|
||||
+ K \
|
||||
+ M; \
|
||||
D += t1; H = t0 + t1; \
|
||||
} while(0)
|
||||
#define R(A, B, C, D, E, F, G, H, K, M) \
|
||||
do \
|
||||
{ \
|
||||
u64 t0 = u64plus (SS0 (A), F2 (A, B, C)); \
|
||||
u64 t1 = \
|
||||
u64plus (H, u64plus (SS1 (E), \
|
||||
u64plus (F1 (E, F, G), u64plus (K, M)))); \
|
||||
D = u64plus (D, t1); \
|
||||
H = u64plus (t0, t1); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
while (words < endp)
|
||||
{
|
||||
uint64_t tm;
|
||||
uint64_t t0, t1;
|
||||
int t;
|
||||
/* FIXME: see sha1.c for a better implementation. */
|
||||
for (t = 0; t < 16; t++)
|
||||
@@ -545,13 +584,13 @@ sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
|
||||
R( c, d, e, f, g, h, a, b, K(78), M(78) );
|
||||
R( b, c, d, e, f, g, h, a, K(79), M(79) );
|
||||
|
||||
a = ctx->state[0] += a;
|
||||
b = ctx->state[1] += b;
|
||||
c = ctx->state[2] += c;
|
||||
d = ctx->state[3] += d;
|
||||
e = ctx->state[4] += e;
|
||||
f = ctx->state[5] += f;
|
||||
g = ctx->state[6] += g;
|
||||
h = ctx->state[7] += h;
|
||||
a = ctx->state[0] = u64plus (ctx->state[0], a);
|
||||
b = ctx->state[1] = u64plus (ctx->state[1], b);
|
||||
c = ctx->state[2] = u64plus (ctx->state[2], c);
|
||||
d = ctx->state[3] = u64plus (ctx->state[3], d);
|
||||
e = ctx->state[4] = u64plus (ctx->state[4], e);
|
||||
f = ctx->state[5] = u64plus (ctx->state[5], f);
|
||||
g = ctx->state[6] = u64plus (ctx->state[6], g);
|
||||
h = ctx->state[7] = u64plus (ctx->state[7], h);
|
||||
}
|
||||
}
|
||||
|
||||
13
lib/sha512.h
13
lib/sha512.h
@@ -20,16 +20,17 @@
|
||||
# define SHA512_H 1
|
||||
|
||||
# include <stdio.h>
|
||||
# include <stdint.h>
|
||||
|
||||
# include "u64.h"
|
||||
|
||||
/* Structure to save state of computation between the single steps. */
|
||||
struct sha512_ctx
|
||||
{
|
||||
uint64_t state[8];
|
||||
u64 state[8];
|
||||
|
||||
uint64_t total[2];
|
||||
uint64_t buflen;
|
||||
uint64_t buffer[32];
|
||||
u64 total[2];
|
||||
size_t buflen;
|
||||
u64 buffer[32];
|
||||
};
|
||||
|
||||
|
||||
@@ -85,6 +86,4 @@ extern int sha384_stream (FILE *stream, void *resblock);
|
||||
extern void *sha512_buffer (const char *buffer, size_t len, void *resblock);
|
||||
extern void *sha384_buffer (const char *buffer, size_t len, void *resblock);
|
||||
|
||||
# define rol64(x,n) ( ((x) << (n)) | ((x) >> (64-(n))) )
|
||||
|
||||
#endif
|
||||
|
||||
160
lib/u64.h
Normal file
160
lib/u64.h
Normal file
@@ -0,0 +1,160 @@
|
||||
/* uint64_t-like operations that work even on hosts lacking uint64_t
|
||||
|
||||
Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/* Return X rotated left by N bits, where 0 < N < 64. */
|
||||
#define u64rol(x, n) u64or (u64shl (x, n), u64shr (x, 64 - n))
|
||||
|
||||
#ifdef UINT64_MAX
|
||||
|
||||
/* Native implementations are trivial. See below for comments on what
|
||||
these operations do. */
|
||||
typedef uint64_t u64;
|
||||
# define u64hilo(hi, lo) ((u64) (((u64) (hi) << 32) + (lo)))
|
||||
# define u64init(hi, lo) u64hilo (hi, lo)
|
||||
# define u64lo(x) ((u64) (x))
|
||||
# define u64lt(x, y) ((x) < (y))
|
||||
# define u64and(x, y) ((x) & (y))
|
||||
# define u64or(x, y) ((x) | (y))
|
||||
# define u64xor(x, y) ((x) ^ (y))
|
||||
# define u64plus(x, y) ((x) + (y))
|
||||
# define u64shl(x, n) ((x) << (n))
|
||||
# define u64shr(x, n) ((x) >> (n))
|
||||
|
||||
#else
|
||||
|
||||
/* u64 is a 64-bit unsigned integer value.
|
||||
u64init (HI, LO), is like u64hilo (HI, LO), but for use in
|
||||
initializer contexts. */
|
||||
# ifdef WORDS_BIGENDIAN
|
||||
typedef struct { uint32_t hi, lo; } u64;
|
||||
# define u64init(hi, lo) { hi, lo }
|
||||
# else
|
||||
typedef struct { uint32_t lo, hi; } u64;
|
||||
# define u64init(hi, lo) { lo, hi }
|
||||
# endif
|
||||
|
||||
/* Given the high and low-order 32-bit quantities HI and LO, return a u64
|
||||
value representing (HI << 32) + LO. */
|
||||
static inline u64
|
||||
u64hilo (uint32_t hi, uint32_t lo)
|
||||
{
|
||||
u64 r;
|
||||
r.hi = hi;
|
||||
r.lo = lo;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Return a u64 value representing LO. */
|
||||
static inline u64
|
||||
u64lo (uint32_t lo)
|
||||
{
|
||||
u64 r;
|
||||
r.hi = 0;
|
||||
r.lo = lo;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Return X < Y. */
|
||||
static inline int
|
||||
u64lt (u64 x, u64 y)
|
||||
{
|
||||
return x.hi < y.hi || (x.hi == y.hi && x.lo < y.lo);
|
||||
}
|
||||
|
||||
/* Return X & Y. */
|
||||
static inline u64
|
||||
u64and (u64 x, u64 y)
|
||||
{
|
||||
u64 r;
|
||||
r.hi = x.hi & y.hi;
|
||||
r.lo = x.lo & y.lo;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Return X | Y. */
|
||||
static inline u64
|
||||
u64or (u64 x, u64 y)
|
||||
{
|
||||
u64 r;
|
||||
r.hi = x.hi | y.hi;
|
||||
r.lo = x.lo | y.lo;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Return X ^ Y. */
|
||||
static inline u64
|
||||
u64xor (u64 x, u64 y)
|
||||
{
|
||||
u64 r;
|
||||
r.hi = x.hi ^ y.hi;
|
||||
r.lo = x.lo ^ y.lo;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Return X + Y. */
|
||||
static inline u64
|
||||
u64plus (u64 x, u64 y)
|
||||
{
|
||||
u64 r;
|
||||
r.lo = x.lo + y.lo;
|
||||
r.hi = x.hi + y.hi + (r.lo < x.lo);
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Return X << N. */
|
||||
static inline u64
|
||||
u64shl (u64 x, int n)
|
||||
{
|
||||
u64 r;
|
||||
if (n < 32)
|
||||
{
|
||||
r.hi = (x.hi << n) | (x.lo >> (32 - n));
|
||||
r.lo = x.lo << n;
|
||||
}
|
||||
else
|
||||
{
|
||||
r.hi = x.lo << (n - 32);
|
||||
r.lo = 0;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Return X >> N. */
|
||||
static inline u64
|
||||
u64shr (u64 x, int n)
|
||||
{
|
||||
u64 r;
|
||||
if (n < 32)
|
||||
{
|
||||
r.hi = x.hi >> n;
|
||||
r.lo = (x.hi << (32 - n)) | (x.lo >> n);
|
||||
}
|
||||
else
|
||||
{
|
||||
r.hi = 0;
|
||||
r.lo = x.hi >> (n - 32);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -43,6 +43,7 @@ file-type.m4
|
||||
fileblocks.m4
|
||||
filemode.m4
|
||||
filenamecat.m4
|
||||
flexmember.m4
|
||||
fnmatch.m4
|
||||
fpending.m4
|
||||
fprintftime.m4
|
||||
@@ -81,11 +82,15 @@ hard-locale.m4
|
||||
hash.m4
|
||||
host-os.m4
|
||||
human.m4
|
||||
i-ring.m4
|
||||
iconv.m4
|
||||
idcache.m4
|
||||
include_next.m4
|
||||
inet_ntop.m4
|
||||
inline.m4
|
||||
intdiv0.m4
|
||||
intl.m4
|
||||
intldir.m4
|
||||
intmax.m4
|
||||
intmax_t.m4
|
||||
inttostr.m4
|
||||
@@ -156,6 +161,7 @@ rename-dest-slash.m4
|
||||
rename.m4
|
||||
rmdir-errno.m4
|
||||
rmdir.m4
|
||||
root-dev-ino.m4
|
||||
rpmatch.m4
|
||||
safe-read.m4
|
||||
safe-write.m4
|
||||
@@ -200,6 +206,7 @@ strtoumax.m4
|
||||
strverscmp.m4
|
||||
sys_socket_h.m4
|
||||
sys_stat_h.m4
|
||||
tempname.m4
|
||||
time_r.m4
|
||||
timespec.m4
|
||||
tm_gmtoff.m4
|
||||
|
||||
232
m4/.gitignore
vendored
Normal file
232
m4/.gitignore
vendored
Normal file
@@ -0,0 +1,232 @@
|
||||
absolute-header.m4
|
||||
acl.m4
|
||||
alloca.m4
|
||||
allocsa.m4
|
||||
argmatch.m4
|
||||
arpa_inet_h.m4
|
||||
assert.m4
|
||||
atexit.m4
|
||||
backupfile.m4
|
||||
base64.m4
|
||||
bison.m4
|
||||
c-strtod.m4
|
||||
calloc.m4
|
||||
canon-host.m4
|
||||
canonicalize.m4
|
||||
chdir-long.m4
|
||||
chown.m4
|
||||
clock_time.m4
|
||||
cloexec.m4
|
||||
close-stream.m4
|
||||
closeout.m4
|
||||
codeset.m4
|
||||
config-h.m4
|
||||
cycle-check.m4
|
||||
d-ino.m4
|
||||
d-type.m4
|
||||
dirfd.m4
|
||||
dirname.m4
|
||||
dos.m4
|
||||
double-slash-root.m4
|
||||
dup2.m4
|
||||
eealloc.m4
|
||||
eoverflow.m4
|
||||
error.m4
|
||||
euidaccess.m4
|
||||
exclude.m4
|
||||
exitfail.m4
|
||||
extensions.m4
|
||||
fcntl-safer.m4
|
||||
fcntl_h.m4
|
||||
file-type.m4
|
||||
fileblocks.m4
|
||||
filemode.m4
|
||||
filenamecat.m4
|
||||
flexmember.m4
|
||||
fnmatch.m4
|
||||
fpending.m4
|
||||
fprintftime.m4
|
||||
free.m4
|
||||
fstypename.m4
|
||||
fsusage.m4
|
||||
ftruncate.m4
|
||||
fts.m4
|
||||
getaddrinfo.m4
|
||||
getcwd-abort-bug.m4
|
||||
getcwd-path-max.m4
|
||||
getcwd.m4
|
||||
getdate.m4
|
||||
getdelim.m4
|
||||
getgroups.m4
|
||||
gethostname.m4
|
||||
gethrxtime.m4
|
||||
getline.m4
|
||||
getloadavg.m4
|
||||
getndelim2.m4
|
||||
getopt.m4
|
||||
getpagesize.m4
|
||||
getpass.m4
|
||||
gettext.m4
|
||||
gettime.m4
|
||||
gettimeofday.m4
|
||||
getugroups.m4
|
||||
getusershell.m4
|
||||
glibc21.m4
|
||||
gnulib-cache.m4
|
||||
gnulib-comp.m4
|
||||
gnulib-tool.m4
|
||||
group-member.m4
|
||||
hard-locale.m4
|
||||
hash.m4
|
||||
host-os.m4
|
||||
human.m4
|
||||
i-ring.m4
|
||||
iconv.m4
|
||||
idcache.m4
|
||||
inet_ntop.m4
|
||||
inline.m4
|
||||
intl.m4
|
||||
intldir.m4
|
||||
intmax.m4
|
||||
intmax_t.m4
|
||||
inttostr.m4
|
||||
inttypes-h.m4
|
||||
inttypes-pri.m4
|
||||
inttypes.m4
|
||||
inttypes_h.m4
|
||||
isapipe.m4
|
||||
jm-winsz1.m4
|
||||
jm-winsz2.m4
|
||||
lchmod.m4
|
||||
lchown.m4
|
||||
lib-ignore.m4
|
||||
lib-ld.m4
|
||||
lib-link.m4
|
||||
lib-prefix.m4
|
||||
link-follow.m4
|
||||
localcharset.m4
|
||||
long-options.m4
|
||||
longdouble.m4
|
||||
longlong.m4
|
||||
ls-mntd-fs.m4
|
||||
lstat.m4
|
||||
mbchar.m4
|
||||
mbiter.m4
|
||||
mbrtowc.m4
|
||||
mbstate_t.m4
|
||||
mbswidth.m4
|
||||
md5.m4
|
||||
memcasecmp.m4
|
||||
memchr.m4
|
||||
memcmp.m4
|
||||
memcoll.m4
|
||||
memcpy.m4
|
||||
memmove.m4
|
||||
mempcpy.m4
|
||||
memrchr.m4
|
||||
memset.m4
|
||||
mkancesdirs.m4
|
||||
mkdir-p.m4
|
||||
mkdir-slash.m4
|
||||
mkstemp.m4
|
||||
mktime.m4
|
||||
modechange.m4
|
||||
mountlist.m4
|
||||
nanosleep.m4
|
||||
netinet_in_h.m4
|
||||
nls.m4
|
||||
openat.m4
|
||||
pathmax.m4
|
||||
perl.m4
|
||||
physmem.m4
|
||||
po.m4
|
||||
posixtm.m4
|
||||
posixver.m4
|
||||
progtest.m4
|
||||
putenv.m4
|
||||
quote.m4
|
||||
quotearg.m4
|
||||
readlink.m4
|
||||
readtokens.m4
|
||||
readutmp.m4
|
||||
regex.m4
|
||||
rename-dest-slash.m4
|
||||
rename.m4
|
||||
rmdir-errno.m4
|
||||
rmdir.m4
|
||||
root-dev-ino.m4
|
||||
rpmatch.m4
|
||||
safe-read.m4
|
||||
safe-write.m4
|
||||
same.m4
|
||||
save-cwd.m4
|
||||
savedir.m4
|
||||
savewd.m4
|
||||
setenv.m4
|
||||
settime.m4
|
||||
sha1.m4
|
||||
sig2str.m4
|
||||
signed.m4
|
||||
snprintf.m4
|
||||
socklen.m4
|
||||
sockpfaf.m4
|
||||
ssize_t.m4
|
||||
st_dm_mode.m4
|
||||
stat-macros.m4
|
||||
stat-time.m4
|
||||
stdarg.m4
|
||||
stdbool.m4
|
||||
stdint.m4
|
||||
stdint_h.m4
|
||||
stdio-safer.m4
|
||||
stdlib-safer.m4
|
||||
stpcpy.m4
|
||||
strcase.m4
|
||||
strcspn.m4
|
||||
strdup.m4
|
||||
strftime.m4
|
||||
strndup.m4
|
||||
strnlen.m4
|
||||
strpbrk.m4
|
||||
strtod.m4
|
||||
strtoimax.m4
|
||||
strtol.m4
|
||||
strtoll.m4
|
||||
strtoul.m4
|
||||
strtoull.m4
|
||||
strtoumax.m4
|
||||
strverscmp.m4
|
||||
sys_socket_h.m4
|
||||
sys_stat_h.m4
|
||||
tempname.m4
|
||||
time_r.m4
|
||||
timespec.m4
|
||||
tm_gmtoff.m4
|
||||
tzset.m4
|
||||
unicodeio.m4
|
||||
unistd-safer.m4
|
||||
unistd_h.m4
|
||||
unlink-busy.m4
|
||||
unlinkdir.m4
|
||||
unlocked-io.m4
|
||||
uptime.m4
|
||||
userspec.m4
|
||||
utimbuf.m4
|
||||
utime.m4
|
||||
utimecmp.m4
|
||||
utimens.m4
|
||||
utimes-null.m4
|
||||
utimes.m4
|
||||
vasnprintf.m4
|
||||
vasprintf.m4
|
||||
wchar_t.m4
|
||||
wcwidth.m4
|
||||
wint_t.m4
|
||||
xalloc.m4
|
||||
xgetcwd.m4
|
||||
xnanosleep.m4
|
||||
xreadlink.m4
|
||||
xstrndup.m4
|
||||
xstrtod.m4
|
||||
xstrtol.m4
|
||||
yesno.m4
|
||||
29
m4/ChangeLog
29
m4/ChangeLog
@@ -1,3 +1,32 @@
|
||||
2006-10-14 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* sha512.m4 (gl_SHA512): Add u64.h to AC_LIBSOURCES.
|
||||
|
||||
2006-10-12 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* jm-macros.m4 (coreutils_MACROS): Rename from gl_MACROS, now that
|
||||
most of the gnulib macros have migrated into gnulib.
|
||||
Don't call gl_INIT here (now it's called from configure.ac, directly).
|
||||
|
||||
2006-10-07 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* jm-macros.m4 (gl_MACROS): Remove use of AC_CONFIG_LIBOBJ_DIR(lib).
|
||||
It is no longer needed, and was causing dependencies to appear
|
||||
in lib/lib/.deps, which provoked a "make distcheck" failure.
|
||||
|
||||
2006-09-29 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* readdir.m4: Remove file once again.
|
||||
* jm-macros.m4: Remove reference to gl_FUNC_READDIR.
|
||||
|
||||
2006-09-28 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* jm-macros.m4: Require the new macro.
|
||||
* readdir.m4 (gl_FUNC_READDIR): Rename from GL_FUNC_READDIR.
|
||||
Increment serial number.
|
||||
* readdir.m4: Revivify this file.
|
||||
We need it to work around a bug on Darwin 0.7.x.
|
||||
|
||||
2006-09-01 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* .cvsignore: Add fcntl_h.m4, getloadavg.m4, inttypes-h.m4,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#serial 103 -*- autoconf -*-
|
||||
#serial 104 -*- autoconf -*-
|
||||
|
||||
dnl Misc type-related macros for coreutils.
|
||||
|
||||
@@ -21,10 +21,8 @@ dnl Misc type-related macros for coreutils.
|
||||
|
||||
# Written by Jim Meyering.
|
||||
|
||||
AC_DEFUN([gl_MACROS],
|
||||
AC_DEFUN([coreutils_MACROS],
|
||||
[
|
||||
gl_INIT
|
||||
|
||||
GNU_PACKAGE="GNU $PACKAGE"
|
||||
AC_DEFINE_UNQUOTED(GNU_PACKAGE, "$GNU_PACKAGE",
|
||||
[The concatenation of the strings `GNU ', and PACKAGE.])
|
||||
@@ -46,8 +44,6 @@ AC_DEFUN([gl_MACROS],
|
||||
|
||||
AC_REQUIRE([AC_FUNC_FSEEKO])
|
||||
|
||||
AC_CONFIG_LIBOBJ_DIR([lib])
|
||||
|
||||
# By default, argmatch should fail calling usage (1).
|
||||
AC_DEFINE(ARGMATCH_DIE, [usage (1)],
|
||||
[Define to the function xargmatch calls on failures.])
|
||||
@@ -66,6 +62,7 @@ AC_DEFUN([gl_MACROS],
|
||||
endgrent \
|
||||
endpwent \
|
||||
fchown \
|
||||
fchmod \
|
||||
ftruncate \
|
||||
iswspace \
|
||||
mkfifo \
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# sha512.m4 serial 1
|
||||
dnl Copyright (C) 2005 Free Software Foundation, Inc.
|
||||
# sha512.m4 serial 2
|
||||
dnl Copyright (C) 2005, 2006 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
AC_DEFUN([gl_SHA512],
|
||||
[
|
||||
AC_LIBSOURCES([sha512.c, sha512.h])
|
||||
AC_LIBSOURCES([sha512.c, sha512.h, u64.h])
|
||||
AC_LIBOBJ([sha512])
|
||||
|
||||
dnl Prerequisites of lib/sha512.c.
|
||||
|
||||
@@ -19,23 +19,26 @@
|
||||
# 02110-1301, USA.
|
||||
|
||||
dist_man_MANS = \
|
||||
base64.1 basename.1 cat.1 chgrp.1 chmod.1 chown.1 chroot.1 cksum.1 comm.1 \
|
||||
base64.1 basename.1 cat.1 chgrp.1 chmod.1 chown.1 cksum.1 comm.1 \
|
||||
cp.1 csplit.1 cut.1 date.1 dd.1 df.1 dir.1 dircolors.1 dirname.1 du.1 \
|
||||
echo.1 env.1 expand.1 expr.1 factor.1 false.1 fmt.1 fold.1 groups.1 \
|
||||
head.1 hostid.1 hostname.1 id.1 install.1 join.1 kill.1 \
|
||||
head.1 hostname.1 id.1 install.1 join.1 kill.1 \
|
||||
link.1 ln.1 logname.1 \
|
||||
ls.1 md5sum.1 mkdir.1 mkfifo.1 mknod.1 mv.1 nice.1 nl.1 nohup.1 od.1 \
|
||||
paste.1 pathchk.1 pinky.1 pr.1 printenv.1 printf.1 ptx.1 pwd.1 readlink.1 \
|
||||
ls.1 md5sum.1 mkdir.1 mkfifo.1 mknod.1 mv.1 nl.1 nohup.1 od.1 \
|
||||
paste.1 pathchk.1 pr.1 printenv.1 printf.1 ptx.1 pwd.1 readlink.1 \
|
||||
rm.1 rmdir.1 seq.1 sha1sum.1 sha224sum.1 sha256sum.1 sha384sum.1 sha512sum.1 \
|
||||
shred.1 shuf.1 sleep.1 sort.1 split.1 stat.1 stty.1 \
|
||||
shred.1 shuf.1 sleep.1 sort.1 split.1 stat.1 \
|
||||
su.1 sum.1 sync.1 tac.1 tail.1 tee.1 test.1 touch.1 tr.1 true.1 tsort.1 \
|
||||
tty.1 uname.1 unexpand.1 uniq.1 unlink.1 uptime.1 users.1 vdir.1 wc.1 \
|
||||
who.1 whoami.1 yes.1
|
||||
tty.1 unexpand.1 uniq.1 unlink.1 vdir.1 wc.1 \
|
||||
whoami.1 yes.1 $(MAN)
|
||||
optional_mans = \
|
||||
chroot.1 hostid.1 nice.1 pinky.1 stty.1 uname.1 uptime.1 users.1 who.1
|
||||
|
||||
man_aux = $(dist_man_MANS:.1=.x)
|
||||
|
||||
EXTRA_DIST = $(man_aux) help2man
|
||||
MAINTAINERCLEANFILES = $(man_MANS)
|
||||
man_aux = $(dist_man_MANS:.1=.x) $(optional_mans:.1=.x)
|
||||
|
||||
EXTRA_DIST = $(man_aux) help2man $(optional_mans)
|
||||
MAINTAINERCLEANFILES = $(dist_man_MANS)
|
||||
|
||||
# Depend on configure.ac to get version number changes.
|
||||
common_dep = $(top_srcdir)/configure.ac
|
||||
|
||||
17
po/.gitignore
vendored
Normal file
17
po/.gitignore
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
*.po
|
||||
LINGUAS
|
||||
Makefile.in
|
||||
Makefile.in.in
|
||||
Makevars
|
||||
Makevars.template
|
||||
POTFILES
|
||||
Rules-quot
|
||||
boldquot.sed
|
||||
coreutils.pot
|
||||
en@boldquot.header
|
||||
en@quot.header
|
||||
insert-header.sin
|
||||
quot.sed
|
||||
remove-potcdate.sed
|
||||
remove-potcdate.sin
|
||||
stamp-po
|
||||
@@ -1,3 +1,11 @@
|
||||
2006-10-19 Jim Meyering <jim@meyering.net>
|
||||
|
||||
* POTFILES.in: Also include lib/regcomp.c, since it too uses gettext.
|
||||
|
||||
2006-10-19 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* POTFILES.in: Add lib/xstrtol.h.
|
||||
|
||||
2006-08-22 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* .cvsignore: More ../bootstrap-related fixes, plus remove old
|
||||
|
||||
@@ -16,15 +16,17 @@ lib/obstack.c
|
||||
lib/openat-die.c
|
||||
lib/quotearg.c
|
||||
lib/randread.c
|
||||
lib/regcomp.c
|
||||
lib/root-dev-ino.h
|
||||
lib/rpmatch.c
|
||||
lib/unicodeio.c
|
||||
lib/userspec.c
|
||||
lib/version-etc.c
|
||||
lib/xalloc-die.c
|
||||
lib/xmemxfrm.c
|
||||
lib/xfts.c
|
||||
lib/xmemcoll.c
|
||||
lib/xmemxfrm.c
|
||||
lib/xstrtol.h
|
||||
|
||||
# Package source files
|
||||
|
||||
|
||||
102
src/.gitignore
vendored
Normal file
102
src/.gitignore
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
\[
|
||||
base64
|
||||
basename
|
||||
cat
|
||||
chgrp
|
||||
chmod
|
||||
chown
|
||||
chroot
|
||||
cksum
|
||||
comm
|
||||
cp
|
||||
csplit
|
||||
cut
|
||||
date
|
||||
dd
|
||||
df
|
||||
dir
|
||||
dircolors
|
||||
dircolors.h
|
||||
dirname
|
||||
du
|
||||
echo
|
||||
env
|
||||
expand
|
||||
expr
|
||||
factor
|
||||
false
|
||||
fmt
|
||||
fold
|
||||
fs.h
|
||||
ginstall
|
||||
groups
|
||||
head
|
||||
hostid
|
||||
hostname
|
||||
id
|
||||
join
|
||||
kill
|
||||
link
|
||||
ln
|
||||
localedir.h
|
||||
logname
|
||||
ls
|
||||
md5sum
|
||||
mkdir
|
||||
mkfifo
|
||||
mknod
|
||||
mv
|
||||
nice
|
||||
nl
|
||||
nohup
|
||||
od
|
||||
paste
|
||||
pathchk
|
||||
pinky
|
||||
pr
|
||||
printenv
|
||||
printf
|
||||
ptx
|
||||
pwd
|
||||
readlink
|
||||
rm
|
||||
rmdir
|
||||
seq
|
||||
setuidgid
|
||||
sha1sum
|
||||
sha224sum
|
||||
sha256sum
|
||||
sha384sum
|
||||
sha512sum
|
||||
shred
|
||||
sleep
|
||||
sort
|
||||
split
|
||||
stat
|
||||
stty
|
||||
su
|
||||
sum
|
||||
sync
|
||||
tac
|
||||
tail
|
||||
tee
|
||||
test
|
||||
touch
|
||||
tr
|
||||
true
|
||||
tsort
|
||||
tty
|
||||
uname
|
||||
unexpand
|
||||
uniq
|
||||
unlink
|
||||
uptime
|
||||
users
|
||||
vdir
|
||||
wc
|
||||
wheel-size.h
|
||||
wheel.h
|
||||
who
|
||||
whoami
|
||||
yes
|
||||
shuf
|
||||
@@ -2,131 +2,100 @@ Index: src/remove.c
|
||||
===================================================================
|
||||
RCS file: /fetish/cu/src/remove.c,v
|
||||
retrieving revision 1.158
|
||||
diff -u -p -u -r1.158 remove.c
|
||||
--- src/remove.c 3 Sep 2006 02:54:51 -0000 1.158
|
||||
+++ src/remove.c 6 Sep 2006 18:57:46 -0000
|
||||
@@ -238,9 +238,10 @@ pop_dir (Dirstack_state *ds)
|
||||
diff --git a/src/remove.c b/src/remove.c
|
||||
index 4728bdd..7477da5 100644
|
||||
--- a/src/remove.c
|
||||
+++ b/src/remove.c
|
||||
@@ -236,9 +236,10 @@ pop_dir (Dirstack_state *ds)
|
||||
{
|
||||
size_t n_lengths = obstack_object_size (&ds->len_stack) / sizeof (size_t);
|
||||
size_t *length = obstack_base (&ds->len_stack);
|
||||
+ size_t top_len;
|
||||
|
||||
|
||||
assert (n_lengths > 0);
|
||||
- size_t top_len = length[n_lengths - 1];
|
||||
+ top_len = length[n_lengths - 1];
|
||||
assert (top_len >= 2);
|
||||
|
||||
|
||||
/* Pop the specified length of file name. */
|
||||
@@ -372,10 +373,11 @@ AD_stack_top (Dirstack_state const *ds)
|
||||
@@ -370,10 +371,11 @@ AD_stack_top (Dirstack_state const *ds)
|
||||
static void
|
||||
AD_stack_pop (Dirstack_state *ds)
|
||||
{
|
||||
+ struct AD_ent *top;
|
||||
assert (0 < AD_stack_height (ds));
|
||||
|
||||
|
||||
/* operate on Active_dir. pop and free top entry */
|
||||
- struct AD_ent *top = AD_stack_top (ds);
|
||||
+ top = AD_stack_top (ds);
|
||||
if (top->unremovable)
|
||||
hash_free (top->unremovable);
|
||||
obstack_blank (&ds->Active_dir, -(int) sizeof (struct AD_ent));
|
||||
@@ -542,6 +544,7 @@ AD_mark_helper (Hash_table **ht, char *f
|
||||
if (*ht == NULL)
|
||||
xalloc_die ();
|
||||
}
|
||||
+ {
|
||||
void *ent = hash_insert (*ht, filename);
|
||||
if (ent == NULL)
|
||||
xalloc_die ();
|
||||
@@ -550,7 +553,7 @@ AD_mark_helper (Hash_table **ht, char *f
|
||||
if (ent != filename)
|
||||
free (filename);
|
||||
}
|
||||
-
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Mark FILENAME (in current directory) as unremovable. */
|
||||
@@ -1090,6 +1093,7 @@ fd_to_subdirp (int fd_cwd, char const *f
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+ {
|
||||
DIR *subdir_dirp = fdopendir (fd_sub);
|
||||
if (subdir_dirp == NULL)
|
||||
{
|
||||
@@ -1098,6 +1102,7 @@ fd_to_subdirp (int fd_cwd, char const *f
|
||||
}
|
||||
|
||||
return subdir_dirp;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Remove entries in the directory open on DIRP
|
||||
@@ -1334,9 +1339,10 @@ remove_dir (int fd_cwd, Dirstack_state *
|
||||
/* The name of the directory that we have just processed,
|
||||
nominally removing all of its contents. */
|
||||
char *empty_dir;
|
||||
+ int fd;
|
||||
|
||||
AD_pop_and_chdir (&dirp, ds, &empty_dir);
|
||||
- int fd = (dirp != NULL ? dirfd (dirp) : AT_FDCWD);
|
||||
+ fd = (dirp != NULL ? dirfd (dirp) : AT_FDCWD);
|
||||
assert (dirp != NULL || AD_stack_height (ds) == 1);
|
||||
|
||||
/* Try to remove EMPTY_DIR only if remove_cwd_entries succeeded. */
|
||||
@@ -1414,6 +1420,7 @@ rm_1 (Dirstack_state *ds, char const *fi
|
||||
@@ -1463,6 +1465,7 @@ rm_1 (Dirstack_state *ds, char const *fi
|
||||
return RM_ERROR;
|
||||
}
|
||||
|
||||
+ {
|
||||
struct stat st;
|
||||
cache_stat_init (&st);
|
||||
if (x->root_dev_ino)
|
||||
@@ -1435,6 +1442,7 @@ rm_1 (Dirstack_state *ds, char const *fi
|
||||
cycle_check_init (&ds->cycle_check_state);
|
||||
@@ -1485,6 +1488,7 @@ rm_1 (Dirstack_state *ds, char const *fi
|
||||
AD_push_initial (ds);
|
||||
AD_INIT_OTHER_MEMBERS ();
|
||||
|
||||
|
||||
+ {
|
||||
int fd_cwd = AT_FDCWD;
|
||||
enum RM_status status = remove_entry (fd_cwd, ds, filename, &st, x, NULL);
|
||||
enum RM_status status = remove_entry (AT_FDCWD, ds, filename, &st, x, NULL);
|
||||
if (status == RM_NONEMPTY_DIR)
|
||||
@@ -1453,6 +1461,8 @@ rm_1 (Dirstack_state *ds, char const *fi
|
||||
{
|
||||
@@ -1501,6 +1505,8 @@ rm_1 (Dirstack_state *ds, char const *fi
|
||||
|
||||
ds_clear (ds);
|
||||
|
||||
return status;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
/* Remove all files and/or directories specified by N_FILES and FILE.
|
||||
@@ -1475,9 +1485,11 @@ rm (size_t n_files, char const *const *f
|
||||
}
|
||||
|
||||
cycle_check_init (&ds->cycle_check_state);
|
||||
+ {
|
||||
enum RM_status s = rm_1 (ds, file[i], x, &cwd_errno);
|
||||
assert (VALID_STATUS (s));
|
||||
UPDATE_STATUS (status, s);
|
||||
+ }
|
||||
}
|
||||
|
||||
if (x->require_restore_cwd && cwd_errno)
|
||||
Index: src/rm.c
|
||||
===================================================================
|
||||
RCS file: /fetish/cu/src/rm.c,v
|
||||
retrieving revision 1.140
|
||||
diff -u -p -u -r1.140 rm.c
|
||||
--- src/rm.c 3 Sep 2006 02:53:58 -0000 1.140
|
||||
+++ src/rm.c 6 Sep 2006 18:57:46 -0000
|
||||
@@ -357,8 +357,10 @@ main (int argc, char **argv)
|
||||
if (!yesno ())
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
+ {
|
||||
enum RM_status status = rm (n_files, file, &x);
|
||||
assert (VALID_STATUS (status));
|
||||
exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
+ }
|
||||
}
|
||||
diff --git a/src/rm.c b/src/rm.c
|
||||
index 364a21c..7a24014 100644
|
||||
--- a/src/rm.c
|
||||
+++ b/src/rm.c
|
||||
@@ -355,6 +355,7 @@ main (int argc, char **argv)
|
||||
quote ("/"));
|
||||
}
|
||||
|
||||
+ {
|
||||
size_t n_files = argc - optind;
|
||||
char const *const *file = (char const *const *) argv + optind;
|
||||
|
||||
@@ -368,7 +369,10 @@ main (int argc, char **argv)
|
||||
if (!yesno ())
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
+ {
|
||||
enum RM_status status = rm (n_files, file, &x);
|
||||
assert (VALID_STATUS (status));
|
||||
exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
Index: shred.c
|
||||
===================================================================
|
||||
RCS file: /fetish/cu/src/shred.c,v
|
||||
retrieving revision 1.130
|
||||
diff -u -p -r1.130 shred.c
|
||||
--- shred.c 3 Sep 2006 02:53:16 -0000 1.130
|
||||
+++ shred.c 3 Oct 2006 13:48:24 -0000
|
||||
@@ -464,7 +464,7 @@ dopass (int fd, char const *qname, off_t
|
||||
out. Thus, it shouldn't give up on bad blocks. This
|
||||
code works because lim is always a multiple of
|
||||
SECTOR_SIZE, except at the end. */
|
||||
- verify (sizeof r % SECTOR_SIZE == 0);
|
||||
+ { verify (sizeof r % SECTOR_SIZE == 0); }
|
||||
if (errnum == EIO && 0 <= size && (soff | SECTOR_MASK) < lim)
|
||||
{
|
||||
size_t soff1 = (soff | SECTOR_MASK) + 1;
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
char *program_name;
|
||||
|
||||
/* Name of input file. May be "-". */
|
||||
static char *infile;
|
||||
static char const *infile;
|
||||
|
||||
/* Descriptor on which input file is open. */
|
||||
static int input_desc;
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include "error.h"
|
||||
#include "fts_.h"
|
||||
#include "group-member.h"
|
||||
#include "lchown.h"
|
||||
#include "quote.h"
|
||||
#include "root-dev-ino.h"
|
||||
#include "xstrtol.h"
|
||||
@@ -120,8 +119,8 @@ Change the group of each FILE to GROUP.\n\
|
||||
With --reference, change the group of each FILE to that of RFILE.\n\
|
||||
\n\
|
||||
-c, --changes like verbose but report only when a change is made\n\
|
||||
--dereference affect the referent of each symbolic link, rather\n\
|
||||
than the symbolic link itself (this is the default)\n\
|
||||
--dereference affect the referent of each symbolic link (this is\n\
|
||||
the default), rather than the symbolic link itself\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
-h, --no-dereference affect each symbolic link instead of any referenced\n\
|
||||
|
||||
13
src/chmod.c
13
src/chmod.c
@@ -193,6 +193,19 @@ process_file (FTS *fts, FTSENT *ent)
|
||||
return true;
|
||||
|
||||
case FTS_NS:
|
||||
/* For a top-level file or directory, this FTS_NS (stat failed)
|
||||
indicator is determined at the time of the initial fts_open call.
|
||||
With programs like chmod, chown, and chgrp, that modify
|
||||
permissions, it is possible that the file in question is
|
||||
accessible when control reaches this point. So, if this is
|
||||
the first time we've seen the FTS_NS for this file, tell
|
||||
fts_read to stat it "again". */
|
||||
if (ent->fts_level == 0 && ent->fts_number == 0)
|
||||
{
|
||||
ent->fts_number = 1;
|
||||
fts_set (fts, ent, FTS_AGAIN);
|
||||
return true;
|
||||
}
|
||||
error (0, ent->fts_errno, _("cannot access %s"), quote (file_full_name));
|
||||
ok = false;
|
||||
break;
|
||||
|
||||
@@ -267,6 +267,19 @@ change_file_owner (FTS *fts, FTSENT *ent,
|
||||
break;
|
||||
|
||||
case FTS_NS:
|
||||
/* For a top-level file or directory, this FTS_NS (stat failed)
|
||||
indicator is determined at the time of the initial fts_open call.
|
||||
With programs like chmod, chown, and chgrp, that modify
|
||||
permissions, it is possible that the file in question is
|
||||
accessible when control reaches this point. So, if this is
|
||||
the first time we've seen the FTS_NS for this file, tell
|
||||
fts_read to stat it "again". */
|
||||
if (ent->fts_level == 0 && ent->fts_number == 0)
|
||||
{
|
||||
ent->fts_number = 1;
|
||||
fts_set (fts, ent, FTS_AGAIN);
|
||||
return true;
|
||||
}
|
||||
error (0, ent->fts_errno, _("cannot access %s"), quote (file_full_name));
|
||||
ok = false;
|
||||
break;
|
||||
@@ -292,7 +305,9 @@ change_file_owner (FTS *fts, FTSENT *ent,
|
||||
file_stats = NULL;
|
||||
}
|
||||
else if (required_uid == (uid_t) -1 && required_gid == (gid_t) -1
|
||||
&& chopt->verbosity == V_off && ! chopt->root_dev_ino)
|
||||
&& chopt->verbosity == V_off
|
||||
&& ! chopt->root_dev_ino
|
||||
&& ! chopt->affect_symlink_referent)
|
||||
{
|
||||
do_chown = true;
|
||||
file_stats = ent->fts_statp;
|
||||
@@ -303,9 +318,9 @@ change_file_owner (FTS *fts, FTSENT *ent,
|
||||
|
||||
/* If this is a symlink and we're dereferencing them,
|
||||
stat it to get info on the referent. */
|
||||
if (S_ISLNK (file_stats->st_mode) && chopt->affect_symlink_referent)
|
||||
if (chopt->affect_symlink_referent && S_ISLNK (file_stats->st_mode))
|
||||
{
|
||||
if (stat (file, &stat_buf) != 0)
|
||||
if (fstatat (fts->fts_cwd_fd, file, &stat_buf, 0) != 0)
|
||||
{
|
||||
error (0, errno, _("cannot dereference %s"),
|
||||
quote (file_full_name));
|
||||
@@ -322,7 +337,12 @@ change_file_owner (FTS *fts, FTSENT *ent,
|
||||
|| required_gid == file_stats->st_gid));
|
||||
}
|
||||
|
||||
if (do_chown && ROOT_DEV_INO_CHECK (chopt->root_dev_ino, file_stats))
|
||||
if (do_chown
|
||||
/* With FTS_NOSTAT, file_stats is valid only for directories.
|
||||
Don't need to check for FTS_D, since it is handled above,
|
||||
and same for FTS_DNR, since then do_chown is false. */
|
||||
&& (ent->fts_info == FTS_DP || ent->fts_info == FTS_DC)
|
||||
&& ROOT_DEV_INO_CHECK (chopt->root_dev_ino, file_stats))
|
||||
{
|
||||
ROOT_DEV_INO_WARN (file_full_name);
|
||||
ok = do_chown = false;
|
||||
@@ -441,7 +461,8 @@ chown_files (char **files, int bit_flags,
|
||||
|
||||
/* Use lstat and stat only if they're needed. */
|
||||
int stat_flags = ((required_uid != (uid_t) -1 || required_gid != (gid_t) -1
|
||||
|| chopt->verbosity != V_off || chopt->root_dev_ino)
|
||||
|| chopt->affect_symlink_referent
|
||||
|| chopt->verbosity != V_off)
|
||||
? 0
|
||||
: FTS_NOSTAT);
|
||||
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
#include "chown-core.h"
|
||||
#include "error.h"
|
||||
#include "fts_.h"
|
||||
#include "lchown.h"
|
||||
#include "quote.h"
|
||||
#include "root-dev-ino.h"
|
||||
#include "userspec.h"
|
||||
@@ -101,8 +100,8 @@ Change the owner and/or group of each FILE to OWNER and/or GROUP.\n\
|
||||
With --reference, change the owner and group of each FILE to those of RFILE.\n\
|
||||
\n\
|
||||
-c, --changes like verbose but report only when a change is made\n\
|
||||
--dereference affect the referent of each symbolic link, rather\n\
|
||||
than the symbolic link itself (this is the default)\n\
|
||||
--dereference affect the referent of each symbolic link (this is\n\
|
||||
the default), rather than the symbolic link itself\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
-h, --no-dereference affect each symbolic link instead of any referenced\n\
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* cksum -- calculate and print POSIX checksums and sizes of files
|
||||
Copyright (C) 92, 1995-2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 92, 1995-2006 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -42,12 +42,9 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdint.h>
|
||||
#include "system.h"
|
||||
|
||||
#if !defined UINT_FAST32_MAX && !defined uint_fast32_t
|
||||
# define uint_fast32_t unsigned int
|
||||
#endif
|
||||
|
||||
#ifdef CRCTAB
|
||||
|
||||
# define BIT(x) ((uint_fast32_t) 1 << (x))
|
||||
|
||||
316
src/copy.c
316
src/copy.c
@@ -175,22 +175,22 @@ copy_dir (char const *src_name_in, char const *dst_name_in, bool new_dst,
|
||||
st_gid fields of SRC_SB. If DEST_DESC is undefined (-1), set
|
||||
the owner and owning group of DST_NAME instead. DEST_DESC must
|
||||
refer to the same file as DEST_NAME if defined.
|
||||
Return true if the syscall succeeds, or if it's ok not to
|
||||
preserve ownership. */
|
||||
Return 1 if the syscall succeeds, 0 if it fails but it's OK
|
||||
not to preserve ownership, -1 otherwise. */
|
||||
|
||||
static bool
|
||||
static int
|
||||
set_owner (const struct cp_options *x, char const *dst_name, int dest_desc,
|
||||
uid_t uid, gid_t gid)
|
||||
{
|
||||
if (HAVE_FCHOWN && dest_desc != -1)
|
||||
{
|
||||
if (fchown (dest_desc, uid, gid) == 0)
|
||||
return true;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (chown (dst_name, uid, gid) == 0)
|
||||
return true;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (! chown_failure_ok (x))
|
||||
@@ -198,10 +198,10 @@ set_owner (const struct cp_options *x, char const *dst_name, int dest_desc,
|
||||
error (0, errno, _("failed to preserve ownership for %s"),
|
||||
quote (dst_name));
|
||||
if (x->require_preserve)
|
||||
return false;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Set the st_author field of DEST_DESC to the st_author field of
|
||||
@@ -230,11 +230,26 @@ set_author (const char *dst_name, int dest_desc, const struct stat *src_sb)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Change the file mode bits of the file identified by DESC or NAME to MODE.
|
||||
Use DESC if DESC is valid and fchmod is available, NAME otherwise. */
|
||||
|
||||
static int
|
||||
fchmod_or_lchmod (int desc, char const *name, mode_t mode)
|
||||
{
|
||||
#if HAVE_FCHMOD
|
||||
if (0 <= desc)
|
||||
return fchmod (desc, mode);
|
||||
#endif
|
||||
return lchmod (name, mode);
|
||||
}
|
||||
|
||||
/* Copy a regular file from SRC_NAME to DST_NAME.
|
||||
If the source file contains holes, copies holes and blocks of zeros
|
||||
in the source file as holes in the destination file.
|
||||
(Holes are read as zeroes by the `read' system call.)
|
||||
Use DST_MODE as the 3rd argument in the call to open.
|
||||
When creating the destination, use DST_MODE & ~OMITTED_PERMISSIONS
|
||||
as the third argument in the call to open, adding
|
||||
OMITTED_PERMISSIONS after copying as needed.
|
||||
X provides many option settings.
|
||||
Return true if successful.
|
||||
*NEW_DST is as in copy_internal.
|
||||
@@ -242,13 +257,15 @@ set_author (const char *dst_name, int dest_desc, const struct stat *src_sb)
|
||||
|
||||
static bool
|
||||
copy_reg (char const *src_name, char const *dst_name,
|
||||
const struct cp_options *x, mode_t dst_mode, bool *new_dst,
|
||||
const struct cp_options *x,
|
||||
mode_t dst_mode, mode_t omitted_permissions, bool *new_dst,
|
||||
struct stat const *src_sb)
|
||||
{
|
||||
char *buf;
|
||||
char *buf_alloc = NULL;
|
||||
int dest_desc;
|
||||
int source_desc;
|
||||
mode_t src_mode = src_sb->st_mode;
|
||||
struct stat sb;
|
||||
struct stat src_open_sb;
|
||||
bool return_val = true;
|
||||
@@ -260,7 +277,7 @@ copy_reg (char const *src_name, char const *dst_name,
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fstat (source_desc, &src_open_sb))
|
||||
if (fstat (source_desc, &src_open_sb) != 0)
|
||||
{
|
||||
error (0, errno, _("cannot fstat %s"), quote (src_name));
|
||||
return_val = false;
|
||||
@@ -280,13 +297,9 @@ copy_reg (char const *src_name, char const *dst_name,
|
||||
|
||||
/* These semantics are required for cp.
|
||||
The if-block will be taken in move_mode. */
|
||||
if (*new_dst)
|
||||
if (! *new_dst)
|
||||
{
|
||||
dest_desc = open (dst_name, O_WRONLY | O_CREAT | O_BINARY, dst_mode);
|
||||
}
|
||||
else
|
||||
{
|
||||
dest_desc = open (dst_name, O_WRONLY | O_TRUNC | O_BINARY, dst_mode);
|
||||
dest_desc = open (dst_name, O_WRONLY | O_TRUNC | O_BINARY);
|
||||
|
||||
if (dest_desc < 0 && x->unlink_dest_after_failed_open)
|
||||
{
|
||||
@@ -296,15 +309,20 @@ copy_reg (char const *src_name, char const *dst_name,
|
||||
return_val = false;
|
||||
goto close_src_desc;
|
||||
}
|
||||
if (x->verbose)
|
||||
printf (_("removed %s\n"), quote (dst_name));
|
||||
|
||||
/* Tell caller that the destination file was unlinked. */
|
||||
*new_dst = true;
|
||||
|
||||
/* Try the open again, but this time with different flags. */
|
||||
dest_desc = open (dst_name, O_WRONLY | O_CREAT | O_BINARY, dst_mode);
|
||||
}
|
||||
}
|
||||
|
||||
if (*new_dst)
|
||||
dest_desc = open (dst_name, O_WRONLY | O_CREAT | O_EXCL | O_BINARY,
|
||||
dst_mode & ~omitted_permissions);
|
||||
else
|
||||
omitted_permissions = 0;
|
||||
|
||||
if (dest_desc < 0)
|
||||
{
|
||||
error (0, errno, _("cannot create regular file %s"), quote (dst_name));
|
||||
@@ -312,7 +330,7 @@ copy_reg (char const *src_name, char const *dst_name,
|
||||
goto close_src_desc;
|
||||
}
|
||||
|
||||
if (fstat (dest_desc, &sb))
|
||||
if (fstat (dest_desc, &sb) != 0)
|
||||
{
|
||||
error (0, errno, _("cannot fstat %s"), quote (dst_name));
|
||||
return_val = false;
|
||||
@@ -502,10 +520,16 @@ copy_reg (char const *src_name, char const *dst_name,
|
||||
|
||||
if (x->preserve_ownership && ! SAME_OWNER_AND_GROUP (*src_sb, sb))
|
||||
{
|
||||
if (! set_owner (x, dst_name, dest_desc, src_sb->st_uid, src_sb->st_gid))
|
||||
{
|
||||
switch (set_owner (x, dst_name, dest_desc,
|
||||
src_sb->st_uid, src_sb->st_gid))
|
||||
{
|
||||
case -1:
|
||||
return_val = false;
|
||||
goto close_src_and_dst_desc;
|
||||
|
||||
case 0:
|
||||
src_mode &= ~ (S_ISUID | S_ISGID | S_ISVTX);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -513,8 +537,8 @@ copy_reg (char const *src_name, char const *dst_name,
|
||||
|
||||
if (x->preserve_mode || x->move_mode)
|
||||
{
|
||||
if (copy_acl (src_name, source_desc, dst_name, dest_desc,
|
||||
src_sb->st_mode) != 0 && x->require_preserve)
|
||||
if (copy_acl (src_name, source_desc, dst_name, dest_desc, src_mode) != 0
|
||||
&& x->require_preserve)
|
||||
return_val = false;
|
||||
}
|
||||
else if (x->set_mode)
|
||||
@@ -522,6 +546,18 @@ copy_reg (char const *src_name, char const *dst_name,
|
||||
if (set_acl (dst_name, dest_desc, x->mode) != 0)
|
||||
return_val = false;
|
||||
}
|
||||
else if (omitted_permissions)
|
||||
{
|
||||
omitted_permissions &= ~ cached_umask ();
|
||||
if (omitted_permissions
|
||||
&& fchmod_or_lchmod (dest_desc, dst_name, dst_mode) != 0)
|
||||
{
|
||||
error (0, errno, _("preserving permissions for %s"),
|
||||
quote (dst_name));
|
||||
if (x->require_preserve)
|
||||
return_val = false;
|
||||
}
|
||||
}
|
||||
|
||||
close_src_and_dst_desc:
|
||||
if (close (dest_desc) < 0)
|
||||
@@ -968,8 +1004,8 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
struct stat src_sb;
|
||||
struct stat dst_sb;
|
||||
mode_t src_mode;
|
||||
mode_t src_type;
|
||||
mode_t dst_mode IF_LINT (= 0);
|
||||
mode_t omitted_permissions;
|
||||
bool restore_dst_mode = false;
|
||||
char *earlier_file = NULL;
|
||||
char *dst_backup = NULL;
|
||||
@@ -989,11 +1025,9 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
return false;
|
||||
}
|
||||
|
||||
src_type = src_sb.st_mode;
|
||||
|
||||
src_mode = src_sb.st_mode;
|
||||
|
||||
if (S_ISDIR (src_type) && !x->recursive)
|
||||
if (S_ISDIR (src_mode) && !x->recursive)
|
||||
{
|
||||
error (0, 0, _("omitting directory %s"), quote (src_name));
|
||||
return false;
|
||||
@@ -1036,34 +1070,57 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
that it is XSTAT'able. */
|
||||
bool return_now;
|
||||
bool unlink_src;
|
||||
bool ok = same_file_ok (src_name, &src_sb, dst_name, &dst_sb,
|
||||
x, &return_now, &unlink_src);
|
||||
if (unlink_src)
|
||||
{
|
||||
if (!abandon_move (x, dst_name, &dst_sb)
|
||||
&& unlink (src_name) != 0)
|
||||
{
|
||||
error (0, errno, _("cannot remove %s"), quote (src_name));
|
||||
return false;
|
||||
}
|
||||
/* Tell the caller that there's no need to remove src_name. */
|
||||
if (rename_succeeded)
|
||||
*rename_succeeded = true;
|
||||
}
|
||||
|
||||
if (return_now)
|
||||
return true;
|
||||
|
||||
if (! ok)
|
||||
if (! same_file_ok (src_name, &src_sb, dst_name, &dst_sb,
|
||||
x, &return_now, &unlink_src))
|
||||
{
|
||||
error (0, 0, _("%s and %s are the same file"),
|
||||
quote_n (0, src_name), quote_n (1, dst_name));
|
||||
return false;
|
||||
}
|
||||
|
||||
/* When there is an existing destination file, we may end up
|
||||
returning early, and hence not copying/moving the file.
|
||||
This may be due to an interactive `negative' reply to the
|
||||
prompt about the existing file. It may also be due to the
|
||||
use of the --reply=no option.
|
||||
|
||||
cp and mv treat -i and -f differently. */
|
||||
if (x->move_mode)
|
||||
{
|
||||
if (abandon_move (x, dst_name, &dst_sb)
|
||||
|| (unlink_src && unlink (src_name) == 0))
|
||||
{
|
||||
/* Pretend the rename succeeded, so the caller (mv)
|
||||
doesn't end up removing the source file. */
|
||||
if (rename_succeeded)
|
||||
*rename_succeeded = true;
|
||||
if (unlink_src && x->verbose)
|
||||
printf (_("removed %s\n"), quote (src_name));
|
||||
return true;
|
||||
}
|
||||
if (unlink_src)
|
||||
{
|
||||
error (0, errno, _("cannot remove %s"), quote (src_name));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (! S_ISDIR (src_mode)
|
||||
&& (x->interactive == I_ALWAYS_NO
|
||||
|| (x->interactive == I_ASK_USER
|
||||
&& (overwrite_prompt (dst_name, &dst_sb), 1)
|
||||
&& ! yesno ())))
|
||||
return true;
|
||||
}
|
||||
|
||||
if (return_now)
|
||||
return true;
|
||||
|
||||
if (!S_ISDIR (dst_sb.st_mode))
|
||||
{
|
||||
if (S_ISDIR (src_type))
|
||||
if (S_ISDIR (src_mode))
|
||||
{
|
||||
if (x->move_mode && x->backup_type != no_backups)
|
||||
{
|
||||
@@ -1097,7 +1154,7 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
}
|
||||
}
|
||||
|
||||
if (!S_ISDIR (src_type))
|
||||
if (!S_ISDIR (src_mode))
|
||||
{
|
||||
if (S_ISDIR (dst_sb.st_mode))
|
||||
{
|
||||
@@ -1140,37 +1197,6 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
}
|
||||
}
|
||||
|
||||
/* When there is an existing destination file, we may end up
|
||||
returning early, and hence not copying/moving the file.
|
||||
This may be due to an interactive `negative' reply to the
|
||||
prompt about the existing file. It may also be due to the
|
||||
use of the --reply=no option. */
|
||||
if (!S_ISDIR (src_type))
|
||||
{
|
||||
/* cp and mv treat -i and -f differently. */
|
||||
if (x->move_mode)
|
||||
{
|
||||
if (abandon_move (x, dst_name, &dst_sb))
|
||||
{
|
||||
/* Pretend the rename succeeded, so the caller (mv)
|
||||
doesn't end up removing the source file. */
|
||||
if (rename_succeeded)
|
||||
*rename_succeeded = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (x->interactive == I_ALWAYS_NO
|
||||
|| (x->interactive == I_ASK_USER
|
||||
&& (overwrite_prompt (dst_name, &dst_sb), 1)
|
||||
&& ! yesno ()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (x->move_mode)
|
||||
{
|
||||
/* Don't allow user to move a directory onto a non-directory. */
|
||||
@@ -1187,7 +1213,13 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
if (x->backup_type != no_backups
|
||||
/* Don't try to back up a destination if the last
|
||||
component of src_name is "." or "..". */
|
||||
&& ! dot_or_dotdot (last_component (src_name)))
|
||||
&& ! dot_or_dotdot (last_component (src_name))
|
||||
/* Create a backup of each destination directory in move mode,
|
||||
but not in copy mode. FIXME: it might make sense to add an
|
||||
option to suppress backup creation also for move mode.
|
||||
That would let one use mv to merge new content into an
|
||||
existing hierarchy. */
|
||||
&& (x->move_mode || ! S_ISDIR (dst_sb.st_mode)))
|
||||
{
|
||||
char *tmp_backup = find_backup_file_name (dst_name,
|
||||
x->backup_type);
|
||||
@@ -1250,6 +1282,8 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
return false;
|
||||
}
|
||||
new_dst = true;
|
||||
if (x->verbose)
|
||||
printf (_("removed %s\n"), quote (dst_name));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1257,7 +1291,7 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
/* If the source is a directory, we don't always create the destination
|
||||
directory. So --verbose should not announce anything until we're
|
||||
sure we'll create a directory. */
|
||||
if (x->verbose && !S_ISDIR (src_type))
|
||||
if (x->verbose && !S_ISDIR (src_mode))
|
||||
emit_verbose (src_name, dst_name, backup_succeeded ? dst_backup : NULL);
|
||||
|
||||
/* Associate the destination file name with the source device and inode
|
||||
@@ -1300,7 +1334,7 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
|| (command_line_arg
|
||||
&& x->dereference == DEREF_COMMAND_LINE_ARGUMENTS)
|
||||
|| x->dereference == DEREF_ALWAYS))
|
||||
|| (x->recursive && S_ISDIR (src_type)))
|
||||
|| (x->recursive && S_ISDIR (src_mode)))
|
||||
{
|
||||
earlier_file = remember_copied (dst_name, src_sb.st_ino, src_sb.st_dev);
|
||||
}
|
||||
@@ -1313,7 +1347,7 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
/* Avoid damaging the destination file system by refusing to preserve
|
||||
hard-linked directories (which are found at least in Netapp snapshot
|
||||
directories). */
|
||||
if (S_ISDIR (src_type))
|
||||
if (S_ISDIR (src_mode))
|
||||
{
|
||||
/* If src_name and earlier_file refer to the same directory entry,
|
||||
then warn about copying a directory into itself. */
|
||||
@@ -1354,6 +1388,8 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
error (0, errno, _("cannot remove %s"), quote (dst_name));
|
||||
goto un_backup;
|
||||
}
|
||||
if (x->verbose)
|
||||
printf (_("removed %s\n"), quote (dst_name));
|
||||
link_failed = (link (earlier_file, dst_name) != 0);
|
||||
}
|
||||
|
||||
@@ -1372,7 +1408,7 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
{
|
||||
if (rename (src_name, dst_name) == 0)
|
||||
{
|
||||
if (x->verbose && S_ISDIR (src_type))
|
||||
if (x->verbose && S_ISDIR (src_mode))
|
||||
emit_verbose (src_name, dst_name,
|
||||
backup_succeeded ? dst_backup : NULL);
|
||||
|
||||
@@ -1468,6 +1504,14 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
new_dst = true;
|
||||
}
|
||||
|
||||
/* If the ownership might change, omit some permissions at first, so
|
||||
unauthorized users cannot nip in before the file has the right
|
||||
ownership. */
|
||||
omitted_permissions =
|
||||
(x->preserve_ownership
|
||||
? (x->set_mode ? x->mode : src_mode) & (S_IRWXG | S_IRWXO)
|
||||
: 0);
|
||||
|
||||
delayed_ok = true;
|
||||
|
||||
/* In certain modes (cp's --symbolic-link), and for certain file types
|
||||
@@ -1476,7 +1520,7 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
In such cases, set this variable to zero. */
|
||||
preserve_metadata = true;
|
||||
|
||||
if (S_ISDIR (src_type))
|
||||
if (S_ISDIR (src_mode))
|
||||
{
|
||||
struct dir_list *dir;
|
||||
|
||||
@@ -1501,7 +1545,14 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
|
||||
if (new_dst || !S_ISDIR (dst_sb.st_mode))
|
||||
{
|
||||
if (mkdir (dst_name, src_mode) != 0)
|
||||
/* POSIX says mkdir's behavior is implementation-defined when
|
||||
(src_mode & ~S_IRWXUGO) != 0. However, common practice is
|
||||
to ask mkdir to copy all the CHMOD_MODE_BITS, letting mkdir
|
||||
decide what to do with S_ISUID | S_ISGID | S_ISVTX. */
|
||||
mode_t mkdir_mode =
|
||||
((x->set_mode ? x->mode : src_mode)
|
||||
& CHMOD_MODE_BITS & ~omitted_permissions);
|
||||
if (mkdir (dst_name, mkdir_mode) != 0)
|
||||
{
|
||||
error (0, errno, _("cannot create directory %s"),
|
||||
quote (dst_name));
|
||||
@@ -1575,8 +1626,8 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
/* If either stat call fails, it's ok not to report
|
||||
the failure and say dst_name is in the current
|
||||
directory. Other things will fail later. */
|
||||
|| stat (".", &dot_sb)
|
||||
|| stat (dst_parent, &dst_parent_sb)
|
||||
|| stat (".", &dot_sb) != 0
|
||||
|| stat (dst_parent, &dst_parent_sb) != 0
|
||||
|| SAME_INODE (dot_sb, dst_parent_sb));
|
||||
free (dst_parent);
|
||||
|
||||
@@ -1619,34 +1670,40 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
goto un_backup;
|
||||
}
|
||||
}
|
||||
else if (S_ISREG (src_type)
|
||||
|| (x->copy_as_regular && !S_ISLNK (src_type)))
|
||||
else if (S_ISREG (src_mode)
|
||||
|| (x->copy_as_regular && !S_ISLNK (src_mode)))
|
||||
{
|
||||
copied_as_regular = true;
|
||||
/* POSIX says the permission bits of the source file must be
|
||||
used as the 3rd argument in the open call, but that's not consistent
|
||||
with historical practice. */
|
||||
if (! copy_reg (src_name, dst_name, x, src_mode, &new_dst, &src_sb))
|
||||
used as the 3rd argument in the open call. Historical
|
||||
practice passed all the source mode bits to 'open', but the extra
|
||||
bits were ignored, so it should be the same either way. */
|
||||
if (! copy_reg (src_name, dst_name, x, src_mode & S_IRWXUGO,
|
||||
omitted_permissions, &new_dst, &src_sb))
|
||||
goto un_backup;
|
||||
}
|
||||
else if (S_ISFIFO (src_type))
|
||||
else if (S_ISFIFO (src_mode))
|
||||
{
|
||||
if (mkfifo (dst_name, src_mode))
|
||||
/* Use mknod, rather than mkfifo, because the former preserves
|
||||
the special mode bits of a fifo on Solaris 10, while mkfifo
|
||||
does not. */
|
||||
if (mknod (dst_name, src_mode & ~omitted_permissions, 0) != 0)
|
||||
{
|
||||
error (0, errno, _("cannot create fifo %s"), quote (dst_name));
|
||||
goto un_backup;
|
||||
}
|
||||
}
|
||||
else if (S_ISBLK (src_type) || S_ISCHR (src_type) || S_ISSOCK (src_type))
|
||||
else if (S_ISBLK (src_mode) || S_ISCHR (src_mode) || S_ISSOCK (src_mode))
|
||||
{
|
||||
if (mknod (dst_name, src_mode, src_sb.st_rdev))
|
||||
if (mknod (dst_name, src_mode & ~omitted_permissions, src_sb.st_rdev)
|
||||
!= 0)
|
||||
{
|
||||
error (0, errno, _("cannot create special file %s"),
|
||||
quote (dst_name));
|
||||
goto un_backup;
|
||||
}
|
||||
}
|
||||
else if (S_ISLNK (src_type))
|
||||
else if (S_ISLNK (src_mode))
|
||||
{
|
||||
char *src_link_val = xreadlink (src_name, src_sb.st_size);
|
||||
if (src_link_val == NULL)
|
||||
@@ -1751,8 +1808,15 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
if (x->preserve_ownership
|
||||
&& (new_dst || !SAME_OWNER_AND_GROUP (src_sb, dst_sb)))
|
||||
{
|
||||
if (! set_owner (x, dst_name, -1, src_sb.st_uid, src_sb.st_gid))
|
||||
return false;
|
||||
switch (set_owner (x, dst_name, -1, src_sb.st_uid, src_sb.st_gid))
|
||||
{
|
||||
case -1:
|
||||
return false;
|
||||
|
||||
case 0:
|
||||
src_mode &= ~ (S_ISUID | S_ISGID | S_ISVTX);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
set_author (dst_name, -1, &src_sb);
|
||||
@@ -1768,14 +1832,40 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
if (set_acl (dst_name, -1, x->mode) != 0)
|
||||
return false;
|
||||
}
|
||||
else if (restore_dst_mode)
|
||||
else
|
||||
{
|
||||
if (lchmod (dst_name, dst_mode) != 0)
|
||||
if (omitted_permissions)
|
||||
{
|
||||
error (0, errno, _("preserving permissions for %s"),
|
||||
quote (dst_name));
|
||||
if (x->require_preserve)
|
||||
return false;
|
||||
omitted_permissions &= ~ cached_umask ();
|
||||
|
||||
if (omitted_permissions && !restore_dst_mode)
|
||||
{
|
||||
/* Permissions were deliberately omitted when the file
|
||||
was created due to security concerns. See whether
|
||||
they need to be re-added now. It'd be faster to omit
|
||||
the lstat, but deducing the current destination mode
|
||||
is tricky in the presence of implementation-defined
|
||||
rules for special mode bits. */
|
||||
if (new_dst && lstat (dst_name, &dst_sb) != 0)
|
||||
{
|
||||
error (0, errno, _("cannot stat %s"), quote (dst_name));
|
||||
return false;
|
||||
}
|
||||
dst_mode = dst_sb.st_mode;
|
||||
if (omitted_permissions & ~dst_mode)
|
||||
restore_dst_mode = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (restore_dst_mode)
|
||||
{
|
||||
if (lchmod (dst_name, dst_mode | omitted_permissions) != 0)
|
||||
{
|
||||
error (0, errno, _("preserving permissions for %s"),
|
||||
quote (dst_name));
|
||||
if (x->require_preserve)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1879,3 +1969,17 @@ chown_failure_ok (struct cp_options const *x)
|
||||
|
||||
return ((errno == EPERM || errno == EINVAL) && !x->chown_privileges);
|
||||
}
|
||||
|
||||
/* Return the user's umask, caching the result. */
|
||||
|
||||
extern mode_t
|
||||
cached_umask (void)
|
||||
{
|
||||
static mode_t mask = -1;
|
||||
if (mask == (mode_t) -1)
|
||||
{
|
||||
mask = umask (0);
|
||||
umask (mask);
|
||||
}
|
||||
return mask;
|
||||
}
|
||||
|
||||
@@ -213,5 +213,6 @@ void src_info_init (struct cp_options *);
|
||||
|
||||
bool chown_privileges (void);
|
||||
bool chown_failure_ok (struct cp_options const *);
|
||||
mode_t cached_umask (void);
|
||||
|
||||
#endif
|
||||
|
||||
49
src/cp.c
49
src/cp.c
@@ -413,6 +413,8 @@ make_dir_parents_private (char const *const_dir, size_t src_offset,
|
||||
if (XSTAT (x, dir, &stats))
|
||||
{
|
||||
mode_t src_mode;
|
||||
mode_t omitted_permissions;
|
||||
mode_t mkdir_mode;
|
||||
|
||||
/* This component does not exist. We must set
|
||||
*new_dst and new->mode inside this loop because,
|
||||
@@ -427,8 +429,15 @@ make_dir_parents_private (char const *const_dir, size_t src_offset,
|
||||
return false;
|
||||
}
|
||||
src_mode = stats.st_mode;
|
||||
omitted_permissions =
|
||||
x->preserve_ownership ? src_mode & (S_IRWXG | S_IRWXO) : 0;
|
||||
|
||||
if (mkdir (dir, src_mode))
|
||||
/* POSIX says mkdir's behavior is implementation-defined when
|
||||
(src_mode & ~S_IRWXUGO) != 0. However, common practice is
|
||||
to ask mkdir to copy all the CHMOD_MODE_BITS, letting mkdir
|
||||
decide what to do with S_ISUID | S_ISGID | S_ISVTX. */
|
||||
mkdir_mode = src_mode & CHMOD_MODE_BITS & ~omitted_permissions;
|
||||
if (mkdir (dir, mkdir_mode) != 0)
|
||||
{
|
||||
error (0, errno, _("cannot make directory %s"),
|
||||
quote (dir));
|
||||
@@ -450,28 +459,30 @@ make_dir_parents_private (char const *const_dir, size_t src_offset,
|
||||
quote (dir));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (x->preserve_mode)
|
||||
{
|
||||
new->mode = src_mode;
|
||||
new->restore_mode = (src_mode != stats.st_mode);
|
||||
}
|
||||
|
||||
if ((stats.st_mode & S_IRWXU) != S_IRWXU)
|
||||
{
|
||||
/* Make the new directory searchable and writable. The
|
||||
original permissions will be restored later. */
|
||||
|
||||
new->mode = stats.st_mode;
|
||||
if (! x->preserve_mode)
|
||||
{
|
||||
if (omitted_permissions & ~stats.st_mode)
|
||||
omitted_permissions &= ~ cached_umask ();
|
||||
if (omitted_permissions & ~stats.st_mode
|
||||
|| (stats.st_mode & S_IRWXU) != S_IRWXU)
|
||||
{
|
||||
new->mode = stats.st_mode | omitted_permissions;
|
||||
new->restore_mode = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (lchmod (dir, stats.st_mode | S_IRWXU) != 0)
|
||||
{
|
||||
error (0, errno, _("setting permissions for %s"),
|
||||
quote (dir));
|
||||
return false;
|
||||
}
|
||||
if ((stats.st_mode & S_IRWXU) != S_IRWXU)
|
||||
{
|
||||
/* Make the new directory searchable and writable.
|
||||
The original permissions will be restored later. */
|
||||
|
||||
if (lchmod (dir, stats.st_mode | S_IRWXU) != 0)
|
||||
{
|
||||
error (0, errno, _("setting permissions for %s"),
|
||||
quote (dir));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,13 +149,13 @@ static uintmax_t current_line = 0;
|
||||
static bool have_read_eof = false;
|
||||
|
||||
/* Name of output files. */
|
||||
static char * volatile filename_space = NULL;
|
||||
static char *volatile filename_space = NULL;
|
||||
|
||||
/* Prefix part of output file names. */
|
||||
static char * volatile prefix = NULL;
|
||||
static char const *volatile prefix = NULL;
|
||||
|
||||
/* Suffix part of output file names. */
|
||||
static char * volatile suffix = NULL;
|
||||
static char *volatile suffix = NULL;
|
||||
|
||||
/* Number of digits to use in output file names. */
|
||||
static int volatile digits = 2;
|
||||
@@ -526,6 +526,8 @@ load_buffer (void)
|
||||
|
||||
if (lines_found)
|
||||
save_buffer (b);
|
||||
else
|
||||
free (b);
|
||||
|
||||
return lines_found != 0;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* cut - remove parts of lines of files
|
||||
Copyright (C) 1997-2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 1997-2006 Free Software Foundation, Inc.
|
||||
Copyright (C) 1984 David M. Ihnat
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
@@ -223,6 +223,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
|
||||
Use one, and only one of -b, -c or -f. Each LIST is made up of one\n\
|
||||
range, or many ranges separated by commas. Selected input is written\n\
|
||||
in the same order that it is read, and is written exactly once.\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
Each range is one of:\n\
|
||||
\n\
|
||||
N N'th byte, character or field, counted from 1\n\
|
||||
@@ -702,7 +704,7 @@ cut_stream (FILE *stream)
|
||||
Return true if successful. */
|
||||
|
||||
static bool
|
||||
cut_file (char *file)
|
||||
cut_file (char const *file)
|
||||
{
|
||||
FILE *stream;
|
||||
|
||||
|
||||
@@ -223,6 +223,8 @@ specifies Coordinated Universal Time. Interpreted sequences are:\n\
|
||||
%Z alphabetic time zone abbreviation (e.g., EDT)\n\
|
||||
\n\
|
||||
By default, date pads numeric fields with zeroes.\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
The following optional flags may follow `%':\n\
|
||||
\n\
|
||||
- (hyphen) do not pad the field\n\
|
||||
|
||||
12
src/dcgen
12
src/dcgen
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/perl -w
|
||||
# dcgen -- convert dircolors.hin to dircolors.h.
|
||||
|
||||
# Copyright (C) 1996, 1998, 2004, 2005 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1996, 1998, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -44,12 +44,14 @@ while (<>)
|
||||
and push @line, $_;
|
||||
}
|
||||
|
||||
my $last_line = pop @line;
|
||||
my $indent = ' ';
|
||||
|
||||
print "static char const G_line[] =\n";
|
||||
print "static char const G_line[] =\n{\n";
|
||||
foreach (@line)
|
||||
{
|
||||
print "$indent\"$_\\0\"\n";
|
||||
s/./'$&',/g;
|
||||
s/'\\'/'\\\\'/g;
|
||||
s/'''/'\\''/g;
|
||||
print "$indent${_}0,\n";
|
||||
}
|
||||
print "$indent\"$last_line\";\n";
|
||||
print "};\n";
|
||||
|
||||
21
src/dd.c
21
src/dd.c
@@ -265,9 +265,9 @@ static struct symbol_value const flags[] =
|
||||
{"direct", O_DIRECT},
|
||||
{"directory", O_DIRECTORY},
|
||||
{"dsync", O_DSYNC},
|
||||
{"noatime", O_NOATIME},
|
||||
{"noatime", HAVE_WORKING_O_NOATIME ? O_NOATIME : 0},
|
||||
{"noctty", O_NOCTTY},
|
||||
{"nofollow", O_NOFOLLOW},
|
||||
{"nofollow", HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0},
|
||||
{"nolinks", O_NOLINKS},
|
||||
{"nonblock", O_NONBLOCK},
|
||||
{"sync", O_SYNC},
|
||||
@@ -448,10 +448,12 @@ Each CONV symbol may be:\n\
|
||||
notrunc do not truncate the output file\n\
|
||||
ucase change lower case to upper case\n\
|
||||
swab swap every pair of input bytes\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
noerror continue after read errors\n\
|
||||
sync pad every input block with NULs to ibs-size; when used\n\
|
||||
with block or unblock, pad with spaces rather than NULs\n\
|
||||
fdatasync physically write output file data before finishing\n\
|
||||
fdatasync physically write output file data before finishing\n\
|
||||
fsync likewise, but also write metadata\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
@@ -470,12 +472,12 @@ Each FLAG symbol may be:\n\
|
||||
fputs (_(" sync likewise, but also for metadata\n"), stdout);
|
||||
if (O_NONBLOCK)
|
||||
fputs (_(" nonblock use non-blocking I/O\n"), stdout);
|
||||
if (O_NOATIME)
|
||||
if (HAVE_WORKING_O_NOATIME)
|
||||
fputs (_(" noatime do not update access time\n"), stdout);
|
||||
if (O_NOCTTY)
|
||||
fputs (_(" noctty do not assign controlling terminal from file\n"),
|
||||
stdout);
|
||||
if (O_NOFOLLOW)
|
||||
if (HAVE_WORKING_O_NOFOLLOW)
|
||||
fputs (_(" nofollow do not follow symlinks\n"), stdout);
|
||||
if (O_NOLINKS)
|
||||
fputs (_(" nolinks fail if multiply-linked\n"), stdout);
|
||||
@@ -1377,8 +1379,10 @@ static int
|
||||
dd_copy (void)
|
||||
{
|
||||
char *ibuf, *bufstart; /* Input buffer. */
|
||||
char *real_buf; /* real buffer address before alignment */
|
||||
char *real_obuf;
|
||||
/* These are declared static so that even though we don't free the
|
||||
buffers, valgrind will recognize that there is no "real" leak. */
|
||||
static char *real_buf; /* real buffer address before alignment */
|
||||
static char *real_obuf;
|
||||
ssize_t nread; /* Bytes read in the current block. */
|
||||
|
||||
/* If nonzero, then the previously read block was partial and
|
||||
@@ -1598,9 +1602,6 @@ dd_copy (void)
|
||||
}
|
||||
}
|
||||
|
||||
free (real_buf);
|
||||
free (real_obuf);
|
||||
|
||||
if ((conversions_mask & C_FDATASYNC) && fdatasync (STDOUT_FILENO) != 0)
|
||||
{
|
||||
if (errno != ENOSYS && errno != EINVAL)
|
||||
|
||||
@@ -246,7 +246,7 @@ dc_parse_stream (FILE *fp, const char *filename)
|
||||
char *input_line = NULL;
|
||||
size_t input_line_size = 0;
|
||||
char const *line;
|
||||
char *term;
|
||||
char const *term;
|
||||
bool ok = true;
|
||||
|
||||
/* State for the parser. */
|
||||
|
||||
@@ -86,8 +86,13 @@ EXEC 01;32
|
||||
#.com 01;32
|
||||
#.btm 01;32
|
||||
#.bat 01;32
|
||||
# Or if you want to colorize scripts even if they do not have the
|
||||
# executable bit actually set.
|
||||
#.sh 01;32
|
||||
#.csh 01;32
|
||||
|
||||
.tar 01;31 # archives or compressed (bright red)
|
||||
# archives or compressed (bright red)
|
||||
.tar 01;31
|
||||
.tgz 01;31
|
||||
.arj 01;31
|
||||
.taz 01;31
|
||||
@@ -97,9 +102,18 @@ EXEC 01;32
|
||||
.Z 01;31
|
||||
.gz 01;31
|
||||
.bz2 01;31
|
||||
.bz 01;31
|
||||
.tbz2 01;31
|
||||
.tz 01;31
|
||||
.deb 01;31
|
||||
.rpm 01;31
|
||||
.jar 01;31
|
||||
.rar 01;31
|
||||
.ace 01;31
|
||||
.zoo 01;31
|
||||
.cpio 01;31
|
||||
.7z 01;31
|
||||
.rz 01;31
|
||||
|
||||
# image formats
|
||||
.jpg 01;35
|
||||
@@ -115,19 +129,42 @@ EXEC 01;32
|
||||
.tif 01;35
|
||||
.tiff 01;35
|
||||
.png 01;35
|
||||
.mng 01;35
|
||||
.pcx 01;35
|
||||
.mov 01;35
|
||||
.mpg 01;35
|
||||
.mpeg 01;35
|
||||
.m2v 01;35
|
||||
.mkv 01;35
|
||||
.ogm 01;35
|
||||
.mp4 01;35
|
||||
.m4v 01;35
|
||||
.mp4v 01;35
|
||||
.vob 01;35
|
||||
.qt 01;35
|
||||
.nuv 01;35
|
||||
.wmv 01;35
|
||||
.asf 01;35
|
||||
.rm 01;35
|
||||
.rmvb 01;35
|
||||
.flc 01;35
|
||||
.avi 01;35
|
||||
.fli 01;35
|
||||
.gl 01;35
|
||||
.dl 01;35
|
||||
.xcf 01;35
|
||||
.xwd 01;35
|
||||
.yuv 01;35
|
||||
|
||||
# audio formats
|
||||
.flac 01;35
|
||||
.mp3 01;35
|
||||
.mpc 01;35
|
||||
.ogg 01;35
|
||||
.wav 01;35
|
||||
.aac 00;36
|
||||
.au 00;36
|
||||
.flac 00;36
|
||||
.mid 00;36
|
||||
.midi 00;36
|
||||
.mka 00;36
|
||||
.mp3 00;36
|
||||
.mpc 00;36
|
||||
.ogg 00;36
|
||||
.ra 00;36
|
||||
.wav 00;36
|
||||
|
||||
16
src/du-tests
16
src/du-tests
@@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2003, 2006 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -18,11 +18,17 @@
|
||||
|
||||
cat - <<\EOF > /dev/null
|
||||
Invoke e.g., like this
|
||||
DU1=du-4.5.2 DU2=du ./du-tests
|
||||
VG_PATH_PREFIX=/cu/src/vg: DU1=/cu/src/du DU2=/usr/bin/du ./du-tests
|
||||
Where /cu/src/vg/du is a valgrind wrapper around du,
|
||||
and DU1 refers to the just-built du binary you want to test.
|
||||
EOF
|
||||
|
||||
test -x "$DU1" || { echo DU1 envvar not set; exit 1; }
|
||||
test -x "$DU2" || { echo DU2 envvar not set; exit 1; }
|
||||
test -z "$DU1" && { echo DU1 envvar not set 1>&2; exit 1; }
|
||||
test -z "$DU2" && { echo DU2 envvar not set 1>&2; exit 1; }
|
||||
|
||||
test -x "$DU1" || { echo $DU1 not executable 1>&2; exit 1; }
|
||||
test -x "$DU2" || { echo $DU2 not executable 1>&2; exit 1; }
|
||||
|
||||
# Expects $DU1 and $DU2 to be the binaries to compare.
|
||||
d1=$(mktemp -d)
|
||||
cp -a $DU1 $d1/du
|
||||
@@ -47,6 +53,6 @@ for args in \
|
||||
; do
|
||||
echo Args: $args ======================
|
||||
diff -u --label=$DU1 --label=$DU2 \
|
||||
<(PATH=$d1 du $args 2>&1) <(PATH=$d2 du $args 2>&1)
|
||||
<(PATH=$VG_PATH_PREFIX$d1 du $args 2>&1) <(PATH=$d2 du $args 2>&1)
|
||||
done
|
||||
rm -rf $d1 $d2
|
||||
|
||||
4
src/du.c
4
src/du.c
@@ -293,6 +293,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
|
||||
the apparent size is usually smaller, it may be\n\
|
||||
larger due to holes in (`sparse') files, internal\n\
|
||||
fragmentation, indirect blocks, and the like\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
-B, --block-size=SIZE use SIZE-byte blocks\n\
|
||||
-b, --bytes equivalent to `--apparent-size --block-size=1'\n\
|
||||
-c, --total produce a grand total\n\
|
||||
@@ -305,6 +307,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
|
||||
change to be equivalent to --dereference-args (-D)\n\
|
||||
-h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)\n\
|
||||
--si like -h, but use powers of 1000 not 1024\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
-k like --block-size=1K\n\
|
||||
-l, --count-links count sizes many times if hard linked\n\
|
||||
-m like --block-size=1M\n\
|
||||
|
||||
@@ -236,7 +236,7 @@ int_value (intmax_t i)
|
||||
/* Return a VALUE for S. */
|
||||
|
||||
static VALUE *
|
||||
str_value (char *s)
|
||||
str_value (char const *s)
|
||||
{
|
||||
VALUE *v = xmalloc (sizeof *v);
|
||||
v->type = string;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* fold -- wrap each input line to fit in specified width.
|
||||
Copyright (C) 91, 1995-2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 91, 1995-2006 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -122,7 +122,7 @@ adjust_column (size_t column, char c)
|
||||
Return true if successful. */
|
||||
|
||||
static bool
|
||||
fold_file (char *filename, size_t width)
|
||||
fold_file (char const *filename, size_t width)
|
||||
{
|
||||
FILE *istream;
|
||||
int c;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
# groups -- print the groups a user is in
|
||||
# Copyright (C) 1991, 1997, 2000, 2002, 2004 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1991, 1997, 2000, 2002, 2004, 2006 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -32,39 +32,52 @@ Same as id -Gn. If no USERNAME, use current process.
|
||||
Report bugs to <@PACKAGE_BUGREPORT@>."
|
||||
|
||||
version='groups (@GNU_PACKAGE@) @VERSION@
|
||||
Written by David MacKenzie.
|
||||
Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
This is free software. You may redistribute copies of it under the terms of
|
||||
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
|
||||
There is NO WARRANTY, to the extent permitted by law.
|
||||
|
||||
Copyright (C) 2004 Free Software Foundation, Inc.
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.'
|
||||
Written by David MacKenzie.'
|
||||
|
||||
|
||||
fail=0
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
--help | --hel | --he | --h)
|
||||
exec echo "$usage" ;;
|
||||
--version | --versio | --versi | --vers | --ver | --ve | --v)
|
||||
exec echo "$version" ;;
|
||||
--)
|
||||
shift
|
||||
break ;;
|
||||
-*)
|
||||
echo "$0: invalid option: $arg" >&2
|
||||
exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# With fewer than two arguments, simply exec "id".
|
||||
case $# in
|
||||
1 )
|
||||
case "z${1}" in
|
||||
z--help )
|
||||
echo "$usage" || fail=1; exit $fail;;
|
||||
z--version )
|
||||
echo "$version" || fail=1; exit $fail;;
|
||||
* ) ;;
|
||||
esac
|
||||
;;
|
||||
* ) ;;
|
||||
0|1) exec id -Gn -- "$@" ;;
|
||||
esac
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
id -Gn
|
||||
fail=$?
|
||||
else
|
||||
for name in "$@"; do
|
||||
groups=`id -Gn -- $name`
|
||||
# With more, we need a loop, and be sure to exit nonzero upon failure.
|
||||
status=0
|
||||
write_error=0
|
||||
|
||||
for name
|
||||
do
|
||||
if groups=`id -Gn -- "$name"`; then
|
||||
echo "$name : $groups" || {
|
||||
status=$?
|
||||
if test $write_error = 0; then
|
||||
echo "$0: write error" >&2
|
||||
write_error=1
|
||||
fi
|
||||
}
|
||||
else
|
||||
status=$?
|
||||
if test $status = 0; then
|
||||
echo $name : $groups
|
||||
else
|
||||
fail=$status
|
||||
fi
|
||||
done
|
||||
fi
|
||||
exit $fail
|
||||
fi
|
||||
done
|
||||
|
||||
exit $status
|
||||
|
||||
@@ -79,7 +79,8 @@ static bool install_file_in_file (const char *from, const char *to,
|
||||
static void get_ids (void);
|
||||
static void strip (char const *name);
|
||||
static void announce_mkdir (char const *dir, void *options);
|
||||
static int make_ancestor (char const *dir, void *options);
|
||||
static int make_ancestor (char const *dir, char const *component,
|
||||
void *options);
|
||||
void usage (int status);
|
||||
|
||||
/* The name this program was run with, for error messages. */
|
||||
@@ -458,11 +459,10 @@ install_file_in_file (const char *from, const char *to,
|
||||
return false;
|
||||
if (strip_files)
|
||||
strip (to);
|
||||
if (! change_attributes (to))
|
||||
if (x->preserve_timestamps && (strip_files || ! S_ISREG (from_sb.st_mode))
|
||||
&& ! change_timestamps (&from_sb, to))
|
||||
return false;
|
||||
if (x->preserve_timestamps && (strip_files || ! S_ISREG (from_sb.st_mode)))
|
||||
return change_timestamps (&from_sb, to);
|
||||
return true;
|
||||
return change_attributes (to);
|
||||
}
|
||||
|
||||
/* Copy file FROM into directory TO_DIR, keeping its same name,
|
||||
@@ -629,11 +629,13 @@ announce_mkdir (char const *dir, void *options)
|
||||
error (0, 0, _("creating directory %s"), quote (dir));
|
||||
}
|
||||
|
||||
/* Make ancestor directory DIR, with options OPTIONS. */
|
||||
/* Make ancestor directory DIR, whose last file name component is
|
||||
COMPONENT, with options OPTIONS. Assume the working directory is
|
||||
COMPONENT's parent. */
|
||||
static int
|
||||
make_ancestor (char const *dir, void *options)
|
||||
make_ancestor (char const *dir, char const *component, void *options)
|
||||
{
|
||||
int r = mkdir (dir, DEFAULT_MODE);
|
||||
int r = mkdir (component, DEFAULT_MODE);
|
||||
if (r == 0)
|
||||
announce_mkdir (dir, options);
|
||||
return r;
|
||||
|
||||
25
src/ln.c
25
src/ln.c
@@ -112,8 +112,9 @@ target_directory_operand (char const *file)
|
||||
size_t blen = strlen (b);
|
||||
bool looks_like_a_dir = (blen == 0 || ISSLASH (b[blen - 1]));
|
||||
struct stat st;
|
||||
int err = ((dereference_dest_dir_symlinks ? stat : lstat) (file, &st) == 0
|
||||
? 0 : errno);
|
||||
int stat_result =
|
||||
(dereference_dest_dir_symlinks ? stat (file, &st) : lstat (file, &st));
|
||||
int err = (stat_result == 0 ? 0 : errno);
|
||||
bool is_a_dir = !err && S_ISDIR (st.st_mode);
|
||||
if (err && err != ENOENT)
|
||||
error (EXIT_FAILURE, err, _("accessing %s"), quote (file));
|
||||
@@ -132,7 +133,7 @@ do_link (const char *source, const char *dest)
|
||||
struct stat source_stats;
|
||||
struct stat dest_stats;
|
||||
char *dest_backup = NULL;
|
||||
bool lstat_ok = false;
|
||||
bool dest_lstat_ok = false;
|
||||
bool source_is_dir = false;
|
||||
bool ok;
|
||||
|
||||
@@ -170,8 +171,8 @@ do_link (const char *source, const char *dest)
|
||||
|
||||
if (remove_existing_files || interactive || backup_type != no_backups)
|
||||
{
|
||||
lstat_ok = (lstat (dest, &dest_stats) == 0);
|
||||
if (!lstat_ok && errno != ENOENT)
|
||||
dest_lstat_ok = (lstat (dest, &dest_stats) == 0);
|
||||
if (!dest_lstat_ok && errno != ENOENT)
|
||||
{
|
||||
error (0, errno, _("accessing %s"), quote (dest));
|
||||
return false;
|
||||
@@ -183,8 +184,14 @@ do_link (const char *source, const char *dest)
|
||||
(with --backup, it just renames any existing destination file)
|
||||
But if the source and destination are the same, don't remove
|
||||
anything and fail right here. */
|
||||
if (remove_existing_files
|
||||
&& lstat_ok
|
||||
if ((remove_existing_files
|
||||
/* Ensure that "ln --backup f f" fails here, with the
|
||||
"... same file" diagnostic, below. Otherwise, subsequent
|
||||
code would give a misleading "file not found" diagnostic.
|
||||
This case is different than the others handled here, since
|
||||
the command in question doesn't use --force. */
|
||||
|| (!symbolic_link && backup_type != no_backups))
|
||||
&& dest_lstat_ok
|
||||
/* Allow `ln -sf --backup k k' to succeed in creating the
|
||||
self-referential symlink, but don't allow the hard-linking
|
||||
equivalent: `ln -f k k' (with or without --backup) to get
|
||||
@@ -204,7 +211,7 @@ do_link (const char *source, const char *dest)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lstat_ok)
|
||||
if (dest_lstat_ok)
|
||||
{
|
||||
if (S_ISDIR (dest_stats.st_mode))
|
||||
{
|
||||
@@ -254,7 +261,7 @@ do_link (const char *source, const char *dest)
|
||||
Try to unlink DEST even if we may have backed it up successfully.
|
||||
In some unusual cases (when DEST and DEST_BACKUP are hard-links
|
||||
that refer to the same file), rename succeeds and DEST remains.
|
||||
If we didn't remove DEST in that case, the subsequent LINKFUNC
|
||||
If we didn't remove DEST in that case, the subsequent symlink or link
|
||||
call would fail. */
|
||||
|
||||
if (!ok && errno == EEXIST && (remove_existing_files || dest_backup))
|
||||
|
||||
15
src/ls.c
15
src/ls.c
@@ -863,11 +863,11 @@ static size_t dired_pos;
|
||||
|
||||
/* Write S to STREAM and increment DIRED_POS by S_LEN. */
|
||||
#define DIRED_FPUTS(s, stream, s_len) \
|
||||
do {fputs ((s), (stream)); dired_pos += s_len;} while (0)
|
||||
do {fputs (s, stream); dired_pos += s_len;} while (0)
|
||||
|
||||
/* Like DIRED_FPUTS, but for use when S is a literal string. */
|
||||
#define DIRED_FPUTS_LITERAL(s, stream) \
|
||||
do {fputs ((s), (stream)); dired_pos += sizeof((s)) - 1;} while (0)
|
||||
do {fputs (s, stream); dired_pos += sizeof (s) - 1;} while (0)
|
||||
|
||||
#define DIRED_INDENT() \
|
||||
do \
|
||||
@@ -892,7 +892,7 @@ static struct obstack subdired_obstack;
|
||||
do \
|
||||
{ \
|
||||
if (dired) \
|
||||
obstack_grow ((obs), &dired_pos, sizeof (dired_pos)); \
|
||||
obstack_grow (obs, &dired_pos, sizeof (dired_pos)); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
@@ -3604,8 +3604,7 @@ quote_name (FILE *out, const char *name, struct quoting_options const *options,
|
||||
reach its end, replacing each non-printable multibyte
|
||||
character with a single question mark. */
|
||||
{
|
||||
mbstate_t mbstate;
|
||||
memset (&mbstate, 0, sizeof mbstate);
|
||||
mbstate_t mbstate = { 0, };
|
||||
do
|
||||
{
|
||||
wchar_t wc;
|
||||
@@ -4271,6 +4270,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
|
||||
-h, --human-readable with -l, print sizes in human readable format\n\
|
||||
(e.g., 1K 234M 2G)\n\
|
||||
--si likewise, but use powers of 1000 not 1024\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
-H, --dereference-command-line\n\
|
||||
follow symbolic links listed on the command line\n\
|
||||
--dereference-command-line-symlink-to-dir\n\
|
||||
@@ -4313,7 +4314,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\
|
||||
fputs (_("\
|
||||
-r, --reverse reverse order while sorting\n\
|
||||
-R, --recursive list subdirectories recursively\n\
|
||||
-s, --size with -l, print size of each file, in blocks\n\
|
||||
-s, --size print the size of each file, in blocks\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
-S sort by file size\n\
|
||||
@@ -4332,6 +4333,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
|
||||
non-recent files and FORMAT2 to recent files;\n\
|
||||
if STYLE is prefixed with `posix-', STYLE\n\
|
||||
takes effect only outside the POSIX locale\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
-t sort by modification time\n\
|
||||
-T, --tabsize=COLS assume tab stops at each COLS instead of 8\n\
|
||||
"), stdout);
|
||||
|
||||
15
src/mkdir.c
15
src/mkdir.c
@@ -81,7 +81,7 @@ struct mkdir_options
|
||||
{
|
||||
/* Function to make an ancestor, or NULL if ancestors should not be
|
||||
made. */
|
||||
int (*make_ancestor_function) (char const *, void *);
|
||||
int (*make_ancestor_function) (char const *, char const *, void *);
|
||||
|
||||
/* Mode for ancestor directory. */
|
||||
mode_t ancestor_mode;
|
||||
@@ -105,15 +105,16 @@ announce_mkdir (char const *dir, void *options)
|
||||
error (0, 0, o->created_directory_format, quote (dir));
|
||||
}
|
||||
|
||||
/* Make ancestor directory DIR, with options OPTIONS. Return 0 if
|
||||
successful and the resulting directory is readable, 1 if successful
|
||||
but the resulting directory is not readable, -1 (setting errno)
|
||||
otherwise. */
|
||||
/* Make ancestor directory DIR, whose last component is COMPONENT,
|
||||
with options OPTIONS. Assume the working directory is COMPONENT's
|
||||
parent. Return 0 if successful and the resulting directory is
|
||||
readable, 1 if successful but the resulting directory is not
|
||||
readable, -1 (setting errno) otherwise. */
|
||||
static int
|
||||
make_ancestor (char const *dir, void *options)
|
||||
make_ancestor (char const *dir, char const *component, void *options)
|
||||
{
|
||||
struct mkdir_options const *o = options;
|
||||
int r = mkdir (dir, o->ancestor_mode);
|
||||
int r = mkdir (component, o->ancestor_mode);
|
||||
if (r == 0)
|
||||
{
|
||||
r = ! (o->ancestor_mode & S_IRUSR);
|
||||
|
||||
1
src/mv.c
1
src/mv.c
@@ -94,6 +94,7 @@ rm_option_init (struct rm_options *x)
|
||||
x->ignore_missing_files = false;
|
||||
x->root_dev_ino = NULL;
|
||||
x->recursive = true;
|
||||
x->one_file_system = false;
|
||||
|
||||
/* Should we prompt for removal, too? No. Prompting for the `move'
|
||||
part is enough. It implies removal. */
|
||||
|
||||
17
src/nl.c
17
src/nl.c
@@ -64,16 +64,16 @@ enum section
|
||||
char *program_name;
|
||||
|
||||
/* Format of body lines (-b). */
|
||||
static char *body_type = "t";
|
||||
static char const *body_type = "t";
|
||||
|
||||
/* Format of header lines (-h). */
|
||||
static char *header_type = "n";
|
||||
static char const *header_type = "n";
|
||||
|
||||
/* Format of footer lines (-f). */
|
||||
static char *footer_type = "n";
|
||||
static char const *footer_type = "n";
|
||||
|
||||
/* Format currently being used (body, header, or footer). */
|
||||
static char *current_type;
|
||||
static char const *current_type;
|
||||
|
||||
/* Regex for body lines to number (-bp). */
|
||||
static struct re_pattern_buffer body_regex;
|
||||
@@ -93,7 +93,7 @@ static char footer_fastmap[UCHAR_MAX + 1];
|
||||
static struct re_pattern_buffer *current_regex = NULL;
|
||||
|
||||
/* Separator string to print after line number (-s). */
|
||||
static char *separator_str = "\t";
|
||||
static char const *separator_str = "\t";
|
||||
|
||||
/* Input section delimiter string (-d). */
|
||||
static char const *section_del = DEFAULT_SECTION_DELIMITERS;
|
||||
@@ -235,9 +235,10 @@ FORMAT is one of:\n\
|
||||
according to `optarg'. */
|
||||
|
||||
static bool
|
||||
build_type_arg (char **typep, struct re_pattern_buffer *regexp, char *fastmap)
|
||||
build_type_arg (char const **typep,
|
||||
struct re_pattern_buffer *regexp, char *fastmap)
|
||||
{
|
||||
const char *errmsg;
|
||||
char const *errmsg;
|
||||
bool rval = true;
|
||||
|
||||
switch (*optarg)
|
||||
@@ -414,7 +415,7 @@ process_file (FILE *fp)
|
||||
Return true if successful. */
|
||||
|
||||
static bool
|
||||
nl_file (const char *file)
|
||||
nl_file (char const *file)
|
||||
{
|
||||
FILE *stream;
|
||||
|
||||
|
||||
6
src/od.c
6
src/od.c
@@ -358,6 +358,8 @@ An OFFSET operand means -j OFFSET. LABEL is the pseudo-address\n\
|
||||
at first byte printed, incremented when dump is progressing.\n\
|
||||
For OFFSET and LABEL, a 0x or 0X prefix indicates hexadecimal;\n\
|
||||
suffixes may be . for octal and b for multiply by 512.\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
\n\
|
||||
TYPE is made up of one or more of these specifications:\n\
|
||||
\n\
|
||||
@@ -388,7 +390,7 @@ of output. \
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
--string without a number implies 3. --width without a number\n\
|
||||
implies 32. By default, od uses -A o -t d2 -w 16.\n\
|
||||
implies 32. By default, od uses -A o -t d2 -w16.\n\
|
||||
"), stdout);
|
||||
printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
|
||||
}
|
||||
@@ -1175,7 +1177,7 @@ write_block (uintmax_t current_offset, size_t n_bytes,
|
||||
static bool first = true;
|
||||
static bool prev_pair_equal = false;
|
||||
|
||||
#define EQUAL_BLOCKS(b1, b2) (memcmp ((b1), (b2), bytes_per_block) == 0)
|
||||
#define EQUAL_BLOCKS(b1, b2) (memcmp (b1, b2, bytes_per_block) == 0)
|
||||
|
||||
if (abbreviate_duplicate_blocks
|
||||
&& !first && n_bytes == bytes_per_block
|
||||
|
||||
@@ -463,9 +463,7 @@ main (int argc, char **argv)
|
||||
{
|
||||
case 'd':
|
||||
/* Delimiter character(s). */
|
||||
if (optarg[0] == '\0')
|
||||
optarg = "\\0";
|
||||
delim_arg = optarg;
|
||||
delim_arg = (optarg[0] == '\0' ? "\\0" : optarg);
|
||||
break;
|
||||
|
||||
case 's':
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* pathchk -- check whether file names are valid or portable
|
||||
Copyright (C) 1991-2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991-2006 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -200,7 +200,7 @@ portable_chars_only (char const *file, size_t filelen)
|
||||
|
||||
if (*invalid)
|
||||
{
|
||||
mbstate_t mbstate = {0};
|
||||
mbstate_t mbstate = { 0, };
|
||||
size_t charlen = mbrlen (invalid, filelen - validlen, &mbstate);
|
||||
error (0, 0,
|
||||
_("nonportable character %s in file name %s"),
|
||||
|
||||
@@ -40,10 +40,6 @@
|
||||
# define MAXHOSTNAMELEN 64
|
||||
#endif
|
||||
|
||||
#ifndef S_IWGRP
|
||||
# define S_IWGRP 020
|
||||
#endif
|
||||
|
||||
char *ttyname ();
|
||||
|
||||
/* The name this program was run with. */
|
||||
|
||||
4
src/pr.c
4
src/pr.c
@@ -430,7 +430,7 @@ static void getoptarg (char *arg, char switch_char, char *character,
|
||||
void usage (int status);
|
||||
static void print_files (int number_of_files, char **av);
|
||||
static void init_parameters (int number_of_files);
|
||||
static void init_header (char *filename, int desc);
|
||||
static void init_header (char const *filename, int desc);
|
||||
static bool init_fps (int number_of_files, char **av);
|
||||
static void init_funcs (void);
|
||||
static void init_store_cols (void);
|
||||
@@ -1653,7 +1653,7 @@ print_files (int number_of_files, char **av)
|
||||
FILENAME for reading. */
|
||||
|
||||
static void
|
||||
init_header (char *filename, int desc)
|
||||
init_header (char const *filename, int desc)
|
||||
{
|
||||
char *buf = NULL;
|
||||
struct stat st;
|
||||
|
||||
@@ -76,7 +76,7 @@ static bool posixly_correct;
|
||||
|
||||
/* This message appears in N_() here rather than just in _() below because
|
||||
the sole use would have been in a #define. */
|
||||
static char *const cfcc_msg =
|
||||
static char const *const cfcc_msg =
|
||||
N_("warning: %s: character(s) following character constant have been ignored");
|
||||
|
||||
/* The name this program was run with. */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* readlink -- display value of a symbolic link.
|
||||
Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -74,6 +74,8 @@ usage (int status)
|
||||
-e, --canonicalize-existing canonicalize by following every symlink in\n\
|
||||
every component of the given name recursively,\n\
|
||||
all components must exist\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
-m, --canonicalize-missing canonicalize by following every symlink in\n\
|
||||
every component of the given name recursively,\n\
|
||||
without requirements on components existence\n\
|
||||
|
||||
218
src/remove.c
218
src/remove.c
@@ -50,19 +50,26 @@
|
||||
#define obstack_chunk_free free
|
||||
|
||||
/* This is the maximum number of consecutive readdir/unlink calls that
|
||||
can be made (with no intervening rewinddir or closedir/opendir)
|
||||
before triggering a bug that makes readdir return NULL even though
|
||||
some directory entries have not been processed. The bug afflicts
|
||||
SunOS's readdir when applied to ufs file systems and Darwin 6.5's
|
||||
(and OSX v.10.3.8's) HFS+. This maximum is conservative in that
|
||||
demonstrating the problem seems to require a directory containing
|
||||
at least 254 deletable entries (which doesn't count . and ..), so
|
||||
we could conceivably increase the maximum value to 254. */
|
||||
can be made (with no intervening rewinddir or closedir/opendir) before
|
||||
triggering a bug that makes readdir return NULL even though some
|
||||
directory entries have not been processed. The bug afflicts SunOS's
|
||||
readdir when applied to ufs file systems and Darwin 6.5's (and OSX
|
||||
v.10.3.8's) HFS+. This maximum is conservative in that demonstrating
|
||||
the problem requires a directory containing at least 16 deletable
|
||||
entries (which doesn't count . and ..).
|
||||
This problem also affects Darwin 7.9.0 (aka MacOS X 10.3.9) on HFS+
|
||||
and NFS-mounted file systems, but not vfat ones. */
|
||||
enum
|
||||
{
|
||||
CONSECUTIVE_READDIR_UNLINK_THRESHOLD = 200
|
||||
CONSECUTIVE_READDIR_UNLINK_THRESHOLD = 10
|
||||
};
|
||||
|
||||
/* FIXME: in 2009, or whenever Darwin 7.9.0 (aka MacOS X 10.3.9) is no
|
||||
longer relevant, remove this work-around code. Then, there will be
|
||||
no need to perform the extra rewinddir call, ever. */
|
||||
#define NEED_REWIND(readdir_unlink_count) \
|
||||
(CONSECUTIVE_READDIR_UNLINK_THRESHOLD <= (readdir_unlink_count))
|
||||
|
||||
enum Ternary
|
||||
{
|
||||
T_UNKNOWN = 2,
|
||||
@@ -141,16 +148,6 @@ struct dirstack_state
|
||||
};
|
||||
typedef struct dirstack_state Dirstack_state;
|
||||
|
||||
/* Just like close(fd), but don't modify errno. */
|
||||
static inline int
|
||||
close_preserve_errno (int fd)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
int result = close (fd);
|
||||
errno = saved_errno;
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Like fstatat, but cache the result. If ST->st_size is -1, the
|
||||
status has not been gotten yet. If less than -1, fstatat failed
|
||||
with errno == -1 - ST->st_size. Otherwise, the status has already
|
||||
@@ -166,11 +163,12 @@ cache_fstatat (int fd, char const *file, struct stat *st, int flag)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Initialize a fstatat cache *ST. */
|
||||
static inline void
|
||||
/* Initialize a fstatat cache *ST. Return ST for convenience. */
|
||||
static inline struct stat *
|
||||
cache_stat_init (struct stat *st)
|
||||
{
|
||||
st->st_size = -1;
|
||||
return st;
|
||||
}
|
||||
|
||||
/* Return true if *ST has been statted. */
|
||||
@@ -430,11 +428,11 @@ ds_free (Dirstack_state *ds)
|
||||
that the post-chdir dev/ino numbers for `.' match the saved ones.
|
||||
If any system call fails or if dev/ino don't match then give a
|
||||
diagnostic and longjump out.
|
||||
Set *PREV_DIR to the name (in malloc'd storage) of the
|
||||
Return the name (in malloc'd storage) of the
|
||||
directory (usually now empty) from which we're coming, and which
|
||||
corresponds to the input value of *DIRP. */
|
||||
static void
|
||||
AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
|
||||
static char *
|
||||
AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds)
|
||||
{
|
||||
struct AD_ent *leaf_dir_ent = AD_stack_top(ds);
|
||||
struct dev_ino leaf_dev_ino = leaf_dir_ent->dev_ino;
|
||||
@@ -443,7 +441,7 @@ AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
|
||||
|
||||
/* Get the name of the current (but soon to be `previous') directory
|
||||
from the top of the stack. */
|
||||
*prev_dir = top_dir (ds);
|
||||
char *prev_dir = top_dir (ds);
|
||||
|
||||
AD_stack_pop (ds);
|
||||
pop_dir (ds);
|
||||
@@ -471,7 +469,7 @@ AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
|
||||
if (closedir (*dirp) != 0)
|
||||
{
|
||||
error (0, errno, _("FATAL: failed to close directory %s"),
|
||||
quote (full_filename (*prev_dir)));
|
||||
quote (full_filename (prev_dir)));
|
||||
goto next_cmdline_arg;
|
||||
}
|
||||
|
||||
@@ -484,7 +482,7 @@ AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
|
||||
if (fd < 0)
|
||||
{
|
||||
error (0, errno, _("FATAL: cannot open .. from %s"),
|
||||
quote (full_filename (*prev_dir)));
|
||||
quote (full_filename (prev_dir)));
|
||||
goto next_cmdline_arg;
|
||||
}
|
||||
|
||||
@@ -514,7 +512,7 @@ AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
|
||||
close (fd);
|
||||
|
||||
next_cmdline_arg:;
|
||||
free (*prev_dir);
|
||||
free (prev_dir);
|
||||
longjmp (ds->current_arg_jumpbuf, 1);
|
||||
}
|
||||
}
|
||||
@@ -523,17 +521,18 @@ AD_pop_and_chdir (DIR **dirp, Dirstack_state *ds, char **prev_dir)
|
||||
if (closedir (*dirp) != 0)
|
||||
{
|
||||
error (0, errno, _("FATAL: failed to close directory %s"),
|
||||
quote (full_filename (*prev_dir)));
|
||||
quote (full_filename (prev_dir)));
|
||||
goto next_cmdline_arg;
|
||||
}
|
||||
*dirp = NULL;
|
||||
}
|
||||
|
||||
return prev_dir;
|
||||
}
|
||||
|
||||
/* Initialize *HT if it is NULL.
|
||||
Insert FILENAME into HT. */
|
||||
static void
|
||||
AD_mark_helper (Hash_table **ht, char *filename)
|
||||
/* Initialize *HT if it is NULL. Return *HT. */
|
||||
static Hash_table *
|
||||
AD_ensure_initialized (Hash_table **ht)
|
||||
{
|
||||
if (*ht == NULL)
|
||||
{
|
||||
@@ -542,7 +541,16 @@ AD_mark_helper (Hash_table **ht, char *filename)
|
||||
if (*ht == NULL)
|
||||
xalloc_die ();
|
||||
}
|
||||
void *ent = hash_insert (*ht, filename);
|
||||
|
||||
return *ht;
|
||||
}
|
||||
|
||||
/* Initialize *HT if it is NULL.
|
||||
Insert FILENAME into HT. */
|
||||
static void
|
||||
AD_mark_helper (Hash_table **ht, char *filename)
|
||||
{
|
||||
void *ent = hash_insert (AD_ensure_initialized (ht), filename);
|
||||
if (ent == NULL)
|
||||
xalloc_die ();
|
||||
else
|
||||
@@ -550,7 +558,6 @@ AD_mark_helper (Hash_table **ht, char *filename)
|
||||
if (ent != filename)
|
||||
free (filename);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Mark FILENAME (in current directory) as unremovable. */
|
||||
@@ -614,7 +621,7 @@ AD_push (int fd_cwd, Dirstack_state *ds, char const *dir,
|
||||
|
||||
/* If our uses of openat are guaranteed not to
|
||||
follow a symlink, then we can skip this check. */
|
||||
if ( ! O_NOFOLLOW)
|
||||
if (! HAVE_WORKING_O_NOFOLLOW)
|
||||
{
|
||||
struct stat sb;
|
||||
if (fstat (fd_cwd, &sb) != 0)
|
||||
@@ -892,7 +899,7 @@ is_dir_lstat (char const *filename, struct stat *st)
|
||||
return RM_OK; \
|
||||
} \
|
||||
\
|
||||
if (errno == ENOENT && (X)->ignore_missing_files) \
|
||||
if (ignorable_missing (X, errno)) \
|
||||
return RM_OK; \
|
||||
} \
|
||||
while (0)
|
||||
@@ -908,7 +915,7 @@ is_dir_lstat (char const *filename, struct stat *st)
|
||||
return RM_OK; \
|
||||
} \
|
||||
\
|
||||
if (errno == ENOENT && (X)->ignore_missing_files) \
|
||||
if (ignorable_missing (X, errno)) \
|
||||
return RM_OK; \
|
||||
\
|
||||
if (errno == ENOTEMPTY || errno == EEXIST) \
|
||||
@@ -916,6 +923,35 @@ is_dir_lstat (char const *filename, struct stat *st)
|
||||
} \
|
||||
while (0)
|
||||
|
||||
/* When a function like unlink, rmdir, or fstatat fails with an errno
|
||||
value of ERRNUM, return true if the specified file system object
|
||||
is guaranteed not to exist; otherwise, return false. */
|
||||
static inline bool
|
||||
nonexistent_file_errno (int errnum)
|
||||
{
|
||||
/* Do not include ELOOP here, since the specified file may indeed
|
||||
exist, but be (in)accessible only via too long a symlink chain.
|
||||
Likewise for ENAMETOOLONG, since rm -f ./././.../foo may fail
|
||||
if the "..." part expands to a long enough sequence of "./"s,
|
||||
even though ./foo does indeed exist. */
|
||||
|
||||
switch (errnum)
|
||||
{
|
||||
case ENOENT:
|
||||
case ENOTDIR:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Encapsulate the test for whether the errno value, ERRNUM, is ignorable. */
|
||||
static inline bool
|
||||
ignorable_missing (struct rm_options const *x, int errnum)
|
||||
{
|
||||
return x->ignore_missing_files && nonexistent_file_errno (errnum);
|
||||
}
|
||||
|
||||
/* Remove the file or directory specified by FILENAME.
|
||||
Return RM_OK if it is removed, and RM_ERROR or RM_USER_DECLINED if not.
|
||||
But if FILENAME specifies a non-empty directory, return RM_NONEMPTY_DIR. */
|
||||
@@ -983,6 +1019,9 @@ remove_entry (int fd_cwd, Dirstack_state const *ds, char const *filename,
|
||||
|| errno == ENOENT || errno == ENOTDIR
|
||||
|| errno == ELOOP || errno == ENAMETOOLONG)
|
||||
{
|
||||
if (ignorable_missing (x, errno))
|
||||
return RM_OK;
|
||||
|
||||
/* Either --recursive is not in effect, or the file cannot be a
|
||||
directory. Report the unlink problem and fail. */
|
||||
error (0, errno, _("cannot remove %s"),
|
||||
@@ -1007,7 +1046,7 @@ remove_entry (int fd_cwd, Dirstack_state const *ds, char const *filename,
|
||||
{
|
||||
if (fstatat (fd_cwd, filename, st, AT_SYMLINK_NOFOLLOW))
|
||||
{
|
||||
if (errno == ENOENT && x->ignore_missing_files)
|
||||
if (ignorable_missing (x, errno))
|
||||
return RM_OK;
|
||||
|
||||
error (0, errno, _("cannot remove %s"),
|
||||
@@ -1067,37 +1106,33 @@ remove_entry (int fd_cwd, Dirstack_state const *ds, char const *filename,
|
||||
static DIR *
|
||||
fd_to_subdirp (int fd_cwd, char const *f,
|
||||
struct rm_options const *x, int prev_errno,
|
||||
struct stat *subdir_sb, Dirstack_state *ds,
|
||||
struct stat *subdir_sb,
|
||||
int *cwd_errno ATTRIBUTE_UNUSED)
|
||||
{
|
||||
int open_flags = O_RDONLY | O_NOCTTY | O_NOFOLLOW | O_NONBLOCK;
|
||||
int fd_sub = openat_permissive (fd_cwd, f, open_flags, 0, cwd_errno);
|
||||
int saved_errno;
|
||||
|
||||
/* Record dev/ino of F. We may compare them against saved values
|
||||
to thwart any attempt to subvert the traversal. They are also used
|
||||
to detect directory cycles. */
|
||||
if (fd_sub < 0 || fstat (fd_sub, subdir_sb) != 0)
|
||||
if (fd_sub < 0)
|
||||
return NULL;
|
||||
else if (fstat (fd_sub, subdir_sb) != 0)
|
||||
saved_errno = errno;
|
||||
else if (S_ISDIR (subdir_sb->st_mode))
|
||||
{
|
||||
if (0 <= fd_sub)
|
||||
close_preserve_errno (fd_sub);
|
||||
return NULL;
|
||||
DIR *subdir_dirp = fdopendir (fd_sub);
|
||||
if (subdir_dirp)
|
||||
return subdir_dirp;
|
||||
saved_errno = errno;
|
||||
}
|
||||
else
|
||||
saved_errno = (prev_errno ? prev_errno : ENOTDIR);
|
||||
|
||||
if (! S_ISDIR (subdir_sb->st_mode))
|
||||
{
|
||||
errno = prev_errno ? prev_errno : ENOTDIR;
|
||||
close_preserve_errno (fd_sub);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DIR *subdir_dirp = fdopendir (fd_sub);
|
||||
if (subdir_dirp == NULL)
|
||||
{
|
||||
close_preserve_errno (fd_sub);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return subdir_dirp;
|
||||
close (fd_sub);
|
||||
errno = saved_errno;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Remove entries in the directory open on DIRP
|
||||
@@ -1138,8 +1173,7 @@ remove_cwd_entries (DIR **dirp,
|
||||
{
|
||||
/* fall through */
|
||||
}
|
||||
else if (CONSECUTIVE_READDIR_UNLINK_THRESHOLD
|
||||
< n_unlinked_since_opendir_or_last_rewind)
|
||||
else if (NEED_REWIND (n_unlinked_since_opendir_or_last_rewind))
|
||||
{
|
||||
/* Call rewinddir if we've called unlink or rmdir so many times
|
||||
(since the opendir or the previous rewinddir) that this
|
||||
@@ -1182,14 +1216,14 @@ remove_cwd_entries (DIR **dirp,
|
||||
case RM_NONEMPTY_DIR:
|
||||
{
|
||||
DIR *subdir_dirp = fd_to_subdirp (dirfd (*dirp), f,
|
||||
x, errno, subdir_sb, ds, NULL);
|
||||
x, errno, subdir_sb, NULL);
|
||||
if (subdir_dirp == NULL)
|
||||
{
|
||||
status = RM_ERROR;
|
||||
|
||||
/* CAUTION: this test and diagnostic are identical to
|
||||
those following the other use of fd_to_subdirp. */
|
||||
if (errno == ENOENT && x->ignore_missing_files)
|
||||
if (ignorable_missing (x, errno))
|
||||
{
|
||||
/* With -f, don't report "file not found". */
|
||||
}
|
||||
@@ -1260,6 +1294,7 @@ remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
|
||||
struct rm_options const *x, int *cwd_errno)
|
||||
{
|
||||
enum RM_status status;
|
||||
dev_t current_dev = dir_st->st_dev;
|
||||
|
||||
/* There is a race condition in that an attacker could replace the nonempty
|
||||
directory, DIR, with a symlink between the preceding call to rmdir
|
||||
@@ -1269,13 +1304,13 @@ remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
|
||||
fd_to_subdirp's fstat, along with the `fstat' and the dev/ino
|
||||
comparison in AD_push ensure that we detect it and fail. */
|
||||
|
||||
DIR *dirp = fd_to_subdirp (fd_cwd, dir, x, 0, dir_st, ds, cwd_errno);
|
||||
DIR *dirp = fd_to_subdirp (fd_cwd, dir, x, 0, dir_st, cwd_errno);
|
||||
|
||||
if (dirp == NULL)
|
||||
{
|
||||
/* CAUTION: this test and diagnostic are identical to
|
||||
those following the other use of fd_to_subdirp. */
|
||||
if (errno == ENOENT && x->ignore_missing_files)
|
||||
if (ignorable_missing (x, errno))
|
||||
{
|
||||
/* With -f, don't report "file not found". */
|
||||
}
|
||||
@@ -1321,21 +1356,35 @@ remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
|
||||
}
|
||||
if (subdir)
|
||||
{
|
||||
AD_push (dirfd (dirp), ds, subdir, &subdir_sb);
|
||||
AD_INIT_OTHER_MEMBERS ();
|
||||
if ( ! x->one_file_system
|
||||
|| subdir_sb.st_dev == current_dev)
|
||||
{
|
||||
AD_push (dirfd (dirp), ds, subdir, &subdir_sb);
|
||||
AD_INIT_OTHER_MEMBERS ();
|
||||
free (subdir);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Here, --one-file-system is in effect, and with remove_cwd_entries'
|
||||
traversal into the current directory, (known as SUBDIR, from ..),
|
||||
DIRP's device number is different from CURRENT_DEV. Arrange not
|
||||
to do anything more with this hierarchy. */
|
||||
error (0, errno, _("skipping %s, since it's on a different device"),
|
||||
quote (full_filename (subdir)));
|
||||
free (subdir);
|
||||
continue;
|
||||
AD_mark_current_as_unremovable (ds);
|
||||
tmp_status = RM_ERROR;
|
||||
UPDATE_STATUS (status, tmp_status);
|
||||
}
|
||||
|
||||
/* Execution reaches this point when we've removed the last
|
||||
removable entry from the current directory. */
|
||||
removable entry from the current directory -- or, with
|
||||
--one-file-system, when the current directory is on a
|
||||
different file system. */
|
||||
{
|
||||
/* The name of the directory that we have just processed,
|
||||
nominally removing all of its contents. */
|
||||
char *empty_dir;
|
||||
|
||||
AD_pop_and_chdir (&dirp, ds, &empty_dir);
|
||||
char *empty_dir = AD_pop_and_chdir (&dirp, ds);
|
||||
int fd = (dirp != NULL ? dirfd (dirp) : AT_FDCWD);
|
||||
assert (dirp != NULL || AD_stack_height (ds) == 1);
|
||||
|
||||
@@ -1348,8 +1397,8 @@ remove_dir (int fd_cwd, Dirstack_state *ds, char const *dir,
|
||||
But that's no big deal since we're interactive. */
|
||||
struct stat empty_st;
|
||||
Ternary is_empty;
|
||||
cache_stat_init (&empty_st);
|
||||
enum RM_status s = prompt (fd, ds, empty_dir, &empty_st, x,
|
||||
enum RM_status s = prompt (fd, ds, empty_dir,
|
||||
cache_stat_init (&empty_st), x,
|
||||
PA_REMOVE_DIR, &is_empty);
|
||||
|
||||
if (s != RM_OK)
|
||||
@@ -1416,11 +1465,12 @@ rm_1 (Dirstack_state *ds, char const *filename,
|
||||
|
||||
struct stat st;
|
||||
cache_stat_init (&st);
|
||||
cycle_check_init (&ds->cycle_check_state);
|
||||
if (x->root_dev_ino)
|
||||
{
|
||||
if (cache_fstatat (AT_FDCWD, filename, &st, AT_SYMLINK_NOFOLLOW) != 0)
|
||||
{
|
||||
if (errno == ENOENT && x->ignore_missing_files)
|
||||
if (ignorable_missing (x, errno))
|
||||
return RM_OK;
|
||||
error (0, errno, _("cannot remove %s"), quote (filename));
|
||||
return RM_ERROR;
|
||||
@@ -1435,8 +1485,7 @@ rm_1 (Dirstack_state *ds, char const *filename,
|
||||
AD_push_initial (ds);
|
||||
AD_INIT_OTHER_MEMBERS ();
|
||||
|
||||
int fd_cwd = AT_FDCWD;
|
||||
enum RM_status status = remove_entry (fd_cwd, ds, filename, &st, x, NULL);
|
||||
enum RM_status status = remove_entry (AT_FDCWD, ds, filename, &st, x, NULL);
|
||||
if (status == RM_NONEMPTY_DIR)
|
||||
{
|
||||
/* In the event that remove_dir->remove_cwd_entries detects
|
||||
@@ -1445,13 +1494,12 @@ rm_1 (Dirstack_state *ds, char const *filename,
|
||||
if (setjmp (ds->current_arg_jumpbuf))
|
||||
status = RM_ERROR;
|
||||
else
|
||||
status = remove_dir (fd_cwd, ds, filename, &st, x, cwd_errno);
|
||||
status = remove_dir (AT_FDCWD, ds, filename, &st, x, cwd_errno);
|
||||
|
||||
AD_stack_clear (ds);
|
||||
}
|
||||
|
||||
ds_clear (ds);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -1471,13 +1519,13 @@ rm (size_t n_files, char const *const *file, struct rm_options const *x)
|
||||
{
|
||||
error (0, 0, _("cannot remove relative-named %s"), quote (file[i]));
|
||||
status = RM_ERROR;
|
||||
continue;
|
||||
}
|
||||
|
||||
cycle_check_init (&ds->cycle_check_state);
|
||||
enum RM_status s = rm_1 (ds, file[i], x, &cwd_errno);
|
||||
assert (VALID_STATUS (s));
|
||||
UPDATE_STATUS (status, s);
|
||||
else
|
||||
{
|
||||
enum RM_status s = rm_1 (ds, file[i], x, &cwd_errno);
|
||||
assert (VALID_STATUS (s));
|
||||
UPDATE_STATUS (status, s);
|
||||
}
|
||||
}
|
||||
|
||||
if (x->require_restore_cwd && cwd_errno)
|
||||
|
||||
@@ -30,6 +30,14 @@ struct rm_options
|
||||
/* If true, query the user about whether to remove each file. */
|
||||
bool interactive;
|
||||
|
||||
/* If true, do not traverse into (or remove) any directory that is
|
||||
on a file system (i.e., that has a different device number) other
|
||||
than that of the corresponding command line argument. Note that
|
||||
even without this option, rm will fail in the end, due to its
|
||||
probable inability to remove the mount point. But there, the
|
||||
diagnostic comes too late -- after removing all contents. */
|
||||
bool one_file_system;
|
||||
|
||||
/* If true, recursively remove directories. */
|
||||
bool recursive;
|
||||
|
||||
|
||||
44
src/rm.c
44
src/rm.c
@@ -72,6 +72,7 @@ char *program_name;
|
||||
enum
|
||||
{
|
||||
INTERACTIVE_OPTION = CHAR_MAX + 1,
|
||||
ONE_FILE_SYSTEM,
|
||||
NO_PRESERVE_ROOT,
|
||||
PRESERVE_ROOT,
|
||||
PRESUME_INPUT_TTY_OPTION
|
||||
@@ -90,6 +91,7 @@ static struct option const long_opts[] =
|
||||
{"force", no_argument, NULL, 'f'},
|
||||
{"interactive", optional_argument, NULL, INTERACTIVE_OPTION},
|
||||
|
||||
{"one-file-system", no_argument, NULL, ONE_FILE_SYSTEM},
|
||||
{"no-preserve-root", no_argument, NULL, NO_PRESERVE_ROOT},
|
||||
{"preserve-root", no_argument, NULL, PRESERVE_ROOT},
|
||||
|
||||
@@ -168,6 +170,11 @@ Remove (unlink) the FILE(s).\n\
|
||||
while still giving protection against most mistakes\n\
|
||||
--interactive[=WHEN] prompt according to WHEN: never, once (-I), or\n\
|
||||
always (-i). Without WHEN, prompt always\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
--one-file-system when removing a hierarchy recursively, skip any\n\
|
||||
directory that is on a file system different from\n\
|
||||
that of the corresponding command line argument\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
--no-preserve-root do not treat `/' specially\n\
|
||||
@@ -207,6 +214,7 @@ rm_option_init (struct rm_options *x)
|
||||
{
|
||||
x->ignore_missing_files = false;
|
||||
x->interactive = false;
|
||||
x->one_file_system = false;
|
||||
x->recursive = false;
|
||||
x->root_dev_ino = NULL;
|
||||
x->stdin_tty = isatty (STDIN_FILENO);
|
||||
@@ -299,6 +307,10 @@ main (int argc, char **argv)
|
||||
break;
|
||||
}
|
||||
|
||||
case ONE_FILE_SYSTEM:
|
||||
x.one_file_system = true;
|
||||
break;
|
||||
|
||||
case NO_PRESERVE_ROOT:
|
||||
preserve_root = false;
|
||||
break;
|
||||
@@ -343,22 +355,20 @@ main (int argc, char **argv)
|
||||
quote ("/"));
|
||||
}
|
||||
|
||||
{
|
||||
size_t n_files = argc - optind;
|
||||
char const *const *file = (char const *const *) argv + optind;
|
||||
size_t n_files = argc - optind;
|
||||
char const *const *file = (char const *const *) argv + optind;
|
||||
|
||||
if (prompt_once && (x.recursive || 3 < n_files))
|
||||
{
|
||||
fprintf (stderr,
|
||||
(x.recursive
|
||||
? _("%s: remove all arguments recursively? ")
|
||||
: _("%s: remove all arguments? ")),
|
||||
program_name);
|
||||
if (!yesno ())
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
enum RM_status status = rm (n_files, file, &x);
|
||||
assert (VALID_STATUS (status));
|
||||
exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
}
|
||||
if (prompt_once && (x.recursive || 3 < n_files))
|
||||
{
|
||||
fprintf (stderr,
|
||||
(x.recursive
|
||||
? _("%s: remove all arguments recursively? ")
|
||||
: _("%s: remove all arguments? ")),
|
||||
program_name);
|
||||
if (!yesno ())
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
enum RM_status status = rm (n_files, file, &x);
|
||||
assert (VALID_STATUS (status));
|
||||
exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
@@ -92,6 +92,8 @@ omitted INCREMENT defaults to 1 even when LAST is smaller than FIRST.\n\
|
||||
FIRST, INCREMENT, and LAST are interpreted as floating point values.\n\
|
||||
INCREMENT is usually positive if FIRST is smaller than LAST, and\n\
|
||||
INCREMENT is usually negative if FIRST is greater than LAST.\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
FORMAT must be suitable for printing one argument of type `double';\n\
|
||||
it defaults to %.PRECf if FIRST, INCREMENT, and LAST are all fixed point\n\
|
||||
decimal numbers with maximum precision PREC, and to %g otherwise.\n\
|
||||
|
||||
@@ -220,6 +220,8 @@ version 3 clients\n\
|
||||
\n\
|
||||
* compressed file systems\n\
|
||||
\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
In the case of ext3 file systems, the above disclaimer applies\n\
|
||||
(and shred is thus of limited effectiveness) only in data=journal mode,\n\
|
||||
which journals file data in addition to just metadata. In both the\n\
|
||||
@@ -228,6 +230,8 @@ Ext3 journaling modes can be changed by adding the data=something option\n\
|
||||
to the mount options for a particular file system in the /etc/fstab file,\n\
|
||||
as documented in the mount man page (man mount).\n\
|
||||
\n\
|
||||
"), stdout);
|
||||
fputs (_("\
|
||||
In addition, file system backups and remote mirrors may contain copies\n\
|
||||
of the file that cannot be removed, and that will allow a shredded file\n\
|
||||
to be recovered later.\n\
|
||||
@@ -1091,7 +1095,7 @@ int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
bool ok = true;
|
||||
struct Options flags;
|
||||
struct Options flags = { 0, };
|
||||
char **file;
|
||||
int n_files;
|
||||
int c;
|
||||
@@ -1106,8 +1110,6 @@ main (int argc, char **argv)
|
||||
|
||||
atexit (close_stdout);
|
||||
|
||||
memset (&flags, 0, sizeof flags);
|
||||
|
||||
flags.n_iterations = DEFAULT_PASSES;
|
||||
flags.size = -1;
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@ read_input (FILE *in, char eolbyte, char ***pline)
|
||||
|
||||
do
|
||||
{
|
||||
if (alloc == used)
|
||||
if (alloc <= used + 1)
|
||||
{
|
||||
if (alloc == SIZE_MAX)
|
||||
xalloc_die ();
|
||||
@@ -279,6 +279,7 @@ main (int argc, char **argv)
|
||||
{
|
||||
unsigned long int argval = 0;
|
||||
char *p = strchr (optarg, '-');
|
||||
char const *hi_optarg = optarg;
|
||||
bool invalid = !p;
|
||||
|
||||
if (input_numbers_option_used (lo_input, hi_input))
|
||||
@@ -292,10 +293,10 @@ main (int argc, char **argv)
|
||||
|| SIZE_MAX < argval);
|
||||
*p = '-';
|
||||
lo_input = argval;
|
||||
optarg = p + 1;
|
||||
hi_optarg = p + 1;
|
||||
}
|
||||
|
||||
invalid |= ((xstrtoul (optarg, NULL, 10, &argval, NULL)
|
||||
invalid |= ((xstrtoul (hi_optarg, NULL, 10, &argval, NULL)
|
||||
!= LONGINT_OK)
|
||||
|| SIZE_MAX < argval);
|
||||
hi_input = argval;
|
||||
|
||||
20
src/sort.c
20
src/sort.c
@@ -337,7 +337,7 @@ Other options:\n\
|
||||
fputs (_("\
|
||||
\n\
|
||||
POS is F[.C][OPTS], where F is the field number and C the character position\n\
|
||||
in the field. If neither the -t nor the -b option is in effect, the characters\n\
|
||||
in the field; both are origin 1. If neither -t nor -b is in effect, characters\n\
|
||||
in a field are counted from the beginning of the preceding whitespace. OPTS is\n\
|
||||
one or more single-letter ordering options, which override global ordering\n\
|
||||
options for that key. If no key is given, use the entire line as the key.\n\
|
||||
@@ -2099,12 +2099,13 @@ sort (char * const *files, size_t nfiles, char const *output_file)
|
||||
}
|
||||
}
|
||||
|
||||
/* Insert key KEY at the end of the key list. */
|
||||
/* Insert a malloc'd copy of key KEY_ARG at the end of the key list. */
|
||||
|
||||
static void
|
||||
insertkey (struct keyfield *key)
|
||||
insertkey (struct keyfield *key_arg)
|
||||
{
|
||||
struct keyfield **p;
|
||||
struct keyfield *key = xmemdup (key_arg, sizeof *key);
|
||||
|
||||
for (p = &keylist; *p; p = &(*p)->next)
|
||||
continue;
|
||||
@@ -2271,9 +2272,9 @@ set_ordering (const char *s, struct keyfield *key, enum blanktype blanktype)
|
||||
}
|
||||
|
||||
static struct keyfield *
|
||||
new_key (void)
|
||||
key_init (struct keyfield *key)
|
||||
{
|
||||
struct keyfield *key = xzalloc (sizeof *key);
|
||||
memset (key, 0, sizeof *key);
|
||||
key->eword = SIZE_MAX;
|
||||
return key;
|
||||
}
|
||||
@@ -2282,6 +2283,7 @@ int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
struct keyfield *key;
|
||||
struct keyfield key_buf;
|
||||
struct keyfield gkey;
|
||||
char const *s;
|
||||
int c = 0;
|
||||
@@ -2292,7 +2294,7 @@ main (int argc, char **argv)
|
||||
size_t nfiles = 0;
|
||||
bool posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL);
|
||||
bool obsolete_usage = (posix2_version () < 200112);
|
||||
char *minus = "-", **files;
|
||||
char **files;
|
||||
char const *outfile = NULL;
|
||||
|
||||
initialize_main (&argc, &argv);
|
||||
@@ -2408,7 +2410,7 @@ main (int argc, char **argv)
|
||||
{
|
||||
/* Treat +POS1 [-POS2] as a key if possible; but silently
|
||||
treat an operand as a file if it is not a valid +POS1. */
|
||||
key = new_key ();
|
||||
key = key_init (&key_buf);
|
||||
s = parse_field_count (optarg + 1, &key->sword, NULL);
|
||||
if (s && *s == '.')
|
||||
s = parse_field_count (s + 1, &key->schar, NULL);
|
||||
@@ -2463,7 +2465,7 @@ main (int argc, char **argv)
|
||||
break;
|
||||
|
||||
case 'k':
|
||||
key = new_key ();
|
||||
key = key_init (&key_buf);
|
||||
|
||||
/* Get POS1. */
|
||||
s = parse_field_count (optarg, &key->sword,
|
||||
@@ -2657,7 +2659,9 @@ main (int argc, char **argv)
|
||||
|
||||
if (nfiles == 0)
|
||||
{
|
||||
static char *minus = "-";
|
||||
nfiles = 1;
|
||||
free (files);
|
||||
files = −
|
||||
}
|
||||
|
||||
|
||||
@@ -154,7 +154,7 @@ statfs (char const *filename, struct fs_info *buf)
|
||||
|
||||
enum
|
||||
{
|
||||
PRINTF_OPTION = CHAR_MAX + 1,
|
||||
PRINTF_OPTION = CHAR_MAX + 1
|
||||
};
|
||||
|
||||
static struct option const long_options[] = {
|
||||
|
||||
15
src/stty.c
15
src/stty.c
@@ -729,7 +729,10 @@ settings, CHAR is taken literally, or coded as in ^c, 0x37, 0177 or\n\
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
struct termios mode;
|
||||
/* Initialize to all zeroes so there is no risk memcmp will report a
|
||||
spurious difference in an uninitialized portion of the structure. */
|
||||
struct termios mode = { 0, };
|
||||
|
||||
enum output_type output_type;
|
||||
int optc;
|
||||
int argi = 0;
|
||||
@@ -840,9 +843,6 @@ main (int argc, char **argv)
|
||||
else
|
||||
device_name = _("standard input");
|
||||
|
||||
/* Initialize to all zeroes so there is no risk memcmp will report a
|
||||
spurious difference in an uninitialized portion of the structure. */
|
||||
memset (&mode, 0, sizeof (mode));
|
||||
if (tcgetattr (STDIN_FILENO, &mode))
|
||||
error (EXIT_FAILURE, errno, "%s", device_name);
|
||||
|
||||
@@ -1002,7 +1002,9 @@ main (int argc, char **argv)
|
||||
|
||||
if (require_set_attr)
|
||||
{
|
||||
struct termios new_mode;
|
||||
/* Initialize to all zeroes so there is no risk memcmp will report a
|
||||
spurious difference in an uninitialized portion of the structure. */
|
||||
struct termios new_mode = { 0, };
|
||||
|
||||
if (tcsetattr (STDIN_FILENO, TCSADRAIN, &mode))
|
||||
error (EXIT_FAILURE, errno, "%s", device_name);
|
||||
@@ -1014,9 +1016,6 @@ main (int argc, char **argv)
|
||||
this partial failure, get the current terminal attributes and
|
||||
compare them to the requested ones. */
|
||||
|
||||
/* Initialize to all zeroes so there is no risk memcmp will report a
|
||||
spurious difference in an uninitialized portion of the structure. */
|
||||
memset (&new_mode, 0, sizeof (new_mode));
|
||||
if (tcgetattr (STDIN_FILENO, &new_mode))
|
||||
error (EXIT_FAILURE, errno, "%s", device_name);
|
||||
|
||||
|
||||
45
src/system.h
45
src/system.h
@@ -117,18 +117,7 @@ you must include <sys/types.h> before including this file
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* The following test is to work around the gross typo in
|
||||
systems like Sony NEWS-OS Release 4.0C, whereby EXIT_FAILURE
|
||||
is defined to 0, not 1. */
|
||||
#if !EXIT_FAILURE
|
||||
# undef EXIT_FAILURE
|
||||
# define EXIT_FAILURE 1
|
||||
#endif
|
||||
|
||||
#ifndef EXIT_SUCCESS
|
||||
# define EXIT_SUCCESS 0
|
||||
#endif
|
||||
#include <exit.h>
|
||||
|
||||
/* Exit statuses for programs like 'env' that exec other programs.
|
||||
EXIT_FAILURE might not be 1, so use EXIT_FAIL in such programs. */
|
||||
@@ -206,11 +195,14 @@ enum
|
||||
/* Some systems, like Sequents, return st_blksize of 0 on pipes.
|
||||
Also, when running `rsh hpux11-system cat any-file', cat would
|
||||
determine that the output stream had an st_blksize of 2147421096.
|
||||
So here we arbitrarily limit the `optimal' block size to 4MB.
|
||||
If anyone knows of a system for which the legitimate value for
|
||||
st_blksize can exceed 4MB, please report it as a bug in this code. */
|
||||
Conversely st_blksize can be 2 GiB (or maybe even larger) with XFS
|
||||
on 64-bit hosts. Somewhat arbitrarily, limit the `optimal' block
|
||||
size to SIZE_MAX / 8 + 1. (Dividing SIZE_MAX by only 4 wouldn't
|
||||
suffice, since "cat" sometimes multiplies the result by 4.) If
|
||||
anyone knows of a system for which this limit is too small, please
|
||||
report it as a bug in this code. */
|
||||
# define ST_BLKSIZE(statbuf) ((0 < (statbuf).st_blksize \
|
||||
&& (statbuf).st_blksize <= (1 << 22)) /* 4MB */ \
|
||||
&& (statbuf).st_blksize <= SIZE_MAX / 8 + 1) \
|
||||
? (statbuf).st_blksize : DEV_BSIZE)
|
||||
# if defined hpux || defined __hpux__ || defined __hpux
|
||||
/* HP-UX counts st_blocks in 1024-byte units.
|
||||
@@ -301,7 +293,7 @@ select_plural (uintmax_t n)
|
||||
return (n <= ULONG_MAX ? n : n % PLURAL_REDUCER + PLURAL_REDUCER);
|
||||
}
|
||||
|
||||
#define STREQ(a, b) (strcmp ((a), (b)) == 0)
|
||||
#define STREQ(a, b) (strcmp (a, b) == 0)
|
||||
|
||||
#if !HAVE_DECL_FREE
|
||||
void free ();
|
||||
@@ -514,7 +506,7 @@ enum
|
||||
const char *s_ = (S); \
|
||||
size_t len_ = strlen (s_) + 1; \
|
||||
char *tmp_dest_ = alloca (len_); \
|
||||
DEST = memcpy (tmp_dest_, (s_), len_); \
|
||||
DEST = memcpy (tmp_dest_, s_, len_); \
|
||||
} \
|
||||
while (0)
|
||||
#endif
|
||||
@@ -523,10 +515,19 @@ enum
|
||||
# define EOVERFLOW EINVAL
|
||||
#endif
|
||||
|
||||
#if ! HAVE_FSEEKO && ! defined fseeko
|
||||
# define fseeko(s, o, w) ((o) == (long int) (o) \
|
||||
? fseek (s, o, w) \
|
||||
: (errno = EOVERFLOW, -1))
|
||||
#if ! HAVE_FSEEKO
|
||||
# if ! defined fseeko
|
||||
# define fseeko(s, o, w) ((o) == (long int) (o) \
|
||||
? fseek (s, o, w) \
|
||||
: (errno = EOVERFLOW, -1))
|
||||
# endif
|
||||
# if ! defined ftello
|
||||
static inline off_t ftello (FILE *stream)
|
||||
{
|
||||
verify (sizeof (long int) <= sizeof (off_t));
|
||||
return ftell (stream);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if ! HAVE_SYNC
|
||||
|
||||
@@ -78,7 +78,7 @@ tac -r -s '.\|
|
||||
char *program_name;
|
||||
|
||||
/* The string that separates the records of the file. */
|
||||
static char *separator;
|
||||
static char const *separator;
|
||||
|
||||
/* True if we have ever read standard input. */
|
||||
static bool have_read_stdin = false;
|
||||
@@ -211,7 +211,7 @@ tac_seekable (int input_fd, const char *file)
|
||||
Only used when the separator is attached to the preceding record. */
|
||||
bool first_time = true;
|
||||
char first_char = *separator; /* Speed optimization, non-regexp. */
|
||||
char *separator1 = separator + 1; /* Speed optimization, non-regexp. */
|
||||
char const *separator1 = separator + 1; /* Speed optimization, non-regexp. */
|
||||
size_t match_length1 = match_length - 1; /* Speed optimization, non-regexp. */
|
||||
struct re_registers regs;
|
||||
|
||||
@@ -426,7 +426,7 @@ static bool
|
||||
copy_to_temp (FILE **g_tmp, char **g_tempfile, int input_fd, char const *file)
|
||||
{
|
||||
static char *template = NULL;
|
||||
static char *tempdir;
|
||||
static char const *tempdir;
|
||||
char *tempfile;
|
||||
FILE *tmp;
|
||||
int fd;
|
||||
|
||||
@@ -292,7 +292,7 @@ valid_file_spec (struct File_spec const *f)
|
||||
return ((f->fd == -1) ^ (f->errnum == 0));
|
||||
}
|
||||
|
||||
static char *
|
||||
static char const *
|
||||
pretty_name (struct File_spec const *f)
|
||||
{
|
||||
return (STREQ (f->name, "-") ? "standard input" : f->name);
|
||||
|
||||
5
src/tr.c
5
src/tr.c
@@ -601,7 +601,7 @@ make_printable_str (char const *s, size_t len)
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
char buf[5];
|
||||
char *tmp = NULL;
|
||||
char const *tmp = NULL;
|
||||
unsigned char c = s[i];
|
||||
|
||||
switch (c)
|
||||
@@ -1177,9 +1177,8 @@ card_of_complement (struct Spec_list *s)
|
||||
{
|
||||
int c;
|
||||
int cardinality = N_CHARS;
|
||||
bool in_set[N_CHARS];
|
||||
bool in_set[N_CHARS] = { 0, };
|
||||
|
||||
memset (in_set, 0, sizeof in_set);
|
||||
s->state = BEGIN_STATE;
|
||||
while ((c = get_next (s, NULL)) != -1)
|
||||
{
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user