diff --git a/coreutils-6.10-configuration.patch b/coreutils-6.10-configuration.patch
index 4f52076..e2cf9cc 100644
--- a/coreutils-6.10-configuration.patch
+++ b/coreutils-6.10-configuration.patch
@@ -107,3 +107,38 @@ diff -urNp coreutils-8.4-orig/tests/touch/no-dereference coreutils-8.4/tests/tou
# Changing time of dangling symlink is okay.
# Skip the test if this fails, but the error text corresponds to
+diff -urNp coreutils-8.12-orig/src/Makefile.am coreutils-8.12/src/Makefile.am
+--- coreutils-8.12-orig/src/Makefile.am 2012-11-06 09:26:07.137152887 +0100
++++ coreutils-8.12/src/Makefile.am 2012-11-06 09:27:02.778884576 +0100
+@@ -139,7 +139,7 @@ bin_PROGRAMS = $(OPTIONAL_BIN_PROGS)
+
+ noinst_PROGRAMS = setuidgid getlimits
+
+-pkglib_PROGRAMS = $(OPTIONAL_PKGLIB_PROGS)
++pkglibexec_PROGRAMS = $(OPTIONAL_PKGLIB_PROGS)
+
+ noinst_HEADERS = \
+ chown-core.h \
+diff -urNp coreutils-8.12-orig/src/stdbuf.c coreutils-8.12/src/stdbuf.c
+--- coreutils-8.12-orig/src/stdbuf.c 2011-02-19 22:28:53.000000000 +0100
++++ coreutils-8.12/src/stdbuf.c 2012-11-06 09:28:24.504275850 +0100
+@@ -194,15 +194,14 @@ set_LD_PRELOAD (void)
+ char *LD_PRELOAD;
+
+ /* Note this would auto add the appropriate search path for "libstdbuf.so":
+- gcc stdbuf.c -Wl,-rpath,'$ORIGIN' -Wl,-rpath,$PKGLIBDIR
++ gcc stdbuf.c -Wl,-rpath,'$ORIGIN' -Wl,-rpath,$PKGLIBEXECDIR
+ However we want the lookup done for the exec'd command not stdbuf.
+
+- Since we don't link against libstdbuf.so add it to LIBDIR rather than
+- LIBEXECDIR, as we'll search for it in the "sys default" case below. */
++ Since we don't link against libstdbuf.so add it to PKGLIBEXECDIR
++ rather than to LIBDIR. */
+ char const *const search_path[] = {
+ program_path,
+- PKGLIBDIR,
+- "", /* sys default */
++ PKGLIBEXECDIR,
+ NULL
+ };
+
diff --git a/coreutils-8.12-chown.patch b/coreutils-8.12-chown.patch
new file mode 100644
index 0000000..679c949
--- /dev/null
+++ b/coreutils-8.12-chown.patch
@@ -0,0 +1,164 @@
+From 92625246f6c9614be5780a04eb227d6519becef5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?P=C3=A1draig=20Brady?=
+Date: Thu, 26 May 2011 11:15:11 +0100
+Subject: [PATCH] chown,chgrp: output the correct ownership in -v messages
+
+* src/chown_core.c (describe_change): Accept the ownership of
+the original file and output that when not changing.
+This is significant when --from is specified as then
+the original and specified ownership may be different.
+(user_group_str): A new helper function refactored from
+describe_change().
+(change_file_owner): Pass the original user and group
+strings to describe_change().
+* test/chown/basic: Add a test case.
+
+Signed-off-by: Kamil Dudka
+---
+ src/chown-core.c | 59 ++++++++++++++++++++++++++++++++++------------------
+ tests/chown/basic | 11 +++++++++
+ 2 files changed, 49 insertions(+), 21 deletions(-)
+
+diff --git a/src/chown-core.c b/src/chown-core.c
+index 82f7341..e72aa33 100644
+--- a/src/chown-core.c
++++ b/src/chown-core.c
+@@ -102,17 +102,44 @@ uid_to_name (uid_t uid)
+ : umaxtostr (uid, buf));
+ }
+
++/* Allocate a string representing USER and GROUP. */
++
++static char *
++user_group_str (char const *user, char const *group)
++{
++ char *spec;
++
++ if (user)
++ {
++ if (group)
++ {
++ spec = xmalloc (strlen (user) + 1 + strlen (group) + 1);
++ stpcpy (stpcpy (stpcpy (spec, user), ":"), group);
++ }
++ else
++ {
++ spec = xstrdup (user);
++ }
++ }
++ else
++ {
++ spec = xstrdup (group);
++ }
++
++ return spec;
++}
++
+ /* Tell the user how/if the user and group of FILE have been changed.
+ If USER is NULL, give the group-oriented messages.
+ CHANGED describes what (if anything) has happened. */
+
+ static void
+ describe_change (const char *file, enum Change_status changed,
++ char const *old_user, char const *old_group,
+ char const *user, char const *group)
+ {
+ const char *fmt;
+- char const *spec;
+- char *spec_allocated = NULL;
++ char *spec;
+
+ if (changed == CH_NOT_APPLIED)
+ {
+@@ -121,40 +148,25 @@ describe_change (const char *file, enum Change_status changed,
+ return;
+ }
+
+- if (user)
+- {
+- if (group)
+- {
+- spec_allocated = xmalloc (strlen (user) + 1 + strlen (group) + 1);
+- stpcpy (stpcpy (stpcpy (spec_allocated, user), ":"), group);
+- spec = spec_allocated;
+- }
+- else
+- {
+- spec = user;
+- }
+- }
+- else
+- {
+- spec = group;
+- }
+-
+ switch (changed)
+ {
+ case CH_SUCCEEDED:
+ fmt = (user ? _("changed ownership of %s to %s\n")
+ : group ? _("changed group of %s to %s\n")
+ : _("no change to ownership of %s\n"));
++ spec = user_group_str (user, group);
+ break;
+ case CH_FAILED:
+ fmt = (user ? _("failed to change ownership of %s to %s\n")
+ : group ? _("failed to change group of %s to %s\n")
+ : _("failed to change ownership of %s\n"));
++ spec = user_group_str (user, group);
+ break;
+ case CH_NO_CHANGE_REQUESTED:
+ fmt = (user ? _("ownership of %s retained as %s\n")
+ : group ? _("group of %s retained as %s\n")
+ : _("ownership of %s retained\n"));
++ spec = user_group_str (user ? old_user : NULL, group ? old_group : NULL);
+ break;
+ default:
+ abort ();
+@@ -162,7 +174,7 @@ describe_change (const char *file, enum Change_status changed,
+
+ printf (fmt, quote (file), spec);
+
+- free (spec_allocated);
++ free (spec);
+ }
+
+ /* Change the owner and/or group of the FILE to UID and/or GID (safely)
+@@ -459,8 +471,13 @@ change_file_owner (FTS *fts, FTSENT *ent,
+ : !symlink_changed ? CH_NOT_APPLIED
+ : !changed ? CH_NO_CHANGE_REQUESTED
+ : CH_SUCCEEDED);
++ char *old_usr = file_stats ? uid_to_name (file_stats->st_uid) : NULL;
++ char *old_grp = file_stats ? gid_to_name (file_stats->st_gid) : NULL;
+ describe_change (file_full_name, ch_status,
++ old_usr, old_grp,
+ chopt->user_name, chopt->group_name);
++ free (old_usr);
++ free (old_grp);
+ }
+ }
+
+diff --git a/tests/chown/basic b/tests/chown/basic
+index 0614f70..5626029 100755
+--- a/tests/chown/basic
++++ b/tests/chown/basic
+@@ -27,6 +27,17 @@ chown -R --preserve-root 0:1 f
+ # Make sure the owner and group are 0 and 1 respectively.
+ set _ `ls -n f`; shift; test "$3:$4" = 0:1 || fail=1
+
++# Make sure the correct diagnostic is output
++# Note we output a name even though an id was specified.
++chown -v --from=42 43 f > out || fail=1
++printf "ownership of \`f' retained as `id -nu`\n" > exp
++compare out exp || fail=1
++
++# Ensure diagnostics work for non existent files.
++chown -v 0 nf > out && fail=1
++printf "failed to change ownership of \`nf' to 0\n" > exp
++compare out exp || fail=1
++
+ chown --from=0:1 2:010 f || fail=1
+
+ # And now they should be 2 and 10 respectively.
+--
+1.7.1
+
diff --git a/coreutils-8.12-lssymlinkacl.patch b/coreutils-8.12-lssymlinkacl.patch
new file mode 100644
index 0000000..cb4f699
--- /dev/null
+++ b/coreutils-8.12-lssymlinkacl.patch
@@ -0,0 +1,59 @@
+diff -urNp coreutils-8.12-orig/lib/file-has-acl.c coreutils-8.12/lib/file-has-acl.c
+--- coreutils-8.12-orig/lib/file-has-acl.c 2012-03-26 10:18:40.496707657 +0200
++++ coreutils-8.12/lib/file-has-acl.c 2012-03-26 10:22:36.802430522 +0200
+@@ -322,6 +322,32 @@ acl_nontrivial (int count, struct acl *e
+
+ #endif
+
++/* acl_extended_file() tests whether a file has an ACL. But it can trigger
++ unnecessary autofs mounts. In newer versions of libacl, a function
++ acl_extended_file_nofollow() is available that uses lgetxattr() and
++ therefore does not have this problem. It is equivalent to
++ acl_extended_file(), except on symbolic links. */
++
++static int
++acl_extended_file_wrap (char const *name)
++{
++ if ( ! HAVE_ACL_EXTENDED_FILE)
++ return -1;
++
++ if (HAVE_ACL_EXTENDED_FILE_NOFOLLOW)
++ {
++ struct stat sb;
++ if (! lstat (name, &sb) && ! S_ISLNK (sb.st_mode))
++ /* acl_extended_file_nofollow() uses lgetxattr() in order to
++ prevent unnecessary mounts. It returns the same result as
++ acl_extended_file() since we already know that NAME is not a
++ symbolic link at this point (modulo the TOCTTOU race condition). */
++ return acl_extended_file_nofollow (name);
++ }
++
++ /* fallback for symlinks and old versions of libacl */
++ return acl_extended_file (name);
++}
+
+ /* Return 1 if NAME has a nontrivial access control list, 0 if NAME
+ only has no or a base access control list, and -1 (setting errno)
+@@ -339,20 +365,12 @@ file_has_acl (char const *name, struct s
+ /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+ int ret;
+
+- if (HAVE_ACL_EXTENDED_FILE || HAVE_ACL_EXTENDED_FILE_NOFOLLOW) /* Linux */
++ if (HAVE_ACL_EXTENDED_FILE) /* Linux */
+ {
+-# if HAVE_ACL_EXTENDED_FILE_NOFOLLOW
+- /* acl_extended_file_nofollow() uses lgetxattr() in order to prevent
+- unnecessary mounts, but it returns the same result as we already
+- know that NAME is not a symbolic link at this point (modulo the
+- TOCTTOU race condition). */
+- ret = acl_extended_file_nofollow (name);
+-# else
+ /* On Linux, acl_extended_file is an optimized function: It only
+ makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for
+ ACL_TYPE_DEFAULT. */
+- ret = acl_extended_file (name);
+-# endif
++ ret = acl_extended_file_wrap (name);
+ }
+ else /* FreeBSD, MacOS X, IRIX, Tru64 */
+ {
diff --git a/coreutils-8.17-cp-freememoryread.patch b/coreutils-8.17-cp-freememoryread.patch
new file mode 100644
index 0000000..be4a429
--- /dev/null
+++ b/coreutils-8.17-cp-freememoryread.patch
@@ -0,0 +1,29 @@
+diff -urNp coreutils-8.17-orig/src/extent-scan.c coreutils-8.17/src/extent-scan.c
+--- coreutils-8.17-orig/src/extent-scan.c 2012-05-02 10:31:47.000000000 +0200
++++ coreutils-8.17/src/extent-scan.c 2012-11-05 12:05:36.732370966 +0100
+@@ -89,7 +89,7 @@ extern bool
+ extent_scan_read (struct extent_scan *scan)
+ {
+ unsigned int si = 0;
+- struct extent_info *last_ei IF_LINT ( = scan->ext_info);
++ struct extent_info *last_ei = scan->ext_info;
+
+ while (true)
+ {
+@@ -127,8 +127,14 @@ extent_scan_read (struct extent_scan *sc
+
+ assert (scan->ei_count <= SIZE_MAX - fiemap->fm_mapped_extents);
+ scan->ei_count += fiemap->fm_mapped_extents;
+- scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count,
+- sizeof (struct extent_info));
++ {
++ /* last_ei points into a buffer that may be freed via xnrealloc.
++ Record its offset and adjust after allocation. */
++ size_t prev_idx = last_ei - scan->ext_info;
++ scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count,
++ sizeof (struct extent_info));
++ last_ei = scan->ext_info + prev_idx;
++ }
+
+ unsigned int i = 0;
+ for (i = 0; i < fiemap->fm_mapped_extents; i++)
diff --git a/coreutils-8.17-df-duplicates.patch b/coreutils-8.17-df-duplicates.patch
new file mode 100644
index 0000000..20c258e
--- /dev/null
+++ b/coreutils-8.17-df-duplicates.patch
@@ -0,0 +1,387 @@
+diff -urNp coreutils-8.12-orig/doc/coreutils.texi coreutils-8.12/doc/coreutils.texi
+--- coreutils-8.12-orig/doc/coreutils.texi 2011-04-25 10:55:27.000000000 +0200
++++ coreutils-8.12/doc/coreutils.texi 2012-12-12 13:28:29.588025346 +0100
+@@ -10379,6 +10379,14 @@ Normally the disk space is printed in un
+ 1024 bytes, but this can be overridden (@pxref{Block size}).
+ Non-integer quantities are rounded up to the next higher unit.
+
++For bind mounts and without arguments, @command{df} only outputs the statistics
++for the first occurence of that device in the list of file systems (@var{mtab}),
++i.e., it hides duplicate entries, unless the @option{-a} option is specified.
++
++By default, @command{df} omits the early-boot pseudo file system type
++@samp{rootfs}, unless the @option{-a} option is specified or that file system
++type is explicitly to be included by using the @option{-t} option.
++
+ @cindex disk device file
+ @cindex device file, disk
+ If an argument @var{file} is a disk device file containing a mounted
+diff -urNp coreutils-8.12-orig/src/df.c coreutils-8.12/src/df.c
+--- coreutils-8.12-orig/src/df.c 2011-04-25 11:45:49.000000000 +0200
++++ coreutils-8.12/src/df.c 2012-12-12 13:28:29.593156345 +0100
+@@ -25,6 +25,7 @@
+ #include
+
+ #include "system.h"
++#include "canonicalize.h"
+ #include "error.h"
+ #include "fsusage.h"
+ #include "human.h"
+@@ -45,6 +46,17 @@
+ /* If true, show inode information. */
+ static bool inode_format;
+
++/* Filled with device numbers of examined file systems to avoid
++ duplicities in output. */
++struct devlist
++{
++ dev_t dev_num;
++ struct devlist *next;
++};
++
++/* Store of already-processed device numbers. */
++static struct devlist *devlist_head;
++
+ /* If true, show even file systems with zero size or
+ uninteresting types. */
+ static bool show_all_fs;
+@@ -56,6 +68,12 @@ static bool show_local_fs;
+ command line argument -- even if it's a dummy (automounter) entry. */
+ static bool show_listed_fs;
+
++/* If true, include rootfs in the output. */
++static bool show_rootfs;
++
++/* The literal name of the initial root file system. */
++static char const *ROOTFS = "rootfs";
++
+ /* Human-readable options for output. */
+ static int human_output_opts;
+
+@@ -349,6 +367,29 @@ excluded_fstype (const char *fstype)
+ return false;
+ }
+
++/* Check if the device was already examined. */
++
++static bool
++dev_examined (char const *mount_dir, char const *devname)
++{
++ struct stat buf;
++ if (-1 == stat (mount_dir, &buf))
++ return false;
++
++ struct devlist *devlist = devlist_head;
++ for ( ; devlist; devlist = devlist->next)
++ if (devlist->dev_num == buf.st_dev)
++ return true;
++
++ /* Add the device number to the global list devlist. */
++ devlist = xmalloc (sizeof *devlist);
++ devlist->dev_num = buf.st_dev;
++ devlist->next = devlist_head;
++ devlist_head = devlist;
++
++ return false;
++}
++
+ /* Return true if N is a known integer value. On many file systems,
+ UINTMAX_MAX represents an unknown value; on AIX, UINTMAX_MAX - 1
+ represents unknown. Use a rule that works on AIX file systems, and
+@@ -417,6 +458,17 @@ add_uint_with_neg_flag (uintmax_t *dest,
+ *dest = -*dest;
+ }
+
++/* Return true if S ends in a string that may be a 36-byte UUID,
++ i.e., of the form HHHHHHHH-HHHH-HHHH-HHHH-HHHHHHHHHHHH, where
++ each H is an upper or lower case hexadecimal digit. */
++static bool _GL_ATTRIBUTE_PURE
++has_uuid_suffix (char const *s)
++{
++ size_t len = strlen (s);
++ return (36 < len
++ && strspn (s + len - 36, "-0123456789abcdefABCDEF") == 36);
++}
++
+ /* Optain a space listing for the disk device with absolute file name DISK.
+ If MOUNT_POINT is non-NULL, it is the name of the root of the
+ file system on DISK.
+@@ -428,13 +480,16 @@ add_uint_with_neg_flag (uintmax_t *dest,
+ If FSTYPE is non-NULL, it is the type of the file system on DISK.
+ If MOUNT_POINT is non-NULL, then DISK may be NULL -- certain systems may
+ not be able to produce statistics in this case.
+- ME_DUMMY and ME_REMOTE are the mount entry flags. */
++ ME_DUMMY and ME_REMOTE are the mount entry flags.
++ Caller must set PROCESS_ALL to true when iterating over all entries, as
++ when df is invoked with no non-option argument. See below for details. */
+
+ static void
+ get_dev (char const *disk, char const *mount_point,
+ char const *stat_file, char const *fstype,
+ bool me_dummy, bool me_remote,
+- const struct fs_usage *force_fsu)
++ const struct fs_usage *force_fsu,
++ bool process_all)
+ {
+ struct fs_usage fsu;
+ char buf[LONGEST_HUMAN_READABLE + 2];
+@@ -459,6 +514,15 @@ get_dev (char const *disk, char const *m
+ if (!selected_fstype (fstype) || excluded_fstype (fstype))
+ return;
+
++ if (process_all && !show_all_fs && !show_listed_fs)
++ {
++ /* No arguments nor "df -a", then check if df has to ... */
++ if (!show_rootfs && STREQ (disk, ROOTFS))
++ return; /* ... skip rootfs: (unless -trootfs is given. */
++ if (dev_examined (mount_point, disk))
++ return; /* ... skip duplicate entries (bind mounts). */
++ }
++
+ /* If MOUNT_POINT is NULL, then the file system is not mounted, and this
+ program reports on the file system that the special file is on.
+ It would be better to report on the unmounted file system,
+@@ -488,6 +552,24 @@ get_dev (char const *disk, char const *m
+
+ if (! disk)
+ disk = "-"; /* unknown */
++
++ char *dev_name = xstrdup (disk);
++ char *resolved_dev;
++
++ /* On some systems, dev_name is a long-named symlink like
++ /dev/disk/by-uuid/828fc648-9f30-43d8-a0b1-f7196a2edb66 pointing to a
++ much shorter and more useful name like /dev/sda1. It may also look
++ like /dev/mapper/luks-828fc648-9f30-43d8-a0b1-f7196a2edb66 and point to
++ /dev/dm-0. When process_all is true and dev_name is a symlink whose
++ name ends with a UUID use the resolved name instead. */
++ if (process_all
++ && has_uuid_suffix (dev_name)
++ && (resolved_dev = canonicalize_filename_mode (dev_name, CAN_EXISTING)))
++ {
++ free (dev_name);
++ dev_name = resolved_dev;
++ }
++
+ if (! fstype)
+ fstype = "-"; /* unknown */
+
+@@ -537,7 +619,7 @@ get_dev (char const *disk, char const *m
+ switch (field)
+ {
+ case DEV_FIELD:
+- cell = xstrdup (disk);
++ cell = dev_name;
+ break;
+
+ case TYPE_FIELD:
+@@ -648,7 +730,7 @@ get_disk (char const *disk)
+ {
+ get_dev (best_match->me_devname, best_match->me_mountdir, NULL,
+ best_match->me_type, best_match->me_dummy,
+- best_match->me_remote, NULL);
++ best_match->me_remote, NULL, false);
+ return true;
+ }
+
+@@ -734,7 +816,7 @@ get_point (const char *point, const stru
+ if (best_match)
+ get_dev (best_match->me_devname, best_match->me_mountdir, point,
+ best_match->me_type, best_match->me_dummy, best_match->me_remote,
+- NULL);
++ NULL, false);
+ else
+ {
+ /* We couldn't find the mount entry corresponding to POINT. Go ahead and
+@@ -745,7 +827,7 @@ get_point (const char *point, const stru
+ char *mp = find_mount_point (point, statp);
+ if (mp)
+ {
+- get_dev (NULL, mp, NULL, NULL, false, false, NULL);
++ get_dev (NULL, mp, NULL, NULL, false, false, NULL, false);
+ free (mp);
+ }
+ }
+@@ -774,7 +856,7 @@ get_all_entries (void)
+
+ for (me = mount_list; me; me = me->me_next)
+ get_dev (me->me_devname, me->me_mountdir, NULL, me->me_type,
+- me->me_dummy, me->me_remote, NULL);
++ me->me_dummy, me->me_remote, NULL, true);
+ }
+
+ /* Add FSTYPE to the list of file system types to display. */
+@@ -940,6 +1022,7 @@ main (int argc, char **argv)
+ /* Accept -F as a synonym for -t for compatibility with Solaris. */
+ case 't':
+ add_fs_type (optarg);
++ show_rootfs = selected_fstype (ROOTFS);
+ break;
+
+ case 'v': /* For SysV compatibility. */
+@@ -1066,13 +1149,21 @@ main (int argc, char **argv)
+ {
+ if (inode_format)
+ grand_fsu.fsu_blocks = 1;
+- get_dev ("total", NULL, NULL, NULL, false, false, &grand_fsu);
++ get_dev ("total", NULL, NULL, NULL, false, false, &grand_fsu, false);
+ }
+
+ print_table ();
+
+ if (! file_systems_processed)
+ error (EXIT_FAILURE, 0, _("no file systems processed"));
++ IF_LINT (
++ while (devlist_head)
++ {
++ struct devlist *devlist = devlist_head->next;
++ free (devlist_head);
++ devlist_head = devlist;
++ }
++ );
+
+ exit (exit_status);
+ }
+diff -urNp coreutils-8.12-orig/tests/df/skip-duplicates coreutils-8.12/tests/df/skip-duplicates
+--- coreutils-8.12-orig/tests/df/skip-duplicates 1970-01-01 01:00:00.000000000 +0100
++++ coreutils-8.12/tests/df/skip-duplicates 2012-12-12 13:28:29.590144032 +0100
+@@ -0,0 +1,77 @@
++#!/bin/sh
++# Test df's behavior when the mount list contains duplicate entries.
++# This test is skipped on systems that lack LD_PRELOAD support; that's fine.
++
++# Copyright (C) 2012 Free Software Foundation, Inc.
++
++# This program is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see .
++
++. "${srcdir=.}/init.sh"; path_prepend_ ../src
++print_ver_ df
++
++df || skip_ "df fails"
++
++# Simulate an mtab file with two entries of the same device number.
++cat > k.c <<'EOF' || framework_failure_
++#include
++#include
++
++struct mntent *getmntent (FILE *fp)
++{
++ /* Prove that LD_PRELOAD works. */
++ static int done = 0;
++ if (!done)
++ {
++ fclose (fopen ("x", "w"));
++ ++done;
++ }
++
++ static struct mntent mntent;
++
++ while (done++ < 3)
++ {
++ mntent.mnt_fsname = "fsname";
++ mntent.mnt_dir = "/";
++ mntent.mnt_type = "-";
++
++ return &mntent;
++ }
++ return NULL;
++}
++EOF
++
++# Then compile/link it:
++gcc --std=gnu99 -shared -fPIC -ldl -O2 k.c -o k.so \
++ || skip_ "getmntent hack does not work on this platform"
++
++# Test if LD_PRELOAD works:
++LD_PRELOAD=./k.so df
++test -f x || skip_ "internal test failure: maybe LD_PRELOAD doesn't work?"
++
++# The fake mtab file should only contain 2 entries, both
++# having the same device number; thus the output should
++# consist of a header and one entry.
++LD_PRELOAD=./k.so df >out || fail=1
++test $(wc -l out || fail=1
++test $(wc -l out || fail=1
++test $(wc -l .
++
++. "${srcdir=.}/init.sh"; path_prepend_ ../src
++print_ver_ df
++
++df || skip_ "df fails"
++
++# Verify that rootfs is in mtab (and shown when the -a option is specified).
++df -a >out || fail=1
++grep '^rootfs' out || skip_ "no rootfs in mtab"
++
++# Ensure that rootfs is supressed when no options is specified.
++df >out || fail=1
++grep '^rootfs' out && { fail=1; cat out; }
++
++# Ensure that the rootfs is shown when explicitly specifying "-t rootfs".
++df -t rootfs >out || fail=1
++grep '^rootfs' out || { fail=1; cat out; }
++
++# Ensure that the rootfs is shown when explicitly specifying "-t rootfs",
++# even when the -a option is specified.
++df -t rootfs -a >out || fail=1
++grep '^rootfs' out || { fail=1; cat out; }
++
++# Ensure that the rootfs is omitted in all_fs mode when it is explicitly
++# black-listed.
++df -a -x rootfs >out || fail=1
++grep '^rootfs' out && { fail=1; cat out; }
++
++Exit $fail
+diff -urNp coreutils-8.12-orig/tests/Makefile.am coreutils-8.12/tests/Makefile.am
+--- coreutils-8.12-orig/tests/Makefile.am 2011-04-25 11:45:27.000000000 +0200
++++ coreutils-8.12/tests/Makefile.am 2012-12-12 13:28:29.592155734 +0100
+@@ -352,6 +352,8 @@ TESTS = \
+ cp/symlink-slash \
+ cp/thru-dangling \
+ df/unreadable \
++ df/skip-duplicates \
++ df/skip-rootfs \
+ dd/direct \
+ dd/misc \
+ dd/nocache \
diff --git a/coreutils-8.2-uname-processortype.patch b/coreutils-8.2-uname-processortype.patch
index 166520d..4c83df8 100644
--- a/coreutils-8.2-uname-processortype.patch
+++ b/coreutils-8.2-uname-processortype.patch
@@ -16,7 +16,7 @@ diff -urNp coreutils-8.2-orig/src/uname.c coreutils-8.2/src/uname.c
}
+#else
+ {
-+ struct utsname u;
++ static struct utsname u;
+ uname(&u);
+ element = u.machine;
+ }
@@ -38,7 +38,7 @@ diff -urNp coreutils-8.2-orig/src/uname.c coreutils-8.2/src/uname.c
}
+#else
+ {
-+ struct utsname u;
++ static struct utsname u;
+ uname(&u);
+ element = u.machine;
+ if(strlen(element)==4 && element[0]=='i' && element[2]=='8' && element[3]=='6')
diff --git a/coreutils-8.5-pam.patch b/coreutils-8.5-pam.patch
index 71b85e7..8a924b2 100644
--- a/coreutils-8.5-pam.patch
+++ b/coreutils-8.5-pam.patch
@@ -106,7 +106,7 @@ index f8f5b61..811aad7 100644
static struct option const longopts[] =
{
{"command", required_argument, NULL, 'c'},
-@@ -200,7 +224,164 @@ log_su (struct passwd const *pw, bool successful)
+@@ -200,7 +224,174 @@ log_su (struct passwd const *pw, bool successful)
}
#endif
@@ -168,7 +168,7 @@ index f8f5b61..811aad7 100644
+create_watching_parent (void)
+{
+ pid_t child;
-+ sigset_t ourset;
++ sigset_t ourset, blockset;
+ int status = 0;
+
+ retval = pam_open_session (pamh, 0);
@@ -230,7 +230,17 @@ index f8f5b61..811aad7 100644
+
+ if (pid != (pid_t)-1 && WIFSTOPPED (status))
+ {
++ /* tcsh sends SIGTSTP to the process group, and so is already pending */
+ kill (getpid (), SIGSTOP);
++ if (WSTOPSIG(status) != SIGSTOP) {
++ sigemptyset(&blockset);
++ if (sigaddset(&blockset, WSTOPSIG(status)) ||
++ sigprocmask(SIG_UNBLOCK, &blockset, &ourset) ||
++ sigprocmask(SIG_SETMASK, &ourset, NULL))
++ {
++ error (0, errno, _("cannot set signal handler"));
++ }
++ }
+ /* once we get here, we must have resumed */
+ kill (pid, SIGCONT);
+ }
@@ -271,7 +281,7 @@ index f8f5b61..811aad7 100644
Return true if the user gives the correct password for entry PW,
false if not. Return true without asking for a password if run by UID 0
or if PW has an empty password. */
-@@ -208,10 +389,52 @@ log_su (struct passwd const *pw, bool successful)
+@@ -208,10 +399,52 @@ log_su (struct passwd const *pw, bool successful)
static bool
correct_password (const struct passwd *pw)
{
@@ -325,7 +335,7 @@ index f8f5b61..811aad7 100644
endspent ();
if (sp)
-@@ -232,6 +455,7 @@ correct_password (const struct passwd *pw)
+@@ -232,6 +465,7 @@ correct_password (const struct passwd *pw)
encrypted = crypt (unencrypted, correct);
memset (unencrypted, 0, strlen (unencrypted));
return STREQ (encrypted, correct);
@@ -333,7 +343,7 @@ index f8f5b61..811aad7 100644
}
/* Update `environ' for the new shell based on PW, with SHELL being
-@@ -274,19 +498,41 @@ modify_environment (const struct passwd *pw, const char *shell)
+@@ -274,19 +508,41 @@ modify_environment (const struct passwd *pw, const char *shell)
}
}
}
@@ -377,7 +387,7 @@ index f8f5b61..811aad7 100644
if (setgid (pw->pw_gid))
error (EXIT_CANCELED, errno, _("cannot set group id"));
if (setuid (pw->pw_uid))
-@@ -500,9 +746,21 @@ main (int argc, char **argv)
+@@ -500,9 +756,21 @@ main (int argc, char **argv)
shell = NULL;
}
shell = xstrdup (shell ? shell : pw->pw_shell);
diff --git a/coreutils-acl-extended-file-nofollow.patch b/coreutils-acl-extended-file-nofollow.patch
new file mode 100644
index 0000000..ad72293
--- /dev/null
+++ b/coreutils-acl-extended-file-nofollow.patch
@@ -0,0 +1,74 @@
+From 95f7c57ff4090a5dee062044d2c7b99879077808 Mon Sep 17 00:00:00 2001
+From: Kamil Dudka redhat.com>
+Date: Fri, 22 Jul 2011 14:48:42 +0200
+Subject: [PATCH] file-has-acl: use acl_extended_file_nofollow if available
+
+* lib/acl-internal.h (HAVE_ACL_EXTENDED_FILE): New macro.
+(acl_extended_file): New macro.
+* lib/file-has-acl.c (file_has_acl): Use acl_extended_file_nofollow.
+* m4/acl.m4 (gl_FUNC_ACL): Check for acl_extended_file_nofollow.
+This addresses http://bugzilla.redhat.com/692823.
+---
+ lib/acl-internal.h | 6 ++++++
+ lib/file-has-acl.c | 10 +++++++++-
+ m4/acl.m4 | 2 +-
+ 3 files changed, 16 insertions(+), 2 deletions(-)
+
+diff --git a/lib/acl-internal.h b/lib/acl-internal.h
+index b3160a7..b509666 100644
+--- a/lib/acl-internal.h
++++ b/lib/acl-internal.h
+@@ -133,6 +133,12 @@ rpl_acl_set_fd (int fd, acl_t acl)
+ # endif
+
+ /* Linux-specific */
++# ifndef HAVE_ACL_EXTENDED_FILE_NOFOLLOW
++# define HAVE_ACL_EXTENDED_FILE_NOFOLLOW false
++# define acl_extended_file_nofollow(name) (-1)
++# endif
++
++/* Linux-specific */
+ # ifndef HAVE_ACL_FROM_MODE
+ # define HAVE_ACL_FROM_MODE false
+ # define acl_from_mode(mode) (NULL)
+diff --git a/lib/file-has-acl.c b/lib/file-has-acl.c
+index 3d4d5c1..2ee6ba2 100644
+--- a/lib/file-has-acl.c
++++ b/lib/file-has-acl.c
+@@ -366,12 +366,20 @@ file_has_acl (char const *name, struct stat const *sb)
+ /* Linux, FreeBSD, MacOS X, IRIX, Tru64 */
+ int ret;
+
+- if (HAVE_ACL_EXTENDED_FILE) /* Linux */
++ if (HAVE_ACL_EXTENDED_FILE || HAVE_ACL_EXTENDED_FILE_NOFOLLOW) /* Linux */
+ {
++# if HAVE_ACL_EXTENDED_FILE_NOFOLLOW
++ /* acl_extended_file_nofollow() uses lgetxattr() in order to prevent
++ unnecessary mounts, but it returns the same result as we already
++ know that NAME is not a symbolic link at this point (modulo the
++ TOCTTOU race condition). */
++ ret = acl_extended_file_nofollow (name);
++# else
+ /* On Linux, acl_extended_file is an optimized function: It only
+ makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for
+ ACL_TYPE_DEFAULT. */
+ ret = acl_extended_file (name);
++# endif
+ }
+ else /* FreeBSD, MacOS X, IRIX, Tru64 */
+ {
+diff --git a/m4/acl.m4 b/m4/acl.m4
+index d6a448a..ecf0384 100644
+--- a/m4/acl.m4
++++ b/m4/acl.m4
+@@ -33,7 +33,7 @@ AC_DEFUN([gl_FUNC_ACL],
+ AC_CHECK_FUNCS(
+ [acl_get_file acl_get_fd acl_set_file acl_set_fd \
+ acl_free acl_from_mode acl_from_text \
+- acl_delete_def_file acl_extended_file \
++ acl_delete_def_file acl_extended_file acl_extended_file_nofollow \
+ acl_delete_fd_np acl_delete_file_np \
+ acl_copy_ext_native acl_create_entry_np \
+ acl_to_short_text acl_free_text])
+--
+1.7.6.586.g302e6
diff --git a/coreutils-colorls.csh b/coreutils-colorls.csh
index 7e3d794..a8b9d57 100755
--- a/coreutils-colorls.csh
+++ b/coreutils-colorls.csh
@@ -1,4 +1,3 @@
-#! /bin/csh -f
# color-ls initialization
if ( $?USER_LS_COLORS ) then
if ( "$USER_LS_COLORS" != "" ) then
@@ -15,12 +14,12 @@ if ($?TERM) then
if ( -e "/etc/DIR_COLORS.$TERM" ) then
set COLORS="/etc/DIR_COLORS.$TERM"
endif
-endif
-if ( -e "/etc/DIR_COLORS.256color" ) then
- if ( "`tty -s && tput colors`" == "256" ) then
- set COLORS=/etc/DIR_COLORS.256color
+ if ( -e "/etc/DIR_COLORS.256color" ) then
+ if ( "`tput colors`" == "256" ) then
+ set COLORS=/etc/DIR_COLORS.256color
endif
endif
+endif
if ( -f ~/.dircolors ) set COLORS=~/.dircolors
if ( -f ~/.dir_colors ) set COLORS=~/.dir_colors
if ($?TERM) then
diff --git a/coreutils-df-direct.patch b/coreutils-df-direct.patch
index 025323d..d242ffc 100644
--- a/coreutils-df-direct.patch
+++ b/coreutils-df-direct.patch
@@ -67,7 +67,7 @@ diff -urNp coreutils-8.11-orig/src/df.c coreutils-8.11/src/df.c
+ char *resolved = canonicalize_file_name (name);
+ if (resolved)
+ {
-+ get_dev (NULL, resolved, NULL, NULL, false, false, NULL);
++ get_dev (NULL, resolved, NULL, NULL, false, false, NULL, false);
+ free (resolved);
+ return;
+ }
diff --git a/coreutils-i18n.patch b/coreutils-i18n.patch
index 6e10f37..043f72b 100644
--- a/coreutils-i18n.patch
+++ b/coreutils-i18n.patch
@@ -1,6 +1,6 @@
-diff -urNp coreutils-8.10-orig/lib/linebuffer.h coreutils-8.10/lib/linebuffer.h
---- coreutils-8.10-orig/lib/linebuffer.h 2011-01-06 09:47:56.000000000 +0100
-+++ coreutils-8.10/lib/linebuffer.h 2011-02-04 20:13:23.985464731 +0100
+diff -urNp coreutils-8.12-orig/lib/linebuffer.h coreutils-8.12/lib/linebuffer.h
+--- coreutils-8.12-orig/lib/linebuffer.h 2011-04-24 19:21:45.000000000 +0200
++++ coreutils-8.12/lib/linebuffer.h 2012-03-26 10:10:44.383439379 +0200
@@ -21,6 +21,11 @@
# include
@@ -23,9 +23,9 @@ diff -urNp coreutils-8.10-orig/lib/linebuffer.h coreutils-8.10/lib/linebuffer.h
};
/* Initialize linebuffer LINEBUFFER for use. */
-diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
---- coreutils-8.10-orig/src/cut.c 2011-01-31 13:40:38.000000000 +0100
-+++ coreutils-8.10/src/cut.c 2011-02-04 20:13:23.988464025 +0100
+diff -urNp coreutils-8.12-orig/src/cut.c coreutils-8.12/src/cut.c
+--- coreutils-8.12-orig/src/cut.c 2011-02-19 18:17:03.000000000 +0100
++++ coreutils-8.12/src/cut.c 2012-03-26 10:10:44.385806690 +0200
@@ -28,6 +28,11 @@
#include
#include
@@ -75,7 +75,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
+ while (0)
+
+/* Get wide character on BUFPOS. BUFPOS is not included after that.
-+ If byte sequence is not valid as a character, CONVFAIL is 1. Otherwise 0. */
++ If byte sequence is not valid as a character, CONVFAIL is 1. Otherwise 0. */
+#define GET_NEXT_WC_FROM_BUFFER(WC, BUFPOS, BUFLEN, MBLENGTH, STATE, CONVFAIL) \
+ do \
+ { \
@@ -226,7 +226,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
}
max_range_endpoint = 0;
-@@ -580,6 +662,63 @@ cut_bytes (FILE *stream)
+@@ -582,6 +664,77 @@ cut_bytes (FILE *stream)
}
}
@@ -234,11 +234,11 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
+/* This function is in use for the following case.
+
+ 1. Read from the stream STREAM, printing to standard output any selected
-+ characters.
++ characters.
+
+ 2. Read from stream STREAM, printing to standard output any selected bytes,
+ without splitting multibyte characters. */
-+
++
+static void
+cut_characters_or_cut_bytes_no_split (FILE *stream)
+{
@@ -251,6 +251,9 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
+ as same character as WC. */
+ mbstate_t state; /* State of the stream. */
+ int convfail = 0; /* 1, when conversion is failed. Otherwise 0. */
++ /* Whether to begin printing delimiters between ranges for the current line.
++ Set after we've begun printing data corresponding to the first range. */
++ bool print_delimiter = false;
+
+ idx = 0;
+ buflen = 0;
@@ -273,12 +276,23 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
+ {
+ putchar ('\n');
+ idx = 0;
++ print_delimiter = false;
+ }
+ else
+ {
++ bool range_start;
++ bool *rs = output_delimiter_specified ? &range_start : NULL;
+ idx += (operating_mode == byte_mode) ? mblength : 1;
-+ if (print_kth (idx, NULL))
-+ fwrite (bufpos, mblength, sizeof(char), stdout);
++ if (print_kth (idx, rs))
++ {
++ if (rs && *rs && print_delimiter)
++ {
++ fwrite (output_delimiter_string, sizeof (char),
++ output_delimiter_length, stdout);
++ }
++ print_delimiter = true;
++ fwrite (bufpos, mblength, sizeof(char), stdout);
++ }
+ }
+
+ buflen -= mblength;
@@ -286,11 +300,11 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
+ }
+}
+#endif
-+
++
/* Read from stream STREAM, printing to standard output any selected fields. */
static void
-@@ -702,13 +841,192 @@ cut_fields (FILE *stream)
+@@ -704,13 +857,195 @@ cut_fields (FILE *stream)
}
}
@@ -310,7 +324,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
+ size_t mblength; /* The byte size of a multibyte character which shows
+ as same character as WC. */
+ mbstate_t state; /* State of the stream. */
-+ int convfail; /* 1, when conversion is failed. Otherwise 0. */
++ int convfail = 0; /* 1, when conversion is failed. Otherwise 0. */
+
+ found_any_selected_field = 0;
+ field_idx = 1;
@@ -321,7 +335,10 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
+ c = getc (stream);
+ empty_input = (c == EOF);
+ if (c != EOF)
++ {
+ ungetc (c, stream);
++ wc = 0;
++ }
+ else
+ wc = WEOF;
+
@@ -359,7 +376,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
+ break;
+ }
+
-+ if (wc == WEOF)
++ if (len<=0 && wc == WEOF)
+ break;
+
+ /* If the first field extends to the end of line (it is not
@@ -486,7 +503,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
}
/* Process file FILE to standard output.
-@@ -760,6 +1078,8 @@ main (int argc, char **argv)
+@@ -762,6 +1097,8 @@ main (int argc, char **argv)
bool ok;
bool delim_specified = false;
char *spec_list_string IF_LINT ( = NULL);
@@ -495,7 +512,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
initialize_main (&argc, &argv);
set_program_name (argv[0]);
-@@ -782,7 +1102,6 @@ main (int argc, char **argv)
+@@ -784,7 +1121,6 @@ main (int argc, char **argv)
switch (optc)
{
case 'b':
@@ -503,7 +520,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
/* Build the byte list. */
if (operating_mode != undefined_mode)
FATAL_ERROR (_("only one type of list may be specified"));
-@@ -790,6 +1109,14 @@ main (int argc, char **argv)
+@@ -792,6 +1128,14 @@ main (int argc, char **argv)
spec_list_string = optarg;
break;
@@ -518,7 +535,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
case 'f':
/* Build the field list. */
if (operating_mode != undefined_mode)
-@@ -801,10 +1128,35 @@ main (int argc, char **argv)
+@@ -803,10 +1147,35 @@ main (int argc, char **argv)
case 'd':
/* New delimiter. */
/* Interpret -d '' to mean `use the NUL byte as the delimiter.' */
@@ -558,7 +575,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
break;
case OUTPUT_DELIMITER_OPTION:
-@@ -817,6 +1169,7 @@ main (int argc, char **argv)
+@@ -819,6 +1188,7 @@ main (int argc, char **argv)
break;
case 'n':
@@ -566,7 +583,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
break;
case 's':
-@@ -839,7 +1192,7 @@ main (int argc, char **argv)
+@@ -841,7 +1211,7 @@ main (int argc, char **argv)
if (operating_mode == undefined_mode)
FATAL_ERROR (_("you must specify a list of bytes, characters, or fields"));
@@ -575,7 +592,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
FATAL_ERROR (_("an input delimiter may be specified only\
when operating on fields"));
-@@ -866,15 +1219,34 @@ main (int argc, char **argv)
+@@ -868,15 +1238,34 @@ main (int argc, char **argv)
}
if (!delim_specified)
@@ -607,7 +624,7 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
+ if (MB_CUR_MAX <= 1 || force_singlebyte_mode)
+#endif
+ {
-+ static char dummy[2];
++ static char dummy[2];
+ dummy[0] = delim;
+ dummy[1] = '\0';
+ output_delimiter_string = dummy;
@@ -616,9 +633,9 @@ diff -urNp coreutils-8.10-orig/src/cut.c coreutils-8.10/src/cut.c
}
if (optind == argc)
-diff -urNp coreutils-8.10-orig/src/expand.c coreutils-8.10/src/expand.c
---- coreutils-8.10-orig/src/expand.c 2011-01-31 13:40:38.000000000 +0100
-+++ coreutils-8.10/src/expand.c 2011-02-04 20:13:23.990463571 +0100
+diff -urNp coreutils-8.12-orig/src/expand.c coreutils-8.12/src/expand.c
+--- coreutils-8.12-orig/src/expand.c 2011-02-19 18:17:03.000000000 +0100
++++ coreutils-8.12/src/expand.c 2012-03-26 10:10:44.386455034 +0200
@@ -38,12 +38,29 @@
#include
#include
@@ -716,7 +733,7 @@ diff -urNp coreutils-8.10-orig/src/expand.c coreutils-8.10/src/expand.c
+ if (convert)
+ {
+ ++column;
-+ if (convert_entire_line == 0)
++ if (convert_entire_line == 0 && !isblank(*bufpos))
+ convert = 0;
+ }
+ putchar (*bufpos);
@@ -776,7 +793,7 @@ diff -urNp coreutils-8.10-orig/src/expand.c coreutils-8.10/src/expand.c
+
+ width = wcwidth (wc);
+ column += (width > 0) ? width : 0;
-+ if (convert_entire_line == 0)
++ if (convert_entire_line == 0 && !iswblank(wc))
+ convert = 0;
+ }
+ }
@@ -806,9 +823,9 @@ diff -urNp coreutils-8.10-orig/src/expand.c coreutils-8.10/src/expand.c
if (have_read_stdin && fclose (stdin) != 0)
error (EXIT_FAILURE, errno, "-");
-diff -urNp coreutils-8.10-orig/src/fold.c coreutils-8.10/src/fold.c
---- coreutils-8.10-orig/src/fold.c 2011-01-31 13:40:38.000000000 +0100
-+++ coreutils-8.10/src/fold.c 2011-02-04 20:13:23.992463115 +0100
+diff -urNp coreutils-8.12-orig/src/fold.c coreutils-8.12/src/fold.c
+--- coreutils-8.12-orig/src/fold.c 2011-02-19 18:17:03.000000000 +0100
++++ coreutils-8.12/src/fold.c 2012-03-26 10:10:44.388464872 +0200
@@ -22,12 +22,34 @@
#include
#include
@@ -1067,7 +1084,7 @@ diff -urNp coreutils-8.10-orig/src/fold.c coreutils-8.10/src/fold.c
+ fwrite (line_out, sizeof(char), offset_out, stdout);
+ START_NEW_LINE;
+ continue;
-+
++
+ case L'\b':
+ increment = (column > 0) ? -1 : 0;
+ break;
@@ -1179,7 +1196,7 @@ diff -urNp coreutils-8.10-orig/src/fold.c coreutils-8.10/src/fold.c
if (ferror (istream))
{
error (0, saved_errno, "%s", filename);
-@@ -254,7 +502,8 @@ main (int argc, char **argv)
+@@ -254,7 +501,8 @@ main (int argc, char **argv)
atexit (close_stdout);
@@ -1189,7 +1206,7 @@ diff -urNp coreutils-8.10-orig/src/fold.c coreutils-8.10/src/fold.c
while ((optc = getopt_long (argc, argv, shortopts, longopts, NULL)) != -1)
{
-@@ -263,7 +512,15 @@ main (int argc, char **argv)
+@@ -263,7 +511,15 @@ main (int argc, char **argv)
switch (optc)
{
case 'b': /* Count bytes rather than columns. */
@@ -1206,9 +1223,9 @@ diff -urNp coreutils-8.10-orig/src/fold.c coreutils-8.10/src/fold.c
break;
case 's': /* Break at word boundaries. */
-diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c
---- coreutils-8.10-orig/src/join.c 2011-01-31 13:40:38.000000000 +0100
-+++ coreutils-8.10/src/join.c 2011-02-04 20:20:15.985114387 +0100
+diff -urNp coreutils-8.12-orig/src/join.c coreutils-8.12/src/join.c
+--- coreutils-8.12-orig/src/join.c 2011-02-19 18:17:03.000000000 +0100
++++ coreutils-8.12/src/join.c 2012-03-26 10:10:44.390449445 +0200
@@ -22,18 +22,32 @@
#include
#include
@@ -1423,7 +1440,7 @@ diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c
+ extract_field (line, ptr, lim - ptr);
+}
+#endif
-+
++
static void
freeline (struct line *line)
{
@@ -1551,7 +1568,7 @@ diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c
- return xmemcoll (beg1, len1, beg2, len2);
- diff = memcmp (beg1, beg2, MIN (len1, len2));
+ copy[0] = (unsigned char *) beg[0];
-+ copy[1] = (unsigned char *) beg[1];
++ copy[1] = (unsigned char *) beg[1];
}
+ if (hard_LC_COLLATE)
@@ -1632,7 +1649,7 @@ diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c
case 't':
{
- unsigned char newtab = optarg[0];
-+ char *newtab;
++ char *newtab = NULL;
+ size_t newtablen;
+ newtab = xstrdup (optarg);
+#if HAVE_MBRTOWC
@@ -1653,8 +1670,9 @@ diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c
+#endif
+ newtablen = 1;
if (! newtab)
+- newtab = '\n'; /* '' => process the whole line. */
+ {
- newtab = '\n'; /* '' => process the whole line. */
++ newtab = "\n"; /* '' => process the whole line. */
+ }
else if (optarg[1])
{
@@ -1683,9 +1701,9 @@ diff -urNp coreutils-8.10-orig/src/join.c coreutils-8.10/src/join.c
break;
case NOCHECK_ORDER_OPTION:
-diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
---- coreutils-8.10-orig/src/pr.c 2011-01-31 13:40:38.000000000 +0100
-+++ coreutils-8.10/src/pr.c 2011-02-04 20:13:24.002460897 +0100
+diff -urNp coreutils-8.12-orig/src/pr.c coreutils-8.12/src/pr.c
+--- coreutils-8.12-orig/src/pr.c 2011-04-25 11:45:49.000000000 +0200
++++ coreutils-8.12/src/pr.c 2012-03-26 10:10:44.394824042 +0200
@@ -312,6 +312,32 @@
#include
@@ -1963,7 +1981,19 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
if (*arg)
{
long int tmp_long;
-@@ -1249,7 +1375,7 @@ init_parameters (int number_of_files)
+@@ -1212,6 +1338,11 @@ static void
+ init_parameters (int number_of_files)
+ {
+ int chars_used_by_number = 0;
++ int mb_len = 1;
++#if HAVE_MBRTOWC
++ if (MB_CUR_MAX > 1)
++ mb_len = MB_LEN_MAX;
++#endif
+
+ lines_per_body = lines_per_page - lines_per_header - lines_per_footer;
+ if (lines_per_body <= 0)
+@@ -1249,7 +1380,7 @@ init_parameters (int number_of_files)
else
col_sep_string = column_separator;
@@ -1972,7 +2002,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
use_col_separator = true;
}
/* It's rather pointless to define a TAB separator with column
-@@ -1280,11 +1406,11 @@ init_parameters (int number_of_files)
+@@ -1280,11 +1411,11 @@ init_parameters (int number_of_files)
TAB_WIDTH (chars_per_input_tab, chars_per_number); */
/* Estimate chars_per_text without any margin and keep it constant. */
@@ -1986,7 +2016,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
/* The number is part of the column width unless we are
printing files in parallel. */
-@@ -1299,7 +1425,7 @@ init_parameters (int number_of_files)
+@@ -1299,7 +1430,7 @@ init_parameters (int number_of_files)
}
chars_per_column = (chars_per_line - chars_used_by_number -
@@ -1995,7 +2025,16 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
if (chars_per_column < 1)
error (EXIT_FAILURE, 0, _("page width too narrow"));
-@@ -1424,7 +1550,7 @@ init_funcs (void)
+@@ -1316,7 +1447,7 @@ init_parameters (int number_of_files)
+ We've to use 8 as the lower limit, if we use chars_per_default_tab = 8
+ to expand a tab which is not an input_tab-char. */
+ free (clump_buff);
+- clump_buff = xmalloc (MAX (8, chars_per_input_tab));
++ clump_buff = xmalloc (mb_len * MAX (8, chars_per_input_tab));
+ }
+
+ /* Open the necessary files,
+@@ -1424,7 +1555,7 @@ init_funcs (void)
/* Enlarge p->start_position of first column to use the same form of
padding_not_printed with all columns. */
@@ -2004,7 +2043,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
/* This loop takes care of all but the rightmost column. */
-@@ -1458,7 +1584,7 @@ init_funcs (void)
+@@ -1458,7 +1589,7 @@ init_funcs (void)
}
else
{
@@ -2013,7 +2052,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
h_next = h + chars_per_column;
}
}
-@@ -1749,9 +1875,9 @@ static void
+@@ -1749,9 +1880,9 @@ static void
align_column (COLUMN *p)
{
padding_not_printed = p->start_position;
@@ -2025,7 +2064,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
padding_not_printed = ANYWHERE;
}
-@@ -2022,13 +2148,13 @@ store_char (char c)
+@@ -2022,13 +2153,13 @@ store_char (char c)
/* May be too generous. */
buff = X2REALLOC (buff, &buff_allocated);
}
@@ -2041,7 +2080,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
char *s;
int left_cut;
-@@ -2051,22 +2177,24 @@ add_line_number (COLUMN *p)
+@@ -2051,22 +2182,24 @@ add_line_number (COLUMN *p)
/* Tabification is assumed for multiple columns, also for n-separators,
but `default n-separator = TAB' hasn't been given priority over
equal column_width also specified by POSIX. */
@@ -2070,7 +2109,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
output_position = POS_AFTER_TAB (chars_per_output_tab,
output_position);
}
-@@ -2227,7 +2355,7 @@ print_white_space (void)
+@@ -2227,7 +2360,7 @@ print_white_space (void)
while (goal - h_old > 1
&& (h_new = POS_AFTER_TAB (chars_per_output_tab, h_old)) <= goal)
{
@@ -2079,7 +2118,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
h_old = h_new;
}
while (++h_old <= goal)
-@@ -2247,6 +2375,7 @@ print_sep_string (void)
+@@ -2247,6 +2380,7 @@ print_sep_string (void)
{
char *s;
int l = col_sep_length;
@@ -2087,7 +2126,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
s = col_sep_string;
-@@ -2260,6 +2389,7 @@ print_sep_string (void)
+@@ -2260,6 +2394,7 @@ print_sep_string (void)
{
for (; separators_not_printed > 0; --separators_not_printed)
{
@@ -2095,7 +2134,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
while (l-- > 0)
{
/* 3 types of sep_strings: spaces only, spaces and chars,
-@@ -2273,12 +2403,15 @@ print_sep_string (void)
+@@ -2273,12 +2408,15 @@ print_sep_string (void)
}
else
{
@@ -2112,7 +2151,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
/* sep_string ends with some spaces */
if (spaces_not_printed > 0)
print_white_space ();
-@@ -2306,7 +2439,7 @@ print_clump (COLUMN *p, int n, char *clu
+@@ -2306,7 +2444,7 @@ print_clump (COLUMN *p, int n, char *clu
required number of tabs and spaces. */
static void
@@ -2121,7 +2160,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
{
if (tabify_output)
{
-@@ -2330,6 +2463,74 @@ print_char (char c)
+@@ -2330,6 +2468,74 @@ print_char (char c)
putchar (c);
}
@@ -2196,7 +2235,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
/* Skip to page PAGE before printing.
PAGE may be larger than total number of pages. */
-@@ -2509,9 +2710,9 @@ read_line (COLUMN *p)
+@@ -2509,9 +2715,9 @@ read_line (COLUMN *p)
align_empty_cols = false;
}
@@ -2208,7 +2247,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
padding_not_printed = ANYWHERE;
}
-@@ -2612,9 +2813,9 @@ print_stored (COLUMN *p)
+@@ -2612,9 +2818,9 @@ print_stored (COLUMN *p)
}
}
@@ -2220,7 +2259,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
padding_not_printed = ANYWHERE;
}
-@@ -2627,8 +2828,8 @@ print_stored (COLUMN *p)
+@@ -2627,8 +2833,8 @@ print_stored (COLUMN *p)
if (spaces_not_printed == 0)
{
output_position = p->start_position + end_vector[line];
@@ -2231,7 +2270,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
}
return true;
-@@ -2647,7 +2848,7 @@ print_stored (COLUMN *p)
+@@ -2647,7 +2853,7 @@ print_stored (COLUMN *p)
number of characters is 1.) */
static int
@@ -2240,7 +2279,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
{
unsigned char uc = c;
char *s = clump_buff;
-@@ -2657,10 +2858,10 @@ char_to_clump (char c)
+@@ -2657,10 +2863,10 @@ char_to_clump (char c)
int chars;
int chars_per_c = 8;
@@ -2253,7 +2292,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
{
width = TAB_WIDTH (chars_per_c, input_position);
-@@ -2741,6 +2942,154 @@ char_to_clump (char c)
+@@ -2741,6 +2947,154 @@ char_to_clump (char c)
return chars;
}
@@ -2298,7 +2337,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
+ width = +4;
+ chars = +4;
+ *s++ = '\\';
-+ sprintf (esc_buff, "%03o", mbc[0]);
++ sprintf (esc_buff, "%03o", (unsigned char) mbc[0]);
+ for (i = 0; i <= 2; ++i)
+ *s++ = (int) esc_buff[i];
+ }
@@ -2347,7 +2386,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
+ width += 4;
+ chars += 4;
+ *s++ = '\\';
-+ sprintf (esc_buff, "%03o", c);
++ sprintf (esc_buff, "%03o", (unsigned char) mbc[i]);
+ for (j = 0; j <= 2; ++j)
+ *s++ = (int) esc_buff[j];
+ }
@@ -2368,7 +2407,7 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
+ width += 4;
+ chars += 4;
+ *s++ = '\\';
-+ sprintf (esc_buff, "%03o", c);
++ sprintf (esc_buff, "%03o", (unsigned char) mbc[i]);
+ for (j = 0; j <= 2; ++j)
+ *s++ = (int) esc_buff[j];
+ }
@@ -2408,9 +2447,9 @@ diff -urNp coreutils-8.10-orig/src/pr.c coreutils-8.10/src/pr.c
/* We've just printed some files and need to clean up things before
looking for more options and printing the next batch of files.
-diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
---- coreutils-8.10-orig/src/sort.c 2011-02-03 11:24:35.000000000 +0100
-+++ coreutils-8.10/src/sort.c 2011-02-04 20:15:44.160384535 +0100
+diff -urNp coreutils-8.12-orig/src/sort.c coreutils-8.12/src/sort.c
+--- coreutils-8.12-orig/src/sort.c 2011-04-25 11:45:49.000000000 +0200
++++ coreutils-8.12/src/sort.c 2012-03-26 10:12:38.009431063 +0200
@@ -22,11 +22,20 @@
#include
@@ -2432,7 +2471,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
#include "system.h"
#include "argmatch.h"
#include "error.h"
-@@ -163,12 +172,34 @@ static int thousands_sep;
+@@ -167,12 +176,34 @@ static int thousands_sep;
/* Nonzero if the corresponding locales are hard. */
static bool hard_LC_COLLATE;
@@ -2468,7 +2507,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
/* The kind of blanks for '-b' to skip in various options. */
enum blanktype { bl_start, bl_end, bl_both };
-@@ -335,13 +366,11 @@ static bool reverse;
+@@ -343,13 +374,11 @@ static bool reverse;
they were read if all keys compare equal. */
static bool stable;
@@ -2485,7 +2524,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
/* Flag to remove consecutive duplicate lines from the output.
Only the last of a sequence of equal lines will be output. */
-@@ -775,6 +804,46 @@ reap_all (void)
+@@ -783,6 +812,46 @@ reap_all (void)
reap (-1);
}
@@ -2532,7 +2571,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
/* Clean up any remaining temporary files. */
static void
-@@ -1207,7 +1276,7 @@ zaptemp (char const *name)
+@@ -1215,7 +1284,7 @@ zaptemp (char const *name)
free (node);
}
@@ -2541,7 +2580,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
static int
struct_month_cmp (void const *m1, void const *m2)
-@@ -1222,7 +1291,7 @@ struct_month_cmp (void const *m1, void c
+@@ -1230,7 +1299,7 @@ struct_month_cmp (void const *m1, void c
/* Initialize the character class tables. */
static void
@@ -2550,7 +2589,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
{
size_t i;
-@@ -1234,7 +1303,7 @@ inittables (void)
+@@ -1242,7 +1311,7 @@ inittables (void)
fold_toupper[i] = toupper (i);
}
@@ -2559,7 +2598,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
/* If we're not in the "C" locale, read different names for months. */
if (hard_LC_TIME)
{
-@@ -1316,6 +1385,84 @@ specify_nmerge (int oi, char c, char con
+@@ -1324,6 +1393,84 @@ specify_nmerge (int oi, char c, char con
xstrtol_fatal (e, oi, c, long_options, s);
}
@@ -2644,7 +2683,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
/* Specify the amount of main memory to use when sorting. */
static void
specify_sort_size (int oi, char c, char const *s)
-@@ -1544,7 +1691,7 @@ buffer_linelim (struct buffer const *buf
+@@ -1552,7 +1699,7 @@ buffer_linelim (struct buffer const *buf
by KEY in LINE. */
static char *
@@ -2653,7 +2692,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
{
char *ptr = line->text, *lim = ptr + line->length - 1;
size_t sword = key->sword;
-@@ -1553,10 +1700,10 @@ begfield (struct line const *line, struc
+@@ -1561,10 +1708,10 @@ begfield (struct line const *line, struc
/* The leading field separator itself is included in a field when -t
is absent. */
@@ -2666,7 +2705,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
++ptr;
if (ptr < lim)
++ptr;
-@@ -1582,11 +1729,70 @@ begfield (struct line const *line, struc
+@@ -1590,11 +1737,70 @@ begfield (struct line const *line, struc
return ptr;
}
@@ -2738,7 +2777,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
{
char *ptr = line->text, *lim = ptr + line->length - 1;
size_t eword = key->eword, echar = key->echar;
-@@ -1601,10 +1807,10 @@ limfield (struct line const *line, struc
+@@ -1609,10 +1815,10 @@ limfield (struct line const *line, struc
`beginning' is the first character following the delimiting TAB.
Otherwise, leave PTR pointing at the first `blank' character after
the preceding field. */
@@ -2751,7 +2790,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
++ptr;
if (ptr < lim && (eword || echar))
++ptr;
-@@ -1650,10 +1856,10 @@ limfield (struct line const *line, struc
+@@ -1658,10 +1864,10 @@ limfield (struct line const *line, struc
*/
/* Make LIM point to the end of (one byte past) the current field. */
@@ -2764,7 +2803,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
if (newlim)
lim = newlim;
}
-@@ -1684,6 +1890,130 @@ limfield (struct line const *line, struc
+@@ -1692,6 +1898,130 @@ limfield (struct line const *line, struc
return ptr;
}
@@ -2895,7 +2934,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
/* Fill BUF reading from FP, moving buf->left bytes from the end
of buf->buf to the beginning first. If EOF is reached and the
file wasn't terminated by a newline, supply one. Set up BUF's line
-@@ -1770,8 +2100,22 @@ fillbuf (struct buffer *buf, FILE *fp, c
+@@ -1778,8 +2108,22 @@ fillbuf (struct buffer *buf, FILE *fp, c
else
{
if (key->skipsblanks)
@@ -2920,7 +2959,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
line->keybeg = line_start;
}
}
-@@ -1892,7 +2236,7 @@ human_numcompare (char const *a, char co
+@@ -1900,7 +2244,7 @@ human_numcompare (char const *a, char co
hideously fast. */
static int
@@ -2929,7 +2968,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
{
while (blanks[to_uchar (*a)])
a++;
-@@ -1902,6 +2246,25 @@ numcompare (char const *a, char const *b
+@@ -1910,6 +2254,25 @@ numcompare (char const *a, char const *b
return strnumcmp (a, b, decimal_point, thousands_sep);
}
@@ -2955,7 +2994,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
static int
general_numcompare (char const *sa, char const *sb)
{
-@@ -1934,7 +2297,7 @@ general_numcompare (char const *sa, char
+@@ -1942,7 +2305,7 @@ general_numcompare (char const *sa, char
Return 0 if the name in S is not recognized. */
static int
@@ -2964,7 +3003,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
{
size_t lo = 0;
size_t hi = MONTHS_PER_YEAR;
-@@ -2209,15 +2572,14 @@ debug_key (struct line const *line, stru
+@@ -2217,15 +2580,14 @@ debug_key (struct line const *line, stru
char saved = *lim;
*lim = '\0';
@@ -2982,7 +3021,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
else if (key->general_numeric)
ignore_value (strtold (beg, &tighter_lim));
else if (key->numeric || key->human_numeric)
-@@ -2361,7 +2723,7 @@ key_warnings (struct keyfield const *gke
+@@ -2369,7 +2731,7 @@ key_warnings (struct keyfield const *gke
bool maybe_space_aligned = !hard_LC_COLLATE && default_key_compare (key)
&& !(key->schar || key->echar);
bool line_offset = key->eword == 0 && key->echar != 0; /* -k1.x,1.y */
@@ -2991,7 +3030,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
&& ((!key->skipsblanks && !(implicit_skip || maybe_space_aligned))
|| (!key->skipsblanks && key->schar)
|| (!key->skipeblanks && key->echar)))
-@@ -2419,11 +2781,83 @@ key_warnings (struct keyfield const *gke
+@@ -2427,11 +2789,83 @@ key_warnings (struct keyfield const *gke
error (0, 0, _("option `-r' only applies to last-resort comparison"));
}
@@ -3057,12 +3096,12 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
+ }
+ while (hi - lo > 1);
+
-+ if (ea)
-+ *ea = (char *) month;
-+
+ result = (!strncmp (month, monthtab[lo].name, strlen (monthtab[lo].name))
+ ? monthtab[lo].val : 0);
+
++ if (ea && result)
++ *ea = s + strlen (monthtab[lo].name);
++
+ return result;
+}
+#endif
@@ -3076,7 +3115,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
{
struct keyfield *key = keylist;
-@@ -2508,7 +2942,7 @@ keycompare (struct line const *a, struct
+@@ -2516,7 +2950,7 @@ keycompare (struct line const *a, struct
else if (key->human_numeric)
diff = human_numcompare (ta, tb);
else if (key->month)
@@ -3085,7 +3124,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
else if (key->random)
diff = compare_random (ta, tlena, tb, tlenb);
else if (key->version)
-@@ -2624,6 +3058,179 @@ keycompare (struct line const *a, struct
+@@ -2632,6 +3066,180 @@ keycompare (struct line const *a, struct
return key->reverse ? -diff : diff;
}
@@ -3167,7 +3206,8 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
+ if (MBLENGTH == (size_t)-2 || MBLENGTH == (size_t)-1) \
+ STATE = state_bak; \
+ if (!ignore) \
-+ COPY[NEW_LEN++] = TEXT[i++]; \
++ COPY[NEW_LEN++] = TEXT[i]; \
++ i++; \
+ continue; \
+ } \
+ \
@@ -3265,7 +3305,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
/* Compare two lines A and B, returning negative, zero, or positive
depending on whether A compares less than, equal to, or greater than B. */
-@@ -4087,7 +4694,7 @@ main (int argc, char **argv)
+@@ -4095,7 +4703,7 @@ main (int argc, char **argv)
initialize_exit_failure (SORT_FAILURE);
hard_LC_COLLATE = hard_locale (LC_COLLATE);
@@ -3274,7 +3314,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
hard_LC_TIME = hard_locale (LC_TIME);
#endif
-@@ -4108,6 +4715,29 @@ main (int argc, char **argv)
+@@ -4116,6 +4724,29 @@ main (int argc, char **argv)
thousands_sep = -1;
}
@@ -3304,7 +3344,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
have_read_stdin = false;
inittables ();
-@@ -4378,13 +5008,34 @@ main (int argc, char **argv)
+@@ -4386,13 +5017,34 @@ main (int argc, char **argv)
case 't':
{
@@ -3343,7 +3383,7 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
else
{
/* Provoke with `sort -txx'. Complain about
-@@ -4395,9 +5046,12 @@ main (int argc, char **argv)
+@@ -4403,9 +5055,12 @@ main (int argc, char **argv)
quote (optarg));
}
}
@@ -3358,9 +3398,9 @@ diff -urNp coreutils-8.10-orig/src/sort.c coreutils-8.10/src/sort.c
}
break;
-diff -urNp coreutils-8.10-orig/src/unexpand.c coreutils-8.10/src/unexpand.c
---- coreutils-8.10-orig/src/unexpand.c 2011-01-31 13:40:38.000000000 +0100
-+++ coreutils-8.10/src/unexpand.c 2011-02-04 20:13:24.015458014 +0100
+diff -urNp coreutils-8.12-orig/src/unexpand.c coreutils-8.12/src/unexpand.c
+--- coreutils-8.12-orig/src/unexpand.c 2011-02-19 18:17:03.000000000 +0100
++++ coreutils-8.12/src/unexpand.c 2012-03-26 10:10:44.401556558 +0200
@@ -39,12 +39,29 @@
#include
#include
@@ -3614,9 +3654,9 @@ diff -urNp coreutils-8.10-orig/src/unexpand.c coreutils-8.10/src/unexpand.c
if (have_read_stdin && fclose (stdin) != 0)
error (EXIT_FAILURE, errno, "-");
-diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c
---- coreutils-8.10-orig/src/uniq.c 2011-01-31 13:40:38.000000000 +0100
-+++ coreutils-8.10/src/uniq.c 2011-02-04 20:13:24.018457349 +0100
+diff -urNp coreutils-8.12-orig/src/uniq.c coreutils-8.12/src/uniq.c
+--- coreutils-8.12-orig/src/uniq.c 2011-04-25 11:45:49.000000000 +0200
++++ coreutils-8.12/src/uniq.c 2012-03-26 10:10:44.403559433 +0200
@@ -21,6 +21,16 @@
#include
#include
@@ -3671,7 +3711,7 @@ diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c
static char *
-find_field (struct linebuffer const *line)
-+find_field_uni (struct linebuffer *line)
++find_field_uni (struct linebuffer const *line)
{
size_t count;
char const *lp = line->buffer;
@@ -3725,7 +3765,7 @@ diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c
+ while (pos < size)
+ {
+ MBCHAR_TO_WCHAR (wc, mblength, lp, pos, size, statep, convfail);
-+
++
+ if (convfail || !iswblank (wc))
+ {
+ pos += mblength;
@@ -3952,7 +3992,7 @@ diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c
match = !different (thisfield, prevfield, thislen, prevlen);
match_count += match;
-@@ -383,6 +612,9 @@ check_file (const char *infile, const ch
+@@ -383,6 +611,9 @@ check_file (const char *infile, const ch
SWAP_LINES (prevline, thisline);
prevfield = thisfield;
prevlen = thislen;
@@ -3962,7 +4002,7 @@ diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c
if (!match)
match_count = 0;
}
-@@ -428,6 +660,19 @@ main (int argc, char **argv)
+@@ -428,6 +659,19 @@ main (int argc, char **argv)
atexit (close_stdout);
@@ -3982,10 +4022,10 @@ diff -urNp coreutils-8.10-orig/src/uniq.c coreutils-8.10/src/uniq.c
skip_chars = 0;
skip_fields = 0;
check_chars = SIZE_MAX;
-diff -urNp coreutils-8.10-orig/tests/Makefile.am coreutils-8.10/tests/Makefile.am
---- coreutils-8.10-orig/tests/Makefile.am 2011-02-04 20:12:58.236173903 +0100
-+++ coreutils-8.10/tests/Makefile.am 2011-02-04 20:13:24.020456905 +0100
-@@ -235,6 +235,7 @@ TESTS = \
+diff -urNp coreutils-8.12-orig/tests/Makefile.am coreutils-8.12/tests/Makefile.am
+--- coreutils-8.12-orig/tests/Makefile.am 2012-03-26 10:10:12.786431587 +0200
++++ coreutils-8.12/tests/Makefile.am 2012-03-26 10:10:44.404540015 +0200
+@@ -236,6 +236,7 @@ TESTS = \
misc/sort-debug-keys \
misc/sort-debug-warn \
misc/sort-files0-from \
@@ -3993,7 +4033,7 @@ diff -urNp coreutils-8.10-orig/tests/Makefile.am coreutils-8.10/tests/Makefile.a
misc/sort-float \
misc/sort-merge \
misc/sort-merge-fdlimit \
-@@ -505,6 +506,10 @@ TESTS = \
+@@ -511,6 +512,10 @@ TESTS = \
$(root_tests)
pr_data = \
@@ -4004,9 +4044,9 @@ diff -urNp coreutils-8.10-orig/tests/Makefile.am coreutils-8.10/tests/Makefile.a
pr/0F \
pr/0FF \
pr/0FFnt \
-diff -urNp coreutils-8.10-orig/tests/misc/cut coreutils-8.10/tests/misc/cut
---- coreutils-8.10-orig/tests/misc/cut 2011-01-31 13:40:38.000000000 +0100
-+++ coreutils-8.10/tests/misc/cut 2011-02-04 20:13:24.021456684 +0100
+diff -urNp coreutils-8.12-orig/tests/misc/cut coreutils-8.12/tests/misc/cut
+--- coreutils-8.12-orig/tests/misc/cut 2011-02-07 09:25:51.000000000 +0100
++++ coreutils-8.12/tests/misc/cut 2012-03-26 10:10:44.405558576 +0200
@@ -26,7 +26,7 @@ use strict;
my $prog = 'cut';
my $try = "Try \`$prog --help' for more information.\n";
@@ -4025,41 +4065,41 @@ diff -urNp coreutils-8.10-orig/tests/misc/cut coreutils-8.10/tests/misc/cut
['inval2', qw(-f -), {IN=>''}, {OUT=>''}, {EXIT=>1}, {ERR=>$no_endpoint}],
['inval3', '-f', '4,-', {IN=>''}, {OUT=>''}, {EXIT=>1}, {ERR=>$no_endpoint}],
['inval4', '-f', '1-2,-', {IN=>''}, {OUT=>''}, {EXIT=>1},
-diff -urNp coreutils-8.10-orig/tests/misc/mb1.I coreutils-8.10/tests/misc/mb1.I
---- coreutils-8.10-orig/tests/misc/mb1.I 1970-01-01 01:00:00.000000000 +0100
-+++ coreutils-8.10/tests/misc/mb1.I 2011-02-04 20:13:24.022456462 +0100
+diff -urNp coreutils-8.12-orig/tests/misc/mb1.I coreutils-8.12/tests/misc/mb1.I
+--- coreutils-8.12-orig/tests/misc/mb1.I 1970-01-01 01:00:00.000000000 +0100
++++ coreutils-8.12/tests/misc/mb1.I 2012-03-26 10:10:44.406556899 +0200
@@ -0,0 +1,4 @@
+Apple@10
+Banana@5
+Citrus@20
+Cherry@30
-diff -urNp coreutils-8.10-orig/tests/misc/mb1.X coreutils-8.10/tests/misc/mb1.X
---- coreutils-8.10-orig/tests/misc/mb1.X 1970-01-01 01:00:00.000000000 +0100
-+++ coreutils-8.10/tests/misc/mb1.X 2011-02-04 20:13:24.023456240 +0100
+diff -urNp coreutils-8.12-orig/tests/misc/mb1.X coreutils-8.12/tests/misc/mb1.X
+--- coreutils-8.12-orig/tests/misc/mb1.X 1970-01-01 01:00:00.000000000 +0100
++++ coreutils-8.12/tests/misc/mb1.X 2012-03-26 10:10:44.406556899 +0200
@@ -0,0 +1,4 @@
+Banana@5
+Apple@10
+Citrus@20
+Cherry@30
-diff -urNp coreutils-8.10-orig/tests/misc/mb2.I coreutils-8.10/tests/misc/mb2.I
---- coreutils-8.10-orig/tests/misc/mb2.I 1970-01-01 01:00:00.000000000 +0100
-+++ coreutils-8.10/tests/misc/mb2.I 2011-02-04 20:13:24.024456019 +0100
+diff -urNp coreutils-8.12-orig/tests/misc/mb2.I coreutils-8.12/tests/misc/mb2.I
+--- coreutils-8.12-orig/tests/misc/mb2.I 1970-01-01 01:00:00.000000000 +0100
++++ coreutils-8.12/tests/misc/mb2.I 2012-03-26 10:10:44.407556588 +0200
@@ -0,0 +1,4 @@
+Apple@AA10@@20
+Banana@AA5@@30
+Citrus@AA20@@5
+Cherry@AA30@@10
-diff -urNp coreutils-8.10-orig/tests/misc/mb2.X coreutils-8.10/tests/misc/mb2.X
---- coreutils-8.10-orig/tests/misc/mb2.X 1970-01-01 01:00:00.000000000 +0100
-+++ coreutils-8.10/tests/misc/mb2.X 2011-02-04 20:13:24.024456019 +0100
+diff -urNp coreutils-8.12-orig/tests/misc/mb2.X coreutils-8.12/tests/misc/mb2.X
+--- coreutils-8.12-orig/tests/misc/mb2.X 1970-01-01 01:00:00.000000000 +0100
++++ coreutils-8.12/tests/misc/mb2.X 2012-03-26 10:10:44.407556588 +0200
@@ -0,0 +1,4 @@
+Citrus@AA20@@5
+Cherry@AA30@@10
+Apple@AA10@@20
+Banana@AA5@@30
-diff -urNp coreutils-8.10-orig/tests/misc/sort-mb-tests coreutils-8.10/tests/misc/sort-mb-tests
---- coreutils-8.10-orig/tests/misc/sort-mb-tests 1970-01-01 01:00:00.000000000 +0100
-+++ coreutils-8.10/tests/misc/sort-mb-tests 2011-02-04 20:13:24.025455797 +0100
+diff -urNp coreutils-8.12-orig/tests/misc/sort-mb-tests coreutils-8.12/tests/misc/sort-mb-tests
+--- coreutils-8.12-orig/tests/misc/sort-mb-tests 1970-01-01 01:00:00.000000000 +0100
++++ coreutils-8.12/tests/misc/sort-mb-tests 2012-03-26 10:10:44.408558435 +0200
@@ -0,0 +1,58 @@
+#! /bin/sh
+case $# in
@@ -4079,7 +4119,7 @@ diff -urNp coreutils-8.10-orig/tests/misc/sort-mb-tests coreutils-8.10/tests/mis
+$xx -t @ -k2 -n misc/mb1.I > misc/mb1.O
+code=$?
+if test $code != 0; then
-+ $echo "Test mb1 failed: $xx return code $code differs from expected value 0" 1>&2
++ $echo "Test mb1 failed: $xx return code $code differs from expected value 0"
+ errors=`expr $errors + 1`
+else
+ cmp misc/mb1.O $srcdir/misc/mb1.X > /dev/null 2>&1
diff --git a/coreutils-su.pamd b/coreutils-su.pamd
index 1981f58..030657f 100644
--- a/coreutils-su.pamd
+++ b/coreutils-su.pamd
@@ -4,7 +4,7 @@ auth sufficient pam_rootok.so
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid
-auth include system-auth
+auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
diff --git a/coreutils.spec b/coreutils.spec
index 2784cdc..703abd5 100644
--- a/coreutils.spec
+++ b/coreutils.spec
@@ -1,7 +1,7 @@
Summary: A set of basic GNU tools commonly used in shell scripts
Name: coreutils
Version: 8.12
-Release: 2%{?dist}
+Release: 9%{?dist}
License: GPLv3+
Group: System Environment/Base
Url: http://www.gnu.org/software/coreutils/
@@ -18,6 +18,9 @@ Source202: coreutils-su-l.pamd
Source203: coreutils-runuser-l.pamd
# From upstream
+Patch1: coreutils-8.12-chown.patch
+Patch2: coreutils-8.17-cp-freememoryread.patch
+Patch3: coreutils-8.17-df-duplicates.patch
# Our patches
#general patch to workaround koji build system issues
@@ -32,6 +35,8 @@ Patch103: coreutils-8.2-uname-processortype.patch
Patch104: coreutils-df-direct.patch
#add note about mkdir --mode behaviour into info documentation(#610559)
Patch107: coreutils-8.4-mkdir-modenote.patch
+#use acl_extended_file_nofollow if available (#692823)
+Patch108: coreutils-acl-extended-file-nofollow.patch
# sh-utils
#add info about TZ envvar to date manpage
@@ -57,6 +62,9 @@ Patch908: coreutils-getgrouplist.patch
Patch912: coreutils-overflow.patch
#compile su with pie flag and RELRO protection
Patch917: coreutils-8.4-su-pie.patch
+#fix rshowing ls ACLs with acl_extended_file_nofollow
+Patch918: coreutils-8.12-lssymlinkacl.patch
+
#SELINUX Patch - implements Redhat changes
#(upstream did some SELinux implementation unlike with RedHat patch)
@@ -80,7 +88,7 @@ Requires(pre): /sbin/install-info
Requires(preun): /sbin/install-info
Requires(post): /sbin/install-info
Requires(post): grep
-%{?!nopam:Requires: pam }
+%{?!nopam:Requires: pam >= 1.1.3-7}
Requires: ncurses
Requires: gmp
Requires: %{name}-libs = %{version}-%{release}
@@ -91,6 +99,7 @@ Provides: stat = %{version}-%{release}
Provides: textutils = %{version}-%{release}
#old mktemp package had epoch 3, so we have to use 4 for coreutils
Provides: mktemp = 4:%{version}-%{release}
+Provides: bundled(gnulib)
Obsoletes: mktemp < 4:%{version}-%{release}
Obsoletes: fileutils <= 4.1.9
Obsoletes: sh-utils <= 2.0.12
@@ -113,6 +122,9 @@ Libraries for coreutils package.
%setup -q
# From upstream
+%patch1 -p1 -b .chown
+%patch2 -p1 -b .cpfmr
+%patch3 -p1 -b .duplic
# Our patches
%patch100 -p1 -b .configure
@@ -121,6 +133,7 @@ Libraries for coreutils package.
%patch103 -p1 -b .sysinfo
%patch104 -p1 -b .dfdirect
%patch107 -p1 -b .mkdirmode
+%patch108 -p1 -b .nofollow
# sh-utils
%patch703 -p1 -b .dateman
@@ -142,7 +155,10 @@ Libraries for coreutils package.
%patch950 -p1 -b .selinux
%patch951 -p1 -b .selinuxman
-chmod a+x tests/misc/sort-mb-tests tests/df/direct || :
+#later applied
+%patch918 -p1 -b .aclsymlink
+
+chmod a+x tests/misc/sort-mb-tests tests/df/direct tests/chown/basic || :
#fix typos/mistakes in localized documentation(#439410, #440056)
find ./po/ -name "*.p*" | xargs \
@@ -326,9 +342,45 @@ fi
%files libs
%defattr(-, root, root, -)
-%{_libdir}/coreutils
+%{_libexecdir}/coreutils
%changelog
+* Wed Dec 12 2012 Ondrej Vasik - 8.12-9
+- fix showing duplicates in df (#709351, O.Oprala, B.Voelker)
+- df: work around long-named /dev/disk/by-uuid/... symlinks
+
+* Mon Nov 05 2012 Ondrej Vasik - 8.12-8
+- fix support for ecryptfs mount of "Private" in su (#722323)
+- cp: avoid data-corrupting free-memory-read (upstream fix)
+- multibyte fixes in cut and expand (by M.Briza, #821260)
+- fix the tcsh colorls.csh behaviour in non-interactive
+ mode (#804604)
+- add virtual provides for bundled(gnulib) copylib (#821748)
+
+* Mon Mar 26 2012 Ondrej Vasik - 8.12-7
+- fix sort segfault with multibyte locales (by P.Brady)
+- fix showing ACLs in ls (#805398, caused by #692823 fix)
+
+* Mon Jan 30 2012 Kamil Dudka - 8.12-6
+- do not use shebang in sourced colorls.csh
+- su: fix shell suspend in tcsh (#597928)
+- variable "u" should be static in uname processor type patch
+- various multibyte patch fixes:
+ - fix cut output-delimiter option
+ - prevent infinite loop in sort when ignoring chars
+ - prevent using unitialized variable in cut
+ - fix pr -c and pr -v segfault with multibyte locales
+ - fix stack smashing, buffer overflow and invalid output of pr (#772172)
+
+* Sun Jan 29 2012 Kamil Dudka - 8.12-5
+- output the correct ownership in chown -v (upstream bug #10636)
+
+* Mon Oct 24 2011 Ondrej Vasik - 8.12-4
+- require at least pam >= 1.1.3-7 (#748215)
+
+* Fri Jul 29 2011 Ondrej Vasik - 8.12-3
+- use acl_extended_file_nofollow() if available (#692823)
+
* Fri Jul 15 2011 Ondrej Vasik - 8.12-2
- support ecryptfs mount of Private (postlogin into su.pamd)
(#722323)
@@ -367,7 +419,7 @@ fi
- new upstream release coreutils-8.10
* Sat Jan 08 2011 Dennis Gilmore - 8.9-2
-- drop no longer needed mkstemp patch for sparc
+- drop no longer needed mkstemp patch for sparc
* Tue Jan 04 2011 Ondrej Vasik - 8.9-1
- new upstream release coreutils-8.9