]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
xz: Refactor suffix test with raw format.
authorJia Tan <jiat0218@gmail.com>
Wed, 15 Nov 2023 15:40:13 +0000 (23:40 +0800)
committerJia Tan <jiat0218@gmail.com>
Wed, 15 Nov 2023 15:40:13 +0000 (23:40 +0800)
The previous version set opt_stdout, but this caused an issue with
copying an input file to standard out when decompressing an unknown file
type. The following needs to result in an error:

    echo foo | xz -df

since -c, --stdout is not used. This fixes the previous error by not
setting opt_stdout.

src/xz/args.c

index bdeaed67eab1822d1e2561b6ac071416323a761e..cee5f20221a94e1c9f8e9fda32c1ec14542af999 100644 (file)
@@ -834,34 +834,22 @@ args_parse(args_info *args, int argc, char **argv)
                args->arg_count = (unsigned int)(argc - optind);
        }
 
-       // If all of the filenames provided are "-" (more than one "-"
-       // could be specified) or no filenames are provided, then we are
-       // only going to be writing to standard out. However if --files or
-       // --files0 is used, then we will not be writing to standard out.
-       if (!opt_stdout && args->files_name == NULL) {
-               uint32_t i;
-
-               for (i = 0; i < args->arg_count; i++) {
-                       const char *name = args->arg_names[i];
-
-                       // getopt_long() will not give us an empty string
-                       // as an argument name here so we don't need to
-                       // check if name[0] is a NULL terminator.
-                       if (name[0] != '-' && name[1] != '\0')
-                               break;
-               }
-
-               // Set opt_stdout if the loop did not exit early.
-               opt_stdout = i == args->arg_count;
-       }
-
        // If raw format is used and a custom suffix is not provided,
-       // then only stdout mode can be used when compressing or decompressing.
+       // then only stdout mode can be used when compressing or
+       // decompressing.
        if (opt_format == FORMAT_RAW && !suffix_is_set() && !opt_stdout
                        && (opt_mode == MODE_COMPRESS
-                               || opt_mode == MODE_DECOMPRESS))
-               message_fatal(_("With --format=raw, --suffix=.SUF is "
-                               "required unless writing to stdout"));
+                               || opt_mode == MODE_DECOMPRESS)) {
+               // If all of the filenames provided are "-" (more than one
+               // "-" could be specified) or no filenames are provided,
+               // then we are only going to be writing to standard out.
+               for (unsigned int i = 0; i < args->arg_count; i++) {
+                       if (strcmp(args->arg_names[i], "-") != 0)
+                               message_fatal(_("With --format=raw, "
+                                               "--suffix=.SUF is required "
+                                               "unless writing to stdout"));
+               }
+       }
 
        return;
 }