On 11/17/2010 05:41 PM, Pádraig Brady wrote: > Yes that is marginally safer but less useful in the common > case of using an isolated +... > > $ sort --debug +1 > sort: using `en_US.utf8' sorting rules > sort: non-portable file name +1; use ./+1 instead > sort: open failed: +1: No such file or directory
Is the issue here that the two error messages are confusing, and that there should be just one? If so, that's easy to fix by adding a call to 'access', as follows. Normally I'd use euidaccess but that would introduce more dependencies than this issue is worth. (PS. This patch spells it "nonportable", for consistency with pathchk.) diff --git a/src/sort.c b/src/sort.c index 7e25f6a..1ad7386 100644 --- a/src/sort.c +++ b/src/sort.c @@ -3990,6 +3990,7 @@ main (int argc, char **argv) bool need_random = false; unsigned long int nthreads = 0; size_t nfiles = 0; + size_t unprotected_file_names = 0; bool posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL); bool obsolete_usage = (posix2_version () < 200112); char **files; @@ -4113,6 +4114,7 @@ main (int argc, char **argv) if (argc <= optind) break; files[nfiles++] = argv[optind++]; + unprotected_file_names += (c != -1); } else switch (c) { @@ -4165,7 +4167,10 @@ main (int argc, char **argv) } } if (! key) - files[nfiles++] = optarg; + { + files[nfiles++] = optarg; + unprotected_file_names++; + } break; case SORT_OPTION: @@ -4470,6 +4475,15 @@ main (int argc, char **argv) quote (setlocale (LC_COLLATE, NULL))); else error (0, 0, _("using simple byte comparison")); + + for (size_t i = 0; i < unprotected_file_names; i++) + if (files[i][0] == '+' && access (files[i], R_OK) == 0) + { + char const *q = quotearg_style (shell_quoting_style, files[i]); + error (0, 0, _("nonportable file name %s; use ./%s instead"), + q, q); + } + key_warnings (&gkey, gkey_only); }