| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/coreutils/src/src/mktemp.c |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | /* Create a temporary file or directory, safely. | - | ||||||||||||||||||
| 2 | Copyright (C) 2007-2018 Free Software Foundation, Inc. | - | ||||||||||||||||||
| 3 | - | |||||||||||||||||||
| 4 | This program is free software: you can redistribute it and/or modify | - | ||||||||||||||||||
| 5 | it under the terms of the GNU General Public License as published by | - | ||||||||||||||||||
| 6 | the Free Software Foundation, either version 3 of the License, or | - | ||||||||||||||||||
| 7 | (at your option) any later version. | - | ||||||||||||||||||
| 8 | - | |||||||||||||||||||
| 9 | This program is distributed in the hope that it will be useful, | - | ||||||||||||||||||
| 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | ||||||||||||||||||
| 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | ||||||||||||||||||
| 12 | GNU General Public License for more details. | - | ||||||||||||||||||
| 13 | - | |||||||||||||||||||
| 14 | You should have received a copy of the GNU General Public License | - | ||||||||||||||||||
| 15 | along with this program. If not, see <https://www.gnu.org/licenses/>. */ | - | ||||||||||||||||||
| 16 | - | |||||||||||||||||||
| 17 | /* Written by Jim Meyering and Eric Blake. */ | - | ||||||||||||||||||
| 18 | - | |||||||||||||||||||
| 19 | #include <config.h> | - | ||||||||||||||||||
| 20 | #include <sys/types.h> | - | ||||||||||||||||||
| 21 | #include <getopt.h> | - | ||||||||||||||||||
| 22 | - | |||||||||||||||||||
| 23 | #include "system.h" | - | ||||||||||||||||||
| 24 | - | |||||||||||||||||||
| 25 | #include "close-stream.h" | - | ||||||||||||||||||
| 26 | #include "die.h" | - | ||||||||||||||||||
| 27 | #include "error.h" | - | ||||||||||||||||||
| 28 | #include "filenamecat.h" | - | ||||||||||||||||||
| 29 | #include "quote.h" | - | ||||||||||||||||||
| 30 | #include "tempname.h" | - | ||||||||||||||||||
| 31 | - | |||||||||||||||||||
| 32 | /* The official name of this program (e.g., no 'g' prefix). */ | - | ||||||||||||||||||
| 33 | #define PROGRAM_NAME "mktemp" | - | ||||||||||||||||||
| 34 | - | |||||||||||||||||||
| 35 | #define AUTHORS \ | - | ||||||||||||||||||
| 36 | proper_name ("Jim Meyering"), \ | - | ||||||||||||||||||
| 37 | proper_name ("Eric Blake") | - | ||||||||||||||||||
| 38 | - | |||||||||||||||||||
| 39 | static const char *default_template = "tmp.XXXXXXXXXX"; | - | ||||||||||||||||||
| 40 | - | |||||||||||||||||||
| 41 | /* For long options that have no equivalent short option, use a | - | ||||||||||||||||||
| 42 | non-character as a pseudo short option, starting with CHAR_MAX + 1. */ | - | ||||||||||||||||||
| 43 | enum | - | ||||||||||||||||||
| 44 | { | - | ||||||||||||||||||
| 45 | SUFFIX_OPTION = CHAR_MAX + 1, | - | ||||||||||||||||||
| 46 | }; | - | ||||||||||||||||||
| 47 | - | |||||||||||||||||||
| 48 | static struct option const longopts[] = | - | ||||||||||||||||||
| 49 | { | - | ||||||||||||||||||
| 50 | {"directory", no_argument, NULL, 'd'}, | - | ||||||||||||||||||
| 51 | {"quiet", no_argument, NULL, 'q'}, | - | ||||||||||||||||||
| 52 | {"dry-run", no_argument, NULL, 'u'}, | - | ||||||||||||||||||
| 53 | {"suffix", required_argument, NULL, SUFFIX_OPTION}, | - | ||||||||||||||||||
| 54 | {"tmpdir", optional_argument, NULL, 'p'}, | - | ||||||||||||||||||
| 55 | {GETOPT_HELP_OPTION_DECL}, | - | ||||||||||||||||||
| 56 | {GETOPT_VERSION_OPTION_DECL}, | - | ||||||||||||||||||
| 57 | {NULL, 0, NULL, 0} | - | ||||||||||||||||||
| 58 | }; | - | ||||||||||||||||||
| 59 | - | |||||||||||||||||||
| 60 | void | - | ||||||||||||||||||
| 61 | usage (int status) | - | ||||||||||||||||||
| 62 | { | - | ||||||||||||||||||
| 63 | if (status != EXIT_SUCCESS)
| 5-13 | ||||||||||||||||||
| 64 | emit_try_help (); executed 5 times by 1 test: end of blockExecuted by:
| 5 | ||||||||||||||||||
| 65 | else | - | ||||||||||||||||||
| 66 | { | - | ||||||||||||||||||
| 67 | printf (_("Usage: %s [OPTION]... [TEMPLATE]\n"), program_name); | - | ||||||||||||||||||
| 68 | fputs (_("\ | - | ||||||||||||||||||
| 69 | Create a temporary file or directory, safely, and print its name.\n\ | - | ||||||||||||||||||
| 70 | TEMPLATE must contain at least 3 consecutive 'X's in last component.\n\ | - | ||||||||||||||||||
| 71 | If TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.\n\ | - | ||||||||||||||||||
| 72 | "), stdout); | - | ||||||||||||||||||
| 73 | fputs (_("\ | - | ||||||||||||||||||
| 74 | Files are created u+rw, and directories u+rwx, minus umask restrictions.\n\ | - | ||||||||||||||||||
| 75 | "), stdout); | - | ||||||||||||||||||
| 76 | fputs ("\n", stdout); | - | ||||||||||||||||||
| 77 | fputs (_("\ | - | ||||||||||||||||||
| 78 | -d, --directory create a directory, not a file\n\ | - | ||||||||||||||||||
| 79 | -u, --dry-run do not create anything; merely print a name (unsafe)\n\ | - | ||||||||||||||||||
| 80 | -q, --quiet suppress diagnostics about file/dir-creation failure\n\ | - | ||||||||||||||||||
| 81 | "), stdout); | - | ||||||||||||||||||
| 82 | fputs (_("\ | - | ||||||||||||||||||
| 83 | --suffix=SUFF append SUFF to TEMPLATE; SUFF must not contain a slash.\n\ | - | ||||||||||||||||||
| 84 | This option is implied if TEMPLATE does not end in X\n\ | - | ||||||||||||||||||
| 85 | "), stdout); | - | ||||||||||||||||||
| 86 | fputs (_("\ | - | ||||||||||||||||||
| 87 | -p DIR, --tmpdir[=DIR] interpret TEMPLATE relative to DIR; if DIR is not\n\ | - | ||||||||||||||||||
| 88 | specified, use $TMPDIR if set, else /tmp. With\n\ | - | ||||||||||||||||||
| 89 | this option, TEMPLATE must not be an absolute name;\n\ | - | ||||||||||||||||||
| 90 | unlike with -t, TEMPLATE may contain slashes, but\n\ | - | ||||||||||||||||||
| 91 | mktemp creates only the final component\n\ | - | ||||||||||||||||||
| 92 | "), stdout); | - | ||||||||||||||||||
| 93 | fputs (_("\ | - | ||||||||||||||||||
| 94 | -t interpret TEMPLATE as a single file name component,\n\ | - | ||||||||||||||||||
| 95 | relative to a directory: $TMPDIR, if set; else the\n\ | - | ||||||||||||||||||
| 96 | directory specified via -p; else /tmp [deprecated]\n\ | - | ||||||||||||||||||
| 97 | "), stdout); | - | ||||||||||||||||||
| 98 | fputs (HELP_OPTION_DESCRIPTION, stdout); | - | ||||||||||||||||||
| 99 | fputs (VERSION_OPTION_DESCRIPTION, stdout); | - | ||||||||||||||||||
| 100 | emit_ancillary_info (PROGRAM_NAME); | - | ||||||||||||||||||
| 101 | } executed 13 times by 1 test: end of blockExecuted by:
| 13 | ||||||||||||||||||
| 102 | - | |||||||||||||||||||
| 103 | exit (status); executed 18 times by 1 test: exit (status);Executed by:
| 18 | ||||||||||||||||||
| 104 | } | - | ||||||||||||||||||
| 105 | - | |||||||||||||||||||
| 106 | static size_t | - | ||||||||||||||||||
| 107 | count_consecutive_X_s (const char *s, size_t len) | - | ||||||||||||||||||
| 108 | { | - | ||||||||||||||||||
| 109 | size_t n = 0; | - | ||||||||||||||||||
| 110 | for ( ; len && s[len-1] == 'X'; len--)
| 1-2874 | ||||||||||||||||||
| 111 | ++n; executed 2304 times by 1 test: ++n;Executed by:
| 2304 | ||||||||||||||||||
| 112 | return n; executed 571 times by 1 test: return n;Executed by:
| 571 | ||||||||||||||||||
| 113 | } | - | ||||||||||||||||||
| 114 | - | |||||||||||||||||||
| 115 | static int | - | ||||||||||||||||||
| 116 | mkstemp_len (char *tmpl, size_t suff_len, size_t x_len, bool dry_run) | - | ||||||||||||||||||
| 117 | { | - | ||||||||||||||||||
| 118 | return gen_tempname_len (tmpl, suff_len, 0, dry_run ? GT_NOCREATE : GT_FILE, executed 16 times by 1 test: return gen_tempname_len (tmpl, suff_len, 0, dry_run ? 2 : 0, x_len);Executed by:
| 16 | ||||||||||||||||||
| 119 | x_len); executed 16 times by 1 test: return gen_tempname_len (tmpl, suff_len, 0, dry_run ? 2 : 0, x_len);Executed by:
| 16 | ||||||||||||||||||
| 120 | } | - | ||||||||||||||||||
| 121 | - | |||||||||||||||||||
| 122 | static int | - | ||||||||||||||||||
| 123 | mkdtemp_len (char *tmpl, size_t suff_len, size_t x_len, bool dry_run) | - | ||||||||||||||||||
| 124 | { | - | ||||||||||||||||||
| 125 | return gen_tempname_len (tmpl, suff_len, 0, dry_run ? GT_NOCREATE : GT_DIR, executed 550 times by 1 test: return gen_tempname_len (tmpl, suff_len, 0, dry_run ? 2 : 1, x_len);Executed by:
| 550 | ||||||||||||||||||
| 126 | x_len); executed 550 times by 1 test: return gen_tempname_len (tmpl, suff_len, 0, dry_run ? 2 : 1, x_len);Executed by:
| 550 | ||||||||||||||||||
| 127 | } | - | ||||||||||||||||||
| 128 | - | |||||||||||||||||||
| 129 | /* True if we have already closed standard output. */ | - | ||||||||||||||||||
| 130 | static bool stdout_closed; | - | ||||||||||||||||||
| 131 | - | |||||||||||||||||||
| 132 | /* Avoid closing stdout twice. Since we conditionally call | - | ||||||||||||||||||
| 133 | close_stream (stdout) in order to decide whether to clean up a | - | ||||||||||||||||||
| 134 | temporary file, the exit hook needs to know whether to do all of | - | ||||||||||||||||||
| 135 | close_stdout or just the stderr half. */ | - | ||||||||||||||||||
| 136 | static void | - | ||||||||||||||||||
| 137 | maybe_close_stdout (void) | - | ||||||||||||||||||
| 138 | { | - | ||||||||||||||||||
| 139 | if (!stdout_closed)
| 36-561 | ||||||||||||||||||
| 140 | close_stdout (); executed 36 times by 1 test: close_stdout ();Executed by:
| 36 | ||||||||||||||||||
| 141 | else if (close_stream (stderr) != 0)
| 0-561 | ||||||||||||||||||
| 142 | _exit (EXIT_FAILURE); never executed: _exit ( 1 ); | 0 | ||||||||||||||||||
| 143 | } executed 597 times by 1 test: end of blockExecuted by:
| 597 | ||||||||||||||||||
| 144 | - | |||||||||||||||||||
| 145 | int | - | ||||||||||||||||||
| 146 | main (int argc, char **argv) | - | ||||||||||||||||||
| 147 | { | - | ||||||||||||||||||
| 148 | char const *dest_dir; | - | ||||||||||||||||||
| 149 | char const *dest_dir_arg = NULL; | - | ||||||||||||||||||
| 150 | bool suppress_file_err = false; | - | ||||||||||||||||||
| 151 | int c; | - | ||||||||||||||||||
| 152 | unsigned int n_args; | - | ||||||||||||||||||
| 153 | char *template; | - | ||||||||||||||||||
| 154 | char *suffix = NULL; | - | ||||||||||||||||||
| 155 | bool use_dest_dir = false; | - | ||||||||||||||||||
| 156 | bool deprecated_t_option = false; | - | ||||||||||||||||||
| 157 | bool create_directory = false; | - | ||||||||||||||||||
| 158 | bool dry_run = false; | - | ||||||||||||||||||
| 159 | int status = EXIT_SUCCESS; | - | ||||||||||||||||||
| 160 | size_t x_count; | - | ||||||||||||||||||
| 161 | size_t suffix_len; | - | ||||||||||||||||||
| 162 | char *dest_name; | - | ||||||||||||||||||
| 163 | - | |||||||||||||||||||
| 164 | initialize_main (&argc, &argv); | - | ||||||||||||||||||
| 165 | set_program_name (argv[0]); | - | ||||||||||||||||||
| 166 | setlocale (LC_ALL, ""); | - | ||||||||||||||||||
| 167 | bindtextdomain (PACKAGE, LOCALEDIR); | - | ||||||||||||||||||
| 168 | textdomain (PACKAGE); | - | ||||||||||||||||||
| 169 | - | |||||||||||||||||||
| 170 | atexit (maybe_close_stdout); | - | ||||||||||||||||||
| 171 | - | |||||||||||||||||||
| 172 | while ((c = getopt_long (argc, argv, "dp:qtuV", longopts, NULL)) != -1)
| 577-1688 | ||||||||||||||||||
| 173 | { | - | ||||||||||||||||||
| 174 | switch (c) | - | ||||||||||||||||||
| 175 | { | - | ||||||||||||||||||
| 176 | case 'd': executed 554 times by 1 test: case 'd':Executed by:
| 554 | ||||||||||||||||||
| 177 | create_directory = true; | - | ||||||||||||||||||
| 178 | break; executed 554 times by 1 test: break;Executed by:
| 554 | ||||||||||||||||||
| 179 | case 'p': executed 547 times by 1 test: case 'p':Executed by:
| 547 | ||||||||||||||||||
| 180 | dest_dir_arg = optarg; | - | ||||||||||||||||||
| 181 | use_dest_dir = true; | - | ||||||||||||||||||
| 182 | break; executed 547 times by 1 test: break;Executed by:
| 547 | ||||||||||||||||||
| 183 | case 'q': executed 6 times by 1 test: case 'q':Executed by:
| 6 | ||||||||||||||||||
| 184 | suppress_file_err = true; | - | ||||||||||||||||||
| 185 | break; executed 6 times by 1 test: break;Executed by:
| 6 | ||||||||||||||||||
| 186 | case 't': executed 545 times by 1 test: case 't':Executed by:
| 545 | ||||||||||||||||||
| 187 | use_dest_dir = true; | - | ||||||||||||||||||
| 188 | deprecated_t_option = true; | - | ||||||||||||||||||
| 189 | break; executed 545 times by 1 test: break;Executed by:
| 545 | ||||||||||||||||||
| 190 | case 'u': executed 6 times by 1 test: case 'u':Executed by:
| 6 | ||||||||||||||||||
| 191 | dry_run = true; | - | ||||||||||||||||||
| 192 | break; executed 6 times by 1 test: break;Executed by:
| 6 | ||||||||||||||||||
| 193 | - | |||||||||||||||||||
| 194 | case SUFFIX_OPTION: executed 10 times by 1 test: case SUFFIX_OPTION:Executed by:
| 10 | ||||||||||||||||||
| 195 | suffix = optarg; | - | ||||||||||||||||||
| 196 | break; executed 10 times by 1 test: break;Executed by:
| 10 | ||||||||||||||||||
| 197 | - | |||||||||||||||||||
| 198 | case_GETOPT_HELP_CHAR; never executed: break;executed 13 times by 1 test: case GETOPT_HELP_CHAR:Executed by:
| 0-13 | ||||||||||||||||||
| 199 | - | |||||||||||||||||||
| 200 | case 'V': /* Undocumented alias, for compatibility with the original never executed: case 'V': | 0 | ||||||||||||||||||
| 201 | mktemp program. */ | - | ||||||||||||||||||
| 202 | case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS); executed 4 times by 1 test: exit ( 0 );Executed by:
never executed: break;executed 4 times by 1 test: case GETOPT_VERSION_CHAR:Executed by:
| 0-4 | ||||||||||||||||||
| 203 | default: executed 3 times by 1 test: default:Executed by:
| 3 | ||||||||||||||||||
| 204 | usage (EXIT_FAILURE); | - | ||||||||||||||||||
| 205 | } never executed: end of block | 0 | ||||||||||||||||||
| 206 | } | - | ||||||||||||||||||
| 207 | - | |||||||||||||||||||
| 208 | n_args = argc - optind; | - | ||||||||||||||||||
| 209 | if (2 <= n_args)
| 2-575 | ||||||||||||||||||
| 210 | { | - | ||||||||||||||||||
| 211 | error (0, 0, _("too many templates")); | - | ||||||||||||||||||
| 212 | usage (EXIT_FAILURE); | - | ||||||||||||||||||
| 213 | } never executed: end of block | 0 | ||||||||||||||||||
| 214 | - | |||||||||||||||||||
| 215 | if (n_args == 0)
| 3-572 | ||||||||||||||||||
| 216 | { | - | ||||||||||||||||||
| 217 | use_dest_dir = true; | - | ||||||||||||||||||
| 218 | template = (char *) default_template; | - | ||||||||||||||||||
| 219 | } executed 3 times by 1 test: end of blockExecuted by:
| 3 | ||||||||||||||||||
| 220 | else | - | ||||||||||||||||||
| 221 | { | - | ||||||||||||||||||
| 222 | template = argv[optind]; | - | ||||||||||||||||||
| 223 | } executed 572 times by 1 test: end of blockExecuted by:
| 572 | ||||||||||||||||||
| 224 | - | |||||||||||||||||||
| 225 | if (suffix)
| 9-566 | ||||||||||||||||||
| 226 | { | - | ||||||||||||||||||
| 227 | size_t len = strlen (template); | - | ||||||||||||||||||
| 228 | if (!len || template[len - 1] != 'X')
| 1-8 | ||||||||||||||||||
| 229 | { | - | ||||||||||||||||||
| 230 | die (EXIT_FAILURE, 0, | - | ||||||||||||||||||
| 231 | _("with --suffix, template %s must end in X"), | - | ||||||||||||||||||
| 232 | quote (template)); | - | ||||||||||||||||||
| 233 | } never executed: end of block | 0 | ||||||||||||||||||
| 234 | suffix_len = strlen (suffix); | - | ||||||||||||||||||
| 235 | dest_name = xcharalloc (len + suffix_len + 1); | - | ||||||||||||||||||
| 236 | memcpy (dest_name, template, len); | - | ||||||||||||||||||
| 237 | memcpy (dest_name + len, suffix, suffix_len + 1); | - | ||||||||||||||||||
| 238 | template = dest_name; | - | ||||||||||||||||||
| 239 | suffix = dest_name + len; | - | ||||||||||||||||||
| 240 | } executed 7 times by 1 test: end of blockExecuted by:
| 7 | ||||||||||||||||||
| 241 | else | - | ||||||||||||||||||
| 242 | { | - | ||||||||||||||||||
| 243 | template = xstrdup (template); | - | ||||||||||||||||||
| 244 | suffix = strrchr (template, 'X'); | - | ||||||||||||||||||
| 245 | if (!suffix)
| 0-566 | ||||||||||||||||||
| 246 | suffix = strchr (template, '\0'); never executed: suffix = (__extension__ (__builtin_constant_p ( '\0' ) && !__builtin_constant_p ( template ) && ( '\0' ) == '\0' ? (char *) __rawmemchr ( template , '\0' ) : __builtin_strchr ( template , '\0' ))) ;
| 0 | ||||||||||||||||||
| 247 | else | - | ||||||||||||||||||
| 248 | suffix++; executed 566 times by 1 test: suffix++;Executed by:
| 566 | ||||||||||||||||||
| 249 | suffix_len = strlen (suffix); | - | ||||||||||||||||||
| 250 | } executed 566 times by 1 test: end of blockExecuted by:
| 566 | ||||||||||||||||||
| 251 | - | |||||||||||||||||||
| 252 | /* At this point, template is malloc'd, and suffix points into template. */ | - | ||||||||||||||||||
| 253 | if (suffix_len && last_component (suffix) != suffix)
| 2-561 | ||||||||||||||||||
| 254 | { | - | ||||||||||||||||||
| 255 | die (EXIT_FAILURE, 0, | - | ||||||||||||||||||
| 256 | _("invalid suffix %s, contains directory separator"), | - | ||||||||||||||||||
| 257 | quote (suffix)); | - | ||||||||||||||||||
| 258 | } never executed: end of block | 0 | ||||||||||||||||||
| 259 | x_count = count_consecutive_X_s (template, suffix - template); | - | ||||||||||||||||||
| 260 | if (x_count < 3)
| 3-568 | ||||||||||||||||||
| 261 | die (EXIT_FAILURE, 0, _("too few X's in template %s"), quote (template)); executed 3 times by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"too few X's in template %s\", 5), quote (template)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "too few X's in template %s" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "too few X's in template %s" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));Executed by:
| 3 | ||||||||||||||||||
| 262 | - | |||||||||||||||||||
| 263 | if (use_dest_dir)
| 19-549 | ||||||||||||||||||
| 264 | { | - | ||||||||||||||||||
| 265 | if (deprecated_t_option)
| 5-544 | ||||||||||||||||||
| 266 | { | - | ||||||||||||||||||
| 267 | char *env = getenv ("TMPDIR"); | - | ||||||||||||||||||
| 268 | if (env && *env)
| 0-543 | ||||||||||||||||||
| 269 | dest_dir = env; executed 1 time by 1 test: dest_dir = env;Executed by:
| 1 | ||||||||||||||||||
| 270 | else if (dest_dir_arg && *dest_dir_arg)
| 0-543 | ||||||||||||||||||
| 271 | dest_dir = dest_dir_arg; executed 543 times by 1 test: dest_dir = dest_dir_arg;Executed by:
| 543 | ||||||||||||||||||
| 272 | else | - | ||||||||||||||||||
| 273 | dest_dir = "/tmp"; never executed: dest_dir = "/tmp"; | 0 | ||||||||||||||||||
| 274 | - | |||||||||||||||||||
| 275 | if (last_component (template) != template)
| 1-543 | ||||||||||||||||||
| 276 | die (EXIT_FAILURE, 0, executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"invalid template, %s, contains directory separator\", 5), quote (template)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext...parator" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "invalid template, %s, contains directory separator" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;Executed by:
| 1 | ||||||||||||||||||
| 277 | _("invalid template, %s, contains directory separator"), executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"invalid template, %s, contains directory separator\", 5), quote (template)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext...parator" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "invalid template, %s, contains directory separator" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;Executed by:
| 1 | ||||||||||||||||||
| 278 | quote (template)); executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"invalid template, %s, contains directory separator\", 5), quote (template)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext...parator" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "invalid template, %s, contains directory separator" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;Executed by:
| 1 | ||||||||||||||||||
| 279 | } executed 543 times by 1 test: end of blockExecuted by:
| 543 | ||||||||||||||||||
| 280 | else | - | ||||||||||||||||||
| 281 | { | - | ||||||||||||||||||
| 282 | if (dest_dir_arg && *dest_dir_arg)
| 0-3 | ||||||||||||||||||
| 283 | dest_dir = dest_dir_arg; executed 2 times by 1 test: dest_dir = dest_dir_arg;Executed by:
| 2 | ||||||||||||||||||
| 284 | else | - | ||||||||||||||||||
| 285 | { | - | ||||||||||||||||||
| 286 | char *env = getenv ("TMPDIR"); | - | ||||||||||||||||||
| 287 | dest_dir = (env && *env ? env : "/tmp");
| 0-3 | ||||||||||||||||||
| 288 | } executed 3 times by 1 test: end of blockExecuted by:
| 3 | ||||||||||||||||||
| 289 | if (IS_ABSOLUTE_FILE_NAME (template))
| 0-4 | ||||||||||||||||||
| 290 | die (EXIT_FAILURE, 0, executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"invalid template, %s; with --tmpdir,\" \" it may not be absolute\", 5), quote (template)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 ...) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "invalid template, %s; with --tmpdir," " it may not be absolute" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;Executed by:
| 1 | ||||||||||||||||||
| 291 | _("invalid template, %s; with --tmpdir," executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"invalid template, %s; with --tmpdir,\" \" it may not be absolute\", 5), quote (template)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 ...) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "invalid template, %s; with --tmpdir," " it may not be absolute" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;Executed by:
| 1 | ||||||||||||||||||
| 292 | " it may not be absolute"), executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"invalid template, %s; with --tmpdir,\" \" it may not be absolute\", 5), quote (template)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 ...) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "invalid template, %s; with --tmpdir," " it may not be absolute" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;Executed by:
| 1 | ||||||||||||||||||
| 293 | quote (template)); executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"invalid template, %s; with --tmpdir,\" \" it may not be absolute\", 5), quote (template)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 ...) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "invalid template, %s; with --tmpdir," " it may not be absolute" , 5) , quote (template)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;Executed by:
| 1 | ||||||||||||||||||
| 294 | } executed 4 times by 1 test: end of blockExecuted by:
| 4 | ||||||||||||||||||
| 295 | - | |||||||||||||||||||
| 296 | dest_name = file_name_concat (dest_dir, template, NULL); | - | ||||||||||||||||||
| 297 | free (template); | - | ||||||||||||||||||
| 298 | template = dest_name; | - | ||||||||||||||||||
| 299 | /* Note that suffix is now invalid. */ | - | ||||||||||||||||||
| 300 | } executed 547 times by 1 test: end of blockExecuted by:
| 547 | ||||||||||||||||||
| 301 | - | |||||||||||||||||||
| 302 | /* Make a copy to be used in case of diagnostic, since failing | - | ||||||||||||||||||
| 303 | mkstemp may leave the buffer in an undefined state. */ | - | ||||||||||||||||||
| 304 | dest_name = xstrdup (template); | - | ||||||||||||||||||
| 305 | - | |||||||||||||||||||
| 306 | if (create_directory)
| 16-550 | ||||||||||||||||||
| 307 | { | - | ||||||||||||||||||
| 308 | int err = mkdtemp_len (dest_name, suffix_len, x_count, dry_run); | - | ||||||||||||||||||
| 309 | if (err != 0)
| 0-550 | ||||||||||||||||||
| 310 | { | - | ||||||||||||||||||
| 311 | if (!suppress_file_err)
| 0 | ||||||||||||||||||
| 312 | error (0, errno, _("failed to create directory via template %s"), never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to create directory via template %s" , 5) , quote (template)); | 0 | ||||||||||||||||||
| 313 | quote (template)); never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to create directory via template %s" , 5) , quote (template)); | 0 | ||||||||||||||||||
| 314 | status = EXIT_FAILURE; | - | ||||||||||||||||||
| 315 | } never executed: end of block | 0 | ||||||||||||||||||
| 316 | } executed 550 times by 1 test: end of blockExecuted by:
| 550 | ||||||||||||||||||
| 317 | else | - | ||||||||||||||||||
| 318 | { | - | ||||||||||||||||||
| 319 | int fd = mkstemp_len (dest_name, suffix_len, x_count, dry_run); | - | ||||||||||||||||||
| 320 | if (fd < 0 || (!dry_run && close (fd) != 0))
| 0-15 | ||||||||||||||||||
| 321 | { | - | ||||||||||||||||||
| 322 | if (!suppress_file_err)
| 0-1 | ||||||||||||||||||
| 323 | error (0, errno, _("failed to create file via template %s"), executed 1 time by 1 test: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to create file via template %s" , 5) , quote (template));Executed by:
| 1 | ||||||||||||||||||
| 324 | quote (template)); executed 1 time by 1 test: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to create file via template %s" , 5) , quote (template));Executed by:
| 1 | ||||||||||||||||||
| 325 | status = EXIT_FAILURE; | - | ||||||||||||||||||
| 326 | } executed 1 time by 1 test: end of blockExecuted by:
| 1 | ||||||||||||||||||
| 327 | } executed 16 times by 1 test: end of blockExecuted by:
| 16 | ||||||||||||||||||
| 328 | - | |||||||||||||||||||
| 329 | if (status == EXIT_SUCCESS)
| 1-565 | ||||||||||||||||||
| 330 | { | - | ||||||||||||||||||
| 331 | puts (dest_name); | - | ||||||||||||||||||
| 332 | /* If we created a file, but then failed to output the file | - | ||||||||||||||||||
| 333 | name, we should clean up the mess before failing. */ | - | ||||||||||||||||||
| 334 | if (!dry_run && ((stdout_closed = true), close_stream (stdout) != 0))
| 4-561 | ||||||||||||||||||
| 335 | { | - | ||||||||||||||||||
| 336 | int saved_errno = errno; | - | ||||||||||||||||||
| 337 | remove (dest_name); | - | ||||||||||||||||||
| 338 | if (!suppress_file_err)
| 2 | ||||||||||||||||||
| 339 | error (0, saved_errno, _("write error")); executed 2 times by 1 test: error (0, saved_errno, dcgettext (((void *)0), "write error" , 5) );Executed by:
| 2 | ||||||||||||||||||
| 340 | status = EXIT_FAILURE; | - | ||||||||||||||||||
| 341 | } executed 4 times by 1 test: end of blockExecuted by:
| 4 | ||||||||||||||||||
| 342 | } executed 565 times by 1 test: end of blockExecuted by:
| 565 | ||||||||||||||||||
| 343 | - | |||||||||||||||||||
| 344 | #ifdef lint | - | ||||||||||||||||||
| 345 | free (dest_name); | - | ||||||||||||||||||
| 346 | free (template); | - | ||||||||||||||||||
| 347 | #endif | - | ||||||||||||||||||
| 348 | - | |||||||||||||||||||
| 349 | return status; executed 566 times by 1 test: return status;Executed by:
| 566 | ||||||||||||||||||
| 350 | } | - | ||||||||||||||||||
| Source code | Switch to Preprocessed file |