OpenCoverage

cp.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/src/cp.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* cp.c -- file copying (main routines)-
2 Copyright (C) 1989-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 Torbjorn Granlund, David MacKenzie, and Jim Meyering. */-
18-
19#include <config.h>-
20#include <stdio.h>-
21#include <sys/types.h>-
22#include <getopt.h>-
23#include <selinux/selinux.h>-
24-
25#include "system.h"-
26#include "argmatch.h"-
27#include "backupfile.h"-
28#include "copy.h"-
29#include "cp-hash.h"-
30#include "die.h"-
31#include "error.h"-
32#include "filenamecat.h"-
33#include "ignore-value.h"-
34#include "quote.h"-
35#include "stat-time.h"-
36#include "utimens.h"-
37#include "acl.h"-
38-
39#if ! HAVE_LCHOWN-
40# define lchown(name, uid, gid) chown (name, uid, gid)-
41#endif-
42-
43/* The official name of this program (e.g., no 'g' prefix). */-
44#define PROGRAM_NAME "cp"-
45-
46#define AUTHORS \-
47 proper_name ("Torbjorn Granlund"), \-
48 proper_name ("David MacKenzie"), \-
49 proper_name ("Jim Meyering")-
50-
51/* Used by do_copy, make_dir_parents_private, and re_protect-
52 to keep a list of leading directories whose protections-
53 need to be fixed after copying. */-
54struct dir_attr-
55{-
56 struct stat st;-
57 bool restore_mode;-
58 size_t slash_offset;-
59 struct dir_attr *next;-
60};-
61-
62/* For long options that have no equivalent short option, use a-
63 non-character as a pseudo short option, starting with CHAR_MAX + 1. */-
64enum-
65{-
66 ATTRIBUTES_ONLY_OPTION = CHAR_MAX + 1,-
67 COPY_CONTENTS_OPTION,-
68 NO_PRESERVE_ATTRIBUTES_OPTION,-
69 PARENTS_OPTION,-
70 PRESERVE_ATTRIBUTES_OPTION,-
71 REFLINK_OPTION,-
72 SPARSE_OPTION,-
73 STRIP_TRAILING_SLASHES_OPTION,-
74 UNLINK_DEST_BEFORE_OPENING-
75};-
76-
77/* True if the kernel is SELinux enabled. */-
78static bool selinux_enabled;-
79-
80/* If true, the command "cp x/e_file e_dir" uses "e_dir/x/e_file"-
81 as its destination instead of the usual "e_dir/e_file." */-
82static bool parents_option = false;-
83-
84/* Remove any trailing slashes from each SOURCE argument. */-
85static bool remove_trailing_slashes;-
86-
87static char const *const sparse_type_string[] =-
88{-
89 "never", "auto", "always", NULL-
90};-
91static enum Sparse_type const sparse_type[] =-
92{-
93 SPARSE_NEVER, SPARSE_AUTO, SPARSE_ALWAYS-
94};-
95ARGMATCH_VERIFY (sparse_type_string, sparse_type);-
96-
97static char const *const reflink_type_string[] =-
98{-
99 "auto", "always", NULL-
100};-
101static enum Reflink_type const reflink_type[] =-
102{-
103 REFLINK_AUTO, REFLINK_ALWAYS-
104};-
105ARGMATCH_VERIFY (reflink_type_string, reflink_type);-
106-
107static struct option const long_opts[] =-
108{-
109 {"archive", no_argument, NULL, 'a'},-
110 {"attributes-only", no_argument, NULL, ATTRIBUTES_ONLY_OPTION},-
111 {"backup", optional_argument, NULL, 'b'},-
112 {"copy-contents", no_argument, NULL, COPY_CONTENTS_OPTION},-
113 {"dereference", no_argument, NULL, 'L'},-
114 {"force", no_argument, NULL, 'f'},-
115 {"interactive", no_argument, NULL, 'i'},-
116 {"link", no_argument, NULL, 'l'},-
117 {"no-clobber", no_argument, NULL, 'n'},-
118 {"no-dereference", no_argument, NULL, 'P'},-
119 {"no-preserve", required_argument, NULL, NO_PRESERVE_ATTRIBUTES_OPTION},-
120 {"no-target-directory", no_argument, NULL, 'T'},-
121 {"one-file-system", no_argument, NULL, 'x'},-
122 {"parents", no_argument, NULL, PARENTS_OPTION},-
123 {"path", no_argument, NULL, PARENTS_OPTION}, /* Deprecated. */-
124 {"preserve", optional_argument, NULL, PRESERVE_ATTRIBUTES_OPTION},-
125 {"recursive", no_argument, NULL, 'R'},-
126 {"remove-destination", no_argument, NULL, UNLINK_DEST_BEFORE_OPENING},-
127 {"sparse", required_argument, NULL, SPARSE_OPTION},-
128 {"reflink", optional_argument, NULL, REFLINK_OPTION},-
129 {"strip-trailing-slashes", no_argument, NULL, STRIP_TRAILING_SLASHES_OPTION},-
130 {"suffix", required_argument, NULL, 'S'},-
131 {"symbolic-link", no_argument, NULL, 's'},-
132 {"target-directory", required_argument, NULL, 't'},-
133 {"update", no_argument, NULL, 'u'},-
134 {"verbose", no_argument, NULL, 'v'},-
135 {GETOPT_SELINUX_CONTEXT_OPTION_DECL},-
136 {GETOPT_HELP_OPTION_DECL},-
137 {GETOPT_VERSION_OPTION_DECL},-
138 {NULL, 0, NULL, 0}-
139};-
140-
141void-
142usage (int status)-
143{-
144 if (status != EXIT_SUCCESS)
status != 0Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 46 times by 1 test
Evaluated by:
  • cp
8-46
145 emit_try_help ();
executed 8 times by 1 test: end of block
Executed by:
  • cp
8
146 else-
147 {-
148 printf (_("\-
149Usage: %s [OPTION]... [-T] SOURCE DEST\n\-
150 or: %s [OPTION]... SOURCE... DIRECTORY\n\-
151 or: %s [OPTION]... -t DIRECTORY SOURCE...\n\-
152"),-
153 program_name, program_name, program_name);-
154 fputs (_("\-
155Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\-
156"), stdout);-
157-
158 emit_mandatory_arg_note ();-
159-
160 fputs (_("\-
161 -a, --archive same as -dR --preserve=all\n\-
162 --attributes-only don't copy the file data, just the attributes\n\-
163 --backup[=CONTROL] make a backup of each existing destination file\-
164\n\-
165 -b like --backup but does not accept an argument\n\-
166 --copy-contents copy contents of special files when recursive\n\-
167 -d same as --no-dereference --preserve=links\n\-
168"), stdout);-
169 fputs (_("\-
170 -f, --force if an existing destination file cannot be\n\-
171 opened, remove it and try again (this option\n\-
172 is ignored when the -n option is also used)\n\-
173 -i, --interactive prompt before overwrite (overrides a previous -n\-
174\n\-
175 option)\n\-
176 -H follow command-line symbolic links in SOURCE\n\-
177"), stdout);-
178 fputs (_("\-
179 -l, --link hard link files instead of copying\n\-
180 -L, --dereference always follow symbolic links in SOURCE\n\-
181"), stdout);-
182 fputs (_("\-
183 -n, --no-clobber do not overwrite an existing file (overrides\n\-
184 a previous -i option)\n\-
185 -P, --no-dereference never follow symbolic links in SOURCE\n\-
186"), stdout);-
187 fputs (_("\-
188 -p same as --preserve=mode,ownership,timestamps\n\-
189 --preserve[=ATTR_LIST] preserve the specified attributes (default:\n\-
190 mode,ownership,timestamps), if possible\n\-
191 additional attributes: context, links, xattr,\-
192\n\-
193 all\n\-
194"), stdout);-
195 fputs (_("\-
196 --no-preserve=ATTR_LIST don't preserve the specified attributes\n\-
197 --parents use full source file name under DIRECTORY\n\-
198"), stdout);-
199 fputs (_("\-
200 -R, -r, --recursive copy directories recursively\n\-
201 --reflink[=WHEN] control clone/CoW copies. See below\n\-
202 --remove-destination remove each existing destination file before\n\-
203 attempting to open it (contrast with --force)\-
204\n"), stdout);-
205 fputs (_("\-
206 --sparse=WHEN control creation of sparse files. See below\n\-
207 --strip-trailing-slashes remove any trailing slashes from each SOURCE\n\-
208 argument\n\-
209"), stdout);-
210 fputs (_("\-
211 -s, --symbolic-link make symbolic links instead of copying\n\-
212 -S, --suffix=SUFFIX override the usual backup suffix\n\-
213 -t, --target-directory=DIRECTORY copy all SOURCE arguments into DIRECTORY\n\-
214 -T, --no-target-directory treat DEST as a normal file\n\-
215"), stdout);-
216 fputs (_("\-
217 -u, --update copy only when the SOURCE file is newer\n\-
218 than the destination file or when the\n\-
219 destination file is missing\n\-
220 -v, --verbose explain what is being done\n\-
221 -x, --one-file-system stay on this file system\n\-
222"), stdout);-
223 fputs (_("\-
224 -Z set SELinux security context of destination\n\-
225 file to default type\n\-
226 --context[=CTX] like -Z, or if CTX is specified then set the\n\-
227 SELinux or SMACK security context to CTX\n\-
228"), stdout);-
229 fputs (HELP_OPTION_DESCRIPTION, stdout);-
230 fputs (VERSION_OPTION_DESCRIPTION, stdout);-
231 fputs (_("\-
232\n\-
233By default, sparse SOURCE files are detected by a crude heuristic and the\n\-
234corresponding DEST file is made sparse as well. That is the behavior\n\-
235selected by --sparse=auto. Specify --sparse=always to create a sparse DEST\n\-
236file whenever the SOURCE file contains a long enough sequence of zero bytes.\n\-
237Use --sparse=never to inhibit creation of sparse files.\n\-
238\n\-
239When --reflink[=always] is specified, perform a lightweight copy, where the\n\-
240data blocks are copied only when modified. If this is not possible the copy\n\-
241fails, or if --reflink=auto is specified, fall back to a standard copy.\n\-
242"), stdout);-
243 emit_backup_suffix_note ();-
244 fputs (_("\-
245\n\-
246As a special case, cp makes a backup of SOURCE when the force and backup\n\-
247options are given and SOURCE and DEST are the same name for an existing,\n\-
248regular file.\n\-
249"), stdout);-
250 emit_ancillary_info (PROGRAM_NAME);-
251 }
executed 46 times by 1 test: end of block
Executed by:
  • cp
46
252 exit (status);
executed 54 times by 1 test: exit (status);
Executed by:
  • cp
54
253}-
254-
255/* Ensure that the parent directories of CONST_DST_NAME have the-
256 correct protections, for the --parents option. This is done-
257 after all copying has been completed, to allow permissions-
258 that don't include user write/execute.-
259-
260 SRC_OFFSET is the index in CONST_DST_NAME of the beginning of the-
261 source directory name.-
262-
263 ATTR_LIST is a null-terminated linked list of structures that-
264 indicates the end of the filename of each intermediate directory-
265 in CONST_DST_NAME that may need to have its attributes changed.-
266 The command 'cp --parents --preserve a/b/c d/e_dir' changes the-
267 attributes of the directories d/e_dir/a and d/e_dir/a/b to match-
268 the corresponding source directories regardless of whether they-
269 existed before the 'cp' command was given.-
270-
271 Return true if the parent of CONST_DST_NAME and any intermediate-
272 directories specified by ATTR_LIST have the proper permissions-
273 when done. */-
274-
275static bool-
276re_protect (char const *const_dst_name, size_t src_offset,-
277 struct dir_attr *attr_list, const struct cp_options *x)-
278{-
279 struct dir_attr *p;-
280 char *dst_name; /* A copy of CONST_DST_NAME we can change. */-
281 char *src_name; /* The source name in 'dst_name'. */-
282-
283 ASSIGN_STRDUPA (dst_name, const_dst_name);-
284 src_name = dst_name + src_offset;-
285-
286 for (p = attr_list; p; p = p->next)
pDescription
TRUEevaluated 15 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 12 times by 1 test
Evaluated by:
  • cp
12-15
287 {-
288 dst_name[p->slash_offset] = '\0';-
289-
290 /* Adjust the times (and if possible, ownership) for the copy.-
291 chown turns off set[ug]id bits for non-root,-
292 so do the chmod last. */-
293-
294 if (x->preserve_timestamps)
x->preserve_timestampsDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
2-13
295 {-
296 struct timespec timespec[2];-
297-
298 timespec[0] = get_stat_atime (&p->st);-
299 timespec[1] = get_stat_mtime (&p->st);-
300-
301 if (utimens (dst_name, timespec))
utimens (dst_name, timespec)Description
TRUEnever evaluated
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
0-13
302 {-
303 error (0, errno, _("failed to preserve times for %s"),-
304 quoteaf (dst_name));-
305 return false;
never executed: return 0 ;
0
306 }-
307 }
executed 13 times by 1 test: end of block
Executed by:
  • cp
13
308-
309 if (x->preserve_ownership)
x->preserve_ownershipDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
2-13
310 {-
311 if (lchown (dst_name, p->st.st_uid, p->st.st_gid) != 0)
lchown (dst_na...t.st_gid) != 0Description
TRUEnever evaluated
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
0-13
312 {-
313 if (! chown_failure_ok (x))
! chown_failure_ok (x)Description
TRUEnever evaluated
FALSEnever evaluated
0
314 {-
315 error (0, errno, _("failed to preserve ownership for %s"),-
316 quoteaf (dst_name));-
317 return false;
never executed: return 0 ;
0
318 }-
319 /* Failing to preserve ownership is OK. Still, try to preserve-
320 the group, but ignore the possible error. */-
321 ignore_value (lchown (dst_name, -1, p->st.st_gid));-
322 }
never executed: end of block
0
323 }
executed 13 times by 1 test: end of block
Executed by:
  • cp
13
324-
325 if (x->preserve_mode)
x->preserve_modeDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
2-13
326 {-
327 if (copy_acl (src_name, -1, dst_name, -1, p->st.st_mode) != 0)
copy_acl (src_....st_mode) != 0Description
TRUEnever evaluated
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
0-13
328 return false;
never executed: return 0 ;
0
329 }
executed 13 times by 1 test: end of block
Executed by:
  • cp
13
330 else if (p->restore_mode)
p->restore_modeDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
331 {-
332 if (lchmod (dst_name, p->st.st_mode) != 0)
chmod (dst_nam....st_mode) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
333 {-
334 error (0, errno, _("failed to preserve permissions for %s"),-
335 quoteaf (dst_name));-
336 return false;
never executed: return 0 ;
0
337 }-
338 }
never executed: end of block
0
339-
340 dst_name[p->slash_offset] = '/';-
341 }
executed 15 times by 1 test: end of block
Executed by:
  • cp
15
342 return true;
executed 12 times by 1 test: return 1 ;
Executed by:
  • cp
12
343}-
344-
345/* Ensure that the parent directory of CONST_DIR exists, for-
346 the --parents option.-
347-
348 SRC_OFFSET is the index in CONST_DIR (which is a destination-
349 directory) of the beginning of the source directory name.-
350 Create any leading directories that don't already exist.-
351 If VERBOSE_FMT_STRING is nonzero, use it as a printf format-
352 string for printing a message after successfully making a directory.-
353 The format should take two string arguments: the names of the-
354 source and destination directories.-
355 Creates a linked list of attributes of intermediate directories,-
356 *ATTR_LIST, for re_protect to use after calling copy.-
357 Sets *NEW_DST if this function creates parent of CONST_DIR.-
358-
359 Return true if parent of CONST_DIR exists as a directory with the proper-
360 permissions when done. */-
361-
362/* FIXME: Synch this function with the one in ../lib/mkdir-p.c. */-
363-
364static bool-
365make_dir_parents_private (char const *const_dir, size_t src_offset,-
366 char const *verbose_fmt_string,-
367 struct dir_attr **attr_list, bool *new_dst,-
368 const struct cp_options *x)-
369{-
370 struct stat stats;-
371 char *dir; /* A copy of CONST_DIR we can change. */-
372 char *src; /* Source name in DIR. */-
373 char *dst_dir; /* Leading directory of DIR. */-
374 size_t dirlen; /* Length of DIR. */-
375-
376 ASSIGN_STRDUPA (dir, const_dir);-
377-
378 src = dir + src_offset;-
379-
380 dirlen = dir_len (dir);-
381 dst_dir = alloca (dirlen + 1);-
382 memcpy (dst_dir, dir, dirlen);-
383 dst_dir[dirlen] = '\0';-
384-
385 *attr_list = NULL;-
386-
387 /* XXX: If all dirs are present at the destination,-
388 no permissions or security contexts will be updated. */-
389 if (stat (dst_dir, &stats) != 0)
stat (dst_dir, &stats) != 0Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 6 times by 1 test
Evaluated by:
  • cp
6-7
390 {-
391 /* A parent of CONST_DIR does not exist.-
392 Make all missing intermediate directories. */-
393 char *slash;-
394-
395 slash = src;-
396 while (*slash == '/')
*slash == '/'Description
TRUEnever evaluated
FALSEevaluated 7 times by 1 test
Evaluated by:
  • cp
0-7
397 slash++;
never executed: slash++;
0
398 while ((slash = strchr (slash, '/')))
(slash = (__ex...sh , '/' ))) )Description
TRUEevaluated 16 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 6 times by 1 test
Evaluated by:
  • cp
__builtin_constant_p ( '/' )Description
TRUEevaluated 22 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
!__builtin_con...nt_p ( slash )Description
TRUEevaluated 22 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
( '/' ) == '\0'Description
TRUEnever evaluated
FALSEevaluated 22 times by 1 test
Evaluated by:
  • cp
0-22
399 {-
400 struct dir_attr *new IF_LINT ( = NULL);-
401 bool missing_dir;-
402-
403 *slash = '\0';-
404 missing_dir = (stat (dir, &stats) != 0);-
405-
406 if (missing_dir || x->preserve_ownership || x->preserve_mode
missing_dirDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
x->preserve_ownershipDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
x->preserve_modeDescription
TRUEnever evaluated
FALSEnever evaluated
0-14
407 || x->preserve_timestamps)
x->preserve_timestampsDescription
TRUEnever evaluated
FALSEnever evaluated
0
408 {-
409 /* Add this directory to the list of directories whose-
410 modes might need fixing later. */-
411 struct stat src_st;-
412 int src_errno = (stat (src, &src_st) != 0
stat (src, &src_st) != 0Description
TRUEnever evaluated
FALSEevaluated 16 times by 1 test
Evaluated by:
  • cp
0-16
413 ? errno-
414 : S_ISDIR (src_st.st_mode)
(((( src_st.st... == (0040000))Description
TRUEevaluated 15 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
1-15
415 ? 0-
416 : ENOTDIR);-
417 if (src_errno)
src_errnoDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
1-15
418 {-
419 error (0, src_errno, _("failed to get attributes of %s"),-
420 quoteaf (src));-
421 return false;
executed 1 time by 1 test: return 0 ;
Executed by:
  • cp
1
422 }-
423-
424 new = xmalloc (sizeof *new);-
425 new->st = src_st;-
426 new->slash_offset = slash - dir;-
427 new->restore_mode = false;-
428 new->next = *attr_list;-
429 *attr_list = new;-
430 }
executed 15 times by 1 test: end of block
Executed by:
  • cp
15
431-
432 /* If required set the default context for created dirs. */-
433 if (! set_process_security_ctx (src, dir,
! set_process_...issing_dir, x)Description
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
0-15
434 missing_dir ? new->st.st_mode : 0,
! set_process_...issing_dir, x)Description
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
0-15
435 missing_dir, x))
! set_process_...issing_dir, x)Description
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
0-15
436 return false;
never executed: return 0 ;
0
437-
438 if (missing_dir)
missing_dirDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
2-13
439 {-
440 mode_t src_mode;-
441 mode_t omitted_permissions;-
442 mode_t mkdir_mode;-
443-
444 /* This component does not exist. We must set-
445 *new_dst and new->st.st_mode inside this loop because,-
446 for example, in the command 'cp --parents ../a/../b/c e_dir',-
447 make_dir_parents_private creates only e_dir/../a if-
448 ./b already exists. */-
449 *new_dst = true;-
450 src_mode = new->st.st_mode;-
451-
452 /* If the ownership or special mode bits might change,-
453 omit some permissions at first, so unauthorized users-
454 cannot nip in before the file is ready. */-
455 omitted_permissions = (src_mode-
456 & (x->preserve_ownership-
457 ? S_IRWXG | S_IRWXO-
458 : x->preserve_mode-
459 ? S_IWGRP | S_IWOTH-
460 : 0));-
461-
462 /* POSIX says mkdir's behavior is implementation-defined when-
463 (src_mode & ~S_IRWXUGO) != 0. However, common practice is-
464 to ask mkdir to copy all the CHMOD_MODE_BITS, letting mkdir-
465 decide what to do with S_ISUID | S_ISGID | S_ISVTX. */-
466 mkdir_mode = x->explicit_no_preserve_mode ? S_IRWXUGO : src_mode;
x->explicit_no_preserve_modeDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 11 times by 1 test
Evaluated by:
  • cp
2-11
467 mkdir_mode &= CHMOD_MODE_BITS & ~omitted_permissions;-
468 if (mkdir (dir, mkdir_mode) != 0)
mkdir (dir, mkdir_mode) != 0Description
TRUEnever evaluated
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
0-13
469 {-
470 error (0, errno, _("cannot make directory %s"),-
471 quoteaf (dir));-
472 return false;
never executed: return 0 ;
0
473 }-
474 else-
475 {-
476 if (verbose_fmt_string != NULL)
verbose_fmt_st...!= ((void *)0)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 11 times by 1 test
Evaluated by:
  • cp
2-11
477 printf (verbose_fmt_string, src, dir);
executed 2 times by 1 test: printf (verbose_fmt_string, src, dir);
Executed by:
  • cp
2
478 }
executed 13 times by 1 test: end of block
Executed by:
  • cp
13
479-
480 /* We need search and write permissions to the new directory-
481 for writing the directory's contents. Check if these-
482 permissions are there. */-
483-
484 if (lstat (dir, &stats))
lstat (dir, &stats)Description
TRUEnever evaluated
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
0-13
485 {-
486 error (0, errno, _("failed to get attributes of %s"),-
487 quoteaf (dir));-
488 return false;
never executed: return 0 ;
0
489 }-
490-
491-
492 if (! x->preserve_mode)
! x->preserve_modeDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 11 times by 1 test
Evaluated by:
  • cp
2-11
493 {-
494 if (omitted_permissions & ~stats.st_mode)
omitted_permis...~stats.st_modeDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
495 omitted_permissions &= ~ cached_umask ();
never executed: omitted_permissions &= ~ cached_umask ();
0
496 if (omitted_permissions & ~stats.st_mode
omitted_permis...~stats.st_modeDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
497 || (stats.st_mode & S_IRWXU) != S_IRWXU)
(stats.st_mode...400|0200|0100)Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
498 {-
499 new->st.st_mode = stats.st_mode | omitted_permissions;-
500 new->restore_mode = true;-
501 }
never executed: end of block
0
502 }
executed 2 times by 1 test: end of block
Executed by:
  • cp
2
503-
504 if ((stats.st_mode & S_IRWXU) != S_IRWXU)
(stats.st_mode...400|0200|0100)Description
TRUEnever evaluated
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
0-13
505 {-
506 /* Make the new directory searchable and writable.-
507 The original permissions will be restored later. */-
508-
509 if (lchmod (dir, stats.st_mode | S_IRWXU) != 0)
chmod (dir, st...0|0100) ) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
510 {-
511 error (0, errno, _("setting permissions for %s"),-
512 quoteaf (dir));-
513 return false;
never executed: return 0 ;
0
514 }-
515 }
never executed: end of block
0
516 }
executed 13 times by 1 test: end of block
Executed by:
  • cp
13
517 else if (!S_ISDIR (stats.st_mode))
! (((( stats.s... == (0040000))Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
518 {-
519 error (0, 0, _("%s exists but is not a directory"),-
520 quoteaf (dir));-
521 return false;
never executed: return 0 ;
0
522 }-
523 else-
524 *new_dst = false;
executed 2 times by 1 test: *new_dst = 0 ;
Executed by:
  • cp
2
525-
526 /* For existing dirs, set the security context as per that already-
527 set for the process global context. */-
528 if (! *new_dst
! *new_dstDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
2-13
529 && (x->set_security_context || x->preserve_security_context))
x->set_security_contextDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
x->preserve_security_contextDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
530 {-
531 if (! set_file_security_ctx (dir, x->preserve_security_context,
! set_file_sec...ontext, 0 , x)Description
TRUEnever evaluated
FALSEnever evaluated
0
532 false, x)
! set_file_sec...ontext, 0 , x)Description
TRUEnever evaluated
FALSEnever evaluated
0
533 && x->require_preserve_context)
x->require_preserve_contextDescription
TRUEnever evaluated
FALSEnever evaluated
0
534 return false;
never executed: return 0 ;
0
535 }
never executed: end of block
0
536-
537 *slash++ = '/';-
538-
539 /* Avoid unnecessary calls to 'stat' when given-
540 file names containing multiple adjacent slashes. */-
541 while (*slash == '/')
*slash == '/'Description
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
0-15
542 slash++;
never executed: slash++;
0
543 }
executed 15 times by 1 test: end of block
Executed by:
  • cp
15
544 }
executed 6 times by 1 test: end of block
Executed by:
  • cp
6
545-
546 /* We get here if the parent of DIR already exists. */-
547-
548 else if (!S_ISDIR (stats.st_mode))
! (((( stats.s... == (0040000))Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • cp
0-6
549 {-
550 error (0, 0, _("%s exists but is not a directory"), quoteaf (dst_dir));-
551 return false;
never executed: return 0 ;
0
552 }-
553 else-
554 {-
555 *new_dst = false;-
556 }
executed 6 times by 1 test: end of block
Executed by:
  • cp
6
557 return true;
executed 12 times by 1 test: return 1 ;
Executed by:
  • cp
12
558}-
559-
560/* FILE is the last operand of this command.-
561 Return true if FILE is a directory.-
562 But report an error and exit if there is a problem accessing FILE,-
563 or if FILE does not exist but would have to refer to an existing-
564 directory if it referred to anything at all.-
565-
566 If the file exists, store the file's status into *ST.-
567 Otherwise, set *NEW_DST. */-
568-
569static bool-
570target_directory_operand (char const *file, struct stat *st, bool *new_dst)-
571{-
572 int err = (stat (file, st) == 0 ? 0 : errno);
stat (file, st) == 0Description
TRUEevaluated 306 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 386 times by 1 test
Evaluated by:
  • cp
306-386
573 bool is_a_dir = !err && S_ISDIR (st->st_mode);
!errDescription
TRUEevaluated 306 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 386 times by 1 test
Evaluated by:
  • cp
(((( st->st_mo... == (0040000))Description
TRUEevaluated 44 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 262 times by 1 test
Evaluated by:
  • cp
44-386
574 if (err)
errDescription
TRUEevaluated 386 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 306 times by 1 test
Evaluated by:
  • cp
306-386
575 {-
576 if (err != ENOENT)
err != 2Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 385 times by 1 test
Evaluated by:
  • cp
1-385
577 die (EXIT_FAILURE, err, _("failed to access %s"), quoteaf (file));
executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, err, dcgettext (((void *)0), \"failed to access %s\", 5), quotearg_style (shell_escape_always_quoting_style, file)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , e...s_quoting_style, file)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , err, dcgettext (((void *)0), "failed to access %s" , 5) , quotearg_style (shell_escape_always_quoting_style, file)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))));
Executed by:
  • cp
1
578 *new_dst = true;-
579 }
executed 385 times by 1 test: end of block
Executed by:
  • cp
385
580 return is_a_dir;
executed 691 times by 1 test: return is_a_dir;
Executed by:
  • cp
691
581}-
582-
583/* Scan the arguments, and copy each by calling copy.-
584 Return true if successful. */-
585-
586static bool-
587do_copy (int n_files, char **file, const char *target_directory,-
588 bool no_target_directory, struct cp_options *x)-
589{-
590 struct stat sb;-
591 bool new_dst = false;-
592 bool ok = true;-
593-
594 if (n_files <= !target_directory)
n_files <= !target_directoryDescription
TRUEnever evaluated
FALSEevaluated 692 times by 1 test
Evaluated by:
  • cp
0-692
595 {-
596 if (n_files <= 0)
n_files <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
597 error (0, 0, _("missing file operand"));
never executed: error (0, 0, dcgettext (((void *)0), "missing file operand" , 5) );
0
598 else-
599 error (0, 0, _("missing destination file operand after %s"),
never executed: error (0, 0, dcgettext (((void *)0), "missing destination file operand after %s" , 5) , quotearg_style (shell_escape_always_quoting_style, file[0]));
0
600 quoteaf (file[0]));
never executed: error (0, 0, dcgettext (((void *)0), "missing destination file operand after %s" , 5) , quotearg_style (shell_escape_always_quoting_style, file[0]));
0
601 usage (EXIT_FAILURE);-
602 }
never executed: end of block
0
603-
604 if (no_target_directory)
no_target_directoryDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 690 times by 1 test
Evaluated by:
  • cp
2-690
605 {-
606 if (target_directory)
target_directoryDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
607 die (EXIT_FAILURE, 0,
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot combine --target-directory (-t) \" \"and --no-target-directory (-T)\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcg...target-directory (-T)" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot combine --target-directory (-t) " "and --no-target-directory (-T)" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
608 _("cannot combine --target-directory (-t) "
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot combine --target-directory (-t) \" \"and --no-target-directory (-T)\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcg...target-directory (-T)" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot combine --target-directory (-t) " "and --no-target-directory (-T)" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
609 "and --no-target-directory (-T)"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot combine --target-directory (-t) \" \"and --no-target-directory (-T)\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcg...target-directory (-T)" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot combine --target-directory (-t) " "and --no-target-directory (-T)" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
610 if (2 < n_files)
2 < n_filesDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
611 {-
612 error (0, 0, _("extra operand %s"), quoteaf (file[2]));-
613 usage (EXIT_FAILURE);-
614 }
never executed: end of block
0
615 /* Update NEW_DST and SB, which may be checked below. */-
616 ignore_value (target_directory_operand (file[n_files -1], &sb, &new_dst));-
617 }
executed 2 times by 1 test: end of block
Executed by:
  • cp
2
618 else if (!target_directory)
!target_directoryDescription
TRUEevaluated 690 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-690
619 {-
620 if (2 <= n_files
2 <= n_filesDescription
TRUEevaluated 690 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-690
621 && target_directory_operand (file[n_files - 1], &sb, &new_dst))
target_directo...&sb, &new_dst)Description
TRUEevaluated 44 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 645 times by 1 test
Evaluated by:
  • cp
44-645
622 target_directory = file[--n_files];
executed 44 times by 1 test: target_directory = file[--n_files];
Executed by:
  • cp
44
623 else if (2 < n_files)
2 < n_filesDescription
TRUEnever evaluated
FALSEevaluated 645 times by 1 test
Evaluated by:
  • cp
0-645
624 die (EXIT_FAILURE, 0, _("target %s is not a directory"),
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"target %s is not a directory\", 5), quotearg_style (shell_escape_always_quoting_style, file[n_files - 1])), assume (false))" ")"); int _gl_dummy; }...)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "target %s is not a directory" , 5) , quotearg_style (shell_escape_always_quoting_style, file[n_files - 1])), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
625 quoteaf (file[n_files - 1]));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"target %s is not a directory\", 5), quotearg_style (shell_escape_always_quoting_style, file[n_files - 1])), assume (false))" ")"); int _gl_dummy; }...)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "target %s is not a directory" , 5) , quotearg_style (shell_escape_always_quoting_style, file[n_files - 1])), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
626 }
executed 689 times by 1 test: end of block
Executed by:
  • cp
689
627-
628 if (target_directory)
target_directoryDescription
TRUEevaluated 44 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 647 times by 1 test
Evaluated by:
  • cp
44-647
629 {-
630 /* cp file1...filen edir-
631 Copy the files 'file1' through 'filen'-
632 to the existing directory 'edir'. */-
633-
634 /* Initialize these hash tables only if we'll need them.-
635 The problems they're used to detect can arise only if-
636 there are two or more files to copy. */-
637 if (2 <= n_files)
2 <= n_filesDescription
TRUEevaluated 19 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 25 times by 1 test
Evaluated by:
  • cp
19-25
638 {-
639 dest_info_init (x);-
640 src_info_init (x);-
641 }
executed 19 times by 1 test: end of block
Executed by:
  • cp
19
642-
643 for (int i = 0; i < n_files; i++)
i < n_filesDescription
TRUEevaluated 65 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 44 times by 1 test
Evaluated by:
  • cp
44-65
644 {-
645 char *dst_name;-
646 bool parent_exists = true; /* True if dir_name (dst_name) exists. */-
647 struct dir_attr *attr_list;-
648 char *arg_in_concat = NULL;-
649 char *arg = file[i];-
650-
651 /* Trailing slashes are meaningful (i.e., maybe worth preserving)-
652 only in the source file names. */-
653 if (remove_trailing_slashes)
remove_trailing_slashesDescription
TRUEnever evaluated
FALSEevaluated 65 times by 1 test
Evaluated by:
  • cp
0-65
654 strip_trailing_slashes (arg);
never executed: strip_trailing_slashes (arg);
0
655-
656 if (parents_option)
parents_optionDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 52 times by 1 test
Evaluated by:
  • cp
13-52
657 {-
658 char *arg_no_trailing_slash;-
659-
660 /* Use 'arg' without trailing slashes in constructing destination-
661 file names. Otherwise, we can end up trying to create a-
662 directory via 'mkdir ("dst/foo/"...', which is not portable.-
663 It fails, due to the trailing slash, on at least-
664 NetBSD 1.[34] systems. */-
665 ASSIGN_STRDUPA (arg_no_trailing_slash, arg);-
666 strip_trailing_slashes (arg_no_trailing_slash);-
667-
668 /* Append all of 'arg' (minus any trailing slash) to 'dest'. */-
669 dst_name = file_name_concat (target_directory,-
670 arg_no_trailing_slash,-
671 &arg_in_concat);-
672-
673 /* For --parents, we have to make sure that the directory-
674 dir_name (dst_name) exists. We may have to create a few-
675 leading directories. */-
676 parent_exists =-
677 (make_dir_parents_private-
678 (dst_name, arg_in_concat - dst_name,-
679 (x->verbose ? "%s -> %s\n" : NULL),-
680 &attr_list, &new_dst, x));-
681 }
executed 13 times by 1 test: end of block
Executed by:
  • cp
13
682 else-
683 {-
684 char *arg_base;-
685 /* Append the last component of 'arg' to 'target_directory'. */-
686 ASSIGN_STRDUPA (arg_base, last_component (arg));-
687 strip_trailing_slashes (arg_base);-
688 /* For 'cp -R source/.. dest', don't copy into 'dest/..'. */-
689 dst_name = (STREQ (arg_base, "..")
never executed: __result = (((const unsigned char *) (const char *) ( arg_base ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( ".." ))[3] - __s2[3]);
never executed: end of block
executed 2 times by 1 test: end of block
Executed by:
  • cp
( __extension_...)))); }) == 0)Description
TRUEnever evaluated
FALSEevaluated 52 times by 1 test
Evaluated by:
  • cp
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEevaluated 52 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
__result == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 50 times by 1 test
Evaluated by:
  • cp
__s2_len > 1Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-52
690 ? xstrdup (target_directory)-
691 : file_name_concat (target_directory, arg_base,-
692 NULL));-
693 }
executed 52 times by 1 test: end of block
Executed by:
  • cp
52
694-
695 if (!parent_exists)
!parent_existsDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 64 times by 1 test
Evaluated by:
  • cp
1-64
696 {-
697 /* make_dir_parents_private failed, so don't even-
698 attempt the copy. */-
699 ok = false;-
700 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
701 else-
702 {-
703 bool copy_into_self;-
704 ok &= copy (arg, dst_name, new_dst, x, &copy_into_self, NULL);-
705-
706 if (parents_option)
parents_optionDescription
TRUEevaluated 12 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 52 times by 1 test
Evaluated by:
  • cp
12-52
707 ok &= re_protect (dst_name, arg_in_concat - dst_name,
executed 12 times by 1 test: ok &= re_protect (dst_name, arg_in_concat - dst_name, attr_list, x);
Executed by:
  • cp
12
708 attr_list, x);
executed 12 times by 1 test: ok &= re_protect (dst_name, arg_in_concat - dst_name, attr_list, x);
Executed by:
  • cp
12
709 }
executed 64 times by 1 test: end of block
Executed by:
  • cp
64
710-
711 if (parents_option)
parents_optionDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 52 times by 1 test
Evaluated by:
  • cp
13-52
712 {-
713 while (attr_list)
attr_listDescription
TRUEevaluated 15 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
13-15
714 {-
715 struct dir_attr *p = attr_list;-
716 attr_list = attr_list->next;-
717 free (p);-
718 }
executed 15 times by 1 test: end of block
Executed by:
  • cp
15
719 }
executed 13 times by 1 test: end of block
Executed by:
  • cp
13
720-
721 free (dst_name);-
722 }
executed 65 times by 1 test: end of block
Executed by:
  • cp
65
723 }
executed 44 times by 1 test: end of block
Executed by:
  • cp
44
724 else /* !target_directory */-
725 {-
726 char const *new_dest;-
727 char const *source = file[0];-
728 char const *dest = file[1];-
729 bool unused;-
730-
731 if (parents_option)
parents_optionDescription
TRUEnever evaluated
FALSEevaluated 647 times by 1 test
Evaluated by:
  • cp
0-647
732 {-
733 error (0, 0,-
734 _("with --parents, the destination must be a directory"));-
735 usage (EXIT_FAILURE);-
736 }
never executed: end of block
0
737-
738 /* When the force and backup options have been specified and-
739 the source and destination are the same name for an existing-
740 regular file, convert the user's command, e.g.,-
741 'cp --force --backup foo foo' to 'cp --force foo fooSUFFIX'-
742 where SUFFIX is determined by any version control options used. */-
743-
744 if (x->unlink_dest_after_failed_open
x->unlink_dest...er_failed_openDescription
TRUEevaluated 64 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 583 times by 1 test
Evaluated by:
  • cp
64-583
745 && x->backup_type != no_backups
x->backup_type != no_backupsDescription
TRUEevaluated 24 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 40 times by 1 test
Evaluated by:
  • cp
24-40
746 && STREQ (source, dest)
never executed: __result = (((const unsigned char *) (const char *) ( source ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( dest ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
( __extension_...)))); }) == 0)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 18 times by 1 test
Evaluated by:
  • cp
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-18
747 && !new_dst && S_ISREG (sb.st_mode))
!new_dstDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
(((( sb.st_mod... == (0100000))Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-6
748 {-
749 static struct cp_options x_tmp;-
750-
751 new_dest = find_backup_file_name (dest, x->backup_type);-
752 /* Set x->backup_type to 'no_backups' so that the normal backup-
753 mechanism is not used when performing the actual copy.-
754 backup_type must be set to 'no_backups' only *after* the above-
755 call to find_backup_file_name -- that function uses-
756 backup_type to determine the suffix it applies. */-
757 x_tmp = *x;-
758 x_tmp.backup_type = no_backups;-
759 x = &x_tmp;-
760 }
executed 6 times by 1 test: end of block
Executed by:
  • cp
6
761 else-
762 {-
763 new_dest = dest;-
764 }
executed 641 times by 1 test: end of block
Executed by:
  • cp
641
765-
766 ok = copy (source, new_dest, 0, x, &unused, NULL);-
767 }
executed 647 times by 1 test: end of block
Executed by:
  • cp
647
768-
769 return ok;
executed 691 times by 1 test: return ok;
Executed by:
  • cp
691
770}-
771-
772static void-
773cp_option_init (struct cp_options *x)-
774{-
775 cp_options_default (x);-
776 x->copy_as_regular = true;-
777 x->dereference = DEREF_UNDEFINED;-
778 x->unlink_dest_before_opening = false;-
779 x->unlink_dest_after_failed_open = false;-
780 x->hard_link = false;-
781 x->interactive = I_UNSPECIFIED;-
782 x->move_mode = false;-
783 x->install_mode = false;-
784 x->one_file_system = false;-
785 x->reflink_mode = REFLINK_NEVER;-
786-
787 x->preserve_ownership = false;-
788 x->preserve_links = false;-
789 x->preserve_mode = false;-
790 x->preserve_timestamps = false;-
791 x->explicit_no_preserve_mode = false;-
792 x->preserve_security_context = false; /* -a or --preserve=context. */-
793 x->require_preserve_context = false; /* --preserve=context. */-
794 x->set_security_context = false; /* -Z, set sys default context. */-
795 x->preserve_xattr = false;-
796 x->reduce_diagnostics = false;-
797 x->require_preserve_xattr = false;-
798-
799 x->data_copy_required = true;-
800 x->require_preserve = false;-
801 x->recursive = false;-
802 x->sparse_mode = SPARSE_AUTO;-
803 x->symbolic_link = false;-
804 x->set_mode = false;-
805 x->mode = 0;-
806-
807 /* Not used. */-
808 x->stdin_tty = false;-
809-
810 x->update = false;-
811 x->verbose = false;-
812-
813 /* By default, refuse to open a dangling destination symlink, because-
814 in general one cannot do that safely, give the current semantics of-
815 open's O_EXCL flag, (which POSIX doesn't even allow cp to use, btw).-
816 But POSIX requires it. */-
817 x->open_dangling_dest_symlink = getenv ("POSIXLY_CORRECT") != NULL;-
818-
819 x->dest_info = NULL;-
820 x->src_info = NULL;-
821}
executed 823 times by 1 test: end of block
Executed by:
  • cp
823
822-
823/* Given a string, ARG, containing a comma-separated list of arguments-
824 to the --preserve option, set the appropriate fields of X to ON_OFF. */-
825static void-
826decode_preserve_arg (char const *arg, struct cp_options *x, bool on_off)-
827{-
828 enum File_attribute-
829 {-
830 PRESERVE_MODE,-
831 PRESERVE_TIMESTAMPS,-
832 PRESERVE_OWNERSHIP,-
833 PRESERVE_LINK,-
834 PRESERVE_CONTEXT,-
835 PRESERVE_XATTR,-
836 PRESERVE_ALL-
837 };-
838 static enum File_attribute const preserve_vals[] =-
839 {-
840 PRESERVE_MODE, PRESERVE_TIMESTAMPS,-
841 PRESERVE_OWNERSHIP, PRESERVE_LINK, PRESERVE_CONTEXT, PRESERVE_XATTR,-
842 PRESERVE_ALL-
843 };-
844 /* Valid arguments to the '--preserve' option. */-
845 static char const* const preserve_args[] =-
846 {-
847 "mode", "timestamps",-
848 "ownership", "links", "context", "xattr", "all", NULL-
849 };-
850 ARGMATCH_VERIFY (preserve_args, preserve_vals);-
851-
852 char *arg_writable = xstrdup (arg);-
853 char *s = arg_writable;-
854 do-
855 {-
856 /* find next comma */-
857 char *comma = strchr (s, ',');
__builtin_constant_p ( ',' )Description
TRUEevaluated 19 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
!__builtin_constant_p ( s )Description
TRUEevaluated 19 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
( ',' ) == '\0'Description
TRUEnever evaluated
FALSEevaluated 19 times by 1 test
Evaluated by:
  • cp
0-19
858 enum File_attribute val;-
859-
860 /* If we found a comma, put a NUL in its place and advance. */-
861 if (comma)
commaDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 18 times by 1 test
Evaluated by:
  • cp
1-18
862 *comma++ = 0;
executed 1 time by 1 test: *comma++ = 0;
Executed by:
  • cp
1
863-
864 /* process S. */-
865 val = XARGMATCH (on_off ? "--preserve" : "--no-preserve",-
866 s, preserve_args, preserve_vals);-
867 switch (val)-
868 {-
869 case PRESERVE_MODE:
executed 8 times by 1 test: case PRESERVE_MODE:
Executed by:
  • cp
8
870 x->preserve_mode = on_off;-
871 x->explicit_no_preserve_mode = !on_off;-
872 break;
executed 8 times by 1 test: break;
Executed by:
  • cp
8
873-
874 case PRESERVE_TIMESTAMPS:
never executed: case PRESERVE_TIMESTAMPS:
0
875 x->preserve_timestamps = on_off;-
876 break;
never executed: break;
0
877-
878 case PRESERVE_OWNERSHIP:
executed 1 time by 1 test: case PRESERVE_OWNERSHIP:
Executed by:
  • cp
1
879 x->preserve_ownership = on_off;-
880 break;
executed 1 time by 1 test: break;
Executed by:
  • cp
1
881-
882 case PRESERVE_LINK:
executed 7 times by 1 test: case PRESERVE_LINK:
Executed by:
  • cp
7
883 x->preserve_links = on_off;-
884 break;
executed 7 times by 1 test: break;
Executed by:
  • cp
7
885-
886 case PRESERVE_CONTEXT:
never executed: case PRESERVE_CONTEXT:
0
887 x->require_preserve_context = on_off;-
888 x->preserve_security_context = on_off;-
889 break;
never executed: break;
0
890-
891 case PRESERVE_XATTR:
executed 1 time by 1 test: case PRESERVE_XATTR:
Executed by:
  • cp
1
892 x->preserve_xattr = on_off;-
893 x->require_preserve_xattr = on_off;-
894 break;
executed 1 time by 1 test: break;
Executed by:
  • cp
1
895-
896 case PRESERVE_ALL:
executed 1 time by 1 test: case PRESERVE_ALL:
Executed by:
  • cp
1
897 x->preserve_mode = on_off;-
898 x->preserve_timestamps = on_off;-
899 x->preserve_ownership = on_off;-
900 x->preserve_links = on_off;-
901 x->explicit_no_preserve_mode = !on_off;-
902 if (selinux_enabled)
selinux_enabledDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
903 x->preserve_security_context = on_off;
never executed: x->preserve_security_context = on_off;
0
904 x->preserve_xattr = on_off;-
905 break;
executed 1 time by 1 test: break;
Executed by:
  • cp
1
906-
907 default:
never executed: default:
0
908 abort ();
never executed: abort ();
0
909 }-
910 s = comma;-
911 }
executed 18 times by 1 test: end of block
Executed by:
  • cp
18
912 while (s);
sDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 17 times by 1 test
Evaluated by:
  • cp
1-17
913-
914 free (arg_writable);-
915}
executed 17 times by 1 test: end of block
Executed by:
  • cp
17
916-
917int-
918main (int argc, char **argv)-
919{-
920 int c;-
921 bool ok;-
922 bool make_backups = false;-
923 char const *backup_suffix = NULL;-
924 char *version_control_string = NULL;-
925 struct cp_options x;-
926 bool copy_contents = false;-
927 char *target_directory = NULL;-
928 bool no_target_directory = false;-
929 char const *scontext = NULL;-
930-
931 initialize_main (&argc, &argv);-
932 set_program_name (argv[0]);-
933 setlocale (LC_ALL, "");-
934 bindtextdomain (PACKAGE, LOCALEDIR);-
935 textdomain (PACKAGE);-
936-
937 atexit (close_stdin);-
938-
939 selinux_enabled = (0 < is_selinux_enabled ());-
940 cp_option_init (&x);-
941-
942 while ((c = getopt_long (argc, argv, "abdfHilLnprst:uvxPRS:TZ",
(c = getopt_lo... *)0) )) != -1Description
TRUEevaluated 761 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 696 times by 1 test
Evaluated by:
  • cp
696-761
943 long_opts, NULL))
(c = getopt_lo... *)0) )) != -1Description
TRUEevaluated 761 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 696 times by 1 test
Evaluated by:
  • cp
696-761
944 != -1)
(c = getopt_lo... *)0) )) != -1Description
TRUEevaluated 761 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 696 times by 1 test
Evaluated by:
  • cp
696-761
945 {-
946 switch (c)-
947 {-
948 case SPARSE_OPTION:
executed 87 times by 1 test: case SPARSE_OPTION:
Executed by:
  • cp
87
949 x.sparse_mode = XARGMATCH ("--sparse", optarg,-
950 sparse_type_string, sparse_type);-
951 break;
executed 86 times by 1 test: break;
Executed by:
  • cp
86
952-
953 case REFLINK_OPTION:
executed 9 times by 1 test: case REFLINK_OPTION:
Executed by:
  • cp
9
954 if (optarg == NULL)
optarg == ((void *)0)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
4-5
955 x.reflink_mode = REFLINK_ALWAYS;
executed 4 times by 1 test: x.reflink_mode = REFLINK_ALWAYS;
Executed by:
  • cp
4
956 else-
957 x.reflink_mode = XARGMATCH ("--reflink", optarg,
executed 5 times by 1 test: x.reflink_mode = ((reflink_type) [__xargmatch_internal ("--reflink", optarg, reflink_type_string, (char const *) (reflink_type), sizeof *(reflink_type), argmatch_die)]) ;
Executed by:
  • cp
5
958 reflink_type_string, reflink_type);
executed 5 times by 1 test: x.reflink_mode = ((reflink_type) [__xargmatch_internal ("--reflink", optarg, reflink_type_string, (char const *) (reflink_type), sizeof *(reflink_type), argmatch_die)]) ;
Executed by:
  • cp
5
959 break;
executed 9 times by 1 test: break;
Executed by:
  • cp
9
960-
961 case 'a':
executed 19 times by 1 test: case 'a':
Executed by:
  • cp
19
962 /* Like -dR --preserve=all with reduced failure diagnostics. */-
963 x.dereference = DEREF_NEVER;-
964 x.preserve_links = true;-
965 x.preserve_ownership = true;-
966 x.preserve_mode = true;-
967 x.preserve_timestamps = true;-
968 x.require_preserve = true;-
969 if (selinux_enabled)
selinux_enabledDescription
TRUEnever evaluated
FALSEevaluated 19 times by 1 test
Evaluated by:
  • cp
0-19
970 x.preserve_security_context = true;
never executed: x.preserve_security_context = 1 ;
0
971 x.preserve_xattr = true;-
972 x.reduce_diagnostics = true;-
973 x.recursive = true;-
974 break;
executed 19 times by 1 test: break;
Executed by:
  • cp
19
975-
976 case 'b':
executed 108 times by 1 test: case 'b':
Executed by:
  • cp
108
977 make_backups = true;-
978 if (optarg)
optargDescription
TRUEevaluated 46 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 62 times by 1 test
Evaluated by:
  • cp
46-62
979 version_control_string = optarg;
executed 46 times by 1 test: version_control_string = optarg;
Executed by:
  • cp
46
980 break;
executed 108 times by 1 test: break;
Executed by:
  • cp
108
981-
982 case ATTRIBUTES_ONLY_OPTION:
executed 4 times by 1 test: case ATTRIBUTES_ONLY_OPTION:
Executed by:
  • cp
4
983 x.data_copy_required = false;-
984 break;
executed 4 times by 1 test: break;
Executed by:
  • cp
4
985-
986 case COPY_CONTENTS_OPTION:
executed 5 times by 1 test: case COPY_CONTENTS_OPTION:
Executed by:
  • cp
5
987 copy_contents = true;-
988 break;
executed 5 times by 1 test: break;
Executed by:
  • cp
5
989-
990 case 'd':
executed 64 times by 1 test: case 'd':
Executed by:
  • cp
64
991 x.preserve_links = true;-
992 x.dereference = DEREF_NEVER;-
993 break;
executed 64 times by 1 test: break;
Executed by:
  • cp
64
994-
995 case 'f':
executed 66 times by 1 test: case 'f':
Executed by:
  • cp
66
996 x.unlink_dest_after_failed_open = true;-
997 break;
executed 66 times by 1 test: break;
Executed by:
  • cp
66
998-
999 case 'H':
executed 9 times by 1 test: case 'H':
Executed by:
  • cp
9
1000 x.dereference = DEREF_COMMAND_LINE_ARGUMENTS;-
1001 break;
executed 9 times by 1 test: break;
Executed by:
  • cp
9
1002-
1003 case 'i':
executed 11 times by 1 test: case 'i':
Executed by:
  • cp
11
1004 x.interactive = I_ASK_USER;-
1005 break;
executed 11 times by 1 test: break;
Executed by:
  • cp
11
1006-
1007 case 'l':
executed 77 times by 1 test: case 'l':
Executed by:
  • cp
77
1008 x.hard_link = true;-
1009 break;
executed 77 times by 1 test: break;
Executed by:
  • cp
77
1010-
1011 case 'L':
executed 11 times by 1 test: case 'L':
Executed by:
  • cp
11
1012 x.dereference = DEREF_ALWAYS;-
1013 break;
executed 11 times by 1 test: break;
Executed by:
  • cp
11
1014-
1015 case 'n':
executed 8 times by 1 test: case 'n':
Executed by:
  • cp
8
1016 x.interactive = I_ALWAYS_NO;-
1017 break;
executed 8 times by 1 test: break;
Executed by:
  • cp
8
1018-
1019 case 'P':
executed 12 times by 1 test: case 'P':
Executed by:
  • cp
12
1020 x.dereference = DEREF_NEVER;-
1021 break;
executed 12 times by 1 test: break;
Executed by:
  • cp
12
1022-
1023 case NO_PRESERVE_ATTRIBUTES_OPTION:
executed 8 times by 1 test: case NO_PRESERVE_ATTRIBUTES_OPTION:
Executed by:
  • cp
8
1024 decode_preserve_arg (optarg, &x, false);-
1025 break;
executed 7 times by 1 test: break;
Executed by:
  • cp
7
1026-
1027 case PRESERVE_ATTRIBUTES_OPTION:
executed 14 times by 1 test: case PRESERVE_ATTRIBUTES_OPTION:
Executed by:
  • cp
14
1028 if (optarg == NULL)
optarg == ((void *)0)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 10 times by 1 test
Evaluated by:
  • cp
4-10
1029 {-
1030 /* Fall through to the case for 'p' below. */-
1031 }
executed 4 times by 1 test: end of block
Executed by:
  • cp
4
1032 else-
1033 {-
1034 decode_preserve_arg (optarg, &x, true);-
1035 x.require_preserve = true;-
1036 break;
executed 10 times by 1 test: break;
Executed by:
  • cp
10
1037 }-
1038 FALLTHROUGH;-
1039-
1040 case 'p':
code before this statement executed 4 times by 1 test: case 'p':
Executed by:
  • cp
executed 7 times by 1 test: case 'p':
Executed by:
  • cp
4-7
1041 x.preserve_ownership = true;-
1042 x.preserve_mode = true;-
1043 x.preserve_timestamps = true;-
1044 x.require_preserve = true;-
1045 break;
executed 11 times by 1 test: break;
Executed by:
  • cp
11
1046-
1047 case PARENTS_OPTION:
executed 12 times by 1 test: case PARENTS_OPTION:
Executed by:
  • cp
12
1048 parents_option = true;-
1049 break;
executed 12 times by 1 test: break;
Executed by:
  • cp
12
1050-
1051 case 'r':
executed 11 times by 1 test: case 'r':
Executed by:
  • cp
11
1052 case 'R':
executed 35 times by 1 test: case 'R':
Executed by:
  • cp
35
1053 x.recursive = true;-
1054 break;
executed 46 times by 1 test: break;
Executed by:
  • cp
46
1055-
1056 case UNLINK_DEST_BEFORE_OPENING:
executed 21 times by 1 test: case UNLINK_DEST_BEFORE_OPENING:
Executed by:
  • cp
21
1057 x.unlink_dest_before_opening = true;-
1058 break;
executed 21 times by 1 test: break;
Executed by:
  • cp
21
1059-
1060 case STRIP_TRAILING_SLASHES_OPTION:
executed 1 time by 1 test: case STRIP_TRAILING_SLASHES_OPTION:
Executed by:
  • cp
1
1061 remove_trailing_slashes = true;-
1062 break;
executed 1 time by 1 test: break;
Executed by:
  • cp
1
1063-
1064 case 's':
executed 3 times by 1 test: case 's':
Executed by:
  • cp
3
1065 x.symbolic_link = true;-
1066 break;
executed 3 times by 1 test: break;
Executed by:
  • cp
3
1067-
1068 case 't':
executed 3 times by 1 test: case 't':
Executed by:
  • cp
3
1069 if (target_directory)
target_directoryDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • cp
0-3
1070 die (EXIT_FAILURE, 0,
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"multiple target directories specified\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "multiple target directories specified" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "multiple target directories specified" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1071 _("multiple target directories specified"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"multiple target directories specified\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "multiple target directories specified" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "multiple target directories specified" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1072 else-
1073 {-
1074 struct stat st;-
1075 if (stat (optarg, &st) != 0)
stat (optarg, &st) != 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-3
1076 die (EXIT_FAILURE, errno, _("failed to access %s"),
executed 3 times by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"failed to access %s\", 5), quotearg_style (shell_escape_always_quoting_style, optarg)), assume (false))" ")"); int _gl_dummy; ..., (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "failed to access %s" , 5) , quotearg_style (shell_escape_always_quoting_style, optarg)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
Executed by:
  • cp
3
1077 quoteaf (optarg));
executed 3 times by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"failed to access %s\", 5), quotearg_style (shell_escape_always_quoting_style, optarg)), assume (false))" ")"); int _gl_dummy; ..., (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "failed to access %s" , 5) , quotearg_style (shell_escape_always_quoting_style, optarg)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
Executed by:
  • cp
3
1078 if (! S_ISDIR (st.st_mode))
! (((( st.st_m... == (0040000))Description
TRUEnever evaluated
FALSEnever evaluated
0
1079 die (EXIT_FAILURE, 0, _("target %s is not a directory"),
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"target %s is not a directory\", 5), quotearg_style (shell_escape_always_quoting_style, optarg)), assume (false))" ")"); int _gl_dummy; })) ? ((erro...yle, optarg)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "target %s is not a directory" , 5) , quotearg_style (shell_escape_always_quoting_style, optarg)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1080 quoteaf (optarg));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"target %s is not a directory\", 5), quotearg_style (shell_escape_always_quoting_style, optarg)), assume (false))" ")"); int _gl_dummy; })) ? ((erro...yle, optarg)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "target %s is not a directory" , 5) , quotearg_style (shell_escape_always_quoting_style, optarg)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1081 }
never executed: end of block
0
1082 target_directory = optarg;-
1083 break;
never executed: break;
0
1084-
1085 case 'T':
executed 4 times by 1 test: case 'T':
Executed by:
  • cp
4
1086 no_target_directory = true;-
1087 break;
executed 4 times by 1 test: break;
Executed by:
  • cp
4
1088-
1089 case 'u':
executed 10 times by 1 test: case 'u':
Executed by:
  • cp
10
1090 x.update = true;-
1091 break;
executed 10 times by 1 test: break;
Executed by:
  • cp
10
1092-
1093 case 'v':
executed 11 times by 1 test: case 'v':
Executed by:
  • cp
11
1094 x.verbose = true;-
1095 break;
executed 11 times by 1 test: break;
Executed by:
  • cp
11
1096-
1097 case 'x':
executed 2 times by 1 test: case 'x':
Executed by:
  • cp
2
1098 x.one_file_system = true;-
1099 break;
executed 2 times by 1 test: break;
Executed by:
  • cp
2
1100-
1101 case 'Z':
executed 2 times by 1 test: case 'Z':
Executed by:
  • cp
2
1102 /* politely decline if we're not on a selinux-enabled kernel. */-
1103 if (selinux_enabled)
selinux_enabledDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
1104 {-
1105 if (optarg)
optargDescription
TRUEnever evaluated
FALSEnever evaluated
0
1106 scontext = optarg;
never executed: scontext = optarg;
0
1107 else-
1108 x.set_security_context = true;
never executed: x.set_security_context = 1 ;
0
1109 }-
1110 else if (optarg)
optargDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
1111 {-
1112 error (0, 0,-
1113 _("warning: ignoring --context; "-
1114 "it requires an SELinux-enabled kernel"));-
1115 }
never executed: end of block
0
1116 break;
executed 2 times by 1 test: break;
Executed by:
  • cp
2
1117-
1118 case 'S':
executed 5 times by 1 test: case 'S':
Executed by:
  • cp
5
1119 make_backups = true;-
1120 backup_suffix = optarg;-
1121 break;
executed 5 times by 1 test: break;
Executed by:
  • cp
5
1122-
1123 case_GETOPT_HELP_CHAR;
never executed: break;
executed 46 times by 1 test: case GETOPT_HELP_CHAR:
Executed by:
  • cp
0-46
1124-
1125 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
executed 73 times by 1 test: exit ( 0 );
Executed by:
  • cp
never executed: break;
executed 73 times by 1 test: case GETOPT_VERSION_CHAR:
Executed by:
  • cp
0-73
1126-
1127 default:
executed 3 times by 1 test: default:
Executed by:
  • cp
3
1128 usage (EXIT_FAILURE);-
1129 }
never executed: end of block
0
1130 }-
1131-
1132 if (x.hard_link && x.symbolic_link)
x.hard_linkDescription
TRUEevaluated 75 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 621 times by 1 test
Evaluated by:
  • cp
x.symbolic_linkDescription
TRUEnever evaluated
FALSEevaluated 75 times by 1 test
Evaluated by:
  • cp
0-621
1133 {-
1134 error (0, 0, _("cannot make both hard and symbolic links"));-
1135 usage (EXIT_FAILURE);-
1136 }
never executed: end of block
0
1137-
1138 if (x.interactive == I_ALWAYS_NO)
x.interactive == I_ALWAYS_NODescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 691 times by 1 test
Evaluated by:
  • cp
5-691
1139 x.update = false;
executed 5 times by 1 test: x.update = 0 ;
Executed by:
  • cp
5
1140-
1141 if (make_backups && x.interactive == I_ALWAYS_NO)
make_backupsDescription
TRUEevaluated 106 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 590 times by 1 test
Evaluated by:
  • cp
x.interactive == I_ALWAYS_NODescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 105 times by 1 test
Evaluated by:
  • cp
1-590
1142 {-
1143 error (0, 0,-
1144 _("options --backup and --no-clobber are mutually exclusive"));-
1145 usage (EXIT_FAILURE);-
1146 }
never executed: end of block
0
1147-
1148 if (x.reflink_mode == REFLINK_ALWAYS && x.sparse_mode != SPARSE_AUTO)
x.reflink_mode...REFLINK_ALWAYSDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 691 times by 1 test
Evaluated by:
  • cp
x.sparse_mode != SPARSE_AUTODescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
2-691
1149 {-
1150 error (0, 0, _("--reflink can be used only with --sparse=auto"));-
1151 usage (EXIT_FAILURE);-
1152 }
never executed: end of block
0
1153-
1154 x.backup_type = (make_backups
make_backupsDescription
TRUEevaluated 105 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 588 times by 1 test
Evaluated by:
  • cp
105-588
1155 ? xget_version (_("backup type"),-
1156 version_control_string)-
1157 : no_backups);-
1158 set_simple_backup_suffix (backup_suffix);-
1159-
1160 if (x.dereference == DEREF_UNDEFINED)
x.dereference ...EREF_UNDEFINEDDescription
TRUEevaluated 586 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 107 times by 1 test
Evaluated by:
  • cp
107-586
1161 {-
1162 if (x.recursive && ! x.hard_link)
x.recursiveDescription
TRUEevaluated 25 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 561 times by 1 test
Evaluated by:
  • cp
! x.hard_linkDescription
TRUEevaluated 19 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 6 times by 1 test
Evaluated by:
  • cp
6-561
1163 /* This is compatible with FreeBSD. */-
1164 x.dereference = DEREF_NEVER;
executed 19 times by 1 test: x.dereference = DEREF_NEVER;
Executed by:
  • cp
19
1165 else-
1166 x.dereference = DEREF_ALWAYS;
executed 567 times by 1 test: x.dereference = DEREF_ALWAYS;
Executed by:
  • cp
567
1167 }-
1168-
1169 if (x.recursive)
x.recursiveDescription
TRUEevaluated 60 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 633 times by 1 test
Evaluated by:
  • cp
60-633
1170 x.copy_as_regular = copy_contents;
executed 60 times by 1 test: x.copy_as_regular = copy_contents;
Executed by:
  • cp
60
1171-
1172 /* Ensure -Z overrides -a. */-
1173 if ((x.set_security_context || scontext)
x.set_security_contextDescription
TRUEnever evaluated
FALSEevaluated 693 times by 1 test
Evaluated by:
  • cp
scontextDescription
TRUEnever evaluated
FALSEevaluated 693 times by 1 test
Evaluated by:
  • cp
0-693
1174 && ! x.require_preserve_context)
! x.require_preserve_contextDescription
TRUEnever evaluated
FALSEnever evaluated
0
1175 x.preserve_security_context = false;
never executed: x.preserve_security_context = 0 ;
0
1176-
1177 if (x.preserve_security_context && (x.set_security_context || scontext))
x.preserve_security_contextDescription
TRUEnever evaluated
FALSEevaluated 693 times by 1 test
Evaluated by:
  • cp
x.set_security_contextDescription
TRUEnever evaluated
FALSEnever evaluated
scontextDescription
TRUEnever evaluated
FALSEnever evaluated
0-693
1178 die (EXIT_FAILURE, 0,
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot set target context and preserve it\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "cannot set target context and preserve it" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot set target context and preserve it" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1179 _("cannot set target context and preserve it"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot set target context and preserve it\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgettext (((void *)0), "cannot set target context and preserve it" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot set target context and preserve it" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1180-
1181 if (x.require_preserve_context && ! selinux_enabled)
x.require_preserve_contextDescription
TRUEnever evaluated
FALSEevaluated 693 times by 1 test
Evaluated by:
  • cp
! selinux_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0-693
1182 die (EXIT_FAILURE, 0,
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot preserve security context \" \"without an SELinux-enabled kernel\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgett...n SELinux-enabled kernel" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot preserve security context " "without an SELinux-enabled kernel" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1183 _("cannot preserve security context "
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot preserve security context \" \"without an SELinux-enabled kernel\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgett...n SELinux-enabled kernel" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot preserve security context " "without an SELinux-enabled kernel" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1184 "without an SELinux-enabled kernel"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot preserve security context \" \"without an SELinux-enabled kernel\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dcgett...n SELinux-enabled kernel" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot preserve security context " "without an SELinux-enabled kernel" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1185-
1186 /* FIXME: This handles new files. But what about existing files?-
1187 I.e., if updating a tree, new files would have the specified context,-
1188 but shouldn't existing files be updated for consistency like this?-
1189 if (scontext)-
1190 restorecon (dst_path, 0, true);-
1191 */-
1192 if (scontext && setfscreatecon (se_const (scontext)) < 0)
scontextDescription
TRUEnever evaluated
FALSEevaluated 693 times by 1 test
Evaluated by:
  • cp
setfscreatecon...scontext)) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0-693
1193 die (EXIT_FAILURE, errno,
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"failed to set default file creation context to %s\", 5), quote (scontext)), assume (false))" ")"); int _gl_dummy; })) ? ((erro... (scontext)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "failed to set default file creation context to %s" , 5) , quote (scontext)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1194 _("failed to set default file creation context to %s"),
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"failed to set default file creation context to %s\", 5), quote (scontext)), assume (false))" ")"); int _gl_dummy; })) ? ((erro... (scontext)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "failed to set default file creation context to %s" , 5) , quote (scontext)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1195 quote (scontext));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"failed to set default file creation context to %s\", 5), quote (scontext)), assume (false))" ")"); int _gl_dummy; })) ? ((erro... (scontext)), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "failed to set default file creation context to %s" , 5) , quote (scontext)), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1196-
1197#if !USE_XATTR-
1198 if (x.require_preserve_xattr)
x.require_preserve_xattrDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 692 times by 1 test
Evaluated by:
  • cp
1-692
1199 die (EXIT_FAILURE, 0, _("cannot preserve extended attributes, cp is "
executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot preserve extended attributes, cp is \" \"built without xattr support\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dc...ithout xattr support" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot preserve extended attributes, cp is " "built without xattr support" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
Executed by:
  • cp
1
1200 "built without xattr support"));
executed 1 time by 1 test: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, 0, dcgettext (((void *)0), \"cannot preserve extended attributes, cp is \" \"built without xattr support\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , 0, dc...ithout xattr support" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , 0, dcgettext (((void *)0), "cannot preserve extended attributes, cp is " "built without xattr support" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
Executed by:
  • cp
1
1201#endif-
1202-
1203 /* Allocate space for remembering copied and created files. */-
1204-
1205 hash_init ();-
1206-
1207 ok = do_copy (argc - optind, argv + optind,-
1208 target_directory, no_target_directory, &x);-
1209-
1210#ifdef lint-
1211 forget_all ();-
1212#endif-
1213-
1214 return ok ? EXIT_SUCCESS : EXIT_FAILURE;
executed 691 times by 1 test: return ok ? 0 : 1 ;
Executed by:
  • cp
691
1215}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2