- Update to 8.17:
** Bug fixes * stat no longer reports a negative file size as a huge positive number. [bug present since 'stat' was introduced in fileutils-4.1.9] ** New features * split and truncate now allow any seekable files in situations where the file size is needed, instead of insisting on regular files. * fmt now accepts the --goal=WIDTH (-g) option. * stat -f recognizes new file system types: bdevfs, inodefs, qnx6 ** Changes in behavior * cp,mv,install,cat,split: now read and write a minimum of 64KiB at a time. This was previously 32KiB and increasing to 64KiB was seen to increase throughput by about 10% when reading cached files on 64 bit GNU/Linux. * cp --attributes-only no longer truncates any existing destination file, allowing for more general copying of attributes from one file to another. - Bring german message catalog up-to-date OBS-URL: https://build.opensuse.org/package/show/Base:System/coreutils?expand=0&rev=156
This commit is contained in:
parent
5f6070ac6a
commit
81c6e98de3
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:1bc7a83591e12aea216f73f8b0667779886c35518737240b26d6d7d3d7b6a87e
|
|
||||||
size 98512
|
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:2a458fead15d9336f46bb4304cc3eaa6ed9407b9130e7ee2ec533909881d2067
|
|
||||||
size 5042844
|
|
3
coreutils-8.17.de.po.xz
Normal file
3
coreutils-8.17.de.po.xz
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:6d62887c50239bfa3c743df063fb20b319c1b70ec019a017da1c8b50a11b87ef
|
||||||
|
size 98604
|
3
coreutils-8.17.tar.xz
Normal file
3
coreutils-8.17.tar.xz
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:4e075a0d238072a5bd079046e1f024dc5e0d9133d43a39c73d0b86b0d1e2c5e5
|
||||||
|
size 5077388
|
@ -20,7 +20,7 @@
|
|||||||
Index: lib/linebuffer.h
|
Index: lib/linebuffer.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- lib/linebuffer.h.orig 2012-01-06 10:14:31.000000000 +0100
|
--- lib/linebuffer.h.orig 2012-01-06 10:14:31.000000000 +0100
|
||||||
+++ lib/linebuffer.h 2012-04-16 17:00:03.953114761 +0200
|
+++ lib/linebuffer.h 2012-06-19 12:13:47.369654318 +0200
|
||||||
@@ -21,6 +21,11 @@
|
@@ -21,6 +21,11 @@
|
||||||
|
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
@ -45,8 +45,8 @@ Index: lib/linebuffer.h
|
|||||||
/* Initialize linebuffer LINEBUFFER for use. */
|
/* Initialize linebuffer LINEBUFFER for use. */
|
||||||
Index: src/cut.c
|
Index: src/cut.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- src/cut.c.orig 2012-03-24 21:26:51.000000000 +0100
|
--- src/cut.c.orig 2012-05-02 10:31:47.000000000 +0200
|
||||||
+++ src/cut.c 2012-04-16 17:00:03.954114734 +0200
|
+++ src/cut.c 2012-06-19 12:13:47.370654294 +0200
|
||||||
@@ -28,6 +28,11 @@
|
@@ -28,6 +28,11 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -639,8 +639,8 @@ Index: src/cut.c
|
|||||||
if (optind == argc)
|
if (optind == argc)
|
||||||
Index: src/expand.c
|
Index: src/expand.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- src/expand.c.orig 2012-03-24 21:26:51.000000000 +0100
|
--- src/expand.c.orig 2012-05-01 22:55:08.000000000 +0200
|
||||||
+++ src/expand.c 2012-04-16 17:00:03.954114734 +0200
|
+++ src/expand.c 2012-06-19 12:13:47.370654294 +0200
|
||||||
@@ -37,12 +37,29 @@
|
@@ -37,12 +37,29 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -830,8 +830,8 @@ Index: src/expand.c
|
|||||||
error (EXIT_FAILURE, errno, "-");
|
error (EXIT_FAILURE, errno, "-");
|
||||||
Index: src/fold.c
|
Index: src/fold.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- src/fold.c.orig 2012-03-24 19:22:13.000000000 +0100
|
--- src/fold.c.orig 2012-04-29 13:45:30.000000000 +0200
|
||||||
+++ src/fold.c 2012-04-16 17:00:03.954114734 +0200
|
+++ src/fold.c 2012-06-19 12:13:47.370654294 +0200
|
||||||
@@ -22,12 +22,34 @@
|
@@ -22,12 +22,34 @@
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@ -1232,8 +1232,8 @@ Index: src/fold.c
|
|||||||
case 's': /* Break at word boundaries. */
|
case 's': /* Break at word boundaries. */
|
||||||
Index: src/join.c
|
Index: src/join.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- src/join.c.orig 2012-03-24 21:26:51.000000000 +0100
|
--- src/join.c.orig 2012-05-02 10:31:47.000000000 +0200
|
||||||
+++ src/join.c 2012-04-16 17:00:03.955114707 +0200
|
+++ src/join.c 2012-06-19 12:13:47.371654270 +0200
|
||||||
@@ -22,18 +22,32 @@
|
@@ -22,18 +22,32 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -1712,8 +1712,8 @@ Index: src/join.c
|
|||||||
case NOCHECK_ORDER_OPTION:
|
case NOCHECK_ORDER_OPTION:
|
||||||
Index: src/pr.c
|
Index: src/pr.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- src/pr.c.orig 2012-03-24 21:26:51.000000000 +0100
|
--- src/pr.c.orig 2012-05-10 09:14:30.000000000 +0200
|
||||||
+++ src/pr.c 2012-04-16 17:00:03.955114707 +0200
|
+++ src/pr.c 2012-06-19 12:15:34.144102794 +0200
|
||||||
@@ -312,6 +312,32 @@
|
@@ -312,6 +312,32 @@
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -2001,13 +2001,13 @@ Index: src/pr.c
|
|||||||
}
|
}
|
||||||
/* It's rather pointless to define a TAB separator with column
|
/* It's rather pointless to define a TAB separator with column
|
||||||
@@ -1279,11 +1405,11 @@ init_parameters (int number_of_files)
|
@@ -1279,11 +1405,11 @@ init_parameters (int number_of_files)
|
||||||
TAB_WIDTH (chars_per_input_tab, chars_per_number); */
|
+ TAB_WIDTH (chars_per_input_tab, chars_per_number); */
|
||||||
|
|
||||||
/* Estimate chars_per_text without any margin and keep it constant. */
|
/* Estimate chars_per_text without any margin and keep it constant. */
|
||||||
- if (number_separator == '\t')
|
- if (number_separator == '\t')
|
||||||
+ if (number_separator[0] == '\t')
|
+ if (number_separator[0] == '\t')
|
||||||
number_width = chars_per_number +
|
number_width = (chars_per_number
|
||||||
TAB_WIDTH (chars_per_default_tab, chars_per_number);
|
+ TAB_WIDTH (chars_per_default_tab, chars_per_number));
|
||||||
else
|
else
|
||||||
- number_width = chars_per_number + 1;
|
- number_width = chars_per_number + 1;
|
||||||
+ number_width = chars_per_number + number_separator_width;
|
+ number_width = chars_per_number + number_separator_width;
|
||||||
@ -2017,9 +2017,9 @@ Index: src/pr.c
|
|||||||
@@ -1298,7 +1424,7 @@ init_parameters (int number_of_files)
|
@@ -1298,7 +1424,7 @@ init_parameters (int number_of_files)
|
||||||
}
|
}
|
||||||
|
|
||||||
chars_per_column = (chars_per_line - chars_used_by_number -
|
chars_per_column = (chars_per_line - chars_used_by_number
|
||||||
- (columns - 1) * col_sep_length) / columns;
|
- - (columns - 1) * col_sep_length) / columns;
|
||||||
+ (columns - 1) * col_sep_width) / columns;
|
+ - (columns - 1) * col_sep_width) / columns;
|
||||||
|
|
||||||
if (chars_per_column < 1)
|
if (chars_per_column < 1)
|
||||||
error (EXIT_FAILURE, 0, _("page width too narrow"));
|
error (EXIT_FAILURE, 0, _("page width too narrow"));
|
||||||
@ -2438,15 +2438,16 @@ Index: src/pr.c
|
|||||||
|
|
||||||
Index: src/sort.c
|
Index: src/sort.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- src/sort.c.orig 2012-03-24 21:26:51.000000000 +0100
|
--- src/sort.c.orig 2012-05-04 12:06:22.000000000 +0200
|
||||||
+++ src/sort.c 2012-04-16 17:03:09.060189025 +0200
|
+++ src/sort.c 2012-06-19 12:16:37.982577478 +0200
|
||||||
@@ -22,11 +22,20 @@
|
@@ -22,12 +22,21 @@
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
+#include <assert.h>
|
+#include <assert.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
@ -2461,7 +2462,7 @@ Index: src/sort.c
|
|||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "argmatch.h"
|
#include "argmatch.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
@@ -167,12 +176,34 @@ static int thousands_sep;
|
@@ -165,12 +174,34 @@ static int thousands_sep;
|
||||||
|
|
||||||
/* Nonzero if the corresponding locales are hard. */
|
/* Nonzero if the corresponding locales are hard. */
|
||||||
static bool hard_LC_COLLATE;
|
static bool hard_LC_COLLATE;
|
||||||
@ -2497,7 +2498,7 @@ Index: src/sort.c
|
|||||||
/* The kind of blanks for '-b' to skip in various options. */
|
/* The kind of blanks for '-b' to skip in various options. */
|
||||||
enum blanktype { bl_start, bl_end, bl_both };
|
enum blanktype { bl_start, bl_end, bl_both };
|
||||||
|
|
||||||
@@ -343,13 +374,11 @@ static bool reverse;
|
@@ -341,13 +372,11 @@ static bool reverse;
|
||||||
they were read if all keys compare equal. */
|
they were read if all keys compare equal. */
|
||||||
static bool stable;
|
static bool stable;
|
||||||
|
|
||||||
@ -2514,7 +2515,7 @@ Index: src/sort.c
|
|||||||
|
|
||||||
/* Flag to remove consecutive duplicate lines from the output.
|
/* Flag to remove consecutive duplicate lines from the output.
|
||||||
Only the last of a sequence of equal lines will be output. */
|
Only the last of a sequence of equal lines will be output. */
|
||||||
@@ -782,6 +811,46 @@ reap_all (void)
|
@@ -780,6 +809,46 @@ reap_all (void)
|
||||||
reap (-1);
|
reap (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2561,7 +2562,7 @@ Index: src/sort.c
|
|||||||
/* Clean up any remaining temporary files. */
|
/* Clean up any remaining temporary files. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1214,7 +1283,7 @@ zaptemp (char const *name)
|
@@ -1212,7 +1281,7 @@ zaptemp (char const *name)
|
||||||
free (node);
|
free (node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2570,7 +2571,7 @@ Index: src/sort.c
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
struct_month_cmp (void const *m1, void const *m2)
|
struct_month_cmp (void const *m1, void const *m2)
|
||||||
@@ -1229,7 +1298,7 @@ struct_month_cmp (void const *m1, void c
|
@@ -1227,7 +1296,7 @@ struct_month_cmp (void const *m1, void c
|
||||||
/* Initialize the character class tables. */
|
/* Initialize the character class tables. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -2579,7 +2580,7 @@ Index: src/sort.c
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
@@ -1241,7 +1310,7 @@ inittables (void)
|
@@ -1239,7 +1308,7 @@ inittables (void)
|
||||||
fold_toupper[i] = toupper (i);
|
fold_toupper[i] = toupper (i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2588,7 +2589,7 @@ Index: src/sort.c
|
|||||||
/* If we're not in the "C" locale, read different names for months. */
|
/* If we're not in the "C" locale, read different names for months. */
|
||||||
if (hard_LC_TIME)
|
if (hard_LC_TIME)
|
||||||
{
|
{
|
||||||
@@ -1323,6 +1392,84 @@ specify_nmerge (int oi, char c, char con
|
@@ -1321,6 +1390,84 @@ specify_nmerge (int oi, char c, char con
|
||||||
xstrtol_fatal (e, oi, c, long_options, s);
|
xstrtol_fatal (e, oi, c, long_options, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2673,7 +2674,7 @@ Index: src/sort.c
|
|||||||
/* Specify the amount of main memory to use when sorting. */
|
/* Specify the amount of main memory to use when sorting. */
|
||||||
static void
|
static void
|
||||||
specify_sort_size (int oi, char c, char const *s)
|
specify_sort_size (int oi, char c, char const *s)
|
||||||
@@ -1551,7 +1698,7 @@ buffer_linelim (struct buffer const *buf
|
@@ -1549,7 +1696,7 @@ buffer_linelim (struct buffer const *buf
|
||||||
by KEY in LINE. */
|
by KEY in LINE. */
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
@ -2682,7 +2683,7 @@ Index: src/sort.c
|
|||||||
{
|
{
|
||||||
char *ptr = line->text, *lim = ptr + line->length - 1;
|
char *ptr = line->text, *lim = ptr + line->length - 1;
|
||||||
size_t sword = key->sword;
|
size_t sword = key->sword;
|
||||||
@@ -1560,10 +1707,10 @@ begfield (struct line const *line, struc
|
@@ -1558,10 +1705,10 @@ begfield (struct line const *line, struc
|
||||||
/* The leading field separator itself is included in a field when -t
|
/* The leading field separator itself is included in a field when -t
|
||||||
is absent. */
|
is absent. */
|
||||||
|
|
||||||
@ -2695,7 +2696,7 @@ Index: src/sort.c
|
|||||||
++ptr;
|
++ptr;
|
||||||
if (ptr < lim)
|
if (ptr < lim)
|
||||||
++ptr;
|
++ptr;
|
||||||
@@ -1589,11 +1736,70 @@ begfield (struct line const *line, struc
|
@@ -1587,11 +1734,70 @@ begfield (struct line const *line, struc
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2767,7 +2768,7 @@ Index: src/sort.c
|
|||||||
{
|
{
|
||||||
char *ptr = line->text, *lim = ptr + line->length - 1;
|
char *ptr = line->text, *lim = ptr + line->length - 1;
|
||||||
size_t eword = key->eword, echar = key->echar;
|
size_t eword = key->eword, echar = key->echar;
|
||||||
@@ -1608,10 +1814,10 @@ limfield (struct line const *line, struc
|
@@ -1606,10 +1812,10 @@ limfield (struct line const *line, struc
|
||||||
'beginning' is the first character following the delimiting TAB.
|
'beginning' is the first character following the delimiting TAB.
|
||||||
Otherwise, leave PTR pointing at the first 'blank' character after
|
Otherwise, leave PTR pointing at the first 'blank' character after
|
||||||
the preceding field. */
|
the preceding field. */
|
||||||
@ -2780,7 +2781,7 @@ Index: src/sort.c
|
|||||||
++ptr;
|
++ptr;
|
||||||
if (ptr < lim && (eword || echar))
|
if (ptr < lim && (eword || echar))
|
||||||
++ptr;
|
++ptr;
|
||||||
@@ -1657,10 +1863,10 @@ limfield (struct line const *line, struc
|
@@ -1655,10 +1861,10 @@ limfield (struct line const *line, struc
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Make LIM point to the end of (one byte past) the current field. */
|
/* Make LIM point to the end of (one byte past) the current field. */
|
||||||
@ -2793,7 +2794,7 @@ Index: src/sort.c
|
|||||||
if (newlim)
|
if (newlim)
|
||||||
lim = newlim;
|
lim = newlim;
|
||||||
}
|
}
|
||||||
@@ -1691,6 +1897,130 @@ limfield (struct line const *line, struc
|
@@ -1689,6 +1895,130 @@ limfield (struct line const *line, struc
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2924,7 +2925,7 @@ Index: src/sort.c
|
|||||||
/* Fill BUF reading from FP, moving buf->left bytes from the end
|
/* 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
|
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
|
file wasn't terminated by a newline, supply one. Set up BUF's line
|
||||||
@@ -1777,8 +2107,22 @@ fillbuf (struct buffer *buf, FILE *fp, c
|
@@ -1775,8 +2105,22 @@ fillbuf (struct buffer *buf, FILE *fp, c
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (key->skipsblanks)
|
if (key->skipsblanks)
|
||||||
@ -2949,7 +2950,7 @@ Index: src/sort.c
|
|||||||
line->keybeg = line_start;
|
line->keybeg = line_start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1899,7 +2243,7 @@ human_numcompare (char const *a, char co
|
@@ -1897,7 +2241,7 @@ human_numcompare (char const *a, char co
|
||||||
hideously fast. */
|
hideously fast. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -2958,7 +2959,7 @@ Index: src/sort.c
|
|||||||
{
|
{
|
||||||
while (blanks[to_uchar (*a)])
|
while (blanks[to_uchar (*a)])
|
||||||
a++;
|
a++;
|
||||||
@@ -1927,6 +2271,25 @@ nan_compare (char const *sa, char const
|
@@ -1925,6 +2269,25 @@ nan_compare (char const *sa, char const
|
||||||
return memcmp (&a, &b, sizeof a);
|
return memcmp (&a, &b, sizeof a);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2984,7 +2985,7 @@ Index: src/sort.c
|
|||||||
static int
|
static int
|
||||||
general_numcompare (char const *sa, char const *sb)
|
general_numcompare (char const *sa, char const *sb)
|
||||||
{
|
{
|
||||||
@@ -1959,7 +2322,7 @@ general_numcompare (char const *sa, char
|
@@ -1957,7 +2320,7 @@ general_numcompare (char const *sa, char
|
||||||
Return 0 if the name in S is not recognized. */
|
Return 0 if the name in S is not recognized. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -2993,7 +2994,7 @@ Index: src/sort.c
|
|||||||
{
|
{
|
||||||
size_t lo = 0;
|
size_t lo = 0;
|
||||||
size_t hi = MONTHS_PER_YEAR;
|
size_t hi = MONTHS_PER_YEAR;
|
||||||
@@ -2234,15 +2597,14 @@ debug_key (struct line const *line, stru
|
@@ -2232,15 +2595,14 @@ debug_key (struct line const *line, stru
|
||||||
char saved = *lim;
|
char saved = *lim;
|
||||||
*lim = '\0';
|
*lim = '\0';
|
||||||
|
|
||||||
@ -3011,7 +3012,7 @@ Index: src/sort.c
|
|||||||
else if (key->general_numeric)
|
else if (key->general_numeric)
|
||||||
ignore_value (strtold (beg, &tighter_lim));
|
ignore_value (strtold (beg, &tighter_lim));
|
||||||
else if (key->numeric || key->human_numeric)
|
else if (key->numeric || key->human_numeric)
|
||||||
@@ -2386,7 +2748,7 @@ key_warnings (struct keyfield const *gke
|
@@ -2384,7 +2746,7 @@ key_warnings (struct keyfield const *gke
|
||||||
bool maybe_space_aligned = !hard_LC_COLLATE && default_key_compare (key)
|
bool maybe_space_aligned = !hard_LC_COLLATE && default_key_compare (key)
|
||||||
&& !(key->schar || key->echar);
|
&& !(key->schar || key->echar);
|
||||||
bool line_offset = key->eword == 0 && key->echar != 0; /* -k1.x,1.y */
|
bool line_offset = key->eword == 0 && key->echar != 0; /* -k1.x,1.y */
|
||||||
@ -3020,7 +3021,7 @@ Index: src/sort.c
|
|||||||
&& ((!key->skipsblanks && !(implicit_skip || maybe_space_aligned))
|
&& ((!key->skipsblanks && !(implicit_skip || maybe_space_aligned))
|
||||||
|| (!key->skipsblanks && key->schar)
|
|| (!key->skipsblanks && key->schar)
|
||||||
|| (!key->skipeblanks && key->echar)))
|
|| (!key->skipeblanks && key->echar)))
|
||||||
@@ -2444,11 +2806,83 @@ key_warnings (struct keyfield const *gke
|
@@ -2442,11 +2804,83 @@ key_warnings (struct keyfield const *gke
|
||||||
error (0, 0, _("option '-r' only applies to last-resort comparison"));
|
error (0, 0, _("option '-r' only applies to last-resort comparison"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3105,7 +3106,7 @@ Index: src/sort.c
|
|||||||
{
|
{
|
||||||
struct keyfield *key = keylist;
|
struct keyfield *key = keylist;
|
||||||
|
|
||||||
@@ -2533,7 +2967,7 @@ keycompare (struct line const *a, struct
|
@@ -2531,7 +2965,7 @@ keycompare (struct line const *a, struct
|
||||||
else if (key->human_numeric)
|
else if (key->human_numeric)
|
||||||
diff = human_numcompare (ta, tb);
|
diff = human_numcompare (ta, tb);
|
||||||
else if (key->month)
|
else if (key->month)
|
||||||
@ -3114,7 +3115,7 @@ Index: src/sort.c
|
|||||||
else if (key->random)
|
else if (key->random)
|
||||||
diff = compare_random (ta, tlena, tb, tlenb);
|
diff = compare_random (ta, tlena, tb, tlenb);
|
||||||
else if (key->version)
|
else if (key->version)
|
||||||
@@ -2649,6 +3083,179 @@ keycompare (struct line const *a, struct
|
@@ -2647,6 +3081,179 @@ keycompare (struct line const *a, struct
|
||||||
return key->reverse ? -diff : diff;
|
return key->reverse ? -diff : diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3294,7 +3295,7 @@ Index: src/sort.c
|
|||||||
/* Compare two lines A and B, returning negative, zero, or positive
|
/* Compare two lines A and B, returning negative, zero, or positive
|
||||||
depending on whether A compares less than, equal to, or greater than B. */
|
depending on whether A compares less than, equal to, or greater than B. */
|
||||||
|
|
||||||
@@ -4109,7 +4716,7 @@ main (int argc, char **argv)
|
@@ -4107,7 +4714,7 @@ main (int argc, char **argv)
|
||||||
initialize_exit_failure (SORT_FAILURE);
|
initialize_exit_failure (SORT_FAILURE);
|
||||||
|
|
||||||
hard_LC_COLLATE = hard_locale (LC_COLLATE);
|
hard_LC_COLLATE = hard_locale (LC_COLLATE);
|
||||||
@ -3303,7 +3304,7 @@ Index: src/sort.c
|
|||||||
hard_LC_TIME = hard_locale (LC_TIME);
|
hard_LC_TIME = hard_locale (LC_TIME);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -4130,6 +4737,29 @@ main (int argc, char **argv)
|
@@ -4128,6 +4735,29 @@ main (int argc, char **argv)
|
||||||
thousands_sep = -1;
|
thousands_sep = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3333,7 +3334,7 @@ Index: src/sort.c
|
|||||||
have_read_stdin = false;
|
have_read_stdin = false;
|
||||||
inittables ();
|
inittables ();
|
||||||
|
|
||||||
@@ -4400,13 +5030,34 @@ main (int argc, char **argv)
|
@@ -4398,13 +5028,34 @@ main (int argc, char **argv)
|
||||||
|
|
||||||
case 't':
|
case 't':
|
||||||
{
|
{
|
||||||
@ -3372,7 +3373,7 @@ Index: src/sort.c
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Provoke with 'sort -txx'. Complain about
|
/* Provoke with 'sort -txx'. Complain about
|
||||||
@@ -4417,9 +5068,12 @@ main (int argc, char **argv)
|
@@ -4415,9 +5066,12 @@ main (int argc, char **argv)
|
||||||
quote (optarg));
|
quote (optarg));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3389,8 +3390,8 @@ Index: src/sort.c
|
|||||||
|
|
||||||
Index: src/unexpand.c
|
Index: src/unexpand.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- src/unexpand.c.orig 2012-03-24 21:26:51.000000000 +0100
|
--- src/unexpand.c.orig 2012-05-01 22:55:08.000000000 +0200
|
||||||
+++ src/unexpand.c 2012-04-16 17:00:03.957114654 +0200
|
+++ src/unexpand.c 2012-06-19 12:13:47.373654222 +0200
|
||||||
@@ -38,12 +38,29 @@
|
@@ -38,12 +38,29 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -3646,8 +3647,8 @@ Index: src/unexpand.c
|
|||||||
error (EXIT_FAILURE, errno, "-");
|
error (EXIT_FAILURE, errno, "-");
|
||||||
Index: src/uniq.c
|
Index: src/uniq.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- src/uniq.c.orig 2012-03-24 21:26:51.000000000 +0100
|
--- src/uniq.c.orig 2012-05-01 22:55:08.000000000 +0200
|
||||||
+++ src/uniq.c 2012-04-16 17:00:03.957114654 +0200
|
+++ src/uniq.c 2012-06-19 12:13:47.374654199 +0200
|
||||||
@@ -21,6 +21,16 @@
|
@@ -21,6 +21,16 @@
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@ -4016,9 +4017,9 @@ Index: src/uniq.c
|
|||||||
check_chars = SIZE_MAX;
|
check_chars = SIZE_MAX;
|
||||||
Index: tests/Makefile.am
|
Index: tests/Makefile.am
|
||||||
===================================================================
|
===================================================================
|
||||||
--- tests/Makefile.am.orig 2012-03-24 19:22:13.000000000 +0100
|
--- tests/Makefile.am.orig 2012-05-10 16:36:42.000000000 +0200
|
||||||
+++ tests/Makefile.am 2012-04-16 17:00:03.957114654 +0200
|
+++ tests/Makefile.am 2012-06-19 12:13:47.374654199 +0200
|
||||||
@@ -243,6 +243,7 @@ TESTS = \
|
@@ -247,6 +247,7 @@ TESTS = \
|
||||||
misc/sort-debug-warn \
|
misc/sort-debug-warn \
|
||||||
misc/sort-discrim \
|
misc/sort-discrim \
|
||||||
misc/sort-files0-from \
|
misc/sort-files0-from \
|
||||||
@ -4026,7 +4027,7 @@ Index: tests/Makefile.am
|
|||||||
misc/sort-float \
|
misc/sort-float \
|
||||||
misc/sort-merge \
|
misc/sort-merge \
|
||||||
misc/sort-merge-fdlimit \
|
misc/sort-merge-fdlimit \
|
||||||
@@ -537,6 +538,10 @@ TESTS = \
|
@@ -543,6 +544,10 @@ TESTS = \
|
||||||
$(root_tests)
|
$(root_tests)
|
||||||
|
|
||||||
pr_data = \
|
pr_data = \
|
||||||
@ -4040,7 +4041,7 @@ Index: tests/Makefile.am
|
|||||||
Index: tests/misc/cut
|
Index: tests/misc/cut
|
||||||
===================================================================
|
===================================================================
|
||||||
--- tests/misc/cut.orig 2012-02-03 10:22:06.000000000 +0100
|
--- tests/misc/cut.orig 2012-02-03 10:22:06.000000000 +0100
|
||||||
+++ tests/misc/cut 2012-04-16 17:00:03.957114654 +0200
|
+++ tests/misc/cut 2012-06-19 12:13:47.374654199 +0200
|
||||||
@@ -30,7 +30,7 @@ my $mb_locale = $ENV{LOCALE_FR_UTF8};
|
@@ -30,7 +30,7 @@ my $mb_locale = $ENV{LOCALE_FR_UTF8};
|
||||||
my $prog = 'cut';
|
my $prog = 'cut';
|
||||||
my $try = "Try '$prog --help' for more information.\n";
|
my $try = "Try '$prog --help' for more information.\n";
|
||||||
@ -4062,7 +4063,7 @@ Index: tests/misc/cut
|
|||||||
Index: tests/misc/mb1.I
|
Index: tests/misc/mb1.I
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||||
+++ tests/misc/mb1.I 2012-04-16 17:00:03.958114628 +0200
|
+++ tests/misc/mb1.I 2012-06-19 12:13:47.374654199 +0200
|
||||||
@@ -0,0 +1,4 @@
|
@@ -0,0 +1,4 @@
|
||||||
+Apple@10
|
+Apple@10
|
||||||
+Banana@5
|
+Banana@5
|
||||||
@ -4071,7 +4072,7 @@ Index: tests/misc/mb1.I
|
|||||||
Index: tests/misc/mb1.X
|
Index: tests/misc/mb1.X
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||||
+++ tests/misc/mb1.X 2012-04-16 17:00:03.958114628 +0200
|
+++ tests/misc/mb1.X 2012-06-19 12:13:47.374654199 +0200
|
||||||
@@ -0,0 +1,4 @@
|
@@ -0,0 +1,4 @@
|
||||||
+Banana@5
|
+Banana@5
|
||||||
+Apple@10
|
+Apple@10
|
||||||
@ -4080,7 +4081,7 @@ Index: tests/misc/mb1.X
|
|||||||
Index: tests/misc/mb2.I
|
Index: tests/misc/mb2.I
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||||
+++ tests/misc/mb2.I 2012-04-16 17:00:03.958114628 +0200
|
+++ tests/misc/mb2.I 2012-06-19 12:13:47.374654199 +0200
|
||||||
@@ -0,0 +1,4 @@
|
@@ -0,0 +1,4 @@
|
||||||
+Apple@AA10@@20
|
+Apple@AA10@@20
|
||||||
+Banana@AA5@@30
|
+Banana@AA5@@30
|
||||||
@ -4089,7 +4090,7 @@ Index: tests/misc/mb2.I
|
|||||||
Index: tests/misc/mb2.X
|
Index: tests/misc/mb2.X
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||||
+++ tests/misc/mb2.X 2012-04-16 17:00:03.958114628 +0200
|
+++ tests/misc/mb2.X 2012-06-19 12:13:47.374654199 +0200
|
||||||
@@ -0,0 +1,4 @@
|
@@ -0,0 +1,4 @@
|
||||||
+Citrus@AA20@@5
|
+Citrus@AA20@@5
|
||||||
+Cherry@AA30@@10
|
+Cherry@AA30@@10
|
||||||
@ -4098,7 +4099,7 @@ Index: tests/misc/mb2.X
|
|||||||
Index: tests/misc/sort-mb-tests
|
Index: tests/misc/sort-mb-tests
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||||
+++ tests/misc/sort-mb-tests 2012-04-16 17:00:03.958114628 +0200
|
+++ tests/misc/sort-mb-tests 2012-06-19 12:13:47.375654176 +0200
|
||||||
@@ -0,0 +1,58 @@
|
@@ -0,0 +1,58 @@
|
||||||
+#! /bin/sh
|
+#! /bin/sh
|
||||||
+case $# in
|
+case $# in
|
||||||
|
@ -1,176 +0,0 @@
|
|||||||
commit 032a549481444395558286b433296c97c09c721d
|
|
||||||
Author: Jim Meyering <meyering@redhat.com>
|
|
||||||
Date: Fri Apr 27 13:28:32 2012 +0200
|
|
||||||
|
|
||||||
id,groups: with no user name, print only real and/or effective IDs,
|
|
||||||
|
|
||||||
... i.e., don't use the getpw* functions.
|
|
||||||
|
|
||||||
Before this change, running groups or id with no user name argument
|
|
||||||
would include a group name or ID from /etc/passwd. Thus, under unusual
|
|
||||||
circumstances (default group is changed, but has not taken effect for a
|
|
||||||
given session), those programs could print a name or ID that is neither
|
|
||||||
real nor effective.
|
|
||||||
|
|
||||||
To demonstrate, run this:
|
|
||||||
|
|
||||||
echo 'for i in 1 2; do id -G; sleep 1.5; done' \
|
|
||||||
|su -s /bin/sh ftp - &
|
|
||||||
sleep 1; perl -pi -e 's/^(ftp:x:\d+):(\d+)/$1:9876/' /etc/passwd
|
|
||||||
|
|
||||||
Those id -G commands printed the following:
|
|
||||||
|
|
||||||
50
|
|
||||||
50 9876
|
|
||||||
|
|
||||||
With this change, they print this:
|
|
||||||
|
|
||||||
50
|
|
||||||
50
|
|
||||||
|
|
||||||
Similarly, running those programs set-GID could make them
|
|
||||||
print one ID too many.
|
|
||||||
|
|
||||||
* src/group-list.c (print_group_list): When username is NULL, pass
|
|
||||||
egid, not getpwuid(ruid)->pw_gid), to xgetgroups, per the API
|
|
||||||
requirements of xgetgroups callee, mgetgroups.
|
|
||||||
When not using the password database, don't call getpwuid.
|
|
||||||
* NEWS (Bug fixes): Mention it.
|
|
||||||
* tests/misc/id-setgid: New file.
|
|
||||||
* tests/Makefile.am (TESTS): Add it.
|
|
||||||
(root_tests): It's a root-only test, so add it here, too.
|
|
||||||
Originally reported by Brynnen Owen as http://bugs.gnu.org/7320.
|
|
||||||
Raised again by Marc Mengel in http://bugzilla.redhat.com/816708.
|
|
||||||
|
|
||||||
Index: NEWS
|
|
||||||
===================================================================
|
|
||||||
--- NEWS.orig 2012-03-26 14:06:43.000000000 +0200
|
|
||||||
+++ NEWS 2012-05-07 14:20:23.431517270 +0200
|
|
||||||
@@ -1,5 +1,15 @@
|
|
||||||
GNU coreutils NEWS -*- outline -*-
|
|
||||||
|
|
||||||
+** Bug fixes
|
|
||||||
+
|
|
||||||
+ id and groups, when invoked with no user name argument, would print
|
|
||||||
+ the default group ID listed in the password database, and sometimes
|
|
||||||
+ that ID would be neither real nor effective. For example, when run
|
|
||||||
+ set-GID, or in a session for which the default group has just been
|
|
||||||
+ changed, the new group ID would be listed, even though it is not
|
|
||||||
+ yet effective.
|
|
||||||
+
|
|
||||||
+
|
|
||||||
* Noteworthy changes in release 8.16 (2012-03-26) [stable]
|
|
||||||
|
|
||||||
** New features
|
|
||||||
Index: THANKS.in
|
|
||||||
===================================================================
|
|
||||||
--- THANKS.in.orig 2012-03-24 19:22:13.000000000 +0100
|
|
||||||
+++ THANKS.in 2012-05-07 14:19:38.953620833 +0200
|
|
||||||
@@ -98,6 +98,7 @@ Brian Silverman bsil
|
|
||||||
Brian Youmans 3diff@gnu.org
|
|
||||||
Britton Leo Kerin fsblk@aurora.uaf.edu
|
|
||||||
Bruce Robertson brucer@theodolite.dyndns.org
|
|
||||||
+Brynnen Owen owen@illinois.edu
|
|
||||||
Carl Johnson carlj@cjlinux.home.org
|
|
||||||
Carl Lowenstein cdl@mpl.UCSD.EDU
|
|
||||||
Carl Roth roth@urs.us
|
|
||||||
@@ -355,6 +356,7 @@ Manfred Hollstein manf
|
|
||||||
Марк Коренберг socketpair@gmail.com
|
|
||||||
Marc Boucher marc@mbsi.ca
|
|
||||||
Marc Haber mh+debian-bugs@zugschlus.de
|
|
||||||
+Marc Mengel mengel@fnal.gov
|
|
||||||
Marc Lehman schmorp@schmorp.de
|
|
||||||
Marc Olzheim marcolz@stack.nl
|
|
||||||
Marco Franzen Marco.Franzen@Thyron.com
|
|
||||||
Index: src/group-list.c
|
|
||||||
===================================================================
|
|
||||||
--- src/group-list.c.orig 2012-02-03 14:16:13.000000000 +0100
|
|
||||||
+++ src/group-list.c 2012-05-07 14:19:38.953620833 +0200
|
|
||||||
@@ -38,11 +38,14 @@ print_group_list (const char *username,
|
|
||||||
bool use_names)
|
|
||||||
{
|
|
||||||
bool ok = true;
|
|
||||||
- struct passwd *pwd;
|
|
||||||
+ struct passwd *pwd = NULL;
|
|
||||||
|
|
||||||
- pwd = getpwuid (ruid);
|
|
||||||
- if (pwd == NULL)
|
|
||||||
- ok = false;
|
|
||||||
+ if (username)
|
|
||||||
+ {
|
|
||||||
+ pwd = getpwuid (ruid);
|
|
||||||
+ if (pwd == NULL)
|
|
||||||
+ ok = false;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (!print_group (rgid, use_names))
|
|
||||||
ok = false;
|
|
||||||
@@ -58,8 +61,7 @@ print_group_list (const char *username,
|
|
||||||
gid_t *groups;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
- int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : (gid_t) -1),
|
|
||||||
- &groups);
|
|
||||||
+ int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : egid), &groups);
|
|
||||||
if (n_groups < 0)
|
|
||||||
{
|
|
||||||
if (username)
|
|
||||||
Index: tests/Makefile.am
|
|
||||||
===================================================================
|
|
||||||
--- tests/Makefile.am.orig 2012-05-07 14:19:38.807624454 +0200
|
|
||||||
+++ tests/Makefile.am 2012-05-07 14:19:38.953620833 +0200
|
|
||||||
@@ -36,6 +36,7 @@ root_tests = \
|
|
||||||
ls/nameless-uid \
|
|
||||||
misc/chcon \
|
|
||||||
misc/chroot-credentials \
|
|
||||||
+ misc/id-setgid \
|
|
||||||
misc/selinux \
|
|
||||||
misc/truncate-owned-by-other \
|
|
||||||
mkdir/writable-under-readonly \
|
|
||||||
@@ -197,6 +198,7 @@ TESTS = \
|
|
||||||
misc/head-pos \
|
|
||||||
misc/id-context \
|
|
||||||
misc/id-groups \
|
|
||||||
+ misc/id-setgid \
|
|
||||||
misc/md5sum \
|
|
||||||
misc/md5sum-bsd \
|
|
||||||
misc/md5sum-newline \
|
|
||||||
Index: tests/misc/id-setgid
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
||||||
+++ tests/misc/id-setgid 2012-05-07 14:19:38.953620833 +0200
|
|
||||||
@@ -0,0 +1,34 @@
|
|
||||||
+#!/bin/sh
|
|
||||||
+# Verify that id -G prints the right group when run set-GID.
|
|
||||||
+
|
|
||||||
+# 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 <http://www.gnu.org/licenses/>.
|
|
||||||
+
|
|
||||||
+. "${srcdir=.}/init.sh"; path_prepend_ ../src
|
|
||||||
+print_ver_ id
|
|
||||||
+require_root_
|
|
||||||
+
|
|
||||||
+g=$(id -u $NON_ROOT_USERNAME) || framework_failure_
|
|
||||||
+
|
|
||||||
+# Construct a different group number.
|
|
||||||
+gp1=$(expr $g + 1)
|
|
||||||
+
|
|
||||||
+echo $gp1 > exp || framework_failure_
|
|
||||||
+
|
|
||||||
+setuidgid -g $gp1 $NON_ROOT_USERNAME env PATH="$PATH" id -G > out || fail=1
|
|
||||||
+compare exp out || fail=1
|
|
||||||
+# With coreutils-8.16 and earlier, id -G would print both: $gp1 $g
|
|
||||||
+
|
|
||||||
+Exit $fail
|
|
@ -1,178 +0,0 @@
|
|||||||
commit ee9e43460f366406edff96b5abfb3ff33587e062
|
|
||||||
Author: Jim Meyering <meyering@redhat.com>
|
|
||||||
Date: Fri May 4 16:42:31 2012 +0200
|
|
||||||
|
|
||||||
cp: handle a race condition more sensibly
|
|
||||||
|
|
||||||
* src/copy.c (copy_reg): In a narrow race (stat sees dest, yet
|
|
||||||
open-without-O_CREAT fails with ENOENT), retry the open with O_CREAT.
|
|
||||||
* tests/cp/nfs-removal-race: New file.
|
|
||||||
* tests/Makefile.am (TESTS): Add it.
|
|
||||||
* NEWS (Bug fixes): Mention it.
|
|
||||||
Reported by Philipp Thomas and Neil F. Brown in
|
|
||||||
http://bugs.gnu.org/11100
|
|
||||||
|
|
||||||
Index: NEWS
|
|
||||||
===================================================================
|
|
||||||
--- NEWS.orig 2012-05-07 14:20:52.079810454 +0200
|
|
||||||
+++ NEWS 2012-05-07 14:21:35.566738140 +0200
|
|
||||||
@@ -9,6 +9,14 @@ GNU coreutils NEWS
|
|
||||||
changed, the new group ID would be listed, even though it is not
|
|
||||||
yet effective.
|
|
||||||
|
|
||||||
+ 'cp S D' is no longer subject to a race: if an existing D were removed
|
|
||||||
+ between the initial stat and subsequent open-without-O_CREAT, cp would
|
|
||||||
+ fail with a confusing diagnostic saying that the destination, D, was not
|
|
||||||
+ found. Now, in this unusual case, it retries the open (but with O_CREAT),
|
|
||||||
+ and hence usually succeeds. With NFS attribute caching, the condition
|
|
||||||
+ was particularly easy to trigger, since there, the removal of D could
|
|
||||||
+ precede the initial stat. [This bug was present in "the beginning".]
|
|
||||||
+
|
|
||||||
|
|
||||||
* Noteworthy changes in release 8.16 (2012-03-26) [stable]
|
|
||||||
|
|
||||||
Index: THANKS.in
|
|
||||||
===================================================================
|
|
||||||
--- THANKS.in.orig 2012-05-07 14:20:52.079810454 +0200
|
|
||||||
+++ THANKS.in 2012-05-07 14:20:52.087810257 +0200
|
|
||||||
@@ -439,7 +439,7 @@ Minh Tran-Le tran
|
|
||||||
Morten Welinder terra@diku.dk
|
|
||||||
Nao Nishijima nao.nishijima.xt@hitachi.com
|
|
||||||
Neal H Walfield neal@cs.uml.edu
|
|
||||||
-Neil Brown neilb@cse.unsw.edu.au
|
|
||||||
+Neil F. Brown neilb@suse.de
|
|
||||||
Nelson H. F. Beebe beebe@math.utah.edu
|
|
||||||
Nick Estes debian@nickstoys.com
|
|
||||||
Nick Graham nick.d.graham@gmail.com
|
|
||||||
@@ -489,6 +489,7 @@ Phil Richards phil
|
|
||||||
Philippe De Muyter phdm@macqel.be
|
|
||||||
Philippe Schnoebelen Philippe.Schnoebelen@imag.fr
|
|
||||||
Phillip Jones mouse@datastacks.com
|
|
||||||
+Philipp Thomas pth@suse.de
|
|
||||||
Piergiorgio Sartor sartor@sony.de
|
|
||||||
Pieter Bowman bowman@math.utah.edu
|
|
||||||
Piotr Gackiewicz gacek@intertele.pl
|
|
||||||
Index: src/copy.c
|
|
||||||
===================================================================
|
|
||||||
--- src/copy.c.orig 2012-03-24 21:26:51.000000000 +0100
|
|
||||||
+++ src/copy.c 2012-05-07 14:20:52.087810257 +0200
|
|
||||||
@@ -889,6 +889,8 @@ copy_reg (char const *src_name, char con
|
|
||||||
|
|
||||||
if (*new_dst)
|
|
||||||
{
|
|
||||||
+ open_with_O_CREAT:;
|
|
||||||
+
|
|
||||||
int open_flags = O_WRONLY | O_CREAT | O_BINARY;
|
|
||||||
dest_desc = open (dst_name, open_flags | O_EXCL,
|
|
||||||
dst_mode & ~omitted_permissions);
|
|
||||||
@@ -939,6 +941,23 @@ copy_reg (char const *src_name, char con
|
|
||||||
|
|
||||||
if (dest_desc < 0)
|
|
||||||
{
|
|
||||||
+ /* If we've just failed due to ENOENT for an ostensibly preexisting
|
|
||||||
+ destination (*new_dst was 0), that's a bit of a contradiction/race:
|
|
||||||
+ the prior stat/lstat said the file existed (*new_dst was 0), yet
|
|
||||||
+ the subsequent open-existing-file failed with ENOENT. With NFS,
|
|
||||||
+ the race window is wider still, since its meta-data caching tends
|
|
||||||
+ to make the stat succeed for a just-removed remote file, while the
|
|
||||||
+ more-definitive initial open call will fail with ENOENT. When this
|
|
||||||
+ situation arises, we attempt to open again, but this time with
|
|
||||||
+ O_CREAT. Do this only when not in move-mode, since when handling
|
|
||||||
+ a cross-device move, we must never open an existing destination. */
|
|
||||||
+ if (dest_errno == ENOENT && ! *new_dst && ! x->move_mode)
|
|
||||||
+ {
|
|
||||||
+ *new_dst = 1;
|
|
||||||
+ goto open_with_O_CREAT;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Otherwise, it's an error. */
|
|
||||||
error (0, dest_errno, _("cannot create regular file %s"),
|
|
||||||
quote (dst_name));
|
|
||||||
return_val = false;
|
|
||||||
Index: tests/Makefile.am
|
|
||||||
===================================================================
|
|
||||||
--- tests/Makefile.am.orig 2012-05-07 14:20:52.080810429 +0200
|
|
||||||
+++ tests/Makefile.am 2012-05-07 14:20:52.087810257 +0200
|
|
||||||
@@ -347,6 +347,7 @@ TESTS = \
|
|
||||||
cp/link-no-deref \
|
|
||||||
cp/link-preserve \
|
|
||||||
cp/link-symlink \
|
|
||||||
+ cp/nfs-removal-race \
|
|
||||||
cp/no-deref-link1 \
|
|
||||||
cp/no-deref-link2 \
|
|
||||||
cp/no-deref-link3 \
|
|
||||||
Index: tests/cp/nfs-removal-race
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
||||||
+++ tests/cp/nfs-removal-race 2012-05-07 14:20:52.087810257 +0200
|
|
||||||
@@ -0,0 +1,70 @@
|
|
||||||
+#!/bin/sh
|
|
||||||
+# Running cp S D on an NFS client while another client has just removed D
|
|
||||||
+# would lead (w/coreutils-8.16 and earlier) to cp's initial stat call
|
|
||||||
+# seeing (via stale NFS cache) that D exists, so that cp would then call
|
|
||||||
+# open without the O_CREAT flag. Yet, the open must actually consult
|
|
||||||
+# the server, which confesses that D has been deleted, thus causing the
|
|
||||||
+# open call to fail with ENOENT.
|
|
||||||
+#
|
|
||||||
+# This test simulates that situation by intercepting stat for a nonexistent
|
|
||||||
+# destination, D, and making the stat fill in the result struct for another
|
|
||||||
+# file and return 0.
|
|
||||||
+#
|
|
||||||
+# This test is skipped on systems that lack LD_PRELOAD support; that's fine.
|
|
||||||
+# Similarly, on a system that lacks <dlfcn.h> or __xstat, skipping it is 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 <http://www.gnu.org/licenses/>.
|
|
||||||
+
|
|
||||||
+. "${srcdir=.}/init.sh"; path_prepend_ ../src
|
|
||||||
+print_ver_ cp
|
|
||||||
+
|
|
||||||
+# Replace each stat call with a call to this wrapper.
|
|
||||||
+cat > k.c <<'EOF' || framework_failure_
|
|
||||||
+#define _GNU_SOURCE
|
|
||||||
+#include <sys/types.h>
|
|
||||||
+#include <dlfcn.h>
|
|
||||||
+
|
|
||||||
+#define __xstat __xstat_orig
|
|
||||||
+
|
|
||||||
+#include <sys/stat.h>
|
|
||||||
+#include <stddef.h>
|
|
||||||
+
|
|
||||||
+#undef __xstat
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+__xstat (int ver, const char *path, struct stat *st)
|
|
||||||
+{
|
|
||||||
+ static int (*real_stat)(int ver, const char *path, struct stat *st) = NULL;
|
|
||||||
+ if (!real_stat)
|
|
||||||
+ real_stat = dlsym (RTLD_NEXT, "__xstat");
|
|
||||||
+ /* When asked to stat nonexistent "d",
|
|
||||||
+ return results suggesting it exists. */
|
|
||||||
+ return real_stat (ver, *path == 'd' && path[1] == 0 ? "d2" : path, st);
|
|
||||||
+}
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+# Then compile/link it:
|
|
||||||
+$CC -shared -fPIC -O2 k.c -o k.so \
|
|
||||||
+ || framework_failure_ 'failed to compile with -shared -fPIC'
|
|
||||||
+
|
|
||||||
+touch d2 || framework_failure_
|
|
||||||
+echo xyz > src || framework_failure_
|
|
||||||
+
|
|
||||||
+# Finally, run the test:
|
|
||||||
+LD_PRELOAD=./k.so cp src d || fail=1
|
|
||||||
+
|
|
||||||
+compare src d || fail=1
|
|
||||||
+Exit $fail
|
|
@ -1,3 +1,35 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Jun 19 12:37:47 CEST 2012 - pth@suse.de
|
||||||
|
|
||||||
|
- Update to 8.17:
|
||||||
|
** Bug fixes
|
||||||
|
|
||||||
|
* stat no longer reports a negative file size as a huge positive
|
||||||
|
number. [bug present since 'stat' was introduced in
|
||||||
|
fileutils-4.1.9]
|
||||||
|
|
||||||
|
** New features
|
||||||
|
|
||||||
|
* split and truncate now allow any seekable files in situations
|
||||||
|
where the file size is needed, instead of insisting on regular
|
||||||
|
files.
|
||||||
|
|
||||||
|
* fmt now accepts the --goal=WIDTH (-g) option.
|
||||||
|
|
||||||
|
* stat -f recognizes new file system types: bdevfs, inodefs, qnx6
|
||||||
|
|
||||||
|
** Changes in behavior
|
||||||
|
|
||||||
|
* cp,mv,install,cat,split: now read and write a minimum of 64KiB at
|
||||||
|
a time. This was previously 32KiB and increasing to 64KiB was
|
||||||
|
seen to increase throughput by about 10% when reading cached
|
||||||
|
files on 64 bit GNU/Linux.
|
||||||
|
|
||||||
|
* cp --attributes-only no longer truncates any existing destination
|
||||||
|
file, allowing for more general copying of attributes from one
|
||||||
|
file to another.
|
||||||
|
- Bring german message catalog up-to-date
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Tue May 15 22:34:03 UTC 2012 - schwab@linux-m68k.org
|
Tue May 15 22:34:03 UTC 2012 - schwab@linux-m68k.org
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ BuildRequires: libselinux-devel
|
|||||||
BuildRequires: pam-devel
|
BuildRequires: pam-devel
|
||||||
BuildRequires: xz
|
BuildRequires: xz
|
||||||
Url: http://www.gnu.org/software/coreutils/
|
Url: http://www.gnu.org/software/coreutils/
|
||||||
Version: 8.16
|
Version: 8.17
|
||||||
Release: 0
|
Release: 0
|
||||||
Provides: fileutils = %{version}
|
Provides: fileutils = %{version}
|
||||||
Provides: mktemp = %{version}
|
Provides: mktemp = %{version}
|
||||||
@ -76,10 +76,6 @@ Patch33: coreutils-8.9-singlethreaded-sort.patch
|
|||||||
Patch34: coreutils-acl-nofollow.patch
|
Patch34: coreutils-acl-nofollow.patch
|
||||||
Patch36: coreutils-basename_documentation.patch
|
Patch36: coreutils-basename_documentation.patch
|
||||||
Patch37: coreutils-bnc#697897-setsid.patch
|
Patch37: coreutils-bnc#697897-setsid.patch
|
||||||
#Upstream patch will be included with 8.17
|
|
||||||
Patch38: coreutils-id_show_real_groups.patch
|
|
||||||
#Upstream patch, needs to be removed for 8.17
|
|
||||||
Patch39: coreutils-race_in_cp.patch
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
# this will create a cycle, broken up randomly - coreutils is just too core to have other
|
# this will create a cycle, broken up randomly - coreutils is just too core to have other
|
||||||
# prerequires
|
# prerequires
|
||||||
@ -123,8 +119,6 @@ uname unexpand uniq unlink uptime users vdir wc who whoami yes
|
|||||||
%patch34
|
%patch34
|
||||||
%patch36
|
%patch36
|
||||||
%patch37
|
%patch37
|
||||||
%patch38
|
|
||||||
%patch39
|
|
||||||
|
|
||||||
xz -dc %{S:4} >po/de.po
|
xz -dc %{S:4} >po/de.po
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user