From 49a1beba86c5a5982634c4f5a2a010783bc23a80 Mon Sep 17 00:00:00 2001 From: kevans Date: Wed, 27 Jun 2018 21:11:28 +0000 Subject: [PATCH] MFC r335404: sort(1): Fix -m when only implicit stdin is used for input Observe: printf "a\nb\nc\n" > /tmp/foo # Next command results in no output cat /tmp/foo | sort -m # Next command results in proper output cat /tmp/foo | sort -m - # Also works: sort -m /tmp/foo Some const'ification was done to simplify the actual solution of adding "-" explicitly to the file list if we didn't have any file arguments left over. PR: 190099 --- usr.bin/sort/file.c | 4 ++-- usr.bin/sort/file.h | 4 ++-- usr.bin/sort/sort.c | 6 +++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/usr.bin/sort/file.c b/usr.bin/sort/file.c index 92aabefd087..1cdc774679c 100644 --- a/usr.bin/sort/file.c +++ b/usr.bin/sort/file.c @@ -227,7 +227,7 @@ file_list_init(struct file_list *fl, bool tmp) * Add a file name to the list */ void -file_list_add(struct file_list *fl, char *fn, bool allocate) +file_list_add(struct file_list *fl, const char *fn, bool allocate) { if (fl && fn) { @@ -1116,7 +1116,7 @@ file_headers_merge(size_t fnum, struct file_header **fh, FILE *f_out) * stdout. */ static void -merge_files_array(size_t argc, char **argv, const char *fn_out) +merge_files_array(size_t argc, const char **argv, const char *fn_out) { if (argv && fn_out) { diff --git a/usr.bin/sort/file.h b/usr.bin/sort/file.h index f3a7d3abc02..724928a7c05 100644 --- a/usr.bin/sort/file.h +++ b/usr.bin/sort/file.h @@ -66,7 +66,7 @@ struct file_reader; */ struct file_list { - char **fns; + const char * *fns; size_t count; size_t sz; bool tmp; @@ -108,7 +108,7 @@ char *new_tmp_file_name(void); void tmp_file_atexit(const char *tmp_file); void file_list_init(struct file_list *fl, bool tmp); -void file_list_add(struct file_list *fl, char *fn, bool allocate); +void file_list_add(struct file_list *fl, const char *fn, bool allocate); void file_list_populate(struct file_list *fl, int argc, char **argv, bool allocate); void file_list_clean(struct file_list *fl); diff --git a/usr.bin/sort/sort.c b/usr.bin/sort/sort.c index 5edc5af6703..bbe8af4607b 100644 --- a/usr.bin/sort/sort.c +++ b/usr.bin/sort/sort.c @@ -1299,7 +1299,11 @@ main(int argc, char **argv) struct file_list fl; file_list_init(&fl, false); - file_list_populate(&fl, argc, argv, true); + /* No file arguments remaining means "read from stdin." */ + if (argc == 0) + file_list_add(&fl, "-", true); + else + file_list_populate(&fl, argc, argv, true); merge_files(&fl, outfile); file_list_clean(&fl); } -- 2.45.0