aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2023-09-06 03:28:19 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2023-09-14 14:59:52 +0000
commite035e58097ae6e7fbdf4934c65752baf3f6ab7d3 (patch)
tree00860b8cc8d2e6a5aeb2f2bed258d640447e3c57
parent9dcbb9e681d70bbe6bab093ddea60bd8687f2c4c (diff)
downloadsrc-e035e58097ae6e7fbdf4934c65752baf3f6ab7d3.tar.gz
src-e035e58097ae6e7fbdf4934c65752baf3f6ab7d3.zip
split: Add missing test cases.
This adds test cases for c4f7198f47c1 and ac17fc816e67. MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D41755 (cherry picked from commit cbea5eddb1b6ae2a101beacf00bf165517f4f2b1) split: Code cleanup. MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D41756 (cherry picked from commit 851bf856d1a7ad5427ea9c22639ab6f6c4a3f503) split: Fix linecount parsing. The “undocumented kludge” which unfortunately can't be dropped for backward compatibility reasons was prone to segfaulting and would improperly allow a new linecount when one was already set. Fix these issues and add regression tests. MFC after: 1 week Sponsored by: Klara, Inc. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D41757 (cherry picked from commit 117c54a78ccd214c236806721f21da750e512d3e)
-rw-r--r--usr.bin/split/split.c45
-rwxr-xr-xusr.bin/split/tests/split_test.sh45
2 files changed, 67 insertions, 23 deletions
diff --git a/usr.bin/split/split.c b/usr.bin/split/split.c
index b5a457ab6ecd..af1ed69c9482 100644
--- a/usr.bin/split/split.c
+++ b/usr.bin/split/split.c
@@ -41,7 +41,6 @@ static const char sccsid[] = "@(#)split.c 8.2 (Berkeley) 4/16/94";
#endif
#include <sys/param.h>
-#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
@@ -85,14 +84,14 @@ static void usage(void) __dead2;
int
main(int argc, char **argv)
{
- int ch;
- int error;
- char *ep, *p;
+ const char *p;
+ char *ep;
+ int ch, error;
setlocale(LC_ALL, "");
dflag = false;
- while ((ch = getopt(argc, argv, "0123456789a:b:cdl:n:p:")) != -1)
+ while ((ch = getopt(argc, argv, "0::1::2::3::4::5::6::7::8::9::a:b:cdl:n:p:")) != -1)
switch (ch) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
@@ -100,17 +99,15 @@ main(int argc, char **argv)
* Undocumented kludge: split was originally designed
* to take a number after a dash.
*/
- if (numlines == 0) {
- p = argv[optind - 1];
- if (p[0] == '-' && p[1] == ch && !p[2])
- numlines = strtol(++p, &ep, 10);
- else
- numlines =
- strtol(argv[optind] + 1, &ep, 10);
- if (numlines <= 0 || *ep)
- errx(EX_USAGE,
- "%s: illegal line count", optarg);
- }
+ if (numlines != 0)
+ usage();
+ numlines = ch - '0';
+ p = optarg ? optarg : "";
+ while (numlines >= 0 && *p >= '0' && *p <= '9')
+ numlines = numlines * 10 + *p++ - '0';
+ if (numlines <= 0 || *p != '\0')
+ errx(EX_USAGE, "%c%s: illegal line count", ch,
+ optarg ? optarg : "");
break;
case 'a': /* Suffix length */
if ((sufflen = strtol(optarg, &ep, 10)) <= 0 || *ep)
@@ -157,17 +154,22 @@ main(int argc, char **argv)
argv += optind;
argc -= optind;
- if (*argv != NULL) { /* Input file. */
+ if (argc > 0) { /* Input file. */
if (strcmp(*argv, "-") == 0)
ifd = STDIN_FILENO;
else if ((ifd = open(*argv, O_RDONLY, 0)) < 0)
err(EX_NOINPUT, "%s", *argv);
++argv;
+ --argc;
+ }
+ if (argc > 0) { /* File name prefix. */
+ if (strlcpy(fname, *argv, sizeof(fname)) >= sizeof(fname))
+ errx(EX_USAGE, "file name prefix is too long: %s",
+ *argv);
+ ++argv;
+ --argc;
}
- if (*argv != NULL) /* File name prefix. */
- if (strlcpy(fname, *argv++, sizeof(fname)) >= sizeof(fname))
- errx(EX_USAGE, "file name prefix is too long");
- if (*argv != NULL)
+ if (argc > 0)
usage();
if (strlen(fname) + (unsigned long)sufflen >= sizeof(fname))
@@ -400,7 +402,6 @@ newfile(void)
sufflen++;
/* Reset so we start back at all 'a's in our extended suffix. */
- tfnum = 0;
fnum = 0;
}
diff --git a/usr.bin/split/tests/split_test.sh b/usr.bin/split/tests/split_test.sh
index 899fd028e74b..c9b87c01618c 100755
--- a/usr.bin/split/tests/split_test.sh
+++ b/usr.bin/split/tests/split_test.sh
@@ -1,7 +1,7 @@
#
# SPDX-License-Identifier: BSD-2-Clause
#
-# Copyright (c) 2022 Klara Systems
+# Copyright (c) 2022-2023 Klara Systems
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -200,6 +200,45 @@ EOF
atf_check -o file:foo-ab cat split-ab
}
+atf_test_case autoextend
+autoextend_body()
+{
+ seq $((26*25+1)) >input
+ atf_check split -l1 input
+ atf_check -o inline:"$((26*25))\n" cat xyz
+ atf_check -o inline:"$((26*25+1))\n" cat xzaaa
+}
+
+atf_test_case continue
+continue_body()
+{
+ echo hello >input
+ atf_check split input
+ atf_check -o file:input cat xaa
+ atf_check -s exit:1 -e ignore cat xab
+ atf_check split -c input
+ atf_check -o file:input cat xab
+}
+
+atf_test_case undocumented_kludge
+undocumented_kludge_body()
+{
+ seq 5000 >input
+ atf_check split -1000 input
+ atf_check -o file:xae seq 4001 5000
+ atf_check split -d1000 input
+ atf_check -o file:x04 seq 4001 5000
+}
+
+atf_test_case duplicate_linecount
+duplicate_linecount_body()
+{
+ atf_check -s exit:64 -e ignore split -5 -5 /dev/null
+ atf_check -s exit:64 -e ignore split -l5 -5 /dev/null
+ atf_check -s exit:64 -e ignore split -5 -l5 /dev/null
+ atf_check -s exit:64 -e ignore split -l5 -l5 /dev/null
+}
+
atf_init_test_cases()
{
atf_add_test_case bytes
@@ -209,4 +248,8 @@ atf_init_test_cases()
atf_add_test_case numeric_suffix
atf_add_test_case larger_suffix_length
atf_add_test_case pattern
+ atf_add_test_case autoextend
+ atf_add_test_case continue
+ atf_add_test_case undocumented_kludge
+ atf_add_test_case duplicate_linecount
}