c09ae1bc93
** Bug fixes cp -u no longer does unnecessary copying merely because the source has finer-grained time stamps than the destination. od now prints floating-point numbers without losing information, and it no longer omits spaces between floating-point columns in some cases. sort -u with at least two threads could attempt to read through a corrupted pointer. [bug introduced in coreutils-8.6] sort with at least two threads and with blocked output would busy-loop (spinlock) all threads, often using 100% of available CPU cycles to do no work. I.e., "sort < big-file | less" could waste a lot of power. [bug introduced in coreutils-8.6] sort with at least two threads no longer segfaults due to use of pointers into the stack of an expired thread. [bug introduced in coreutils-8.6] sort --compress no longer mishandles subprocesses' exit statuses, no longer hangs indefinitely due to a bug in waiting for subprocesses, and no longer generates many more than NMERGE subprocesses. sort -m -o f f ... f no longer dumps core when file descriptors are limited. csplit no longer corrupts heap when writing more than 999 files, nor does it leak memory for every chunk of input processed [the bugs were present in the initial implementation] tail -F once again notices changes in a currently unavailable remote directory [bug introduced in coreutils-7.5] ** Changes in behavior sort will not create more than 8 threads by default due to diminishing performance gains. Also the --parallel option is no longer restricted to the number of available processors. cp --attributes-only now completely overrides --reflink. Previously a reflink was needlessly attempted. OBS-URL: https://build.opensuse.org/package/show/Base:System/coreutils?expand=0&rev=77
96 lines
2.8 KiB
Diff
96 lines
2.8 KiB
Diff
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
|
Date: Thu, 30 Dec 2010 01:36:59 +0000
|
|
Subject: [PATCH] split: fix the suffix length calculation
|
|
|
|
* src/split.c (set_suffix_length): Only auto calculate
|
|
the suffix length when the number of files is specified.
|
|
* tests/misc/split-a: Add a case to trigger the bug.
|
|
* NEWS: Mention the fix.
|
|
---
|
|
NEWS | 6 ++++++
|
|
src/split.c | 32 ++++++++++++++++++++------------
|
|
tests/misc/split-a | 5 +++++
|
|
3 files changed, 31 insertions(+), 12 deletions(-)
|
|
|
|
--- src/split.c
|
|
+++ src/split.c
|
|
@@ -78,6 +78,13 @@ static bool elide_empty_files;
|
|
input to output, which is much slower, so disabled by default. */
|
|
static bool unbuffered;
|
|
|
|
+/* The split mode to use. */
|
|
+enum Split_type
|
|
+{
|
|
+ type_undef, type_bytes, type_byteslines, type_lines, type_digits,
|
|
+ type_chunk_bytes, type_chunk_lines, type_rr
|
|
+};
|
|
+
|
|
/* For long options that have no equivalent short option, use a
|
|
non-character as a pseudo short option, starting with CHAR_MAX + 1. */
|
|
enum
|
|
@@ -105,16 +112,21 @@ static struct option const longopts[] =
|
|
};
|
|
|
|
static void
|
|
-set_suffix_length (uintmax_t n_units)
|
|
+set_suffix_length (uintmax_t n_units, enum Split_type split_type)
|
|
{
|
|
#define DEFAULT_SUFFIX_LENGTH 2
|
|
|
|
size_t suffix_needed = 0;
|
|
- size_t alphabet_len = strlen (suffix_alphabet);
|
|
- bool alphabet_slop = (n_units % alphabet_len) != 0;
|
|
- while (n_units /= alphabet_len)
|
|
- suffix_needed++;
|
|
- suffix_needed += alphabet_slop;
|
|
+
|
|
+ if (split_type == type_chunk_bytes || split_type == type_chunk_lines
|
|
+ || split_type == type_rr)
|
|
+ {
|
|
+ size_t alphabet_len = strlen (suffix_alphabet);
|
|
+ bool alphabet_slop = (n_units % alphabet_len) != 0;
|
|
+ while (n_units /= alphabet_len)
|
|
+ suffix_needed++;
|
|
+ suffix_needed += alphabet_slop;
|
|
+ }
|
|
|
|
if (suffix_length) /* set by user */
|
|
{
|
|
@@ -780,11 +792,7 @@ int
|
|
main (int argc, char **argv)
|
|
{
|
|
struct stat stat_buf;
|
|
- enum
|
|
- {
|
|
- type_undef, type_bytes, type_byteslines, type_lines, type_digits,
|
|
- type_chunk_bytes, type_chunk_lines, type_rr
|
|
- } split_type = type_undef;
|
|
+ enum Split_type split_type = type_undef;
|
|
size_t in_blk_size = 0; /* optimal block size of input file device */
|
|
char *buf; /* file i/o buffer */
|
|
size_t page_size = getpagesize ();
|
|
@@ -984,7 +992,7 @@ main (int argc, char **argv)
|
|
usage (EXIT_FAILURE);
|
|
}
|
|
|
|
- set_suffix_length (n_units);
|
|
+ set_suffix_length (n_units, split_type);
|
|
|
|
/* Get out the filename arguments. */
|
|
|
|
--- tests/misc/split-a
|
|
+++ tests/misc/split-a
|
|
@@ -63,4 +63,9 @@ for f in $files; do
|
|
n=$(expr $n + 1)
|
|
done
|
|
|
|
+# Ensure that -a is independent of -[bCl]
|
|
+split -a2 -b1000 < /dev/null || fail=1
|
|
+split -a2 -l1000 < /dev/null || fail=1
|
|
+split -a2 -C1000 < /dev/null || fail=1
|
|
+
|
|
Exit $fail
|
|
--
|
|
1.7.3.4
|
|
|