OpenCoverage

copy.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/src/copy.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* copy.c -- core functions for copying files and directories-
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/* Extracted from cp.c and librarified by Jim Meyering. */-
18-
19#include <config.h>-
20#include <stdio.h>-
21#include <assert.h>-
22#include <sys/ioctl.h>-
23#include <sys/types.h>-
24#include <selinux/selinux.h>-
25-
26#if HAVE_HURD_H-
27# include <hurd.h>-
28#endif-
29#if HAVE_PRIV_H-
30# include <priv.h>-
31#endif-
32-
33#include "system.h"-
34#include "acl.h"-
35#include "backupfile.h"-
36#include "buffer-lcm.h"-
37#include "canonicalize.h"-
38#include "copy.h"-
39#include "cp-hash.h"-
40#include "extent-scan.h"-
41#include "die.h"-
42#include "error.h"-
43#include "fadvise.h"-
44#include "fcntl--.h"-
45#include "fiemap.h"-
46#include "file-set.h"-
47#include "filemode.h"-
48#include "filenamecat.h"-
49#include "force-link.h"-
50#include "full-write.h"-
51#include "hash.h"-
52#include "hash-triple.h"-
53#include "ignore-value.h"-
54#include "ioblksize.h"-
55#include "quote.h"-
56#include "renameat2.h"-
57#include "root-uid.h"-
58#include "same.h"-
59#include "savedir.h"-
60#include "stat-size.h"-
61#include "stat-time.h"-
62#include "utimecmp.h"-
63#include "utimens.h"-
64#include "write-any-file.h"-
65#include "areadlink.h"-
66#include "yesno.h"-
67#include "selinux.h"-
68-
69#if USE_XATTR-
70# include <attr/error_context.h>-
71# include <attr/libattr.h>-
72# include <stdarg.h>-
73# include "verror.h"-
74#endif-
75-
76#if HAVE_LINUX_FALLOC_H-
77# include <linux/falloc.h>-
78#endif-
79-
80/* See HAVE_FALLOCATE workaround when including this file. */-
81#ifdef HAVE_LINUX_FS_H-
82# include <linux/fs.h>-
83#endif-
84-
85#if !defined FICLONE && defined __linux__-
86# define FICLONE _IOW (0x94, 9, int)-
87#endif-
88-
89#ifndef HAVE_FCHOWN-
90# define HAVE_FCHOWN false-
91# define fchown(fd, uid, gid) (-1)-
92#endif-
93-
94#ifndef HAVE_LCHOWN-
95# define HAVE_LCHOWN false-
96# define lchown(name, uid, gid) chown (name, uid, gid)-
97#endif-
98-
99#ifndef HAVE_MKFIFO-
100static int-
101rpl_mkfifo (char const *file, mode_t mode)-
102{-
103 errno = ENOTSUP;-
104 return -1;-
105}-
106# define mkfifo rpl_mkfifo-
107#endif-
108-
109#ifndef USE_ACL-
110# define USE_ACL 0-
111#endif-
112-
113#define SAME_OWNER(A, B) ((A).st_uid == (B).st_uid)-
114#define SAME_GROUP(A, B) ((A).st_gid == (B).st_gid)-
115#define SAME_OWNER_AND_GROUP(A, B) (SAME_OWNER (A, B) && SAME_GROUP (A, B))-
116-
117/* LINK_FOLLOWS_SYMLINKS is tri-state; if it is -1, we don't know-
118 how link() behaves, so assume we can't hardlink symlinks in that case. */-
119#if (defined HAVE_LINKAT && ! LINKAT_SYMLINK_NOTSUP) || ! LINK_FOLLOWS_SYMLINKS-
120# define CAN_HARDLINK_SYMLINKS 1-
121#else-
122# define CAN_HARDLINK_SYMLINKS 0-
123#endif-
124-
125struct dir_list-
126{-
127 struct dir_list *parent;-
128 ino_t ino;-
129 dev_t dev;-
130};-
131-
132/* Initial size of the cp.dest_info hash table. */-
133#define DEST_INFO_INITIAL_CAPACITY 61-
134-
135static bool copy_internal (char const *src_name, char const *dst_name,-
136 bool new_dst, struct stat const *parent,-
137 struct dir_list *ancestors,-
138 const struct cp_options *x,-
139 bool command_line_arg,-
140 bool *first_dir_created_per_command_line_arg,-
141 bool *copy_into_self,-
142 bool *rename_succeeded);-
143static bool owner_failure_ok (struct cp_options const *x);-
144-
145/* Pointers to the file names: they're used in the diagnostic that is issued-
146 when we detect the user is trying to copy a directory into itself. */-
147static char const *top_level_src_name;-
148static char const *top_level_dst_name;-
149-
150/* Set the timestamp of symlink, FILE, to TIMESPEC.-
151 If this system lacks support for that, simply return 0. */-
152static inline int-
153utimens_symlink (char const *file, struct timespec const *timespec)-
154{-
155 int err = lutimens (file, timespec);-
156 /* When configuring on a system with new headers and libraries, and-
157 running on one with a kernel that is old enough to lack the syscall,-
158 utimensat fails with ENOSYS. Ignore that. */-
159 if (err && errno == ENOSYS)
errDescription
TRUEnever evaluated
FALSEevaluated 3 times by 2 tests
Evaluated by:
  • cp
  • mv
(*__errno_location ()) == 38Description
TRUEnever evaluated
FALSEnever evaluated
0-3
160 err = 0;
never executed: err = 0;
0
161 return err;
executed 3 times by 2 tests: return err;
Executed by:
  • cp
  • mv
3
162}-
163-
164/* Attempt to punch a hole to avoid any permanent-
165 speculative preallocation on file systems such as XFS.-
166 Return values as per fallocate(2) except ENOSYS etc. are ignored. */-
167-
168static int-
169punch_hole (int fd, off_t offset, off_t length)-
170{-
171 int ret = 0;-
172/* +0 is to work around older <linux/fs.h> defining HAVE_FALLOCATE to empty. */-
173#if HAVE_FALLOCATE + 0-
174# if defined FALLOC_FL_PUNCH_HOLE && defined FALLOC_FL_KEEP_SIZE-
175 ret = fallocate (fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,-
176 offset, length);-
177 if (ret < 0 && (is_ENOTSUP (errno) || errno == ENOSYS))
ret < 0Description
TRUEnever evaluated
FALSEevaluated 1627 times by 1 test
Evaluated by:
  • cp
is_ENOTSUP ( (...location ()) )Description
TRUEnever evaluated
FALSEnever evaluated
(*__errno_location ()) == 38Description
TRUEnever evaluated
FALSEnever evaluated
0-1627
178 ret = 0;
never executed: ret = 0;
0
179# endif-
180#endif-
181 return ret;
executed 1627 times by 1 test: return ret;
Executed by:
  • cp
1627
182}-
183-
184/* Create a hole at the end of a file,-
185 avoiding preallocation if requested. */-
186-
187static bool-
188create_hole (int fd, char const *name, bool punch_holes, off_t size)-
189{-
190 off_t file_end = lseek (fd, size, SEEK_CUR);-
191-
192 if (file_end < 0)
file_end < 0Description
TRUEnever evaluated
FALSEevaluated 1619 times by 1 test
Evaluated by:
  • cp
0-1619
193 {-
194 error (0, errno, _("cannot lseek %s"), quoteaf (name));-
195 return false;
never executed: return 0 ;
0
196 }-
197-
198 /* Some file systems (like XFS) preallocate when write extending a file.-
199 I.e., a previous write() may have preallocated extra space-
200 that the seek above will not discard. A subsequent write() could-
201 then make this allocation permanent. */-
202 if (punch_holes && punch_hole (fd, file_end - size, size) < 0)
punch_holesDescription
TRUEevaluated 1618 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
punch_hole (fd...ize, size) < 0Description
TRUEnever evaluated
FALSEevaluated 1618 times by 1 test
Evaluated by:
  • cp
0-1618
203 {-
204 error (0, errno, _("error deallocating %s"), quoteaf (name));-
205 return false;
never executed: return 0 ;
0
206 }-
207-
208 return true;
executed 1619 times by 1 test: return 1 ;
Executed by:
  • cp
1619
209}-
210-
211-
212/* Copy the regular file open on SRC_FD/SRC_NAME to DST_FD/DST_NAME,-
213 honoring the MAKE_HOLES setting and using the BUF_SIZE-byte buffer-
214 BUF for temporary storage. Copy no more than MAX_N_READ bytes.-
215 Return true upon successful completion;-
216 print a diagnostic and return false upon error.-
217 Note that for best results, BUF should be "well"-aligned.-
218 BUF must have sizeof(uintptr_t)-1 bytes of additional space-
219 beyond BUF[BUF_SIZE-1].-
220 Set *LAST_WRITE_MADE_HOLE to true if the final operation on-
221 DEST_FD introduced a hole. Set *TOTAL_N_READ to the number of-
222 bytes read. */-
223static bool-
224sparse_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,-
225 size_t hole_size, bool punch_holes,-
226 char const *src_name, char const *dst_name,-
227 uintmax_t max_n_read, off_t *total_n_read,-
228 bool *last_write_made_hole)-
229{-
230 *last_write_made_hole = false;-
231 *total_n_read = 0;-
232 bool make_hole = false;-
233 off_t psize = 0;-
234-
235 while (max_n_read)
max_n_readDescription
TRUEevaluated 7313 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 1394 times by 1 test
Evaluated by:
  • cp
1394-7313
236 {-
237 ssize_t n_read = read (src_fd, buf, MIN (max_n_read, buf_size));-
238 if (n_read < 0)
n_read < 0Description
TRUEnever evaluated
FALSEevaluated 7313 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-7313
239 {-
240 if (errno == EINTR)
(*__errno_location ()) == 4Description
TRUEnever evaluated
FALSEnever evaluated
0
241 continue;
never executed: continue;
0
242 error (0, errno, _("error reading %s"), quoteaf (src_name));-
243 return false;
never executed: return 0 ;
0
244 }-
245 if (n_read == 0)
n_read == 0Description
TRUEevaluated 4395 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 2918 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
2918-4395
246 break;
executed 4395 times by 3 tests: break;
Executed by:
  • cp
  • ginstall
  • mv
4395
247 max_n_read -= n_read;-
248 *total_n_read += n_read;-
249-
250 /* Loop over the input buffer in chunks of hole_size. */-
251 size_t csize = hole_size ? hole_size : buf_size;
hole_sizeDescription
TRUEevaluated 1474 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 1444 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
1444-1474
252 char *cbuf = buf;-
253 char *pbuf = buf;-
254-
255 while (n_read)
n_readDescription
TRUEevaluated 9418 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 2918 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
2918-9418
256 {-
257 bool prev_hole = make_hole;-
258 csize = MIN (csize, n_read);
(( csize )<( n_read ))Description
TRUEevaluated 6500 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2918 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
2918-6500
259-
260 if (hole_size && csize)
hole_sizeDescription
TRUEevaluated 7974 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 1444 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
csizeDescription
TRUEevaluated 7970 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 4 times by 1 test
Evaluated by:
  • cp
4-7974
261 make_hole = is_nul (cbuf, csize);
executed 7970 times by 1 test: make_hole = is_nul (cbuf, csize);
Executed by:
  • cp
7970
262-
263 bool transition = (make_hole != prev_hole) && psize;
(make_hole != prev_hole)Description
TRUEevaluated 476 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 8942 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
psizeDescription
TRUEevaluated 458 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 18 times by 1 test
Evaluated by:
  • cp
18-8942
264 bool last_chunk = (n_read == csize && ! make_hole) || ! csize;
n_read == csizeDescription
TRUEevaluated 2918 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 6500 times by 1 test
Evaluated by:
  • cp
! make_holeDescription
TRUEevaluated 2876 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 42 times by 1 test
Evaluated by:
  • cp
! csizeDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 6538 times by 1 test
Evaluated by:
  • cp
4-6538
265-
266 if (transition || last_chunk)
transitionDescription
TRUEevaluated 458 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 8960 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
last_chunkDescription
TRUEevaluated 2876 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 6084 times by 1 test
Evaluated by:
  • cp
458-8960
267 {-
268 if (! transition)
! transitionDescription
TRUEevaluated 2876 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 458 times by 1 test
Evaluated by:
  • cp
458-2876
269 psize += csize;
executed 2876 times by 3 tests: psize += csize;
Executed by:
  • cp
  • ginstall
  • mv
2876
270-
271 if (! prev_hole)
! prev_holeDescription
TRUEevaluated 3100 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 234 times by 1 test
Evaluated by:
  • cp
234-3100
272 {-
273 if (full_write (dest_fd, pbuf, psize) != psize)
full_write (de...size) != psizeDescription
TRUEnever evaluated
FALSEevaluated 3100 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-3100
274 {-
275 error (0, errno, _("error writing %s"),-
276 quoteaf (dst_name));-
277 return false;
never executed: return 0 ;
0
278 }-
279 }
executed 3100 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
3100
280 else-
281 {-
282 if (! create_hole (dest_fd, dst_name, punch_holes, psize))
! create_hole ..._holes, psize)Description
TRUEnever evaluated
FALSEevaluated 234 times by 1 test
Evaluated by:
  • cp
0-234
283 return false;
never executed: return 0 ;
0
284 }
executed 234 times by 1 test: end of block
Executed by:
  • cp
234
285-
286 pbuf = cbuf;-
287 psize = csize;-
288-
289 if (last_chunk)
last_chunkDescription
TRUEevaluated 2880 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 454 times by 1 test
Evaluated by:
  • cp
454-2880
290 {-
291 if (! csize)
! csizeDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2876 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
4-2876
292 n_read = 0; /* Finished processing buffer. */
executed 4 times by 1 test: n_read = 0;
Executed by:
  • cp
4
293-
294 if (transition)
transitionDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2876 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
4-2876
295 csize = 0; /* Loop again to deal with last chunk. */
executed 4 times by 1 test: csize = 0;
Executed by:
  • cp
4
296 else-
297 psize = 0; /* Reset for next read loop. */
executed 2876 times by 3 tests: psize = 0;
Executed by:
  • cp
  • ginstall
  • mv
2876
298 }-
299 }
executed 3334 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
3334
300 else /* Coalesce writes/seeks. */-
301 {-
302 if (psize <= OFF_T_MAX - csize)
psize <= ((off...+ 1))) - csizeDescription
TRUEevaluated 6084 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-6084
303 psize += csize;
executed 6084 times by 1 test: psize += csize;
Executed by:
  • cp
6084
304 else-
305 {-
306 error (0, 0, _("overflow reading %s"), quoteaf (src_name));-
307 return false;
never executed: return 0 ;
0
308 }-
309 }-
310-
311 n_read -= csize;-
312 cbuf += csize;-
313 }
executed 9418 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
9418
314-
315 *last_write_made_hole = make_hole;-
316-
317 /* It's tempting to break early here upon a short read from-
318 a regular file. That would save the final read syscall-
319 for each file. Unfortunately that doesn't work for-
320 certain files in /proc or /sys with linux kernels. */-
321 }
executed 2918 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
2918
322-
323 /* Ensure a trailing hole is created, so that subsequent-
324 calls of sparse_copy() start at the correct offset. */-
325 if (make_hole && ! create_hole (dest_fd, dst_name, punch_holes, psize))
make_holeDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5781 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
! create_hole ..._holes, psize)Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • cp
0-5781
326 return false;
never executed: return 0 ;
0
327 else-
328 return true;
executed 5789 times by 3 tests: return 1 ;
Executed by:
  • cp
  • ginstall
  • mv
5789
329}-
330-
331/* Perform the O(1) btrfs clone operation, if possible.-
332 Upon success, return 0. Otherwise, return -1 and set errno. */-
333static inline int-
334clone_file (int dest_fd, int src_fd)-
335{-
336#ifdef FICLONE-
337 return ioctl (dest_fd, FICLONE, src_fd);
executed 3923 times by 2 tests: return ioctl (dest_fd, (((1U) << (((0 +8)+8)+14)) | (((0x94)) << (0 +8)) | (((9)) << 0) | ((((sizeof(int)))) << ((0 +8)+8))) , src_fd);
Executed by:
  • cp
  • mv
3923
338#else-
339 (void) dest_fd;-
340 (void) src_fd;-
341 errno = ENOTSUP;-
342 return -1;-
343#endif-
344}-
345-
346/* Write N_BYTES zero bytes to file descriptor FD. Return true if successful.-
347 Upon write failure, set errno and return false. */-
348static bool-
349write_zeros (int fd, off_t n_bytes)-
350{-
351 static char *zeros;-
352 static size_t nz = IO_BUFSIZE;-
353-
354 /* Attempt to use a relatively large calloc'd source buffer for-
355 efficiency, but if that allocation fails, resort to a smaller-
356 statically allocated one. */-
357 if (zeros == NULL)
zeros == ((void *)0)Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-5
358 {-
359 static char fallback[1024];-
360 zeros = calloc (nz, 1);-
361 if (zeros == NULL)
zeros == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
0-5
362 {-
363 zeros = fallback;-
364 nz = sizeof fallback;-
365 }
never executed: end of block
0
366 }
executed 5 times by 1 test: end of block
Executed by:
  • cp
5
367-
368 while (n_bytes)
n_bytesDescription
TRUEevaluated 42 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
5-42
369 {-
370 size_t n = MIN (nz, n_bytes);
(( nz )<( n_bytes ))Description
TRUEevaluated 37 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
5-37
371 if ((full_write (fd, zeros, n)) != n)
(full_write (f...eros, n)) != nDescription
TRUEnever evaluated
FALSEevaluated 42 times by 1 test
Evaluated by:
  • cp
0-42
372 return false;
never executed: return 0 ;
0
373 n_bytes -= n;-
374 }
executed 42 times by 1 test: end of block
Executed by:
  • cp
42
375-
376 return true;
executed 5 times by 1 test: return 1 ;
Executed by:
  • cp
5
377}-
378-
379/* Perform an efficient extent copy, if possible. This avoids-
380 the overhead of detecting holes in hole-introducing/preserving-
381 copy, and thus makes copying sparse files much more efficient.-
382 Upon a successful copy, return true. If the initial extent scan-
383 fails, set *NORMAL_COPY_REQUIRED to true and return false.-
384 Upon any other failure, set *NORMAL_COPY_REQUIRED to false and-
385 return false. */-
386static bool-
387extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,-
388 size_t hole_size, off_t src_total_size,-
389 enum Sparse_type sparse_mode,-
390 char const *src_name, char const *dst_name,-
391 bool *require_normal_copy)-
392{-
393 struct extent_scan scan;-
394 off_t last_ext_start = 0;-
395 off_t last_ext_len = 0;-
396-
397 /* Keep track of the output position.-
398 We may need this at the end, for a final ftruncate. */-
399 off_t dest_pos = 0;-
400-
401 extent_scan_init (src_fd, &scan);-
402-
403 *require_normal_copy = false;-
404 bool wrote_hole_at_eof = true;-
405 do-
406 {-
407 bool ok = extent_scan_read (&scan);-
408 if (! ok)
! okDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 64 times by 1 test
Evaluated by:
  • cp
9-64
409 {-
410 if (scan.hit_final_extent)
scan.hit_final_extentDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
4-5
411 break;
executed 4 times by 1 test: break;
Executed by:
  • cp
4
412-
413 if (scan.initial_scan_failed)
scan.initial_scan_failedDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-5
414 {-
415 *require_normal_copy = true;-
416 return false;
executed 5 times by 1 test: return 0 ;
Executed by:
  • cp
5
417 }-
418-
419 error (0, errno, _("%s: failed to get extents info"),-
420 quotef (src_name));-
421 return false;
never executed: return 0 ;
0
422 }-
423-
424 bool empty_extent = false;-
425 for (unsigned int i = 0; i < scan.ei_count || empty_extent; i++)
i < scan.ei_countDescription
TRUEevaluated 1394 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 18 times by 1 test
Evaluated by:
  • cp
empty_extentDescription
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • cp
0-1394
426 {-
427 off_t ext_start;-
428 off_t ext_len;-
429 off_t ext_hole_size;-
430-
431 if (i < scan.ei_count)
i < scan.ei_countDescription
TRUEevaluated 1394 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1394
432 {-
433 ext_start = scan.ext_info[i].ext_logical;-
434 ext_len = scan.ext_info[i].ext_length;-
435 }
executed 1394 times by 1 test: end of block
Executed by:
  • cp
1394
436 else /* empty extent at EOF. */-
437 {-
438 i--;-
439 ext_start = last_ext_start + scan.ext_info[i].ext_length;-
440 ext_len = 0;-
441 }
never executed: end of block
0
442-
443 /* Truncate extent to EOF. Extents starting after EOF are-
444 treated as zero length extents starting right after EOF.-
445 Generally this will trigger with an extent starting after-
446 src_total_size, and result in creating a hole or zeros until EOF.-
447 Though in a file in which extents have changed since src_total_size-
448 was determined, we might have an extent spanning that size,-
449 in which case we'll only copy data up to that size. */-
450 if (src_total_size < ext_start + ext_len)
src_total_size...tart + ext_lenDescription
TRUEevaluated 23 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 1371 times by 1 test
Evaluated by:
  • cp
23-1371
451 {-
452 if (src_total_size < ext_start)
src_total_size < ext_startDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 20 times by 1 test
Evaluated by:
  • cp
3-20
453 ext_start = src_total_size;
executed 3 times by 1 test: ext_start = src_total_size;
Executed by:
  • cp
3
454 ext_len = src_total_size - ext_start;-
455 }
executed 23 times by 1 test: end of block
Executed by:
  • cp
23
456-
457 ext_hole_size = ext_start - last_ext_start - last_ext_len;-
458-
459 wrote_hole_at_eof = false;-
460-
461 if (ext_hole_size)
ext_hole_sizeDescription
TRUEevaluated 1379 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
15-1379
462 {-
463 if (lseek (src_fd, ext_start, SEEK_SET) < 0)
lseek (src_fd,...start, 0 ) < 0Description
TRUEnever evaluated
FALSEevaluated 1379 times by 1 test
Evaluated by:
  • cp
0-1379
464 {-
465 error (0, errno, _("cannot lseek %s"), quoteaf (src_name));-
466 fail:
code before this statement never executed: fail:
0
467 extent_scan_free (&scan);-
468 return false;
never executed: return 0 ;
0
469 }-
470-
471 if ((empty_extent && sparse_mode == SPARSE_ALWAYS)
empty_extentDescription
TRUEnever evaluated
FALSEevaluated 1379 times by 1 test
Evaluated by:
  • cp
sparse_mode == SPARSE_ALWAYSDescription
TRUEnever evaluated
FALSEnever evaluated
0-1379
472 || (!empty_extent && sparse_mode != SPARSE_NEVER))
!empty_extentDescription
TRUEevaluated 1379 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
sparse_mode != SPARSE_NEVERDescription
TRUEevaluated 1377 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-1379
473 {-
474 if (! create_hole (dest_fd, dst_name,
! create_hole ...ext_hole_size)Description
TRUEnever evaluated
FALSEevaluated 1377 times by 1 test
Evaluated by:
  • cp
0-1377
475 sparse_mode == SPARSE_ALWAYS,
! create_hole ...ext_hole_size)Description
TRUEnever evaluated
FALSEevaluated 1377 times by 1 test
Evaluated by:
  • cp
0-1377
476 ext_hole_size))
! create_hole ...ext_hole_size)Description
TRUEnever evaluated
FALSEevaluated 1377 times by 1 test
Evaluated by:
  • cp
0-1377
477 goto fail;
never executed: goto fail;
0
478 wrote_hole_at_eof = true;-
479 }
executed 1377 times by 1 test: end of block
Executed by:
  • cp
1377
480 else-
481 {-
482 /* When not inducing holes and when there is a hole between-
483 the end of the previous extent and the beginning of the-
484 current one, write zeros to the destination file. */-
485 off_t nzeros = ext_hole_size;-
486 if (empty_extent)
empty_extentDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
487 nzeros = MIN (src_total_size - dest_pos, ext_hole_size);
never executed: nzeros = ((( src_total_size - dest_pos )<( ext_hole_size ))?( src_total_size - dest_pos ):( ext_hole_size )) ;
(( src_total_s...t_hole_size ))Description
TRUEnever evaluated
FALSEnever evaluated
0
488-
489 if (! write_zeros (dest_fd, nzeros))
! write_zeros ...st_fd, nzeros)Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
490 {-
491 error (0, errno, _("%s: write failed"),-
492 quotef (dst_name));-
493 goto fail;
never executed: goto fail;
0
494 }-
495-
496 dest_pos = MIN (src_total_size, ext_start);
(( src_total_s...( ext_start ))Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
497 }
executed 2 times by 1 test: end of block
Executed by:
  • cp
2
498 }-
499-
500 last_ext_start = ext_start;-
501-
502 /* Treat an unwritten but allocated extent much like a hole.-
503 I.e., don't read, but don't convert to a hole in the destination,-
504 unless SPARSE_ALWAYS. */-
505 /* For now, do not treat FIEMAP_EXTENT_UNWRITTEN specially,-
506 because that (in combination with no sync) would lead to data-
507 loss at least on XFS and ext4 when using 2.6.39-rc3 kernels. */-
508 if (0 && (scan.ext_info[i].ext_flags & FIEMAP_EXTENT_UNWRITTEN))
dead code: (scan.ext_info[i].ext_flags & 0x00000800)
dead code: { empty_extent = 1 ; last_ext_len = 0; if (ext_len == 0) empty_extent = 0 ; }
-
509 {
dead code: { empty_extent = 1 ; last_ext_len = 0; if (ext_len == 0) empty_extent = 0 ; }
-
510 empty_extent = true;
dead code: { empty_extent = 1 ; last_ext_len = 0; if (ext_len == 0) empty_extent = 0 ; }
-
511 last_ext_len = 0;
dead code: { empty_extent = 1 ; last_ext_len = 0; if (ext_len == 0) empty_extent = 0 ; }
-
512 if (ext_len == 0) /* The last extent is empty and processed. */
dead code: { empty_extent = 1 ; last_ext_len = 0; if (ext_len == 0) empty_extent = 0 ; }
-
513 empty_extent = false;
dead code: { empty_extent = 1 ; last_ext_len = 0; if (ext_len == 0) empty_extent = 0 ; }
-
514 }
dead code: { empty_extent = 1 ; last_ext_len = 0; if (ext_len == 0) empty_extent = 0 ; }
-
515 else-
516 {-
517 off_t n_read;-
518 empty_extent = false;-
519 last_ext_len = ext_len;-
520 bool read_hole;-
521-
522 if ( ! sparse_copy (src_fd, dest_fd, buf, buf_size,
! sparse_copy ...d, &read_hole)Description
TRUEnever evaluated
FALSEevaluated 1394 times by 1 test
Evaluated by:
  • cp
0-1394
523 sparse_mode == SPARSE_ALWAYS ? hole_size: 0,
! sparse_copy ...d, &read_hole)Description
TRUEnever evaluated
FALSEevaluated 1394 times by 1 test
Evaluated by:
  • cp
0-1394
524 true, src_name, dst_name, ext_len, &n_read,
! sparse_copy ...d, &read_hole)Description
TRUEnever evaluated
FALSEevaluated 1394 times by 1 test
Evaluated by:
  • cp
0-1394
525 &read_hole))
! sparse_copy ...d, &read_hole)Description
TRUEnever evaluated
FALSEevaluated 1394 times by 1 test
Evaluated by:
  • cp
0-1394
526 goto fail;
never executed: goto fail;
0
527-
528 dest_pos = ext_start + n_read;-
529 if (n_read)
n_readDescription
TRUEevaluated 1391 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 3 times by 1 test
Evaluated by:
  • cp
3-1391
530 wrote_hole_at_eof = read_hole;
executed 1391 times by 1 test: wrote_hole_at_eof = read_hole;
Executed by:
  • cp
1391
531 }
executed 1394 times by 1 test: end of block
Executed by:
  • cp
1394
532-
533 /* If the file ends with unwritten extents not accounted for in the-
534 size, then skip processing them, and the associated redundant-
535 read() calls which will always return 0. We will need to-
536 remove this when we add fallocate() so that we can maintain-
537 extents beyond the apparent size. */-
538 if (dest_pos == src_total_size)
dest_pos == src_total_sizeDescription
TRUEevaluated 46 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 1348 times by 1 test
Evaluated by:
  • cp
46-1348
539 {-
540 scan.hit_final_extent = true;-
541 break;
executed 46 times by 1 test: break;
Executed by:
  • cp
46
542 }-
543 }
executed 1348 times by 1 test: end of block
Executed by:
  • cp
1348
544-
545 /* Release the space allocated to scan->ext_info. */-
546 extent_scan_free (&scan);-
547-
548 }
executed 64 times by 1 test: end of block
Executed by:
  • cp
64
549 while (! scan.hit_final_extent);
! scan.hit_final_extentDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 56 times by 1 test
Evaluated by:
  • cp
8-56
550-
551 /* When the source file ends with a hole, we have to do a little more work,-
552 since the above copied only up to and including the final extent.-
553 In order to complete the copy, we may have to insert a hole or write-
554 zeros in the destination corresponding to the source file's hole-at-EOF.-
555-
556 In addition, if the final extent was a block of zeros at EOF and we've-
557 just converted them to a hole in the destination, we must call ftruncate-
558 here in order to record the proper length in the destination. */-
559 if ((dest_pos < src_total_size || wrote_hole_at_eof)
dest_pos < src_total_sizeDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 46 times by 1 test
Evaluated by:
  • cp
wrote_hole_at_eofDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 44 times by 1 test
Evaluated by:
  • cp
2-46
560 && (sparse_mode != SPARSE_NEVER
sparse_mode != SPARSE_NEVERDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 3 times by 1 test
Evaluated by:
  • cp
(sparse_mode !...e - dest_pos))Description
TRUEnever evaluated
FALSEevaluated 16 times by 1 test
Evaluated by:
  • cp
0-16
561 ? ftruncate (dest_fd, src_total_size)
(sparse_mode !...e - dest_pos))Description
TRUEnever evaluated
FALSEevaluated 16 times by 1 test
Evaluated by:
  • cp
0-16
562 : ! write_zeros (dest_fd, src_total_size - dest_pos)))
(sparse_mode !...e - dest_pos))Description
TRUEnever evaluated
FALSEevaluated 16 times by 1 test
Evaluated by:
  • cp
0-16
563 {-
564 error (0, errno, _("failed to extend %s"), quoteaf (dst_name));-
565 return false;
never executed: return 0 ;
0
566 }-
567-
568 if (sparse_mode == SPARSE_ALWAYS && dest_pos < src_total_size
sparse_mode == SPARSE_ALWAYSDescription
TRUEevaluated 52 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 8 times by 1 test
Evaluated by:
  • cp
dest_pos < src_total_sizeDescription
TRUEevaluated 9 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 43 times by 1 test
Evaluated by:
  • cp
8-52
569 && punch_hole (dest_fd, dest_pos, src_total_size - dest_pos) < 0)
punch_hole (de... dest_pos) < 0Description
TRUEnever evaluated
FALSEevaluated 9 times by 1 test
Evaluated by:
  • cp
0-9
570 {-
571 error (0, errno, _("error deallocating %s"), quoteaf (dst_name));-
572 return false;
never executed: return 0 ;
0
573 }-
574-
575 return true;
executed 60 times by 1 test: return 1 ;
Executed by:
  • cp
60
576}-
577-
578/* FIXME: describe */-
579/* FIXME: rewrite this to use a hash table so we avoid the quadratic-
580 performance hit that's probably noticeable only on trees deeper-
581 than a few hundred levels. See use of active_dir_map in remove.c */-
582-
583static bool _GL_ATTRIBUTE_PURE-
584is_ancestor (const struct stat *sb, const struct dir_list *ancestors)-
585{-
586 while (ancestors != 0)
ancestors != 0Description
TRUEevaluated 50028 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 33971 times by 2 tests
Evaluated by:
  • cp
  • mv
33971-50028
587 {-
588 if (ancestors->ino == sb->st_ino && ancestors->dev == sb->st_dev)
ancestors->ino == sb->st_inoDescription
TRUEnever evaluated
FALSEevaluated 50028 times by 2 tests
Evaluated by:
  • cp
  • mv
ancestors->dev == sb->st_devDescription
TRUEnever evaluated
FALSEnever evaluated
0-50028
589 return true;
never executed: return 1 ;
0
590 ancestors = ancestors->parent;-
591 }
executed 50028 times by 2 tests: end of block
Executed by:
  • cp
  • mv
50028
592 return false;
executed 33971 times by 2 tests: return 0 ;
Executed by:
  • cp
  • mv
33971
593}-
594-
595static bool-
596errno_unsupported (int err)-
597{-
598 return err == ENOTSUP || err == ENODATA;
never executed: return err == 95 || err == 61 ;
0
599}-
600-
601#if USE_XATTR-
602static void-
603copy_attr_error (struct error_context *ctx _GL_UNUSED,-
604 char const *fmt, ...)-
605{-
606 if (!errno_unsupported (errno))-
607 {-
608 int err = errno;-
609 va_list ap;-
610-
611 /* use verror module to print error message */-
612 va_start (ap, fmt);-
613 verror (0, err, fmt, ap);-
614 va_end (ap);-
615 }-
616}-
617-
618static void-
619copy_attr_allerror (struct error_context *ctx _GL_UNUSED,-
620 char const *fmt, ...)-
621{-
622 int err = errno;-
623 va_list ap;-
624-
625 /* use verror module to print error message */-
626 va_start (ap, fmt);-
627 verror (0, err, fmt, ap);-
628 va_end (ap);-
629}-
630-
631static char const *-
632copy_attr_quote (struct error_context *ctx _GL_UNUSED, char const *str)-
633{-
634 return quoteaf (str);-
635}-
636-
637static void-
638copy_attr_free (struct error_context *ctx _GL_UNUSED,-
639 char const *str _GL_UNUSED)-
640{-
641}-
642-
643/* Exclude SELinux extended attributes that are otherwise handled,-
644 and are problematic to copy again. Also honor attributes-
645 configured for exclusion in /etc/xattr.conf.-
646 FIXME: Should we handle POSIX ACLs similarly?-
647 Return zero to skip. */-
648static int-
649check_selinux_attr (const char *name, struct error_context *ctx)-
650{-
651 return STRNCMP_LIT (name, "security.selinux")-
652 && attr_copy_check_permissions (name, ctx);-
653}-
654-
655/* If positive SRC_FD and DST_FD descriptors are passed,-
656 then copy by fd, otherwise copy by name. */-
657-
658static bool-
659copy_attr (char const *src_path, int src_fd,-
660 char const *dst_path, int dst_fd, struct cp_options const *x)-
661{-
662 int ret;-
663 bool all_errors = (!x->data_copy_required || x->require_preserve_xattr);-
664 bool some_errors = (!all_errors && !x->reduce_diagnostics);-
665 bool selinux_done = (x->preserve_security_context || x->set_security_context);-
666 struct error_context ctx =-
667 {-
668 .error = all_errors ? copy_attr_allerror : copy_attr_error,-
669 .quote = copy_attr_quote,-
670 .quote_free = copy_attr_free-
671 };-
672 if (0 <= src_fd && 0 <= dst_fd)-
673 ret = attr_copy_fd (src_path, src_fd, dst_path, dst_fd,-
674 selinux_done ? check_selinux_attr : NULL,-
675 (all_errors || some_errors ? &ctx : NULL));-
676 else-
677 ret = attr_copy_file (src_path, dst_path,-
678 selinux_done ? check_selinux_attr : NULL,-
679 (all_errors || some_errors ? &ctx : NULL));-
680-
681 return ret == 0;-
682}-
683#else /* USE_XATTR */-
684-
685static bool-
686copy_attr (char const *src_path _GL_UNUSED,-
687 int src_fd _GL_UNUSED,-
688 char const *dst_path _GL_UNUSED,-
689 int dst_fd _GL_UNUSED,-
690 struct cp_options const *x _GL_UNUSED)-
691{-
692 return true;
executed 37858 times by 2 tests: return 1 ;
Executed by:
  • cp
  • mv
37858
693}-
694#endif /* USE_XATTR */-
695-
696/* Read the contents of the directory SRC_NAME_IN, and recursively-
697 copy the contents to DST_NAME_IN. NEW_DST is true if-
698 DST_NAME_IN is a directory that was created previously in the-
699 recursion. SRC_SB and ANCESTORS describe SRC_NAME_IN.-
700 Set *COPY_INTO_SELF if SRC_NAME_IN is a parent of-
701 (or the same as) DST_NAME_IN; otherwise, clear it.-
702 Propagate *FIRST_DIR_CREATED_PER_COMMAND_LINE_ARG from-
703 caller to each invocation of copy_internal. Be careful to-
704 pass the address of a temporary, and to update-
705 *FIRST_DIR_CREATED_PER_COMMAND_LINE_ARG only upon completion.-
706 Return true if successful. */-
707-
708static bool-
709copy_dir (char const *src_name_in, char const *dst_name_in, bool new_dst,-
710 const struct stat *src_sb, struct dir_list *ancestors,-
711 const struct cp_options *x,-
712 bool *first_dir_created_per_command_line_arg,-
713 bool *copy_into_self)-
714{-
715 char *name_space;-
716 char *namep;-
717 struct cp_options non_command_line_options = *x;-
718 bool ok = true;-
719-
720 name_space = savedir (src_name_in, SAVEDIR_SORT_FASTREAD);-
721 if (name_space == NULL)
name_space == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 33971 times by 2 tests
Evaluated by:
  • cp
  • mv
0-33971
722 {-
723 /* This diagnostic is a bit vague because savedir can fail in-
724 several different ways. */-
725 error (0, errno, _("cannot access %s"), quoteaf (src_name_in));-
726 return false;
never executed: return 0 ;
0
727 }-
728-
729 /* For cp's -H option, dereference command line arguments, but do not-
730 dereference symlinks that are found via recursive traversal. */-
731 if (x->dereference == DEREF_COMMAND_LINE_ARGUMENTS)
x->dereference...LINE_ARGUMENTSDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 33969 times by 2 tests
Evaluated by:
  • cp
  • mv
2-33969
732 non_command_line_options.dereference = DEREF_NEVER;
executed 2 times by 1 test: non_command_line_options.dereference = DEREF_NEVER;
Executed by:
  • cp
2
733-
734 bool new_first_dir_created = false;-
735 namep = name_space;-
736 while (*namep != '\0')
*namep != '\0'Description
TRUEevaluated 63958 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 33960 times by 2 tests
Evaluated by:
  • cp
  • mv
33960-63958
737 {-
738 bool local_copy_into_self;-
739 char *src_name = file_name_concat (src_name_in, namep, NULL);-
740 char *dst_name = file_name_concat (dst_name_in, namep, NULL);-
741 bool first_dir_created = *first_dir_created_per_command_line_arg;-
742-
743 ok &= copy_internal (src_name, dst_name, new_dst, src_sb,-
744 ancestors, &non_command_line_options, false,-
745 &first_dir_created,-
746 &local_copy_into_self, NULL);-
747 *copy_into_self |= local_copy_into_self;-
748-
749 free (dst_name);-
750 free (src_name);-
751-
752 /* If we're copying into self, there's no point in continuing,-
753 and in fact, that would even infloop, now that we record only-
754 the first created directory per command line argument. */-
755 if (local_copy_into_self)
local_copy_into_selfDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 63947 times by 2 tests
Evaluated by:
  • cp
  • mv
11-63947
756 break;
executed 11 times by 1 test: break;
Executed by:
  • cp
11
757-
758 new_first_dir_created |= first_dir_created;-
759 namep += strlen (namep) + 1;-
760 }
executed 63947 times by 2 tests: end of block
Executed by:
  • cp
  • mv
63947
761 free (name_space);-
762 *first_dir_created_per_command_line_arg = new_first_dir_created;-
763-
764 return ok;
executed 33971 times by 2 tests: return ok;
Executed by:
  • cp
  • mv
33971
765}-
766-
767/* Set the owner and owning group of DEST_DESC to the st_uid and-
768 st_gid fields of SRC_SB. If DEST_DESC is undefined (-1), set-
769 the owner and owning group of DST_NAME instead; for-
770 safety prefer lchown if the system supports it since no-
771 symbolic links should be involved. DEST_DESC must-
772 refer to the same file as DEST_NAME if defined.-
773 Upon failure to set both UID and GID, try to set only the GID.-
774 NEW_DST is true if the file was newly created; otherwise,-
775 DST_SB is the status of the destination.-
776 Return 1 if the initial syscall succeeds, 0 if it fails but it's OK-
777 not to preserve ownership, -1 otherwise. */-
778-
779static int-
780set_owner (const struct cp_options *x, char const *dst_name, int dest_desc,-
781 struct stat const *src_sb, bool new_dst,-
782 struct stat const *dst_sb)-
783{-
784 uid_t uid = src_sb->st_uid;-
785 gid_t gid = src_sb->st_gid;-
786-
787 /* Naively changing the ownership of an already-existing file before-
788 changing its permissions would create a window of vulnerability if-
789 the file's old permissions are too generous for the new owner and-
790 group. Avoid the window by first changing to a restrictive-
791 temporary mode if necessary. */-
792-
793 if (!new_dst && (x->preserve_mode || x->move_mode || x->set_mode))
!new_dstDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 33933 times by 2 tests
Evaluated by:
  • cp
  • mv
x->preserve_modeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
x->move_modeDescription
TRUEnever evaluated
FALSEnever evaluated
x->set_modeDescription
TRUEnever evaluated
FALSEnever evaluated
0-33933
794 {-
795 mode_t old_mode = dst_sb->st_mode;-
796 mode_t new_mode =-
797 (x->preserve_mode || x->move_mode ? src_sb->st_mode : x->mode);
x->preserve_modeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
x->move_modeDescription
TRUEnever evaluated
FALSEnever evaluated
0-1
798 mode_t restrictive_temp_mode = old_mode & new_mode & S_IRWXU;-
799-
800 if ((USE_ACL-
801 || (old_mode & CHMOD_MODE_BITS
(old_mode & ( ...000 | 01000 ))Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1
802 & (~new_mode | S_ISUID | S_ISGID | S_ISVTX)))
(old_mode & ( ...000 | 01000 ))Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1
803 && qset_acl (dst_name, dest_desc, restrictive_temp_mode) != 0)
qset_acl (dst_...emp_mode) != 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
804 {-
805 if (! owner_failure_ok (x))
! owner_failure_ok (x)Description
TRUEnever evaluated
FALSEnever evaluated
0
806 error (0, errno, _("clearing permissions for %s"),
never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "clearing permissions for %s" , 5) , quotearg_style (shell_escape_always_quoting_style, dst_name));
0
807 quoteaf (dst_name));
never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "clearing permissions for %s" , 5) , quotearg_style (shell_escape_always_quoting_style, dst_name));
0
808 return -x->require_preserve;
never executed: return -x->require_preserve;
0
809 }-
810 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
811-
812 if (HAVE_FCHOWN && dest_desc != -1)
dest_desc != -1Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 33933 times by 2 tests
Evaluated by:
  • cp
  • mv
1-33933
813 {-
814 if (fchown (dest_desc, uid, gid) == 0)
fchown (dest_d...uid, gid) == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1
815 return 1;
executed 1 time by 1 test: return 1;
Executed by:
  • cp
1
816 if (errno == EPERM || errno == EINVAL)
(*__errno_location ()) == 1Description
TRUEnever evaluated
FALSEnever evaluated
(*__errno_location ()) == 22Description
TRUEnever evaluated
FALSEnever evaluated
0
817 {-
818 /* We've failed to set *both*. Now, try to set just the group-
819 ID, but ignore any failure here, and don't change errno. */-
820 int saved_errno = errno;-
821 ignore_value (fchown (dest_desc, -1, gid));-
822 errno = saved_errno;-
823 }
never executed: end of block
0
824 }
never executed: end of block
0
825 else-
826 {-
827 if (lchown (dst_name, uid, gid) == 0)
lchown (dst_na...uid, gid) == 0Description
TRUEevaluated 33933 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEnever evaluated
0-33933
828 return 1;
executed 33933 times by 2 tests: return 1;
Executed by:
  • cp
  • mv
33933
829 if (errno == EPERM || errno == EINVAL)
(*__errno_location ()) == 1Description
TRUEnever evaluated
FALSEnever evaluated
(*__errno_location ()) == 22Description
TRUEnever evaluated
FALSEnever evaluated
0
830 {-
831 /* We've failed to set *both*. Now, try to set just the group-
832 ID, but ignore any failure here, and don't change errno. */-
833 int saved_errno = errno;-
834 ignore_value (lchown (dst_name, -1, gid));-
835 errno = saved_errno;-
836 }
never executed: end of block
0
837 }
never executed: end of block
0
838-
839 if (! chown_failure_ok (x))
! chown_failure_ok (x)Description
TRUEnever evaluated
FALSEnever evaluated
0
840 {-
841 error (0, errno, _("failed to preserve ownership for %s"),-
842 quoteaf (dst_name));-
843 if (x->require_preserve)
x->require_preserveDescription
TRUEnever evaluated
FALSEnever evaluated
0
844 return -1;
never executed: return -1;
0
845 }
never executed: end of block
0
846-
847 return 0;
never executed: return 0;
0
848}-
849-
850/* Set the st_author field of DEST_DESC to the st_author field of-
851 SRC_SB. If DEST_DESC is undefined (-1), set the st_author field-
852 of DST_NAME instead. DEST_DESC must refer to the same file as-
853 DEST_NAME if defined. */-
854-
855static void-
856set_author (const char *dst_name, int dest_desc, const struct stat *src_sb)-
857{-
858#if HAVE_STRUCT_STAT_ST_AUTHOR-
859 /* FIXME: Modify the following code so that it does not-
860 follow symbolic links. */-
861-
862 /* Preserve the st_author field. */-
863 file_t file = (dest_desc < 0-
864 ? file_name_lookup (dst_name, 0, 0)-
865 : getdport (dest_desc));-
866 if (file == MACH_PORT_NULL)-
867 error (0, errno, _("failed to lookup file %s"), quoteaf (dst_name));-
868 else-
869 {-
870 error_t err = file_chauthor (file, src_sb->st_author);-
871 if (err)-
872 error (0, err, _("failed to preserve authorship for %s"),-
873 quoteaf (dst_name));-
874 mach_port_deallocate (mach_task_self (), file);-
875 }-
876#else-
877 (void) dst_name;-
878 (void) dest_desc;-
879 (void) src_sb;-
880#endif-
881}
executed 38433 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
38433
882-
883/* Set the default security context for the process. New files will-
884 have this security context set. Also existing files can have their-
885 context adjusted based on this process context, by-
886 set_file_security_ctx() called with PROCESS_LOCAL=true.-
887 This should be called before files are created so there is no race-
888 where a file may be present without an appropriate security context.-
889 Based on CP_OPTIONS, diagnose warnings and fail when appropriate.-
890 Return FALSE on failure, TRUE on success. */-
891-
892bool-
893set_process_security_ctx (char const *src_name, char const *dst_name,-
894 mode_t mode, bool new_dst, const struct cp_options *x)-
895{-
896 if (x->preserve_security_context)
x->preserve_security_contextDescription
TRUEnever evaluated
FALSEevaluated 68505 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-68505
897 {-
898 /* Set the default context for the process to match the source. */-
899 bool all_errors = !x->data_copy_required || x->require_preserve_context;
!x->data_copy_requiredDescription
TRUEnever evaluated
FALSEnever evaluated
x->require_preserve_contextDescription
TRUEnever evaluated
FALSEnever evaluated
0
900 bool some_errors = !all_errors && !x->reduce_diagnostics;
!all_errorsDescription
TRUEnever evaluated
FALSEnever evaluated
!x->reduce_diagnosticsDescription
TRUEnever evaluated
FALSEnever evaluated
0
901 char *con;-
902-
903 if (0 <= lgetfilecon (src_name, &con))
0 <= rpl_lgetf...rc_name, &con)Description
TRUEnever evaluated
FALSEnever evaluated
0
904 {-
905 if (setfscreatecon (con) < 0)
setfscreatecon (con) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
906 {-
907 if (all_errors || (some_errors && !errno_unsupported (errno)))
all_errorsDescription
TRUEnever evaluated
FALSEnever evaluated
some_errorsDescription
TRUEnever evaluated
FALSEnever evaluated
!errno_unsuppo...location ()) )Description
TRUEnever evaluated
FALSEnever evaluated
0
908 error (0, errno,
never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to set default file creation context to %s" , 5) , quote (con));
0
909 _("failed to set default file creation context to %s"),
never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to set default file creation context to %s" , 5) , quote (con));
0
910 quote (con));
never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to set default file creation context to %s" , 5) , quote (con));
0
911 if (x->require_preserve_context)
x->require_preserve_contextDescription
TRUEnever evaluated
FALSEnever evaluated
0
912 {-
913 freecon (con);-
914 return false;
never executed: return 0 ;
0
915 }-
916 }
never executed: end of block
0
917 freecon (con);-
918 }
never executed: end of block
0
919 else-
920 {-
921 if (all_errors || (some_errors && !errno_unsupported (errno)))
all_errorsDescription
TRUEnever evaluated
FALSEnever evaluated
some_errorsDescription
TRUEnever evaluated
FALSEnever evaluated
!errno_unsuppo...location ()) )Description
TRUEnever evaluated
FALSEnever evaluated
0
922 {-
923 error (0, errno,-
924 _("failed to get security context of %s"),-
925 quoteaf (src_name));-
926 }
never executed: end of block
0
927 if (x->require_preserve_context)
x->require_preserve_contextDescription
TRUEnever evaluated
FALSEnever evaluated
0
928 return false;
never executed: return 0 ;
0
929 }
never executed: end of block
0
930 }-
931 else if (x->set_security_context)
x->set_security_contextDescription
TRUEnever evaluated
FALSEevaluated 68505 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-68505
932 {-
933 /* With -Z, adjust the default context for the process-
934 to have the type component adjusted as per the destination path. */-
935 if (new_dst && defaultcon (dst_name, mode) < 0
new_dstDescription
TRUEnever evaluated
FALSEnever evaluated
defaultcon (ds...ame, mode) < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
936 && ! ignorable_ctx_err (errno))
! ignorable_ct...location ()) )Description
TRUEnever evaluated
FALSEnever evaluated
0
937 {-
938 error (0, errno,-
939 _("failed to set default file creation context for %s"),-
940 quoteaf (dst_name));-
941 }
never executed: end of block
0
942 }
never executed: end of block
0
943-
944 return true;
executed 68505 times by 3 tests: return 1 ;
Executed by:
  • cp
  • ginstall
  • mv
68505
945}-
946-
947/* Reset the security context of DST_NAME, to that already set-
948 as the process default if PROCESS_LOCAL is true. Otherwise-
949 adjust the type component of DST_NAME's security context as-
950 per the system default for that path. Issue warnings upon-
951 failure, when allowed by various settings in CP_OPTIONS.-
952 Return FALSE on failure, TRUE on success. */-
953-
954bool-
955set_file_security_ctx (char const *dst_name, bool process_local,-
956 bool recurse, const struct cp_options *x)-
957{-
958 bool all_errors = (!x->data_copy_required
!x->data_copy_requiredDescription
TRUEnever evaluated
FALSEnever evaluated
0
959 || x->require_preserve_context);
x->require_preserve_contextDescription
TRUEnever evaluated
FALSEnever evaluated
0
960 bool some_errors = !all_errors && !x->reduce_diagnostics;
!all_errorsDescription
TRUEnever evaluated
FALSEnever evaluated
!x->reduce_diagnosticsDescription
TRUEnever evaluated
FALSEnever evaluated
0
961-
962 if (! restorecon (dst_name, recurse, process_local))
! restorecon (...process_local)Description
TRUEnever evaluated
FALSEnever evaluated
0
963 {-
964 if (all_errors || (some_errors && !errno_unsupported (errno)))
all_errorsDescription
TRUEnever evaluated
FALSEnever evaluated
some_errorsDescription
TRUEnever evaluated
FALSEnever evaluated
!errno_unsuppo...location ()) )Description
TRUEnever evaluated
FALSEnever evaluated
0
965 error (0, errno, _("failed to set the security context of %s"),
never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to set the security context of %s" , 5) , quotearg_n_style (0, shell_escape_always_quoting_style, dst_name));
0
966 quoteaf_n (0, dst_name));
never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "failed to set the security context of %s" , 5) , quotearg_n_style (0, shell_escape_always_quoting_style, dst_name));
0
967 return false;
never executed: return 0 ;
0
968 }-
969-
970 return true;
never executed: return 1 ;
0
971}-
972-
973/* Change the file mode bits of the file identified by DESC or NAME to MODE.-
974 Use DESC if DESC is valid and fchmod is available, NAME otherwise. */-
975-
976static int-
977fchmod_or_lchmod (int desc, char const *name, mode_t mode)-
978{-
979#if HAVE_FCHMOD-
980 if (0 <= desc)
0 <= descDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1
981 return fchmod (desc, mode);
executed 1 time by 1 test: return fchmod (desc, mode);
Executed by:
  • cp
1
982#endif-
983 return lchmod (name, mode);
never executed: return chmod (name, mode);
0
984}-
985-
986#ifndef HAVE_STRUCT_STAT_ST_BLOCKS-
987# define HAVE_STRUCT_STAT_ST_BLOCKS 0-
988#endif-
989-
990/* Use a heuristic to determine whether stat buffer SB comes from a file-
991 with sparse blocks. If the file has fewer blocks than would normally-
992 be needed for a file of its size, then at least one of the blocks in-
993 the file is a hole. In that case, return true. */-
994static bool-
995is_probably_sparse (struct stat const *sb)-
996{-
997 return (HAVE_STRUCT_STAT_ST_BLOCKS
executed 4455 times by 3 tests: return (1 && (((( sb->st_mode )) & 0170000) == (0100000)) && ((*sb).st_blocks) < sb->st_size / 512 );
Executed by:
  • cp
  • ginstall
  • mv
4455
998 && S_ISREG (sb->st_mode)
executed 4455 times by 3 tests: return (1 && (((( sb->st_mode )) & 0170000) == (0100000)) && ((*sb).st_blocks) < sb->st_size / 512 );
Executed by:
  • cp
  • ginstall
  • mv
4455
999 && ST_NBLOCKS (*sb) < sb->st_size / ST_NBLOCKSIZE);
executed 4455 times by 3 tests: return (1 && (((( sb->st_mode )) & 0170000) == (0100000)) && ((*sb).st_blocks) < sb->st_size / 512 );
Executed by:
  • cp
  • ginstall
  • mv
4455
1000}-
1001-
1002-
1003/* Copy a regular file from SRC_NAME to DST_NAME.-
1004 If the source file contains holes, copies holes and blocks of zeros-
1005 in the source file as holes in the destination file.-
1006 (Holes are read as zeroes by the 'read' system call.)-
1007 When creating the destination, use DST_MODE & ~OMITTED_PERMISSIONS-
1008 as the third argument in the call to open, adding-
1009 OMITTED_PERMISSIONS after copying as needed.-
1010 X provides many option settings.-
1011 Return true if successful.-
1012 *NEW_DST is as in copy_internal.-
1013 SRC_SB is the result of calling XSTAT (aka stat) on SRC_NAME. */-
1014-
1015static bool-
1016copy_reg (char const *src_name, char const *dst_name,-
1017 const struct cp_options *x,-
1018 mode_t dst_mode, mode_t omitted_permissions, bool *new_dst,-
1019 struct stat const *src_sb)-
1020{-
1021 char *buf;-
1022 char *buf_alloc = NULL;-
1023 char *name_alloc = NULL;-
1024 int dest_desc;-
1025 int dest_errno;-
1026 int source_desc;-
1027 mode_t src_mode = src_sb->st_mode;-
1028 struct stat sb;-
1029 struct stat src_open_sb;-
1030 bool return_val = true;-
1031 bool data_copy_required = x->data_copy_required;-
1032-
1033 source_desc = open (src_name,-
1034 (O_RDONLY | O_BINARY-
1035 | (x->dereference == DEREF_NEVER ? O_NOFOLLOW : 0)));-
1036 if (source_desc < 0)
source_desc < 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 4461 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
1-4461
1037 {-
1038 error (0, errno, _("cannot open %s for reading"), quoteaf (src_name));-
1039 return false;
executed 1 time by 1 test: return 0 ;
Executed by:
  • cp
1
1040 }-
1041-
1042 if (fstat (source_desc, &src_open_sb) != 0)
fstat (source_..._open_sb) != 0Description
TRUEnever evaluated
FALSEevaluated 4461 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4461
1043 {-
1044 error (0, errno, _("cannot fstat %s"), quoteaf (src_name));-
1045 return_val = false;-
1046 goto close_src_desc;
never executed: goto close_src_desc;
0
1047 }-
1048-
1049 /* Compare the source dev/ino from the open file to the incoming,-
1050 saved ones obtained via a previous call to stat. */-
1051 if (! SAME_INODE (*src_sb, src_open_sb))
(*src_sb).st_i...pen_sb).st_inoDescription
TRUEevaluated 4461 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEnever evaluated
(*src_sb).st_d...pen_sb).st_devDescription
TRUEevaluated 4461 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEnever evaluated
0-4461
1052 {-
1053 error (0, 0,-
1054 _("skipping file %s, as it was replaced while being copied"),-
1055 quoteaf (src_name));-
1056 return_val = false;-
1057 goto close_src_desc;
never executed: goto close_src_desc;
0
1058 }-
1059-
1060 /* The semantics of the following open calls are mandated-
1061 by the specs for both cp and mv. */-
1062 if (! *new_dst)
! *new_dstDescription
TRUEevaluated 98 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 4363 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
98-4363
1063 {-
1064 int open_flags =-
1065 O_WRONLY | O_BINARY | (x->data_copy_required ? O_TRUNC : 0);-
1066 dest_desc = open (dst_name, open_flags);-
1067 dest_errno = errno;-
1068-
1069 /* When using cp --preserve=context to copy to an existing destination,-
1070 reset the context as per the default context, which has already been-
1071 set according to the src.-
1072 When using the mutually exclusive -Z option, then adjust the type of-
1073 the existing context according to the system default for the dest.-
1074 Note we set the context here, _after_ the file is opened, lest the-
1075 new context disallow that. */-
1076 if ((x->set_security_context || x->preserve_security_context)
x->set_security_contextDescription
TRUEnever evaluated
FALSEevaluated 98 times by 1 test
Evaluated by:
  • cp
x->preserve_security_contextDescription
TRUEnever evaluated
FALSEevaluated 98 times by 1 test
Evaluated by:
  • cp
0-98
1077 && 0 <= dest_desc)
0 <= dest_descDescription
TRUEnever evaluated
FALSEnever evaluated
0
1078 {-
1079 if (! set_file_security_ctx (dst_name, x->preserve_security_context,
! set_file_sec...ontext, 0 , x)Description
TRUEnever evaluated
FALSEnever evaluated
0
1080 false, x))
! set_file_sec...ontext, 0 , x)Description
TRUEnever evaluated
FALSEnever evaluated
0
1081 {-
1082 if (x->require_preserve_context)
x->require_preserve_contextDescription
TRUEnever evaluated
FALSEnever evaluated
0
1083 {-
1084 return_val = false;-
1085 goto close_src_and_dst_desc;
never executed: goto close_src_and_dst_desc;
0
1086 }-
1087 }
never executed: end of block
0
1088 }
never executed: end of block
0
1089-
1090 if (dest_desc < 0 && x->unlink_dest_after_failed_open)
dest_desc < 0Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 91 times by 1 test
Evaluated by:
  • cp
x->unlink_dest...er_failed_openDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-91
1091 {-
1092 if (unlink (dst_name) != 0)
unlink (dst_name) != 0Description
TRUEnever evaluated
FALSEevaluated 7 times by 1 test
Evaluated by:
  • cp
0-7
1093 {-
1094 error (0, errno, _("cannot remove %s"), quoteaf (dst_name));-
1095 return_val = false;-
1096 goto close_src_desc;
never executed: goto close_src_desc;
0
1097 }-
1098 if (x->verbose)
x->verboseDescription
TRUEnever evaluated
FALSEevaluated 7 times by 1 test
Evaluated by:
  • cp
0-7
1099 printf (_("removed %s\n"), quoteaf (dst_name));
never executed: printf ( dcgettext (((void *)0), "removed %s\n" , 5) , quotearg_style (shell_escape_always_quoting_style, dst_name));
0
1100-
1101 /* Tell caller that the destination file was unlinked. */-
1102 *new_dst = true;-
1103-
1104 /* Ensure there is no race where a file may be left without-
1105 an appropriate security context. */-
1106 if (x->set_security_context)
x->set_security_contextDescription
TRUEnever evaluated
FALSEevaluated 7 times by 1 test
Evaluated by:
  • cp
0-7
1107 {-
1108 if (! set_process_security_ctx (src_name, dst_name, dst_mode,
! set_process_..., *new_dst, x)Description
TRUEnever evaluated
FALSEnever evaluated
0
1109 *new_dst, x))
! set_process_..., *new_dst, x)Description
TRUEnever evaluated
FALSEnever evaluated
0
1110 {-
1111 return_val = false;-
1112 goto close_src_desc;
never executed: goto close_src_desc;
0
1113 }-
1114 }
never executed: end of block
0
1115 }
executed 7 times by 1 test: end of block
Executed by:
  • cp
7
1116 }
executed 98 times by 1 test: end of block
Executed by:
  • cp
98
1117-
1118 if (*new_dst)
*new_dstDescription
TRUEevaluated 4370 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 91 times by 1 test
Evaluated by:
  • cp
91-4370
1119 {-
1120 open_with_O_CREAT:;-
1121-
1122 int open_flags = O_WRONLY | O_CREAT | O_BINARY;-
1123 dest_desc = open (dst_name, open_flags | O_EXCL,-
1124 dst_mode & ~omitted_permissions);-
1125 dest_errno = errno;-
1126-
1127 /* When trying to copy through a dangling destination symlink,-
1128 the above open fails with EEXIST. If that happens, and-
1129 lstat'ing the DST_NAME shows that it is a symlink, then we-
1130 have a problem: trying to resolve this dangling symlink to-
1131 a directory/destination-entry pair is fundamentally racy,-
1132 so punt. If x->open_dangling_dest_symlink is set (cp sets-
1133 that when POSIXLY_CORRECT is set in the environment), simply-
1134 call open again, but without O_EXCL (potentially dangerous).-
1135 If not, fail with a diagnostic. These shenanigans are necessary-
1136 only when copying, i.e., not in move_mode. */-
1137 if (dest_desc < 0 && dest_errno == EEXIST && ! x->move_mode)
dest_desc < 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 4367 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
dest_errno == 17Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
! x->move_modeDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-4367
1138 {-
1139 struct stat dangling_link_sb;-
1140 if (lstat (dst_name, &dangling_link_sb) == 0
lstat (dst_nam..._link_sb) == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-2
1141 && S_ISLNK (dangling_link_sb.st_mode))
(((( dangling_... == (0120000))Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-2
1142 {-
1143 if (x->open_dangling_dest_symlink)
x->open_dangling_dest_symlinkDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
1
1144 {-
1145 dest_desc = open (dst_name, open_flags,-
1146 dst_mode & ~omitted_permissions);-
1147 dest_errno = errno;-
1148 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
1149 else-
1150 {-
1151 error (0, 0, _("not writing through dangling symlink %s"),-
1152 quoteaf (dst_name));-
1153 return_val = false;-
1154 goto close_src_desc;
executed 1 time by 1 test: goto close_src_desc;
Executed by:
  • cp
1
1155 }-
1156 }-
1157 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
1158-
1159 /* Improve quality of diagnostic when a nonexistent dst_name-
1160 ends in a slash and open fails with errno == EISDIR. */-
1161 if (dest_desc < 0 && dest_errno == EISDIR
dest_desc < 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 4368 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
dest_errno == 21Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-4368
1162 && *dst_name && dst_name[strlen (dst_name) - 1] == '/')
*dst_nameDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
dst_name[strle...e) - 1] == '/'Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1
1163 dest_errno = ENOTDIR;
executed 1 time by 1 test: dest_errno = 20 ;
Executed by:
  • cp
1
1164 }
executed 4369 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
4369
1165 else-
1166 {-
1167 omitted_permissions = 0;-
1168 }
executed 91 times by 1 test: end of block
Executed by:
  • cp
91
1169-
1170 if (dest_desc < 0)
dest_desc < 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 4459 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
1-4459
1171 {-
1172 /* If we've just failed due to ENOENT for an ostensibly preexisting-
1173 destination (*new_dst was 0), that's a bit of a contradiction/race:-
1174 the prior stat/lstat said the file existed (*new_dst was 0), yet-
1175 the subsequent open-existing-file failed with ENOENT. With NFS,-
1176 the race window is wider still, since its meta-data caching tends-
1177 to make the stat succeed for a just-removed remote file, while the-
1178 more-definitive initial open call will fail with ENOENT. When this-
1179 situation arises, we attempt to open again, but this time with-
1180 O_CREAT. Do this only when not in move-mode, since when handling-
1181 a cross-device move, we must never open an existing destination. */-
1182 if (dest_errno == ENOENT && ! *new_dst && ! x->move_mode)
dest_errno == 2Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
! *new_dstDescription
TRUEnever evaluated
FALSEnever evaluated
! x->move_modeDescription
TRUEnever evaluated
FALSEnever evaluated
0-1
1183 {-
1184 *new_dst = 1;-
1185 goto open_with_O_CREAT;
never executed: goto open_with_O_CREAT;
0
1186 }-
1187-
1188 /* Otherwise, it's an error. */-
1189 error (0, dest_errno, _("cannot create regular file %s"),-
1190 quoteaf (dst_name));-
1191 return_val = false;-
1192 goto close_src_desc;
executed 1 time by 1 test: goto close_src_desc;
Executed by:
  • cp
1
1193 }-
1194-
1195 if (fstat (dest_desc, &sb) != 0)
fstat (dest_desc, &sb) != 0Description
TRUEnever evaluated
FALSEevaluated 4459 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4459
1196 {-
1197 error (0, errno, _("cannot fstat %s"), quoteaf (dst_name));-
1198 return_val = false;-
1199 goto close_src_and_dst_desc;
never executed: goto close_src_and_dst_desc;
0
1200 }-
1201-
1202 /* --attributes-only overrides --reflink. */-
1203 if (data_copy_required && x->reflink_mode)
data_copy_requiredDescription
TRUEevaluated 4456 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 3 times by 1 test
Evaluated by:
  • cp
x->reflink_modeDescription
TRUEevaluated 3923 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 533 times by 2 tests
Evaluated by:
  • cp
  • ginstall
3-4456
1204 {-
1205 bool clone_ok = clone_file (dest_desc, source_desc) == 0;-
1206 if (clone_ok || x->reflink_mode == REFLINK_ALWAYS)
clone_okDescription
TRUEnever evaluated
FALSEevaluated 3923 times by 2 tests
Evaluated by:
  • cp
  • mv
x->reflink_mod...REFLINK_ALWAYSDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 3922 times by 2 tests
Evaluated by:
  • cp
  • mv
0-3923
1207 {-
1208 if (!clone_ok)
!clone_okDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1
1209 {-
1210 error (0, errno, _("failed to clone %s from %s"),-
1211 quoteaf_n (0, dst_name), quoteaf_n (1, src_name));-
1212 return_val = false;-
1213 goto close_src_and_dst_desc;
executed 1 time by 1 test: goto close_src_and_dst_desc;
Executed by:
  • cp
1
1214 }-
1215 data_copy_required = false;-
1216 }
never executed: end of block
0
1217 }
executed 3922 times by 2 tests: end of block
Executed by:
  • cp
  • mv
3922
1218-
1219 if (data_copy_required)
data_copy_requiredDescription
TRUEevaluated 4455 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 3 times by 1 test
Evaluated by:
  • cp
3-4455
1220 {-
1221 /* Choose a suitable buffer size; it may be adjusted later. */-
1222 size_t buf_alignment = getpagesize ();-
1223 size_t buf_size = io_blksize (sb);-
1224 size_t hole_size = ST_BLKSIZE (sb);
0 < (sb).st_blksizeDescription
TRUEevaluated 4455 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEnever evaluated
(sb).st_blksiz..._t)-1) / 8 + 1Description
TRUEevaluated 4455 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEnever evaluated
0-4455
1225-
1226 fdadvise (source_desc, 0, 0, FADVISE_SEQUENTIAL);-
1227-
1228 /* Deal with sparse files. */-
1229 bool make_holes = false;-
1230 bool sparse_src = is_probably_sparse (&src_open_sb);-
1231-
1232 if (S_ISREG (sb.st_mode))
(((( sb.st_mod... == (0100000))Description
TRUEevaluated 4454 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
1-4454
1233 {-
1234 /* Even with --sparse=always, try to create holes only-
1235 if the destination is a regular file. */-
1236 if (x->sparse_mode == SPARSE_ALWAYS)
x->sparse_mode... SPARSE_ALWAYSDescription
TRUEevaluated 76 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 4378 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
76-4378
1237 make_holes = true;
executed 76 times by 1 test: make_holes = 1 ;
Executed by:
  • cp
76
1238-
1239 /* Use a heuristic to determine whether SRC_NAME contains any sparse-
1240 blocks. If the file has fewer blocks than would normally be-
1241 needed for a file of its size, then at least one of the blocks in-
1242 the file is a hole. */-
1243 if (x->sparse_mode == SPARSE_AUTO && sparse_src)
x->sparse_mode == SPARSE_AUTODescription
TRUEevaluated 4373 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 81 times by 1 test
Evaluated by:
  • cp
sparse_srcDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 4365 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
8-4373
1244 make_holes = true;
executed 8 times by 1 test: make_holes = 1 ;
Executed by:
  • cp
8
1245 }
executed 4454 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
4454
1246-
1247 /* If not making a sparse file, try to use a more-efficient-
1248 buffer size. */-
1249 if (! make_holes)
! make_holesDescription
TRUEevaluated 4371 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 84 times by 1 test
Evaluated by:
  • cp
84-4371
1250 {-
1251 /* Compute the least common multiple of the input and output-
1252 buffer sizes, adjusting for outlandish values. */-
1253 size_t blcm_max = MIN (SIZE_MAX, SSIZE_MAX) - buf_alignment;
(((18446744073...fffffffffffL))Description
TRUEnever evaluated
FALSEevaluated 4371 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4371
1254 size_t blcm = buffer_lcm (io_blksize (src_open_sb), buf_size,-
1255 blcm_max);-
1256-
1257 /* Do not bother with a buffer larger than the input file, plus one-
1258 byte to make sure the file has not grown while reading it. */-
1259 if (S_ISREG (src_open_sb.st_mode) && src_open_sb.st_size < buf_size)
(((( src_open_... == (0100000))Description
TRUEevaluated 4367 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 4 times by 1 test
Evaluated by:
  • cp
src_open_sb.st_size < buf_sizeDescription
TRUEevaluated 4356 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 11 times by 2 tests
Evaluated by:
  • cp
  • ginstall
4-4367
1260 buf_size = src_open_sb.st_size + 1;
executed 4356 times by 3 tests: buf_size = src_open_sb.st_size + 1;
Executed by:
  • cp
  • ginstall
  • mv
4356
1261-
1262 /* However, stick with a block size that is a positive multiple of-
1263 blcm, overriding the above adjustments. Watch out for-
1264 overflow. */-
1265 buf_size += blcm - 1;-
1266 buf_size -= buf_size % blcm;-
1267 if (buf_size == 0 || blcm_max < buf_size)
buf_size == 0Description
TRUEnever evaluated
FALSEevaluated 4371 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
blcm_max < buf_sizeDescription
TRUEnever evaluated
FALSEevaluated 4371 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4371
1268 buf_size = blcm;
never executed: buf_size = blcm;
0
1269 }
executed 4371 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
4371
1270-
1271 buf_alloc = xmalloc (buf_size + buf_alignment);-
1272 buf = ptr_align (buf_alloc, buf_alignment);-
1273-
1274 if (sparse_src)
sparse_srcDescription
TRUEevaluated 65 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 4390 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
65-4390
1275 {-
1276 bool normal_copy_required;-
1277-
1278 /* Perform an efficient extent-based copy, falling back to the-
1279 standard copy only if the initial extent scan fails. If the-
1280 '--sparse=never' option is specified, write all data but use-
1281 any extents to read more efficiently. */-
1282 if (extent_copy (source_desc, dest_desc, buf, buf_size, hole_size,
extent_copy (s...copy_required)Description
TRUEevaluated 60 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
5-60
1283 src_open_sb.st_size,
extent_copy (s...copy_required)Description
TRUEevaluated 60 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
5-60
1284 make_holes ? x->sparse_mode : SPARSE_NEVER,
extent_copy (s...copy_required)Description
TRUEevaluated 60 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
5-60
1285 src_name, dst_name, &normal_copy_required))
extent_copy (s...copy_required)Description
TRUEevaluated 60 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
5-60
1286 goto preserve_metadata;
executed 60 times by 1 test: goto preserve_metadata;
Executed by:
  • cp
60
1287-
1288 if (! normal_copy_required)
! normal_copy_requiredDescription
TRUEnever evaluated
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
0-5
1289 {-
1290 return_val = false;-
1291 goto close_src_and_dst_desc;
never executed: goto close_src_and_dst_desc;
0
1292 }-
1293 }
executed 5 times by 1 test: end of block
Executed by:
  • cp
5
1294-
1295 off_t n_read;-
1296 bool wrote_hole_at_eof;-
1297 if (! sparse_copy (source_desc, dest_desc, buf, buf_size,
! sparse_copy ...e_hole_at_eof)Description
TRUEnever evaluated
FALSEevaluated 4395 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4395
1298 make_holes ? hole_size : 0,
! sparse_copy ...e_hole_at_eof)Description
TRUEnever evaluated
FALSEevaluated 4395 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4395
1299 x->sparse_mode == SPARSE_ALWAYS, src_name, dst_name,
! sparse_copy ...e_hole_at_eof)Description
TRUEnever evaluated
FALSEevaluated 4395 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4395
1300 UINTMAX_MAX, &n_read,
! sparse_copy ...e_hole_at_eof)Description
TRUEnever evaluated
FALSEevaluated 4395 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4395
1301 &wrote_hole_at_eof))
! sparse_copy ...e_hole_at_eof)Description
TRUEnever evaluated
FALSEevaluated 4395 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4395
1302 {-
1303 return_val = false;-
1304 goto close_src_and_dst_desc;
never executed: goto close_src_and_dst_desc;
0
1305 }-
1306 else if (wrote_hole_at_eof && ftruncate (dest_desc, n_read) < 0)
wrote_hole_at_eofDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 4387 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
ftruncate (des...c, n_read) < 0Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • cp
0-4387
1307 {-
1308 error (0, errno, _("failed to extend %s"), quoteaf (dst_name));-
1309 return_val = false;-
1310 goto close_src_and_dst_desc;
never executed: goto close_src_and_dst_desc;
0
1311 }-
1312 }
executed 4395 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
4395
1313-
1314preserve_metadata:
code before this statement executed 4398 times by 3 tests: preserve_metadata:
Executed by:
  • cp
  • ginstall
  • mv
4398
1315 if (x->preserve_timestamps)
x->preserve_timestampsDescription
TRUEevaluated 3929 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 529 times by 2 tests
Evaluated by:
  • cp
  • ginstall
529-3929
1316 {-
1317 struct timespec timespec[2];-
1318 timespec[0] = get_stat_atime (src_sb);-
1319 timespec[1] = get_stat_mtime (src_sb);-
1320-
1321 if (fdutimens (dest_desc, dst_name, timespec) != 0)
fdutimens (des...timespec) != 0Description
TRUEnever evaluated
FALSEevaluated 3929 times by 2 tests
Evaluated by:
  • cp
  • mv
0-3929
1322 {-
1323 error (0, errno, _("preserving times for %s"), quoteaf (dst_name));-
1324 if (x->require_preserve)
x->require_preserveDescription
TRUEnever evaluated
FALSEnever evaluated
0
1325 {-
1326 return_val = false;-
1327 goto close_src_and_dst_desc;
never executed: goto close_src_and_dst_desc;
0
1328 }-
1329 }
never executed: end of block
0
1330 }
executed 3929 times by 2 tests: end of block
Executed by:
  • cp
  • mv
3929
1331-
1332 /* Set ownership before xattrs as changing owners will-
1333 clear capabilities. */-
1334 if (x->preserve_ownership && ! SAME_OWNER_AND_GROUP (*src_sb, sb))
x->preserve_ownershipDescription
TRUEevaluated 3930 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 528 times by 2 tests
Evaluated by:
  • cp
  • ginstall
((*src_sb).st_...= (sb).st_uid)Description
TRUEevaluated 3930 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEnever evaluated
((*src_sb).st_...= (sb).st_gid)Description
TRUEevaluated 3929 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-3930
1335 {-
1336 switch (set_owner (x, dst_name, dest_desc, src_sb, *new_dst, &sb))-
1337 {-
1338 case -1:
never executed: case -1:
0
1339 return_val = false;-
1340 goto close_src_and_dst_desc;
never executed: goto close_src_and_dst_desc;
0
1341-
1342 case 0:
never executed: case 0:
0
1343 src_mode &= ~ (S_ISUID | S_ISGID | S_ISVTX);-
1344 break;
never executed: break;
0
1345 }-
1346 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
1347-
1348 /* To allow copying xattrs on read-only files, temporarily chmod u+rw.-
1349 This workaround is required as an inode permission check is done-
1350 by xattr_permission() in fs/xattr.c of the GNU/Linux kernel tree. */-
1351 if (x->preserve_xattr)
x->preserve_xattrDescription
TRUEevaluated 3922 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 536 times by 2 tests
Evaluated by:
  • cp
  • ginstall
536-3922
1352 {-
1353 bool access_changed = false;-
1354-
1355 if (!(sb.st_mode & S_IWUSR) && geteuid () != ROOT_UID)
!(sb.st_mode & 0200 )Description
TRUEnever evaluated
FALSEevaluated 3922 times by 2 tests
Evaluated by:
  • cp
  • mv
geteuid () != 0Description
TRUEnever evaluated
FALSEnever evaluated
0-3922
1356 {-
1357 access_changed = fchmod_or_lchmod (dest_desc, dst_name,-
1358 S_IRUSR | S_IWUSR) == 0;-
1359 }
never executed: end of block
0
1360-
1361 if (!copy_attr (src_name, source_desc, dst_name, dest_desc, x)
!copy_attr (sr... dest_desc, x)Description
TRUEnever evaluated
FALSEevaluated 3922 times by 2 tests
Evaluated by:
  • cp
  • mv
0-3922
1362 && x->require_preserve_xattr)
x->require_preserve_xattrDescription
TRUEnever evaluated
FALSEnever evaluated
0
1363 return_val = false;
never executed: return_val = 0 ;
0
1364-
1365 if (access_changed)
access_changedDescription
TRUEnever evaluated
FALSEevaluated 3922 times by 2 tests
Evaluated by:
  • cp
  • mv
0-3922
1366 fchmod_or_lchmod (dest_desc, dst_name, dst_mode & ~omitted_permissions);
never executed: fchmod_or_lchmod (dest_desc, dst_name, dst_mode & ~omitted_permissions);
0
1367 }
executed 3922 times by 2 tests: end of block
Executed by:
  • cp
  • mv
3922
1368-
1369 set_author (dst_name, dest_desc, src_sb);-
1370-
1371 if (x->preserve_mode || x->move_mode)
x->preserve_modeDescription
TRUEevaluated 3930 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 528 times by 2 tests
Evaluated by:
  • cp
  • ginstall
x->move_modeDescription
TRUEnever evaluated
FALSEevaluated 528 times by 2 tests
Evaluated by:
  • cp
  • ginstall
0-3930
1372 {-
1373 if (copy_acl (src_name, source_desc, dst_name, dest_desc, src_mode) != 0
copy_acl (src_...src_mode) != 0Description
TRUEnever evaluated
FALSEevaluated 3930 times by 2 tests
Evaluated by:
  • cp
  • mv
0-3930
1374 && x->require_preserve)
x->require_preserveDescription
TRUEnever evaluated
FALSEnever evaluated
0
1375 return_val = false;
never executed: return_val = 0 ;
0
1376 }
executed 3930 times by 2 tests: end of block
Executed by:
  • cp
  • mv
3930
1377 else if (x->set_mode)
x->set_modeDescription
TRUEevaluated 22 times by 1 test
Evaluated by:
  • ginstall
FALSEevaluated 506 times by 1 test
Evaluated by:
  • cp
22-506
1378 {-
1379 if (set_acl (dst_name, dest_desc, x->mode) != 0)
set_acl (dst_n... x->mode) != 0Description
TRUEnever evaluated
FALSEevaluated 22 times by 1 test
Evaluated by:
  • ginstall
0-22
1380 return_val = false;
never executed: return_val = 0 ;
0
1381 }
executed 22 times by 1 test: end of block
Executed by:
  • ginstall
22
1382 else if (x->explicit_no_preserve_mode)
x->explicit_no_preserve_modeDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 503 times by 1 test
Evaluated by:
  • cp
3-503
1383 {-
1384 if (set_acl (dst_name, dest_desc, MODE_RW_UGO & ~cached_umask ()) != 0)
set_acl (dst_n...umask ()) != 0Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • cp
0-3
1385 return_val = false;
never executed: return_val = 0 ;
0
1386 }
executed 3 times by 1 test: end of block
Executed by:
  • cp
3
1387 else if (omitted_permissions)
omitted_permissionsDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 502 times by 1 test
Evaluated by:
  • cp
1-502
1388 {-
1389 omitted_permissions &= ~ cached_umask ();-
1390 if (omitted_permissions
omitted_permissionsDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1
1391 && fchmod_or_lchmod (dest_desc, dst_name, dst_mode) != 0)
fchmod_or_lchm...dst_mode) != 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
1392 {-
1393 error (0, errno, _("preserving permissions for %s"),-
1394 quoteaf (dst_name));-
1395 if (x->require_preserve)
x->require_preserveDescription
TRUEnever evaluated
FALSEnever evaluated
0
1396 return_val = false;
never executed: return_val = 0 ;
0
1397 }
never executed: end of block
0
1398 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
1399-
1400close_src_and_dst_desc:
code before this statement executed 4458 times by 3 tests: close_src_and_dst_desc:
Executed by:
  • cp
  • ginstall
  • mv
4458
1401 if (close (dest_desc) < 0)
close (dest_desc) < 0Description
TRUEnever evaluated
FALSEevaluated 4459 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4459
1402 {-
1403 error (0, errno, _("failed to close %s"), quoteaf (dst_name));-
1404 return_val = false;-
1405 }
never executed: end of block
0
1406close_src_desc:
code before this statement executed 4459 times by 3 tests: close_src_desc:
Executed by:
  • cp
  • ginstall
  • mv
4459
1407 if (close (source_desc) < 0)
close (source_desc) < 0Description
TRUEnever evaluated
FALSEevaluated 4461 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-4461
1408 {-
1409 error (0, errno, _("failed to close %s"), quoteaf (src_name));-
1410 return_val = false;-
1411 }
never executed: end of block
0
1412-
1413 free (buf_alloc);-
1414 free (name_alloc);-
1415 return return_val;
executed 4461 times by 3 tests: return return_val;
Executed by:
  • cp
  • ginstall
  • mv
4461
1416}-
1417-
1418/* Return true if it's ok that the source and destination-
1419 files are the 'same' by some measure. The goal is to avoid-
1420 making the 'copy' operation remove both copies of the file-
1421 in that case, while still allowing the user to e.g., move or-
1422 copy a regular file onto a symlink that points to it.-
1423 Try to minimize the cost of this function in the common case.-
1424 Set *RETURN_NOW if we've determined that the caller has no more-
1425 work to do and should return successfully, right away. */-
1426-
1427static bool-
1428same_file_ok (char const *src_name, struct stat const *src_sb,-
1429 char const *dst_name, struct stat const *dst_sb,-
1430 const struct cp_options *x, bool *return_now)-
1431{-
1432 const struct stat *src_sb_link;-
1433 const struct stat *dst_sb_link;-
1434 struct stat tmp_dst_sb;-
1435 struct stat tmp_src_sb;-
1436-
1437 bool same_link;-
1438 bool same = SAME_INODE (*src_sb, *dst_sb);
(*src_sb).st_i...dst_sb).st_inoDescription
TRUEevaluated 79 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 803 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
(*src_sb).st_d...dst_sb).st_devDescription
TRUEevaluated 79 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEnever evaluated
0-803
1439-
1440 *return_now = false;-
1441-
1442 /* FIXME: this should (at the very least) be moved into the following-
1443 if-block. More likely, it should be removed, because it inhibits-
1444 making backups. But removing it will result in a change in behavior-
1445 that will probably have to be documented -- and tests will have to-
1446 be updated. */-
1447 if (same && x->hard_link)
sameDescription
TRUEevaluated 79 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 803 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
x->hard_linkDescription
TRUEevaluated 23 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 56 times by 2 tests
Evaluated by:
  • cp
  • mv
23-803
1448 {-
1449 *return_now = true;-
1450 return true;
executed 23 times by 1 test: return 1 ;
Executed by:
  • cp
23
1451 }-
1452-
1453 if (x->dereference == DEREF_NEVER)
x->dereference == DEREF_NEVERDescription
TRUEevaluated 651 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 208 times by 2 tests
Evaluated by:
  • cp
  • ginstall
208-651
1454 {-
1455 same_link = same;-
1456-
1457 /* If both the source and destination files are symlinks (and we'll-
1458 know this here IFF preserving symlinks), then it's usually ok-
1459 when they are distinct. */-
1460 if (S_ISLNK (src_sb->st_mode) && S_ISLNK (dst_sb->st_mode))
(((( src_sb->s... == (0120000))Description
TRUEevaluated 32 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 619 times by 2 tests
Evaluated by:
  • cp
  • mv
(((( dst_sb->s... == (0120000))Description
TRUEevaluated 15 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 17 times by 2 tests
Evaluated by:
  • cp
  • mv
15-619
1461 {-
1462 bool sn = same_name (src_name, dst_name);-
1463 if ( ! sn)
! snDescription
TRUEevaluated 14 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 1 time by 1 test
Evaluated by:
  • mv
1-14
1464 {-
1465 /* It's fine when we're making any type of backup. */-
1466 if (x->backup_type != no_backups)
x->backup_type != no_backupsDescription
TRUEevaluated 5 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 9 times by 2 tests
Evaluated by:
  • cp
  • mv
5-9
1467 return true;
executed 5 times by 2 tests: return 1 ;
Executed by:
  • cp
  • mv
5
1468-
1469 /* Here we have two symlinks that are hard-linked together,-
1470 and we're not making backups. In this unusual case, simply-
1471 returning true would lead to mv calling "rename(A,B)",-
1472 which would do nothing and return 0. */-
1473 if (same_link)
same_linkDescription
TRUEevaluated 3 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 6 times by 2 tests
Evaluated by:
  • cp
  • mv
3-6
1474 {-
1475 *return_now = true;-
1476 return ! x->move_mode;
executed 3 times by 2 tests: return ! x->move_mode;
Executed by:
  • cp
  • mv
3
1477 }-
1478 }
executed 6 times by 2 tests: end of block
Executed by:
  • cp
  • mv
6
1479-
1480 return ! sn;
executed 7 times by 2 tests: return ! sn;
Executed by:
  • cp
  • mv
7
1481 }-
1482-
1483 src_sb_link = src_sb;-
1484 dst_sb_link = dst_sb;-
1485 }
executed 636 times by 2 tests: end of block
Executed by:
  • cp
  • mv
636
1486 else-
1487 {-
1488 if (!same)
!sameDescription
TRUEevaluated 178 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 30 times by 1 test
Evaluated by:
  • cp
30-178
1489 return true;
executed 178 times by 2 tests: return 1 ;
Executed by:
  • cp
  • ginstall
178
1490-
1491 if (lstat (dst_name, &tmp_dst_sb) != 0
lstat (dst_nam...p_dst_sb) != 0Description
TRUEnever evaluated
FALSEevaluated 30 times by 1 test
Evaluated by:
  • cp
0-30
1492 || lstat (src_name, &tmp_src_sb) != 0)
lstat (src_nam...p_src_sb) != 0Description
TRUEnever evaluated
FALSEevaluated 30 times by 1 test
Evaluated by:
  • cp
0-30
1493 return true;
never executed: return 1 ;
0
1494-
1495 src_sb_link = &tmp_src_sb;-
1496 dst_sb_link = &tmp_dst_sb;-
1497-
1498 same_link = SAME_INODE (*src_sb_link, *dst_sb_link);
(*src_sb_link)...b_link).st_inoDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 19 times by 1 test
Evaluated by:
  • cp
(*src_sb_link)...b_link).st_devDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-19
1499-
1500 /* If both are symlinks, then it's ok, but only if the destination-
1501 will be unlinked before being opened. This is like the test-
1502 above, but with the addition of the unlink_dest_before_opening-
1503 conjunct because otherwise, with two symlinks to the same target,-
1504 we'd end up truncating the source file. */-
1505 if (S_ISLNK (src_sb_link->st_mode) && S_ISLNK (dst_sb_link->st_mode)
(((( src_sb_li... == (0120000))Description
TRUEevaluated 17 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
(((( dst_sb_li... == (0120000))Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
4-17
1506 && x->unlink_dest_before_opening)
x->unlink_dest_before_openingDescription
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • cp
0-4
1507 return true;
never executed: return 1 ;
0
1508 }
executed 30 times by 1 test: end of block
Executed by:
  • cp
30
1509-
1510 /* The backup code ensures there's a copy, so it's usually ok to-
1511 remove any destination file. One exception is when both-
1512 source and destination are the same directory entry. In that-
1513 case, moving the destination file aside (in making the backup)-
1514 would also rename the source file and result in an error. */-
1515 if (x->backup_type != no_backups)
x->backup_type != no_backupsDescription
TRUEevaluated 56 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 610 times by 2 tests
Evaluated by:
  • cp
  • mv
56-610
1516 {-
1517 if (!same_link)
!same_linkDescription
TRUEevaluated 49 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 7 times by 2 tests
Evaluated by:
  • cp
  • mv
7-49
1518 {-
1519 /* In copy mode when dereferencing symlinks, if the source is a-
1520 symlink and the dest is not, then backing up the destination-
1521 (moving it aside) would make it a dangling symlink, and the-
1522 subsequent attempt to open it in copy_reg would fail with-
1523 a misleading diagnostic. Avoid that by returning zero in-
1524 that case so the caller can make cp (or mv when it has to-
1525 resort to reading the source file) fail now. */-
1526-
1527 /* FIXME-note: even with the following kludge, we can still provoke-
1528 the offending diagnostic. It's just a little harder to do :-)-
1529 $ rm -f a b c; touch c; ln -s c b; ln -s b a; cp -b a b-
1530 cp: cannot open 'a' for reading: No such file or directory-
1531 That's misleading, since a subsequent 'ls' shows that 'a'-
1532 is still there.-
1533 One solution would be to open the source file *before* moving-
1534 aside the destination, but that'd involve a big rewrite. */-
1535 if ( ! x->move_mode
! x->move_modeDescription
TRUEevaluated 18 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 31 times by 1 test
Evaluated by:
  • mv
18-31
1536 && x->dereference != DEREF_NEVER
x->dereference != DEREF_NEVERDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 12 times by 1 test
Evaluated by:
  • cp
6-12
1537 && S_ISLNK (src_sb_link->st_mode)
(((( src_sb_li... == (0120000))Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-6
1538 && ! S_ISLNK (dst_sb_link->st_mode))
! (((( dst_sb_... == (0120000))Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-6
1539 return false;
executed 6 times by 1 test: return 0 ;
Executed by:
  • cp
6
1540-
1541 return true;
executed 43 times by 2 tests: return 1 ;
Executed by:
  • cp
  • mv
43
1542 }-
1543-
1544 /* FIXME: What about case insensitive file systems ? */-
1545 return ! same_name (src_name, dst_name);
executed 7 times by 2 tests: return ! same_name (src_name, dst_name);
Executed by:
  • cp
  • mv
7
1546 }-
1547-
1548#if 0-
1549 /* FIXME: use or remove */-
1550-
1551 /* If we're making a backup, we'll detect the problem case in-
1552 copy_reg because SRC_NAME will no longer exist. Allowing-
1553 the test to be deferred lets cp do some useful things.-
1554 But when creating hardlinks and SRC_NAME is a symlink-
1555 but DST_NAME is not we must test anyway. */-
1556 if (x->hard_link-
1557 || !S_ISLNK (src_sb_link->st_mode)-
1558 || S_ISLNK (dst_sb_link->st_mode))-
1559 return true;-
1560-
1561 if (x->dereference != DEREF_NEVER)-
1562 return true;-
1563#endif-
1564-
1565 if (x->move_mode || x->unlink_dest_before_opening)
x->move_modeDescription
TRUEevaluated 545 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 65 times by 1 test
Evaluated by:
  • cp
x->unlink_dest_before_openingDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 55 times by 1 test
Evaluated by:
  • cp
10-545
1566 {-
1567 /* They may refer to the same file if we're in move mode and the-
1568 target is a symlink. That is ok, since we remove any existing-
1569 destination file before opening it -- via 'rename' if they're on-
1570 the same file system, via 'unlink (DST_NAME)' otherwise. */-
1571 if (S_ISLNK (dst_sb_link->st_mode))
(((( dst_sb_li... == (0120000))Description
TRUEevaluated 6 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 549 times by 2 tests
Evaluated by:
  • cp
  • mv
6-549
1572 return true;
executed 6 times by 2 tests: return 1 ;
Executed by:
  • cp
  • mv
6
1573-
1574 /* It's not ok if they're distinct hard links to the same file as-
1575 this causes a race condition and we may lose data in this case. */-
1576 if (same_link
same_linkDescription
TRUEevaluated 6 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 543 times by 2 tests
Evaluated by:
  • cp
  • mv
6-543
1577 && 1 < dst_sb_link->st_nlink
1 < dst_sb_link->st_nlinkDescription
TRUEevaluated 5 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
1-5
1578 && ! same_name (src_name, dst_name))
! same_name (s...ame, dst_name)Description
TRUEevaluated 4 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 1 time by 1 test
Evaluated by:
  • mv
1-4
1579 return ! x->move_mode;
executed 4 times by 2 tests: return ! x->move_mode;
Executed by:
  • cp
  • mv
4
1580 }
executed 545 times by 2 tests: end of block
Executed by:
  • cp
  • mv
545
1581-
1582 /* If neither is a symlink, then it's ok as long as they aren't-
1583 hard links to the same file. */-
1584 if (!S_ISLNK (src_sb_link->st_mode) && !S_ISLNK (dst_sb_link->st_mode))
! (((( src_sb_... == (0120000))Description
TRUEevaluated 578 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 22 times by 2 tests
Evaluated by:
  • cp
  • mv
! (((( dst_sb_... == (0120000))Description
TRUEevaluated 572 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 6 times by 1 test
Evaluated by:
  • cp
6-578
1585 {-
1586 if (!SAME_INODE (*src_sb_link, *dst_sb_link))
(*src_sb_link)...b_link).st_inoDescription
TRUEevaluated 17 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 555 times by 2 tests
Evaluated by:
  • cp
  • mv
(*src_sb_link)...b_link).st_devDescription
TRUEevaluated 17 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEnever evaluated
0-555
1587 return true;
executed 555 times by 2 tests: return 1 ;
Executed by:
  • cp
  • mv
555
1588-
1589 /* If they are the same file, it's ok if we're making hard links. */-
1590 if (x->hard_link)
x->hard_linkDescription
TRUEnever evaluated
FALSEevaluated 17 times by 2 tests
Evaluated by:
  • cp
  • mv
0-17
1591 {-
1592 *return_now = true;-
1593 return true;
never executed: return 1 ;
0
1594 }-
1595 }
executed 17 times by 2 tests: end of block
Executed by:
  • cp
  • mv
17
1596-
1597 /* At this point, it is normally an error (data loss) to move a symlink-
1598 onto its referent, but in at least one narrow case, it is not:-
1599 In move mode, when-
1600 1) src is a symlink,-
1601 2) dest has a link count of 2 or more and-
1602 3) dest and the referent of src are not the same directory entry,-
1603 then it's ok, since while we'll lose one of those hard links,-
1604 src will still point to a remaining link.-
1605 Note that technically, condition #3 obviates condition #2, but we-
1606 retain the 1 < st_nlink condition because that means fewer invocations-
1607 of the more expensive #3.-
1608-
1609 Given this,-
1610 $ touch f && ln f l && ln -s f s-
1611 $ ls -og f l s-
1612 -rw-------. 2 0 Jan 4 22:46 f-
1613 -rw-------. 2 0 Jan 4 22:46 l-
1614 lrwxrwxrwx. 1 1 Jan 4 22:46 s -> f-
1615 this must fail: mv s f-
1616 this must succeed: mv s l */-
1617 if (x->move_mode
x->move_modeDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 40 times by 1 test
Evaluated by:
  • cp
5-40
1618 && S_ISLNK (src_sb->st_mode)
(((( src_sb->s... == (0120000))Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 1 time by 1 test
Evaluated by:
  • mv
1-4
1619 && 1 < dst_sb_link->st_nlink)
1 < dst_sb_link->st_nlinkDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • mv
FALSEevaluated 3 times by 1 test
Evaluated by:
  • mv
1-3
1620 {-
1621 char *abs_src = canonicalize_file_name (src_name);-
1622 if (abs_src)
abs_srcDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • mv
FALSEnever evaluated
0-1
1623 {-
1624 bool result = ! same_name (abs_src, dst_name);-
1625 free (abs_src);-
1626 return result;
executed 1 time by 1 test: return result;
Executed by:
  • mv
1
1627 }-
1628 }
never executed: end of block
0
1629-
1630 /* It's ok to remove a destination symlink. But that works only-
1631 when creating symbolic links, or when the source and destination-
1632 are on the same file system and when creating hard links or when-
1633 unlinking before opening the destination. */-
1634 if (x->symbolic_link
x->symbolic_linkDescription
TRUEnever evaluated
FALSEevaluated 44 times by 2 tests
Evaluated by:
  • cp
  • mv
0-44
1635 || ((x->hard_link || x->unlink_dest_before_opening)
x->hard_linkDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 41 times by 2 tests
Evaluated by:
  • cp
  • mv
x->unlink_dest_before_openingDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 35 times by 2 tests
Evaluated by:
  • cp
  • mv
3-41
1636 && S_ISLNK (dst_sb_link->st_mode)))
(((( dst_sb_li... == (0120000))Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 7 times by 1 test
Evaluated by:
  • cp
2-7
1637 return dst_sb_link->st_dev == src_sb_link->st_dev;
executed 2 times by 1 test: return dst_sb_link->st_dev == src_sb_link->st_dev;
Executed by:
  • cp
2
1638-
1639 if (x->dereference == DEREF_NEVER)
x->dereference == DEREF_NEVERDescription
TRUEevaluated 22 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 20 times by 1 test
Evaluated by:
  • cp
20-22
1640 {-
1641 if ( ! S_ISLNK (src_sb_link->st_mode))
! (((( src_sb_... == (0120000))Description
TRUEevaluated 12 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 10 times by 2 tests
Evaluated by:
  • cp
  • mv
10-12
1642 tmp_src_sb = *src_sb_link;
executed 12 times by 2 tests: tmp_src_sb = *src_sb_link;
Executed by:
  • cp
  • mv
12
1643 else if (stat (src_name, &tmp_src_sb) != 0)
stat (src_name...p_src_sb) != 0Description
TRUEnever evaluated
FALSEevaluated 10 times by 2 tests
Evaluated by:
  • cp
  • mv
0-10
1644 return true;
never executed: return 1 ;
0
1645-
1646 if ( ! S_ISLNK (dst_sb_link->st_mode))
! (((( dst_sb_... == (0120000))Description
TRUEevaluated 22 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEnever evaluated
0-22
1647 tmp_dst_sb = *dst_sb_link;
executed 22 times by 2 tests: tmp_dst_sb = *dst_sb_link;
Executed by:
  • cp
  • mv
22
1648 else if (stat (dst_name, &tmp_dst_sb) != 0)
stat (dst_name...p_dst_sb) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1649 return true;
never executed: return 1 ;
0
1650-
1651 if ( ! SAME_INODE (tmp_src_sb, tmp_dst_sb))
(tmp_src_sb).s...dst_sb).st_inoDescription
TRUEevaluated 22 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEnever evaluated
(tmp_src_sb).s...dst_sb).st_devDescription
TRUEevaluated 22 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEnever evaluated
0-22
1652 return true;
never executed: return 1 ;
0
1653-
1654 /* FIXME: shouldn't this be testing whether we're making symlinks? */-
1655 if (x->hard_link)
x->hard_linkDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 21 times by 2 tests
Evaluated by:
  • cp
  • mv
1-21
1656 {-
1657 *return_now = true;-
1658 return true;
executed 1 time by 1 test: return 1 ;
Executed by:
  • cp
1
1659 }-
1660 }
executed 21 times by 2 tests: end of block
Executed by:
  • cp
  • mv
21
1661-
1662 return false;
executed 41 times by 2 tests: return 0 ;
Executed by:
  • cp
  • mv
41
1663}-
1664-
1665/* Return true if FILE, with mode MODE, is writable in the sense of 'mv'.-
1666 Always consider a symbolic link to be writable. */-
1667static bool-
1668writable_destination (char const *file, mode_t mode)-
1669{-
1670 return (S_ISLNK (mode)
executed 13 times by 2 tests: return ( (((( mode )) & 0170000) == (0120000)) || can_write_any_file () || euidaccess (file, 2 ) == 0);
Executed by:
  • cp
  • mv
13
1671 || can_write_any_file ()
executed 13 times by 2 tests: return ( (((( mode )) & 0170000) == (0120000)) || can_write_any_file () || euidaccess (file, 2 ) == 0);
Executed by:
  • cp
  • mv
13
1672 || euidaccess (file, W_OK) == 0);
executed 13 times by 2 tests: return ( (((( mode )) & 0170000) == (0120000)) || can_write_any_file () || euidaccess (file, 2 ) == 0);
Executed by:
  • cp
  • mv
13
1673}-
1674-
1675static bool-
1676overwrite_ok (struct cp_options const *x, char const *dst_name,-
1677 struct stat const *dst_sb)-
1678{-
1679 if (! writable_destination (dst_name, dst_sb->st_mode))
! writable_des...t_sb->st_mode)Description
TRUEevaluated 3 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 10 times by 2 tests
Evaluated by:
  • cp
  • mv
3-10
1680 {-
1681 char perms[12]; /* "-rwxrwxrwx " ls-style modes. */-
1682 strmode (dst_sb->st_mode, perms);-
1683 perms[10] = '\0';-
1684 fprintf (stderr,-
1685 (x->move_mode || x->unlink_dest_before_opening-
1686 || x->unlink_dest_after_failed_open)-
1687 ? _("%s: replace %s, overriding mode %04lo (%s)? ")-
1688 : _("%s: unwritable %s (mode %04lo, %s); try anyway? "),-
1689 program_name, quoteaf (dst_name),-
1690 (unsigned long int) (dst_sb->st_mode & CHMOD_MODE_BITS),-
1691 &perms[1]);-
1692 }
executed 3 times by 2 tests: end of block
Executed by:
  • cp
  • mv
3
1693 else-
1694 {-
1695 fprintf (stderr, _("%s: overwrite %s? "),-
1696 program_name, quoteaf (dst_name));-
1697 }
executed 10 times by 2 tests: end of block
Executed by:
  • cp
  • mv
10
1698-
1699 return yesno ();
executed 13 times by 2 tests: return yesno ();
Executed by:
  • cp
  • mv
13
1700}-
1701-
1702/* Initialize the hash table implementing a set of F_triple entries-
1703 corresponding to destination files. */-
1704extern void-
1705dest_info_init (struct cp_options *x)-
1706{-
1707 x->dest_info-
1708 = hash_initialize (DEST_INFO_INITIAL_CAPACITY,-
1709 NULL,-
1710 triple_hash,-
1711 triple_compare,-
1712 triple_free);-
1713}
executed 42 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
42
1714-
1715/* Initialize the hash table implementing a set of F_triple entries-
1716 corresponding to source files listed on the command line. */-
1717extern void-
1718src_info_init (struct cp_options *x)-
1719{-
1720-
1721 /* Note that we use triple_hash_no_name here.-
1722 Contrast with the use of triple_hash above.-
1723 That is necessary because a source file may be specified-
1724 in many different ways. We want to warn about this-
1725 cp a a d/-
1726 as well as this:-
1727 cp a ./a d/-
1728 */-
1729 x->src_info-
1730 = hash_initialize (DEST_INFO_INITIAL_CAPACITY,-
1731 NULL,-
1732 triple_hash_no_name,-
1733 triple_compare,-
1734 triple_free);-
1735}
executed 19 times by 1 test: end of block
Executed by:
  • cp
19
1736-
1737/* When effecting a move (e.g., for mv(1)), and given the name DST_NAME-
1738 of the destination and a corresponding stat buffer, DST_SB, return-
1739 true if the logical 'move' operation should _not_ proceed.-
1740 Otherwise, return false.-
1741 Depending on options specified in X, this code may issue an-
1742 interactive prompt asking whether it's ok to overwrite DST_NAME. */-
1743static bool-
1744abandon_move (const struct cp_options *x,-
1745 char const *dst_name,-
1746 struct stat const *dst_sb)-
1747{-
1748 assert (x->move_mode);-
1749 return (x->interactive == I_ALWAYS_NO
executed 572 times by 1 test: return (x->interactive == I_ALWAYS_NO || ((x->interactive == I_ASK_USER || (x->interactive == I_UNSPECIFIED && x->stdin_tty && ! writable_destination (dst_name, dst_sb->st_mode))) && ! overwrite_ok (x, dst_name, dst_sb)));
Executed by:
  • mv
572
1750 || ((x->interactive == I_ASK_USER
executed 572 times by 1 test: return (x->interactive == I_ALWAYS_NO || ((x->interactive == I_ASK_USER || (x->interactive == I_UNSPECIFIED && x->stdin_tty && ! writable_destination (dst_name, dst_sb->st_mode))) && ! overwrite_ok (x, dst_name, dst_sb)));
Executed by:
  • mv
572
1751 || (x->interactive == I_UNSPECIFIED
executed 572 times by 1 test: return (x->interactive == I_ALWAYS_NO || ((x->interactive == I_ASK_USER || (x->interactive == I_UNSPECIFIED && x->stdin_tty && ! writable_destination (dst_name, dst_sb->st_mode))) && ! overwrite_ok (x, dst_name, dst_sb)));
Executed by:
  • mv
572
1752 && x->stdin_tty
executed 572 times by 1 test: return (x->interactive == I_ALWAYS_NO || ((x->interactive == I_ASK_USER || (x->interactive == I_UNSPECIFIED && x->stdin_tty && ! writable_destination (dst_name, dst_sb->st_mode))) && ! overwrite_ok (x, dst_name, dst_sb)));
Executed by:
  • mv
572
1753 && ! writable_destination (dst_name, dst_sb->st_mode)))
executed 572 times by 1 test: return (x->interactive == I_ALWAYS_NO || ((x->interactive == I_ASK_USER || (x->interactive == I_UNSPECIFIED && x->stdin_tty && ! writable_destination (dst_name, dst_sb->st_mode))) && ! overwrite_ok (x, dst_name, dst_sb)));
Executed by:
  • mv
572
1754 && ! overwrite_ok (x, dst_name, dst_sb)));
executed 572 times by 1 test: return (x->interactive == I_ALWAYS_NO || ((x->interactive == I_ASK_USER || (x->interactive == I_UNSPECIFIED && x->stdin_tty && ! writable_destination (dst_name, dst_sb->st_mode))) && ! overwrite_ok (x, dst_name, dst_sb)));
Executed by:
  • mv
572
1755}-
1756-
1757/* Print --verbose output on standard output, e.g. 'new' -> 'old'.-
1758 If BACKUP_DST_NAME is non-NULL, then also indicate that it is-
1759 the name of a backup file. */-
1760static void-
1761emit_verbose (char const *src, char const *dst, char const *backup_dst_name)-
1762{-
1763 printf ("%s -> %s", quoteaf_n (0, src), quoteaf_n (1, dst));-
1764 if (backup_dst_name)
backup_dst_nameDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • mv
FALSEevaluated 19 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
1-19
1765 printf (_(" (backup: %s)"), quoteaf (backup_dst_name));
executed 1 time by 1 test: printf ( dcgettext (((void *)0), " (backup: %s)" , 5) , quotearg_style (shell_escape_always_quoting_style, backup_dst_name));
Executed by:
  • mv
1
1766 putchar ('\n');-
1767}
executed 20 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
20
1768-
1769/* A wrapper around "setfscreatecon (NULL)" that exits upon failure. */-
1770static void-
1771restore_default_fscreatecon_or_die (void)-
1772{-
1773 if (setfscreatecon (NULL) != 0)
setfscreatecon...id *)0) ) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1774 die (EXIT_FAILURE, errno,
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"failed to restore the default file creation context\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errn...ile creation context" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "failed to restore the default file creation context" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1775 _("failed to restore the default file creation context"));
never executed: ((!!sizeof (struct { _Static_assert ( 1 , "verify_expr (" "1" ", " "(error (1, (*__errno_location ()), dcgettext (((void *)0), \"failed to restore the default file creation context\", 5)), assume (false))" ")"); int _gl_dummy; })) ? ((error ( 1 , (*__errn...ile creation context" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ()))) : ((error ( 1 , (*__errno_location ()) , dcgettext (((void *)0), "failed to restore the default file creation context" , 5) ), (( 0 ) ? (void) 0 : __builtin_unreachable ())))) ;
0
1776}
never executed: end of block
0
1777-
1778/* Create a hard link DST_NAME to SRC_NAME, honoring the REPLACE, VERBOSE and-
1779 DEREFERENCE settings. Return true upon success. Otherwise, diagnose the-
1780 failure and return false. If SRC_NAME is a symbolic link, then it will not-
1781 be followed unless DEREFERENCE is true.-
1782 If the system doesn't support hard links to symbolic links, then DST_NAME-
1783 will be created as a symbolic link to SRC_NAME. */-
1784static bool-
1785create_hard_link (char const *src_name, char const *dst_name,-
1786 bool replace, bool verbose, bool dereference)-
1787{-
1788 int status = force_linkat (AT_FDCWD, src_name, AT_FDCWD, dst_name,-
1789 dereference ? AT_SYMLINK_FOLLOW : 0,-
1790 replace);-
1791 if (status < 0)
status < 0Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 30051 times by 2 tests
Evaluated by:
  • cp
  • mv
5-30051
1792 {-
1793 error (0, errno, _("cannot create hard link %s to %s"),-
1794 quoteaf_n (0, dst_name), quoteaf_n (1, src_name));-
1795 return false;
executed 5 times by 1 test: return 0 ;
Executed by:
  • cp
5
1796 }-
1797 if (0 < status && verbose)
0 < statusDescription
TRUEevaluated 16 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 30035 times by 2 tests
Evaluated by:
  • cp
  • mv
verboseDescription
TRUEnever evaluated
FALSEevaluated 16 times by 2 tests
Evaluated by:
  • cp
  • mv
0-30035
1798 printf (_("removed %s\n"), quoteaf (dst_name));
never executed: printf ( dcgettext (((void *)0), "removed %s\n" , 5) , quotearg_style (shell_escape_always_quoting_style, dst_name));
0
1799 return true;
executed 30051 times by 2 tests: return 1 ;
Executed by:
  • cp
  • mv
30051
1800}-
1801-
1802/* Return true if the current file should be (tried to be) dereferenced:-
1803 either for DEREF_ALWAYS or for DEREF_COMMAND_LINE_ARGUMENTS in the case-
1804 where the current file is a COMMAND_LINE_ARG; otherwise return false. */-
1805static inline bool _GL_ATTRIBUTE_PURE-
1806should_dereference (const struct cp_options *x, bool command_line_arg)-
1807{-
1808 return x->dereference == DEREF_ALWAYS
executed 69216 times by 3 tests: return x->dereference == DEREF_ALWAYS || (x->dereference == DEREF_COMMAND_LINE_ARGUMENTS && command_line_arg);
Executed by:
  • cp
  • ginstall
  • mv
69216
1809 || (x->dereference == DEREF_COMMAND_LINE_ARGUMENTS
executed 69216 times by 3 tests: return x->dereference == DEREF_ALWAYS || (x->dereference == DEREF_COMMAND_LINE_ARGUMENTS && command_line_arg);
Executed by:
  • cp
  • ginstall
  • mv
69216
1810 && command_line_arg);
executed 69216 times by 3 tests: return x->dereference == DEREF_ALWAYS || (x->dereference == DEREF_COMMAND_LINE_ARGUMENTS && command_line_arg);
Executed by:
  • cp
  • ginstall
  • mv
69216
1811}-
1812-
1813/* Return true if the source file with basename SRCBASE and status SRC_ST-
1814 is likely to be the simple backup file for DST_NAME. */-
1815static bool-
1816source_is_dst_backup (char const *srcbase, struct stat const *src_st,-
1817 char const *dst_name)-
1818{-
1819 size_t srcbaselen = strlen (srcbase);-
1820 char const *dstbase = last_component (dst_name);-
1821 size_t dstbaselen = strlen (dstbase);-
1822 size_t suffixlen = strlen (simple_backup_suffix);-
1823 if (! (srcbaselen == dstbaselen + suffixlen
srcbaselen == ...en + suffixlenDescription
TRUEevaluated 10 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 41 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
10-41
1824 && memcmp (srcbase, dstbase, dstbaselen) == 0
memcmp (srcbas...tbaselen) == 0Description
TRUEevaluated 2 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 8 times by 2 tests
Evaluated by:
  • cp
  • mv
2-8
1825 && STREQ (srcbase + dstbaselen, simple_backup_suffix)))
never executed: __result = (((const unsigned char *) (const char *) ( srcbase + dstbaselen ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( simple_backup_suffix ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
( __extension_...)))); }) == 0)Description
TRUEevaluated 2 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEnever evaluated
__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-2
1826 return false;
executed 49 times by 3 tests: return 0 ;
Executed by:
  • cp
  • ginstall
  • mv
49
1827 size_t dstlen = strlen (dst_name);-
1828 char *dst_back = xmalloc (dstlen + suffixlen + 1);-
1829 strcpy (mempcpy (dst_back, dst_name, dstlen), simple_backup_suffix);-
1830 struct stat dst_back_sb;-
1831 int dst_back_status = stat (dst_back, &dst_back_sb);-
1832 free (dst_back);-
1833 return dst_back_status == 0 && SAME_INODE (*src_st, dst_back_sb);
executed 2 times by 2 tests: return dst_back_status == 0 && ((*src_st).st_ino == (dst_back_sb).st_ino && (*src_st).st_dev == (dst_back_sb).st_dev);
Executed by:
  • cp
  • mv
2
1834}-
1835-
1836/* Copy the file SRC_NAME to the file DST_NAME. The files may be of-
1837 any type. NEW_DST should be true if the file DST_NAME cannot-
1838 exist because its parent directory was just created; NEW_DST should-
1839 be false if DST_NAME might already exist. A non-null PARENT describes the-
1840 parent directory. ANCESTORS points to a linked, null terminated list of-
1841 devices and inodes of parent directories of SRC_NAME. COMMAND_LINE_ARG-
1842 is true iff SRC_NAME was specified on the command line.-
1843 FIRST_DIR_CREATED_PER_COMMAND_LINE_ARG is both input and output.-
1844 Set *COPY_INTO_SELF if SRC_NAME is a parent of (or the-
1845 same as) DST_NAME; otherwise, clear it.-
1846 Return true if successful. */-
1847static bool-
1848copy_internal (char const *src_name, char const *dst_name,-
1849 bool new_dst,-
1850 struct stat const *parent,-
1851 struct dir_list *ancestors,-
1852 const struct cp_options *x,-
1853 bool command_line_arg,-
1854 bool *first_dir_created_per_command_line_arg,-
1855 bool *copy_into_self,-
1856 bool *rename_succeeded)-
1857{-
1858 struct stat src_sb;-
1859 struct stat dst_sb;-
1860 mode_t src_mode IF_LINT ( = 0);-
1861 mode_t dst_mode IF_LINT ( = 0);-
1862 mode_t dst_mode_bits;-
1863 mode_t omitted_permissions;-
1864 bool restore_dst_mode = false;-
1865 char *earlier_file = NULL;-
1866 char *dst_backup = NULL;-
1867 bool delayed_ok;-
1868 bool copied_as_regular = false;-
1869 bool dest_is_symlink = false;-
1870 bool have_dst_lstat = false;-
1871-
1872 *copy_into_self = false;-
1873-
1874 int rename_errno = x->rename_errno;-
1875 if (x->move_mode)
x->move_modeDescription
TRUEevaluated 8458 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 60773 times by 2 tests
Evaluated by:
  • cp
  • ginstall
8458-60773
1876 {-
1877 if (rename_errno < 0)
rename_errno < 0Description
TRUEevaluated 7874 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 584 times by 1 test
Evaluated by:
  • mv
584-7874
1878 rename_errno = (renameat2 (AT_FDCWD, src_name, AT_FDCWD, dst_name,
executed 7874 times by 1 test: rename_errno = (renameat2 ( -100 , src_name, -100 , dst_name, (1 << 0) ) ? (*__errno_location ()) : 0);
Executed by:
  • mv
renameat2 ( -1...me, (1 << 0) )Description
TRUEevaluated 7862 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 12 times by 1 test
Evaluated by:
  • mv
12-7874
1879 RENAME_NOREPLACE)
executed 7874 times by 1 test: rename_errno = (renameat2 ( -100 , src_name, -100 , dst_name, (1 << 0) ) ? (*__errno_location ()) : 0);
Executed by:
  • mv
renameat2 ( -1...me, (1 << 0) )Description
TRUEevaluated 7862 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 12 times by 1 test
Evaluated by:
  • mv
12-7874
1880 ? errno : 0);
executed 7874 times by 1 test: rename_errno = (renameat2 ( -100 , src_name, -100 , dst_name, (1 << 0) ) ? (*__errno_location ()) : 0);
Executed by:
  • mv
7874
1881 new_dst = rename_errno == 0;-
1882 if (rename_succeeded)
rename_succeededDescription
TRUEevaluated 4539 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 3919 times by 1 test
Evaluated by:
  • mv
3919-4539
1883 *rename_succeeded = new_dst;
executed 4539 times by 1 test: *rename_succeeded = new_dst;
Executed by:
  • mv
4539
1884 }
executed 8458 times by 1 test: end of block
Executed by:
  • mv
8458
1885-
1886 if (rename_errno == 0
rename_errno =...!= I_ALWAYS_NODescription
TRUEevaluated 69203 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 28 times by 1 test
Evaluated by:
  • mv
rename_errno == 0Description
TRUEevaluated 32 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 69199 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
28-69203
1887 ? !x->last_file
rename_errno =...!= I_ALWAYS_NODescription
TRUEevaluated 69203 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 28 times by 1 test
Evaluated by:
  • mv
28-69203
1888 : rename_errno != EEXIST || x->interactive != I_ALWAYS_NO)
rename_errno =...!= I_ALWAYS_NODescription
TRUEevaluated 69203 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 28 times by 1 test
Evaluated by:
  • mv
rename_errno != 17Description
TRUEevaluated 68631 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 568 times by 1 test
Evaluated by:
  • mv
x->interactive != I_ALWAYS_NODescription
TRUEevaluated 565 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 3 times by 1 test
Evaluated by:
  • mv
3-69203
1889 {-
1890 char const *name = rename_errno == 0 ? dst_name : src_name;
rename_errno == 0Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 69196 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
7-69196
1891 if (XSTAT (x, name, &src_sb) != 0)
((x)->derefere...&src_sb)) != 0Description
TRUEevaluated 9 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 69194 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
(x)->dereferen...== DEREF_NEVERDescription
TRUEevaluated 68569 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 634 times by 2 tests
Evaluated by:
  • cp
  • ginstall
9-69194
1892 {-
1893 error (0, errno, _("cannot stat %s"), quoteaf (name));-
1894 return false;
executed 9 times by 2 tests: return 0 ;
Executed by:
  • cp
  • mv
9
1895 }-
1896-
1897 src_mode = src_sb.st_mode;-
1898-
1899 if (S_ISDIR (src_mode) && !x->recursive)
(((( src_mode ... == (0040000))Description
TRUEevaluated 34000 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 35194 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
!x->recursiveDescription
TRUEevaluated 4 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 33996 times by 2 tests
Evaluated by:
  • cp
  • mv
4-35194
1900 {-
1901 error (0, 0, ! x->install_mode /* cp */-
1902 ? _("-r not specified; omitting directory %s")-
1903 : _("omitting directory %s"),-
1904 quoteaf (src_name));-
1905 return false;
executed 4 times by 2 tests: return 0 ;
Executed by:
  • cp
  • ginstall
4
1906 }-
1907 }
executed 69190 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
69190
1908-
1909 /* Detect the case in which the same source file appears more than-
1910 once on the command line and no backup option has been selected.-
1911 If so, simply warn and don't copy it the second time.-
1912 This check is enabled only if x->src_info is non-NULL. */-
1913 if (command_line_arg && x->src_info)
command_line_argDescription
TRUEevaluated 5260 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 63958 times by 2 tests
Evaluated by:
  • cp
  • mv
x->src_infoDescription
TRUEevaluated 40 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5220 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
40-63958
1914 {-
1915 if ( ! S_ISDIR (src_sb.st_mode)
! (((( src_sb.... == (0040000))Description
TRUEevaluated 29 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 11 times by 1 test
Evaluated by:
  • cp
11-29
1916 && x->backup_type == no_backups
x->backup_type == no_backupsDescription
TRUEevaluated 23 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 6 times by 1 test
Evaluated by:
  • cp
6-23
1917 && seen_file (x->src_info, src_name, &src_sb))
seen_file (x->...name, &src_sb)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 21 times by 1 test
Evaluated by:
  • cp
2-21
1918 {-
1919 error (0, 0, _("warning: source file %s specified more than once"),-
1920 quoteaf (src_name));-
1921 return true;
executed 2 times by 1 test: return 1 ;
Executed by:
  • cp
2
1922 }-
1923-
1924 record_file (x->src_info, src_name, &src_sb);-
1925 }
executed 38 times by 1 test: end of block
Executed by:
  • cp
38
1926-
1927 bool dereference = should_dereference (x, command_line_arg);-
1928-
1929 if (!new_dst)
!new_dstDescription
TRUEevaluated 9157 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 60059 times by 2 tests
Evaluated by:
  • cp
  • mv
9157-60059
1930 {-
1931 if (! (rename_errno == EEXIST && x->interactive == I_ALWAYS_NO))
rename_errno == 17Description
TRUEevaluated 568 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 8589 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
x->interactive == I_ALWAYS_NODescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 565 times by 1 test
Evaluated by:
  • mv
3-8589
1932 {-
1933 /* Regular files can be created by writing through symbolic-
1934 links, but other files cannot. So use stat on the-
1935 destination when copying a regular file, and lstat otherwise.-
1936 However, if we intend to unlink or remove the destination-
1937 first, use lstat, since a copy won't actually be made to the-
1938 destination in that case. */-
1939 bool use_lstat-
1940 = ((! S_ISREG (src_mode)
! (((( src_mod... == (0100000))Description
TRUEevaluated 4034 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 5120 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
4034-5120
1941 && (! x->copy_as_regular
! x->copy_as_regularDescription
TRUEevaluated 4000 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 34 times by 1 test
Evaluated by:
  • cp
34-4000
1942 || S_ISDIR (src_mode) || S_ISLNK (src_mode)))
(((( src_mode ... == (0040000))Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 32 times by 1 test
Evaluated by:
  • cp
(((( src_mode ... == (0120000))Description
TRUEevaluated 30 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
2-32
1943 || x->move_mode || x->symbolic_link || x->hard_link
x->move_modeDescription
TRUEevaluated 4477 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 645 times by 2 tests
Evaluated by:
  • cp
  • ginstall
x->symbolic_linkDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 644 times by 2 tests
Evaluated by:
  • cp
  • ginstall
x->hard_linkDescription
TRUEevaluated 45 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 599 times by 2 tests
Evaluated by:
  • cp
  • ginstall
1-4477
1944 || x->backup_type != no_backups
x->backup_type != no_backupsDescription
TRUEevaluated 65 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 534 times by 2 tests
Evaluated by:
  • cp
  • ginstall
65-534
1945 || x->unlink_dest_before_opening);
x->unlink_dest_before_openingDescription
TRUEevaluated 33 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 501 times by 1 test
Evaluated by:
  • cp
33-501
1946 int fstatat_flags = use_lstat ? AT_SYMLINK_NOFOLLOW : 0;
use_lstatDescription
TRUEevaluated 8653 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 501 times by 1 test
Evaluated by:
  • cp
501-8653
1947 if (fstatat (AT_FDCWD, dst_name, &dst_sb, fstatat_flags) == 0)
fstatat ( -100...at_flags) == 0Description
TRUEevaluated 885 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 8269 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
885-8269
1948 {-
1949 have_dst_lstat = use_lstat;-
1950 rename_errno = EEXIST;-
1951 }
executed 885 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
885
1952 else-
1953 {-
1954 if (errno != ENOENT)
(*__errno_location ()) != 2Description
TRUEnever evaluated
FALSEevaluated 8269 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-8269
1955 {-
1956 error (0, errno, _("cannot stat %s"), quoteaf (dst_name));-
1957 return false;
never executed: return 0 ;
0
1958 }-
1959 new_dst = true;-
1960 }
executed 8269 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
8269
1961 }-
1962-
1963 if (rename_errno == EEXIST)
rename_errno == 17Description
TRUEevaluated 888 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 8269 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
888-8269
1964 {-
1965 bool return_now = false;-
1966-
1967 if (x->interactive != I_ALWAYS_NO
x->interactive != I_ALWAYS_NODescription
TRUEevaluated 882 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 6 times by 2 tests
Evaluated by:
  • cp
  • mv
6-882
1968 && ! same_file_ok (src_name, &src_sb, dst_name, &dst_sb,
! same_file_ok..., &return_now)Description
TRUEevaluated 55 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 827 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
55-827
1969 x, &return_now))
! same_file_ok..., &return_now)Description
TRUEevaluated 55 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 827 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
55-827
1970 {-
1971 error (0, 0, _("%s and %s are the same file"),-
1972 quoteaf_n (0, src_name), quoteaf_n (1, dst_name));-
1973 return false;
executed 55 times by 2 tests: return 0 ;
Executed by:
  • cp
  • mv
55
1974 }-
1975-
1976 if (x->update && !S_ISDIR (src_mode))
x->updateDescription
TRUEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 815 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
! (((( src_mod... == (0040000))Description
TRUEevaluated 16 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
2-815
1977 {-
1978 /* When preserving timestamps (but not moving within a file-
1979 system), don't worry if the destination timestamp is-
1980 less than the source merely because of timestamp-
1981 truncation. */-
1982 int options = ((x->preserve_timestamps
x->preserve_timestampsDescription
TRUEevaluated 11 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
5-11
1983 && ! (x->move_mode
x->move_modeDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 8 times by 1 test
Evaluated by:
  • cp
3-8
1984 && dst_sb.st_dev == src_sb.st_dev))
dst_sb.st_dev == src_sb.st_devDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • mv
FALSEnever evaluated
0-3
1985 ? UTIMECMP_TRUNCATE_SOURCE-
1986 : 0);-
1987-
1988 if (0 <= utimecmp (dst_name, &dst_sb, &src_sb, options))
0 <= utimecmp ...c_sb, options)Description
TRUEevaluated 12 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 4 times by 2 tests
Evaluated by:
  • cp
  • mv
4-12
1989 {-
1990 /* We're using --update and the destination is not older-
1991 than the source, so do not copy or move. Pretend the-
1992 rename succeeded, so the caller (if it's mv) doesn't-
1993 end up removing the source file. */-
1994 if (rename_succeeded)
rename_succeededDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 10 times by 1 test
Evaluated by:
  • cp
2-10
1995 *rename_succeeded = true;
executed 2 times by 1 test: *rename_succeeded = 1 ;
Executed by:
  • mv
2
1996-
1997 /* However, we still must record that we've processed-
1998 this src/dest pair, in case this source file is-
1999 hard-linked to another one. In that case, we'll use-
2000 the mapping information to link the corresponding-
2001 destination names. */-
2002 earlier_file = remember_copied (dst_name, src_sb.st_ino,-
2003 src_sb.st_dev);-
2004 if (earlier_file)
earlier_fileDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 7 times by 2 tests
Evaluated by:
  • cp
  • mv
5-7
2005 {-
2006 /* Note we currently replace DST_NAME unconditionally,-
2007 even if it was a newer separate file. */-
2008 if (! create_hard_link (earlier_file, dst_name, true,
! create_hard_..., dereference)Description
TRUEnever evaluated
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
0-5
2009 x->verbose, dereference))
! create_hard_..., dereference)Description
TRUEnever evaluated
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
0-5
2010 {-
2011 goto un_backup;
never executed: goto un_backup;
0
2012 }-
2013 }
executed 5 times by 1 test: end of block
Executed by:
  • cp
5
2014-
2015 return true;
executed 12 times by 2 tests: return 1 ;
Executed by:
  • cp
  • mv
12
2016 }-
2017 }
executed 4 times by 2 tests: end of block
Executed by:
  • cp
  • mv
4
2018-
2019 /* When there is an existing destination file, we may end up-
2020 returning early, and hence not copying/moving the file.-
2021 This may be due to an interactive 'negative' reply to the-
2022 prompt about the existing file. It may also be due to the-
2023 use of the --no-clobber option.-
2024-
2025 cp and mv treat -i and -f differently. */-
2026 if (x->move_mode)
x->move_modeDescription
TRUEevaluated 572 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 249 times by 2 tests
Evaluated by:
  • cp
  • ginstall
249-572
2027 {-
2028 if (abandon_move (x, dst_name, &dst_sb))
abandon_move (...name, &dst_sb)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 566 times by 1 test
Evaluated by:
  • mv
6-566
2029 {-
2030 /* Pretend the rename succeeded, so the caller (mv)-
2031 doesn't end up removing the source file. */-
2032 if (rename_succeeded)
rename_succeededDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • mv
FALSEnever evaluated
0-6
2033 *rename_succeeded = true;
executed 6 times by 1 test: *rename_succeeded = 1 ;
Executed by:
  • mv
6
2034 return true;
executed 6 times by 1 test: return 1 ;
Executed by:
  • mv
6
2035 }-
2036 }
executed 566 times by 1 test: end of block
Executed by:
  • mv
566
2037 else-
2038 {-
2039 if (! S_ISDIR (src_mode)
! (((( src_mod... == (0040000))Description
TRUEevaluated 231 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 18 times by 1 test
Evaluated by:
  • cp
18-231
2040 && (x->interactive == I_ALWAYS_NO
x->interactive == I_ALWAYS_NODescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 228 times by 2 tests
Evaluated by:
  • cp
  • ginstall
3-228
2041 || (x->interactive == I_ASK_USER
x->interactive == I_ASK_USERDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 221 times by 2 tests
Evaluated by:
  • cp
  • ginstall
7-221
2042 && ! overwrite_ok (x, dst_name, &dst_sb))))
! overwrite_ok...name, &dst_sb)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
2-5
2043 return true;
executed 5 times by 1 test: return 1 ;
Executed by:
  • cp
5
2044 }
executed 244 times by 2 tests: end of block
Executed by:
  • cp
  • ginstall
244
2045-
2046 if (return_now)
return_nowDescription
TRUEevaluated 26 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 784 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
26-784
2047 return true;
executed 26 times by 1 test: return 1 ;
Executed by:
  • cp
26
2048-
2049 if (!S_ISDIR (dst_sb.st_mode))
! (((( dst_sb.... == (0040000))Description
TRUEevaluated 757 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 27 times by 2 tests
Evaluated by:
  • cp
  • mv
27-757
2050 {-
2051 if (S_ISDIR (src_mode))
(((( src_mode ... == (0040000))Description
TRUEevaluated 3 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 754 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
3-754
2052 {-
2053 if (x->move_mode && x->backup_type != no_backups)
x->move_modeDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
x->backup_type != no_backupsDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • mv
0-2
2054 {-
2055 /* Moving a directory onto an existing-
2056 non-directory is ok only with --backup. */-
2057 }
never executed: end of block
0
2058 else-
2059 {-
2060 error (0, 0,-
2061 _("cannot overwrite non-directory %s with directory %s"),-
2062 quoteaf_n (0, dst_name), quoteaf_n (1, src_name));-
2063 return false;
executed 3 times by 2 tests: return 0 ;
Executed by:
  • cp
  • mv
3
2064 }-
2065 }-
2066-
2067 /* Don't let the user destroy their data, even if they try hard:-
2068 This mv command must fail (likewise for cp):-
2069 rm -rf a b c; mkdir a b c; touch a/f b/f; mv a/f b/f c-
2070 Otherwise, the contents of b/f would be lost.-
2071 In the case of 'cp', b/f would be lost if the user simulated-
2072 a move using cp and rm.-
2073 Note that it works fine if you use --backup=numbered. */-
2074 if (command_line_arg
command_line_argDescription
TRUEevaluated 752 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
2-752
2075 && x->backup_type != numbered_backups
x->backup_type...mbered_backupsDescription
TRUEevaluated 708 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 44 times by 2 tests
Evaluated by:
  • cp
  • mv
44-708
2076 && seen_file (x->dest_info, dst_name, &dst_sb))
seen_file (x->...name, &dst_sb)Description
TRUEevaluated 4 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 704 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
4-704
2077 {-
2078 error (0, 0,-
2079 _("will not overwrite just-created %s with %s"),-
2080 quoteaf_n (0, dst_name), quoteaf_n (1, src_name));-
2081 return false;
executed 4 times by 2 tests: return 0 ;
Executed by:
  • cp
  • mv
4
2082 }-
2083 }
executed 750 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
750
2084-
2085 if (!S_ISDIR (src_mode))
! (((( src_mod... == (0040000))Description
TRUEevaluated 753 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 24 times by 2 tests
Evaluated by:
  • cp
  • mv
24-753
2086 {-
2087 if (S_ISDIR (dst_sb.st_mode))
(((( dst_sb.st... == (0040000))Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 750 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
3-750
2088 {-
2089 if (x->move_mode && x->backup_type != no_backups)
x->move_modeDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • mv
FALSEnever evaluated
x->backup_type != no_backupsDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • mv
0-3
2090 {-
2091 /* Moving a non-directory onto an existing-
2092 directory is ok only with --backup. */-
2093 }
never executed: end of block
0
2094 else-
2095 {-
2096 error (0, 0,-
2097 _("cannot overwrite directory %s with non-directory"),-
2098 quoteaf (dst_name));-
2099 return false;
executed 3 times by 1 test: return 0 ;
Executed by:
  • mv
3
2100 }-
2101 }-
2102 }
executed 750 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
750
2103-
2104 if (x->move_mode)
x->move_modeDescription
TRUEevaluated 559 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 215 times by 2 tests
Evaluated by:
  • cp
  • ginstall
215-559
2105 {-
2106 /* Don't allow user to move a directory onto a non-directory. */-
2107 if (S_ISDIR (src_sb.st_mode) && !S_ISDIR (dst_sb.st_mode)
(((( src_sb.st... == (0040000))Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 552 times by 1 test
Evaluated by:
  • mv
! (((( dst_sb.... == (0040000))Description
TRUEnever evaluated
FALSEevaluated 7 times by 1 test
Evaluated by:
  • mv
0-552
2108 && x->backup_type == no_backups)
x->backup_type == no_backupsDescription
TRUEnever evaluated
FALSEnever evaluated
0
2109 {-
2110 error (0, 0,-
2111 _("cannot move directory onto non-directory: %s -> %s"),-
2112 quotef_n (0, src_name), quotef_n (0, dst_name));-
2113 return false;
never executed: return 0 ;
0
2114 }-
2115 }
executed 559 times by 1 test: end of block
Executed by:
  • mv
559
2116-
2117 char const *srcbase;-
2118 if (x->backup_type != no_backups
x->backup_type != no_backupsDescription
TRUEevaluated 98 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 676 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
98-676
2119 /* Don't try to back up a destination if the last-
2120 component of src_name is "." or "..". */-
2121 && ! dot_or_dotdot (srcbase = last_component (src_name))
! dot_or_dotdo...nt (src_name))Description
TRUEevaluated 97 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
1-97
2122 /* Create a backup of each destination directory in move mode,-
2123 but not in copy mode. FIXME: it might make sense to add an-
2124 option to suppress backup creation also for move mode.-
2125 That would let one use mv to merge new content into an-
2126 existing hierarchy. */-
2127 && (x->move_mode || ! S_ISDIR (dst_sb.st_mode)))
x->move_modeDescription
TRUEevaluated 33 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 64 times by 2 tests
Evaluated by:
  • cp
  • ginstall
! (((( dst_sb.... == (0040000))Description
TRUEevaluated 63 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
1-64
2128 {-
2129 /* Fail if creating the backup file would likely destroy-
2130 the source file. Otherwise, the commands:-
2131 cd /tmp; rm -f a a~; : > a; echo A > a~; cp --b=simple a~ a-
2132 would leave two zero-length files: a and a~. */-
2133 if (x->backup_type != numbered_backups
x->backup_type...mbered_backupsDescription
TRUEevaluated 51 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 45 times by 2 tests
Evaluated by:
  • cp
  • mv
45-51
2134 && source_is_dst_backup (srcbase, &src_sb, dst_name))
source_is_dst_..._sb, dst_name)Description
TRUEevaluated 2 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 49 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
2-49
2135 {-
2136 const char *fmt;-
2137 fmt = (x->move_mode
x->move_modeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • mv
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
1
2138 ? _("backing up %s might destroy source; %s not moved")-
2139 : _("backing up %s might destroy source; %s not copied"));-
2140 error (0, 0, fmt,-
2141 quoteaf_n (0, dst_name),-
2142 quoteaf_n (1, src_name));-
2143 return false;
executed 2 times by 2 tests: return 0 ;
Executed by:
  • cp
  • mv
2
2144 }-
2145-
2146 char *tmp_backup = backup_file_rename (dst_name, x->backup_type);-
2147-
2148 /* FIXME: use fts:-
2149 Using alloca for a file name that may be arbitrarily-
2150 long is not recommended. In fact, even forming such a name-
2151 should be discouraged. Eventually, this code will be rewritten-
2152 to use fts, so using alloca here will be less of a problem. */-
2153 if (tmp_backup)
tmp_backupDescription
TRUEevaluated 94 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEnever evaluated
0-94
2154 {-
2155 ASSIGN_STRDUPA (dst_backup, tmp_backup);-
2156 free (tmp_backup);-
2157 }
executed 94 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
94
2158 else if (errno != ENOENT)
(*__errno_location ()) != 2Description
TRUEnever evaluated
FALSEnever evaluated
0
2159 {-
2160 error (0, errno, _("cannot backup %s"), quoteaf (dst_name));-
2161 return false;
never executed: return 0 ;
0
2162 }-
2163 new_dst = true;-
2164 }
executed 94 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
94
2165 else if (! S_ISDIR (dst_sb.st_mode)
! (((( dst_sb.... == (0040000))Description
TRUEevaluated 655 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 23 times by 2 tests
Evaluated by:
  • cp
  • mv
23-655
2166 /* Never unlink dst_name when in move mode. */-
2167 && ! x->move_mode
! x->move_modeDescription
TRUEevaluated 135 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 520 times by 1 test
Evaluated by:
  • mv
135-520
2168 && (x->unlink_dest_before_opening
x->unlink_dest_before_openingDescription
TRUEevaluated 16 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 119 times by 1 test
Evaluated by:
  • cp
16-119
2169 || (x->preserve_links && 1 < dst_sb.st_nlink)
x->preserve_linksDescription
TRUEevaluated 13 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 106 times by 1 test
Evaluated by:
  • cp
1 < dst_sb.st_nlinkDescription
TRUEnever evaluated
FALSEevaluated 13 times by 1 test
Evaluated by:
  • cp
0-106
2170 || (x->dereference == DEREF_NEVER
x->dereference == DEREF_NEVERDescription
TRUEevaluated 11 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 108 times by 1 test
Evaluated by:
  • cp
11-108
2171 && ! S_ISREG (src_sb.st_mode))
! (((( src_sb.... == (0100000))Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 6 times by 1 test
Evaluated by:
  • cp
5-6
2172 ))-
2173 {-
2174 if (unlink (dst_name) != 0 && errno != ENOENT)
unlink (dst_name) != 0Description
TRUEnever evaluated
FALSEevaluated 21 times by 2 tests
Evaluated by:
  • cp
  • ginstall
(*__errno_location ()) != 2Description
TRUEnever evaluated
FALSEnever evaluated
0-21
2175 {-
2176 error (0, errno, _("cannot remove %s"), quoteaf (dst_name));-
2177 return false;
never executed: return 0 ;
0
2178 }-
2179 new_dst = true;-
2180 if (x->verbose)
x->verboseDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • ginstall
FALSEevaluated 14 times by 2 tests
Evaluated by:
  • cp
  • ginstall
7-14
2181 printf (_("removed %s\n"), quoteaf (dst_name));
executed 7 times by 1 test: printf ( dcgettext (((void *)0), "removed %s\n" , 5) , quotearg_style (shell_escape_always_quoting_style, dst_name));
Executed by:
  • ginstall
7
2182 }
executed 21 times by 2 tests: end of block
Executed by:
  • cp
  • ginstall
21
2183 }
executed 772 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
772
2184 }
executed 9041 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
9041
2185-
2186 /* Ensure we don't try to copy through a symlink that was-
2187 created by a prior call to this function. */-
2188 if (command_line_arg
command_line_argDescription
TRUEevaluated 5149 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 63951 times by 2 tests
Evaluated by:
  • cp
  • mv
5149-63951
2189 && x->dest_info
x->dest_infoDescription
TRUEevaluated 3976 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 1173 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
1173-3976
2190 && ! x->move_mode
! x->move_modeDescription
TRUEevaluated 43 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 3933 times by 1 test
Evaluated by:
  • mv
43-3933
2191 && x->backup_type == no_backups)
x->backup_type == no_backupsDescription
TRUEevaluated 38 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 5 times by 1 test
Evaluated by:
  • cp
5-38
2192 {-
2193 bool lstat_ok = true;-
2194 struct stat tmp_buf;-
2195 struct stat *dst_lstat_sb;-
2196-
2197 /* If we called lstat above, good: use that data.-
2198 Otherwise, call lstat here, in case dst_name is a symlink. */-
2199 if (have_dst_lstat)
have_dst_lstatDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 32 times by 2 tests
Evaluated by:
  • cp
  • ginstall
6-32
2200 dst_lstat_sb = &dst_sb;
executed 6 times by 1 test: dst_lstat_sb = &dst_sb;
Executed by:
  • cp
6
2201 else-
2202 {-
2203 if (lstat (dst_name, &tmp_buf) == 0)
lstat (dst_nam...&tmp_buf) == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 26 times by 2 tests
Evaluated by:
  • cp
  • ginstall
6-26
2204 dst_lstat_sb = &tmp_buf;
executed 6 times by 1 test: dst_lstat_sb = &tmp_buf;
Executed by:
  • cp
6
2205 else-
2206 lstat_ok = false;
executed 26 times by 2 tests: lstat_ok = 0 ;
Executed by:
  • cp
  • ginstall
26
2207 }-
2208-
2209 /* Never copy through a symlink we've just created. */-
2210 if (lstat_ok
lstat_okDescription
TRUEevaluated 12 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 26 times by 2 tests
Evaluated by:
  • cp
  • ginstall
12-26
2211 && S_ISLNK (dst_lstat_sb->st_mode)
(((( dst_lstat... == (0120000))Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 9 times by 1 test
Evaluated by:
  • cp
3-9
2212 && seen_file (x->dest_info, dst_name, dst_lstat_sb))
seen_file (x->... dst_lstat_sb)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
1-2
2213 {-
2214 error (0, 0,-
2215 _("will not copy %s through just-created symlink %s"),-
2216 quoteaf_n (0, src_name), quoteaf_n (1, dst_name));-
2217 return false;
executed 2 times by 1 test: return 0 ;
Executed by:
  • cp
2
2218 }-
2219 }
executed 36 times by 2 tests: end of block
Executed by:
  • cp
  • ginstall
36
2220-
2221 /* If the source is a directory, we don't always create the destination-
2222 directory. So --verbose should not announce anything until we're-
2223 sure we'll create a directory. Also don't announce yet when moving-
2224 so we can distinguish renames versus copies. */-
2225 if (x->verbose && !x->move_mode && !S_ISDIR (src_mode))
x->verboseDescription
TRUEevaluated 30 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 69068 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
!x->move_modeDescription
TRUEevaluated 16 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 14 times by 1 test
Evaluated by:
  • mv
! (((( src_mod... == (0040000))Description
TRUEevaluated 14 times by 2 tests
Evaluated by:
  • cp
  • ginstall
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
2-69068
2226 emit_verbose (src_name, dst_name, dst_backup);
executed 14 times by 2 tests: emit_verbose (src_name, dst_name, dst_backup);
Executed by:
  • cp
  • ginstall
14
2227-
2228 /* Associate the destination file name with the source device and inode-
2229 so that if we encounter a matching dev/ino pair in the source tree-
2230 we can arrange to create a hard link between the corresponding names-
2231 in the destination tree.-
2232-
2233 When using the --link (-l) option, there is no need to take special-
2234 measures, because (barring race conditions) files that are hard-linked-
2235 in the source tree will also be hard-linked in the destination tree.-
2236-
2237 Sometimes, when preserving links, we have to record dev/ino even-
2238 though st_nlink == 1:-
2239 - when in move_mode, since we may be moving a group of N hard-linked-
2240 files (via two or more command line arguments) to a different-
2241 partition; the links may be distributed among the command line-
2242 arguments (possibly hierarchies) so that the link count of-
2243 the final, once-linked source file is reduced to 1 when it is-
2244 considered below. But in this case (for mv) we don't need to-
2245 incur the expense of recording the dev/ino => name mapping; all we-
2246 really need is a lookup, to see if the dev/ino pair has already-
2247 been copied.-
2248 - when using -H and processing a command line argument;-
2249 that command line argument could be a symlink pointing to another-
2250 command line argument. With 'cp -H --preserve=link', we hard-link-
2251 those two destination files.-
2252 - likewise for -L except that it applies to all files, not just-
2253 command line arguments.-
2254-
2255 Also, with --recursive, record dev/ino of each command-line directory.-
2256 We'll use that info to detect this problem: cp -R dir dir. */-
2257-
2258 if (rename_errno == 0)
rename_errno == 0Description
TRUEevaluated 32 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 69066 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
32-69066
2259 earlier_file = NULL;
executed 32 times by 1 test: earlier_file = ((void *)0) ;
Executed by:
  • mv
32
2260 else if (x->recursive && S_ISDIR (src_mode))
x->recursiveDescription
TRUEevaluated 68491 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 575 times by 2 tests
Evaluated by:
  • cp
  • ginstall
(((( src_mode ... == (0040000))Description
TRUEevaluated 33989 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 34502 times by 2 tests
Evaluated by:
  • cp
  • mv
575-68491
2261 {-
2262 if (command_line_arg)
command_line_argDescription
TRUEevaluated 3966 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 30023 times by 2 tests
Evaluated by:
  • cp
  • mv
3966-30023
2263 earlier_file = remember_copied (dst_name, src_sb.st_ino, src_sb.st_dev);
executed 3966 times by 2 tests: earlier_file = remember_copied (dst_name, src_sb.st_ino, src_sb.st_dev);
Executed by:
  • cp
  • mv
3966
2264 else-
2265 earlier_file = src_to_dest_lookup (src_sb.st_ino, src_sb.st_dev);
executed 30023 times by 2 tests: earlier_file = src_to_dest_lookup (src_sb.st_ino, src_sb.st_dev);
Executed by:
  • cp
  • mv
30023
2266 }-
2267 else if (x->move_mode && src_sb.st_nlink == 1)
x->move_modeDescription
TRUEevaluated 4468 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 30609 times by 2 tests
Evaluated by:
  • cp
  • ginstall
src_sb.st_nlink == 1Description
TRUEevaluated 4458 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 10 times by 1 test
Evaluated by:
  • mv
10-30609
2268 {-
2269 earlier_file = src_to_dest_lookup (src_sb.st_ino, src_sb.st_dev);-
2270 }
executed 4458 times by 1 test: end of block
Executed by:
  • mv
4458
2271 else if (x->preserve_links
x->preserve_linksDescription
TRUEevaluated 30063 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 556 times by 2 tests
Evaluated by:
  • cp
  • ginstall
556-30063
2272 && !x->hard_link
!x->hard_linkDescription
TRUEevaluated 56 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 30007 times by 1 test
Evaluated by:
  • cp
56-30007
2273 && (1 < src_sb.st_nlink
1 < src_sb.st_nlinkDescription
TRUEevaluated 30 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 26 times by 1 test
Evaluated by:
  • cp
26-30
2274 || (command_line_arg
command_line_argDescription
TRUEevaluated 24 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
2-24
2275 && x->dereference == DEREF_COMMAND_LINE_ARGUMENTS)
x->dereference...LINE_ARGUMENTSDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 22 times by 1 test
Evaluated by:
  • cp
2-22
2276 || x->dereference == DEREF_ALWAYS))
x->dereference == DEREF_ALWAYSDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 20 times by 1 test
Evaluated by:
  • cp
4-20
2277 {-
2278 earlier_file = remember_copied (dst_name, src_sb.st_ino, src_sb.st_dev);-
2279 }
executed 36 times by 2 tests: end of block
Executed by:
  • cp
  • mv
36
2280-
2281 /* Did we copy this inode somewhere else (in this command line argument)-
2282 and therefore this is a second hard link to the inode? */-
2283-
2284 if (earlier_file)
earlier_fileDescription
TRUEevaluated 25 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 69073 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
25-69073
2285 {-
2286 /* Avoid damaging the destination file system by refusing to preserve-
2287 hard-linked directories (which are found at least in Netapp snapshot-
2288 directories). */-
2289 if (S_ISDIR (src_mode))
(((( src_mode ... == (0040000))Description
TRUEevaluated 8 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 17 times by 2 tests
Evaluated by:
  • cp
  • mv
8-17
2290 {-
2291 /* If src_name and earlier_file refer to the same directory entry,-
2292 then warn about copying a directory into itself. */-
2293 if (same_name (src_name, earlier_file))
same_name (src... earlier_file)Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 3 times by 2 tests
Evaluated by:
  • cp
  • mv
3-5
2294 {-
2295 error (0, 0, _("cannot copy a directory, %s, into itself, %s"),-
2296 quoteaf_n (0, top_level_src_name),-
2297 quoteaf_n (1, top_level_dst_name));-
2298 *copy_into_self = true;-
2299 goto un_backup;
executed 5 times by 1 test: goto un_backup;
Executed by:
  • cp
5
2300 }-
2301 else if (same_name (dst_name, earlier_file))
same_name (dst... earlier_file)Description
TRUEevaluated 3 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEnever evaluated
0-3
2302 {-
2303 error (0, 0, _("warning: source directory %s "-
2304 "specified more than once"),-
2305 quoteaf (top_level_src_name));-
2306 /* In move mode, if a previous rename succeeded, then-
2307 we won't be in this path as the source is missing. If the-
2308 rename previously failed, then that has been handled, so-
2309 pretend this attempt succeeded so the source isn't removed. */-
2310 if (x->move_mode && rename_succeeded)
x->move_modeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • mv
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
rename_succeededDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • mv
FALSEnever evaluated
0-2
2311 *rename_succeeded = true;
executed 1 time by 1 test: *rename_succeeded = 1 ;
Executed by:
  • mv
1
2312 /* We only do backups in move mode, and for non directories.-
2313 So just ignore this repeated entry. */-
2314 return true;
executed 3 times by 2 tests: return 1 ;
Executed by:
  • cp
  • mv
3
2315 }-
2316 else if (x->dereference == DEREF_ALWAYS
x->dereference == DEREF_ALWAYSDescription
TRUEnever evaluated
FALSEnever evaluated
0
2317 || (command_line_arg
command_line_argDescription
TRUEnever evaluated
FALSEnever evaluated
0
2318 && x->dereference == DEREF_COMMAND_LINE_ARGUMENTS))
x->dereference...LINE_ARGUMENTSDescription
TRUEnever evaluated
FALSEnever evaluated
0
2319 {-
2320 /* This happens when e.g., encountering a directory for the-
2321 second or subsequent time via symlinks when cp is invoked-
2322 with -R and -L. E.g.,-
2323 rm -rf a b c d; mkdir a b c d; ln -s ../c a; ln -s ../c b;-
2324 cp -RL a b d-
2325 */-
2326 }
never executed: end of block
0
2327 else-
2328 {-
2329 error (0, 0, _("will not create hard link %s to directory %s"),-
2330 quoteaf_n (0, dst_name), quoteaf_n (1, earlier_file));-
2331 goto un_backup;
never executed: goto un_backup;
0
2332 }-
2333 }-
2334 else-
2335 {-
2336 if (! create_hard_link (earlier_file, dst_name, true, x->verbose,
! create_hard_..., dereference)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 16 times by 2 tests
Evaluated by:
  • cp
  • mv
1-16
2337 dereference))
! create_hard_..., dereference)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 16 times by 2 tests
Evaluated by:
  • cp
  • mv
1-16
2338 goto un_backup;
executed 1 time by 1 test: goto un_backup;
Executed by:
  • cp
1
2339-
2340 return true;
executed 16 times by 2 tests: return 1 ;
Executed by:
  • cp
  • mv
16
2341 }-
2342 }-
2343-
2344 if (x->move_mode)
x->move_modeDescription
TRUEevaluated 8423 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 60650 times by 2 tests
Evaluated by:
  • cp
  • ginstall
8423-60650
2345 {-
2346 if (rename_errno == EEXIST)
rename_errno == 17Description
TRUEevaluated 556 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 7867 times by 1 test
Evaluated by:
  • mv
556-7867
2347 rename_errno = rename (src_name, dst_name) == 0 ? 0 : errno;
executed 556 times by 1 test: rename_errno = rename (src_name, dst_name) == 0 ? 0 : (*__errno_location ()) ;
Executed by:
  • mv
rename (src_na...dst_name) == 0Description
TRUEevaluated 543 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 13 times by 1 test
Evaluated by:
  • mv
13-556
2348-
2349 if (rename_errno == 0)
rename_errno == 0Description
TRUEevaluated 575 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 7848 times by 1 test
Evaluated by:
  • mv
575-7848
2350 {-
2351 if (x->verbose)
x->verboseDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 573 times by 1 test
Evaluated by:
  • mv
2-573
2352 {-
2353 printf (_("renamed "));-
2354 emit_verbose (src_name, dst_name, dst_backup);-
2355 }
executed 2 times by 1 test: end of block
Executed by:
  • mv
2
2356-
2357 if (x->set_security_context)
x->set_security_contextDescription
TRUEnever evaluated
FALSEevaluated 575 times by 1 test
Evaluated by:
  • mv
0-575
2358 {-
2359 /* -Z failures are only warnings currently. */-
2360 (void) set_file_security_ctx (dst_name, false, true, x);-
2361 }
never executed: end of block
0
2362-
2363 if (rename_succeeded)
rename_succeededDescription
TRUEevaluated 575 times by 1 test
Evaluated by:
  • mv
FALSEnever evaluated
0-575
2364 *rename_succeeded = true;
executed 575 times by 1 test: *rename_succeeded = 1 ;
Executed by:
  • mv
575
2365-
2366 if (command_line_arg && !x->last_file)
command_line_argDescription
TRUEevaluated 575 times by 1 test
Evaluated by:
  • mv
FALSEnever evaluated
!x->last_fileDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 565 times by 1 test
Evaluated by:
  • mv
0-575
2367 {-
2368 /* Record destination dev/ino/name, so that if we are asked-
2369 to overwrite that file again, we can detect it and fail. */-
2370 /* It's fine to use the _source_ stat buffer (src_sb) to get the-
2371 _destination_ dev/ino, since the rename above can't have-
2372 changed those, and 'mv' always uses lstat.-
2373 We could limit it further by operating-
2374 only on non-directories. */-
2375 record_file (x->dest_info, dst_name, &src_sb);-
2376 }
executed 10 times by 1 test: end of block
Executed by:
  • mv
10
2377-
2378 return true;
executed 575 times by 1 test: return 1 ;
Executed by:
  • mv
575
2379 }-
2380-
2381 /* FIXME: someday, consider what to do when moving a directory into-
2382 itself but when source and destination are on different devices. */-
2383-
2384 /* This happens when attempting to rename a directory to a-
2385 subdirectory of itself. */-
2386 if (rename_errno == EINVAL)
rename_errno == 22Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 7845 times by 1 test
Evaluated by:
  • mv
3-7845
2387 {-
2388 /* FIXME: this is a little fragile in that it relies on rename(2)-
2389 failing with a specific errno value. Expect problems on-
2390 non-POSIX systems. */-
2391 error (0, 0, _("cannot move %s to a subdirectory of itself, %s"),-
2392 quoteaf_n (0, top_level_src_name),-
2393 quoteaf_n (1, top_level_dst_name));-
2394-
2395 /* Note that there is no need to call forget_created here,-
2396 (compare with the other calls in this file) since the-
2397 destination directory didn't exist before. */-
2398-
2399 *copy_into_self = true;-
2400 /* FIXME-cleanup: Don't return true here; adjust mv.c accordingly.-
2401 The only caller that uses this code (mv.c) ends up setting its-
2402 exit status to nonzero when copy_into_self is nonzero. */-
2403 return true;
executed 3 times by 1 test: return 1 ;
Executed by:
  • mv
3
2404 }-
2405-
2406 /* WARNING: there probably exist systems for which an inter-device-
2407 rename fails with a value of errno not handled here.-
2408 If/as those are reported, add them to the condition below.-
2409 If this happens to you, please do the following and send the output-
2410 to the bug-reporting address (e.g., in the output of cp --help):-
2411 touch k; perl -e 'rename "k","/tmp/k" or print "$!(",$!+0,")\n"'-
2412 where your current directory is on one partition and /tmp is the other.-
2413 Also, please try to find the E* errno macro name corresponding to-
2414 the diagnostic and parenthesized integer, and include that in your-
2415 e-mail. One way to do that is to run a command like this-
2416 find /usr/include/. -type f \-
2417 | xargs grep 'define.*\<E[A-Z]*\>.*\<18\>' /dev/null-
2418 where you'd replace '18' with the integer in parentheses that-
2419 was output from the perl one-liner above.-
2420 If necessary, of course, change '/tmp' to some other directory. */-
2421 if (rename_errno != EXDEV)
rename_errno != 18Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 7842 times by 1 test
Evaluated by:
  • mv
3-7842
2422 {-
2423 /* There are many ways this can happen due to a race condition.-
2424 When something happens between the initial XSTAT and the-
2425 subsequent rename, we can get many different types of errors.-
2426 For example, if the destination is initially a non-directory-
2427 or non-existent, but it is created as a directory, the rename-
2428 fails. If two 'mv' commands try to rename the same file at-
2429 about the same time, one will succeed and the other will fail.-
2430 If the permissions on the directory containing the source or-
2431 destination file are made too restrictive, the rename will-
2432 fail. Etc. */-
2433 error (0, rename_errno,-
2434 _("cannot move %s to %s"),-
2435 quoteaf_n (0, src_name), quoteaf_n (1, dst_name));-
2436 forget_created (src_sb.st_ino, src_sb.st_dev);-
2437 return false;
executed 3 times by 1 test: return 0 ;
Executed by:
  • mv
3
2438 }-
2439-
2440 /* The rename attempt has failed. Remove any existing destination-
2441 file so that a cross-device 'mv' acts as if it were really using-
2442 the rename syscall. Note both src and dst must both be directories-
2443 or not, and this is enforced above. Therefore we check the src_mode-
2444 and operate on dst_name here as a tighter constraint and also because-
2445 src_mode is readily available here. */-
2446 if ((S_ISDIR (src_mode) ? rmdir (dst_name) : unlink (dst_name)) != 0
(((( src_mode ... == (0040000))Description
TRUEevaluated 3919 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 3923 times by 1 test
Evaluated by:
  • mv
( (((( src_mod...st_name)) != 0Description
TRUEevaluated 7837 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 5 times by 1 test
Evaluated by:
  • mv
5-7837
2447 && errno != ENOENT)
(*__errno_location ()) != 2Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 7835 times by 1 test
Evaluated by:
  • mv
2-7835
2448 {-
2449 error (0, errno,-
2450 _("inter-device move failed: %s to %s; unable to remove target"),-
2451 quoteaf_n (0, src_name), quoteaf_n (1, dst_name));-
2452 forget_created (src_sb.st_ino, src_sb.st_dev);-
2453 return false;
executed 2 times by 1 test: return 0 ;
Executed by:
  • mv
2
2454 }-
2455-
2456 if (x->verbose && !S_ISDIR (src_mode))
x->verboseDescription
TRUEevaluated 10 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 7830 times by 1 test
Evaluated by:
  • mv
! (((( src_mod... == (0040000))Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 7 times by 1 test
Evaluated by:
  • mv
3-7830
2457 {-
2458 printf (_("copied "));-
2459 emit_verbose (src_name, dst_name, dst_backup);-
2460 }
executed 3 times by 1 test: end of block
Executed by:
  • mv
3
2461 new_dst = true;-
2462 }
executed 7840 times by 1 test: end of block
Executed by:
  • mv
7840
2463-
2464 /* If the ownership might change, or if it is a directory (whose-
2465 special mode bits may change after the directory is created),-
2466 omit some permissions at first, so unauthorized users cannot nip-
2467 in before the file is ready. */-
2468 dst_mode_bits = (x->set_mode ? x->mode : src_mode) & CHMOD_MODE_BITS;
x->set_modeDescription
TRUEevaluated 22 times by 1 test
Evaluated by:
  • ginstall
FALSEevaluated 68468 times by 2 tests
Evaluated by:
  • cp
  • mv
22-68468
2469 omitted_permissions =-
2470 (dst_mode_bits-
2471 & (x->preserve_ownership ? S_IRWXG | S_IRWXO-
2472 : S_ISDIR (src_mode) ? S_IWGRP | S_IWOTH-
2473 : 0));-
2474-
2475 delayed_ok = true;-
2476-
2477 /* If required, set the default security context for new files.-
2478 Also for existing files this is used as a reference-
2479 when copying the context with --preserve=context.-
2480 FIXME: Do we need to consider dst_mode_bits here? */-
2481 if (! set_process_security_ctx (src_name, dst_name, src_mode, new_dst, x))
! set_process_...e, new_dst, x)Description
TRUEnever evaluated
FALSEevaluated 68490 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
0-68490
2482 return false;
never executed: return 0 ;
0
2483-
2484 if (S_ISDIR (src_mode))
(((( src_mode ... == (0040000))Description
TRUEevaluated 33971 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 34519 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
33971-34519
2485 {-
2486 struct dir_list *dir;-
2487-
2488 /* If this directory has been copied before during the-
2489 recursion, there is a symbolic link to an ancestor-
2490 directory of the symbolic link. It is impossible to-
2491 continue to copy this, unless we've got an infinite disk. */-
2492-
2493 if (is_ancestor (&src_sb, ancestors))
is_ancestor (&...sb, ancestors)Description
TRUEnever evaluated
FALSEevaluated 33971 times by 2 tests
Evaluated by:
  • cp
  • mv
0-33971
2494 {-
2495 error (0, 0, _("cannot copy cyclic symbolic link %s"),-
2496 quoteaf (src_name));-
2497 goto un_backup;
never executed: goto un_backup;
0
2498 }-
2499-
2500 /* Insert the current directory in the list of parents. */-
2501-
2502 dir = alloca (sizeof *dir);-
2503 dir->parent = ancestors;-
2504 dir->ino = src_sb.st_ino;-
2505 dir->dev = src_sb.st_dev;-
2506-
2507 if (new_dst || !S_ISDIR (dst_sb.st_mode))
new_dstDescription
TRUEevaluated 33956 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
! (((( dst_sb.... == (0040000))Description
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
0-33956
2508 {-
2509 /* POSIX says mkdir's behavior is implementation-defined when-
2510 (src_mode & ~S_IRWXUGO) != 0. However, common practice is-
2511 to ask mkdir to copy all the CHMOD_MODE_BITS, letting mkdir-
2512 decide what to do with S_ISUID | S_ISGID | S_ISVTX. */-
2513 if (mkdir (dst_name, dst_mode_bits & ~omitted_permissions) != 0)
mkdir (dst_nam...missions) != 0Description
TRUEnever evaluated
FALSEevaluated 33956 times by 2 tests
Evaluated by:
  • cp
  • mv
0-33956
2514 {-
2515 error (0, errno, _("cannot create directory %s"),-
2516 quoteaf (dst_name));-
2517 goto un_backup;
never executed: goto un_backup;
0
2518 }-
2519-
2520 /* We need search and write permissions to the new directory-
2521 for writing the directory's contents. Check if these-
2522 permissions are there. */-
2523-
2524 if (lstat (dst_name, &dst_sb) != 0)
lstat (dst_name, &dst_sb) != 0Description
TRUEnever evaluated
FALSEevaluated 33956 times by 2 tests
Evaluated by:
  • cp
  • mv
0-33956
2525 {-
2526 error (0, errno, _("cannot stat %s"), quoteaf (dst_name));-
2527 goto un_backup;
never executed: goto un_backup;
0
2528 }-
2529 else if ((dst_sb.st_mode & S_IRWXU) != S_IRWXU)
(dst_sb.st_mod...400|0200|0100)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 33955 times by 2 tests
Evaluated by:
  • cp
  • mv
1-33955
2530 {-
2531 /* Make the new directory searchable and writable. */-
2532-
2533 dst_mode = dst_sb.st_mode;-
2534 restore_dst_mode = true;-
2535-
2536 if (lchmod (dst_name, dst_mode | S_IRWXU) != 0)
chmod (dst_nam...0|0100) ) != 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
2537 {-
2538 error (0, errno, _("setting permissions for %s"),-
2539 quoteaf (dst_name));-
2540 goto un_backup;
never executed: goto un_backup;
0
2541 }-
2542 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
2543-
2544 /* Record the created directory's inode and device numbers into-
2545 the search structure, so that we can avoid copying it again.-
2546 Do this only for the first directory that is created for each-
2547 source command line argument. */-
2548 if (!*first_dir_created_per_command_line_arg)
!*first_dir_cr...mmand_line_argDescription
TRUEevaluated 3945 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 30011 times by 2 tests
Evaluated by:
  • cp
  • mv
3945-30011
2549 {-
2550 remember_copied (dst_name, dst_sb.st_ino, dst_sb.st_dev);-
2551 *first_dir_created_per_command_line_arg = true;-
2552 }
executed 3945 times by 2 tests: end of block
Executed by:
  • cp
  • mv
3945
2553-
2554 if (x->verbose)
x->verboseDescription
TRUEevaluated 8 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 33948 times by 2 tests
Evaluated by:
  • cp
  • mv
8-33948
2555 {-
2556 if (x->move_mode)
x->move_modeDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • mv
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
1-7
2557 printf (_("created directory %s\n"), quoteaf (dst_name));
executed 7 times by 1 test: printf ( dcgettext (((void *)0), "created directory %s\n" , 5) , quotearg_style (shell_escape_always_quoting_style, dst_name));
Executed by:
  • mv
7
2558 else-
2559 emit_verbose (src_name, dst_name, NULL);
executed 1 time by 1 test: emit_verbose (src_name, dst_name, ((void *)0) );
Executed by:
  • cp
1
2560 }-
2561 }
executed 33956 times by 2 tests: end of block
Executed by:
  • cp
  • mv
33956
2562 else-
2563 {-
2564 omitted_permissions = 0;-
2565-
2566 /* For directories, the process global context could be reset for-
2567 descendents, so use it to set the context for existing dirs here.-
2568 This will also give earlier indication of failure to set ctx. */-
2569 if (x->set_security_context || x->preserve_security_context)
x->set_security_contextDescription
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
x->preserve_security_contextDescription
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
0-15
2570 if (! set_file_security_ctx (dst_name, x->preserve_security_context,
! set_file_sec...ontext, 0 , x)Description
TRUEnever evaluated
FALSEnever evaluated
0
2571 false, x))
! set_file_sec...ontext, 0 , x)Description
TRUEnever evaluated
FALSEnever evaluated
0
2572 {-
2573 if (x->require_preserve_context)
x->require_preserve_contextDescription
TRUEnever evaluated
FALSEnever evaluated
0
2574 goto un_backup;
never executed: goto un_backup;
0
2575 }
never executed: end of block
0
2576 }
executed 15 times by 1 test: end of block
Executed by:
  • cp
15
2577-
2578 /* Decide whether to copy the contents of the directory. */-
2579 if (x->one_file_system && parent && parent->st_dev != src_sb.st_dev)
x->one_file_systemDescription
TRUEnever evaluated
FALSEevaluated 33971 times by 2 tests
Evaluated by:
  • cp
  • mv
parentDescription
TRUEnever evaluated
FALSEnever evaluated
parent->st_dev... src_sb.st_devDescription
TRUEnever evaluated
FALSEnever evaluated
0-33971
2580 {-
2581 /* Here, we are crossing a file system boundary and cp's -x option-
2582 is in effect: so don't copy the contents of this directory. */-
2583 }
never executed: end of block
0
2584 else-
2585 {-
2586 /* Copy the contents of the directory. Don't just return if-
2587 this fails -- otherwise, the failure to read a single file-
2588 in a source directory would cause the containing destination-
2589 directory not to have owner/perms set properly. */-
2590 delayed_ok = copy_dir (src_name, dst_name, new_dst, &src_sb, dir, x,-
2591 first_dir_created_per_command_line_arg,-
2592 copy_into_self);-
2593 }
executed 33971 times by 2 tests: end of block
Executed by:
  • cp
  • mv
33971
2594 }-
2595 else if (x->symbolic_link)
x->symbolic_linkDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 34518 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
1-34518
2596 {-
2597 dest_is_symlink = true;-
2598 if (*src_name != '/')
*src_name != '/'Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1
2599 {-
2600 /* Check that DST_NAME denotes a file in the current directory. */-
2601 struct stat dot_sb;-
2602 struct stat dst_parent_sb;-
2603 char *dst_parent;-
2604 bool in_current_dir;-
2605-
2606 dst_parent = dir_name (dst_name);-
2607-
2608 in_current_dir = (STREQ (".", dst_parent)
never executed: __result = (((const unsigned char *) (const char *) ( "." ))[3] - __s2[3]);
never executed: end of block
executed 1 time by 1 test: end of block
Executed by:
  • cp
never executed: __result = (((const unsigned char *) (const char *) ( dst_parent ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
( __extension_...)))); }) == 0)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
__s1_len > 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
__result == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
__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-1
2609 /* If either stat call fails, it's ok not to report-
2610 the failure and say dst_name is in the current-
2611 directory. Other things will fail later. */-
2612 || stat (".", &dot_sb) != 0
stat (".", &dot_sb) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2613 || stat (dst_parent, &dst_parent_sb) != 0
stat (dst_pare...arent_sb) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2614 || SAME_INODE (dot_sb, dst_parent_sb));
(dot_sb).st_in...ent_sb).st_inoDescription
TRUEnever evaluated
FALSEnever evaluated
(dot_sb).st_de...ent_sb).st_devDescription
TRUEnever evaluated
FALSEnever evaluated
0
2615 free (dst_parent);-
2616-
2617 if (! in_current_dir)
! in_current_dirDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
2618 {-
2619 error (0, 0,-
2620 _("%s: can make relative symbolic links only in current directory"),-
2621 quotef (dst_name));-
2622 goto un_backup;
never executed: goto un_backup;
0
2623 }-
2624 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
2625 if (force_symlinkat (src_name, AT_FDCWD, dst_name,
force_symlinka...iled_open) < 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
2626 x->unlink_dest_after_failed_open)
force_symlinka...iled_open) < 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
2627 < 0)
force_symlinka...iled_open) < 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
2628 {-
2629 error (0, errno, _("cannot create symbolic link %s to %s"),-
2630 quoteaf_n (0, dst_name), quoteaf_n (1, src_name));-
2631 goto un_backup;
never executed: goto un_backup;
0
2632 }-
2633 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
2634-
2635 /* POSIX 2008 states that it is implementation-defined whether-
2636 link() on a symlink creates a hard-link to the symlink, or only-
2637 to the referent (effectively dereferencing the symlink) (POSIX-
2638 2001 required the latter behavior, although many systems provided-
2639 the former). Yet cp, invoked with '--link --no-dereference',-
2640 should not follow the link. We can approximate the desired-
2641 behavior by skipping this hard-link creating block and instead-
2642 copying the symlink, via the 'S_ISLNK'- copying code below.-
2643-
2644 Note gnulib's linkat module, guarantees that the symlink is not-
2645 dereferenced. However its emulation currently doesn't maintain-
2646 timestamps or ownership so we only call it when we know the-
2647 emulation will not be needed. */-
2648 else if (x->hard_link
x->hard_linkDescription
TRUEevaluated 30034 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 4484 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
4484-30034
2649 && !(! CAN_HARDLINK_SYMLINKS && S_ISLNK (src_mode)
dead code: (((( src_mode )) & 0170000) == (0120000))
-
2650 && x->dereference == DEREF_NEVER))
dead code: x->dereference == DEREF_NEVER
-
2651 {-
2652 if (! create_hard_link (src_name, dst_name,
! create_hard_..., dereference)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 30030 times by 1 test
Evaluated by:
  • cp
4-30030
2653 x->unlink_dest_after_failed_open,
! create_hard_..., dereference)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 30030 times by 1 test
Evaluated by:
  • cp
4-30030
2654 false, dereference))
! create_hard_..., dereference)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 30030 times by 1 test
Evaluated by:
  • cp
4-30030
2655 goto un_backup;
executed 4 times by 1 test: goto un_backup;
Executed by:
  • cp
4
2656 }
executed 30030 times by 1 test: end of block
Executed by:
  • cp
30030
2657 else if (S_ISREG (src_mode)
(((( src_mode ... == (0100000))Description
TRUEevaluated 4458 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 26 times by 2 tests
Evaluated by:
  • cp
  • mv
26-4458
2658 || (x->copy_as_regular && !S_ISLNK (src_mode)))
x->copy_as_regularDescription
TRUEevaluated 15 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 11 times by 2 tests
Evaluated by:
  • cp
  • mv
! (((( src_mod... == (0120000))Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 11 times by 1 test
Evaluated by:
  • cp
4-15
2659 {-
2660 copied_as_regular = true;-
2661 /* POSIX says the permission bits of the source file must be-
2662 used as the 3rd argument in the open call. Historical-
2663 practice passed all the source mode bits to 'open', but the extra-
2664 bits were ignored, so it should be the same either way.-
2665-
2666 This call uses DST_MODE_BITS, not SRC_MODE. These are-
2667 normally the same, and the exception (where x->set_mode) is-
2668 used only by 'install', which POSIX does not specify and-
2669 where DST_MODE_BITS is what's wanted. */-
2670 if (! copy_reg (src_name, dst_name, x, dst_mode_bits & S_IRWXUGO,
! copy_reg (sr..._dst, &src_sb)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 4458 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
4-4458
2671 omitted_permissions, &new_dst, &src_sb))
! copy_reg (sr..._dst, &src_sb)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 4458 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
4-4458
2672 goto un_backup;
executed 4 times by 1 test: goto un_backup;
Executed by:
  • cp
4
2673 }
executed 4458 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
4458
2674 else if (S_ISFIFO (src_mode))
(((( src_mode ... == (0010000))Description
TRUEevaluated 4 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
4-18
2675 {-
2676 /* Use mknod, rather than mkfifo, because the former preserves-
2677 the special mode bits of a fifo on Solaris 10, while mkfifo-
2678 does not. But fall back on mkfifo, because on some BSD systems,-
2679 mknod always fails when asked to create a FIFO. */-
2680 if (mknod (dst_name, src_mode & ~omitted_permissions, 0) != 0)
mknod (dst_nam...sions, 0) != 0Description
TRUEnever evaluated
FALSEevaluated 4 times by 2 tests
Evaluated by:
  • cp
  • mv
0-4
2681 if (mkfifo (dst_name, src_mode & ~S_IFIFO & ~omitted_permissions) != 0)
mkfifo (dst_na...missions) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2682 {-
2683 error (0, errno, _("cannot create fifo %s"), quoteaf (dst_name));-
2684 goto un_backup;
never executed: goto un_backup;
0
2685 }-
2686 }
executed 4 times by 2 tests: end of block
Executed by:
  • cp
  • mv
4
2687 else if (S_ISBLK (src_mode) || S_ISCHR (src_mode) || S_ISSOCK (src_mode))
(((( src_mode ... == (0060000))Description
TRUEnever evaluated
FALSEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
(((( src_mode ... == (0020000))Description
TRUEnever evaluated
FALSEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
(((( src_mode ... == (0140000))Description
TRUEnever evaluated
FALSEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
0-18
2688 {-
2689 if (mknod (dst_name, src_mode & ~omitted_permissions, src_sb.st_rdev)
mknod (dst_nam....st_rdev) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2690 != 0)
mknod (dst_nam....st_rdev) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2691 {-
2692 error (0, errno, _("cannot create special file %s"),-
2693 quoteaf (dst_name));-
2694 goto un_backup;
never executed: goto un_backup;
0
2695 }-
2696 }
never executed: end of block
0
2697 else if (S_ISLNK (src_mode))
(((( src_mode ... == (0120000))Description
TRUEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEnever evaluated
0-18
2698 {-
2699 char *src_link_val = areadlink_with_size (src_name, src_sb.st_size);-
2700 dest_is_symlink = true;-
2701 if (src_link_val == NULL)
src_link_val == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
0-18
2702 {-
2703 error (0, errno, _("cannot read symbolic link %s"),-
2704 quoteaf (src_name));-
2705 goto un_backup;
never executed: goto un_backup;
0
2706 }-
2707-
2708 int symlink_r = force_symlinkat (src_link_val, AT_FDCWD, dst_name,-
2709 x->unlink_dest_after_failed_open);-
2710 int symlink_err = symlink_r < 0 ? errno : 0;
symlink_r < 0Description
TRUEnever evaluated
FALSEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
0-18
2711 if (symlink_err && x->update && !new_dst && S_ISLNK (dst_sb.st_mode)
symlink_errDescription
TRUEnever evaluated
FALSEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
x->updateDescription
TRUEnever evaluated
FALSEnever evaluated
!new_dstDescription
TRUEnever evaluated
FALSEnever evaluated
(((( dst_sb.st... == (0120000))Description
TRUEnever evaluated
FALSEnever evaluated
0-18
2712 && dst_sb.st_size == strlen (src_link_val))
dst_sb.st_size...(src_link_val)Description
TRUEnever evaluated
FALSEnever evaluated
0
2713 {-
2714 /* See if the destination is already the desired symlink.-
2715 FIXME: This behavior isn't documented, and seems wrong-
2716 in some cases, e.g., if the destination symlink has the-
2717 wrong ownership, permissions, or timestamps. */-
2718 char *dest_link_val =-
2719 areadlink_with_size (dst_name, dst_sb.st_size);-
2720 if (dest_link_val)
dest_link_valDescription
TRUEnever evaluated
FALSEnever evaluated
0
2721 {-
2722 if (STREQ (dest_link_val, src_link_val))
never executed: __result = (((const unsigned char *) (const char *) ( dest_link_val ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( src_link_val ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
( __extension_...)))); }) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
__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
2723 symlink_err = 0;
never executed: symlink_err = 0;
0
2724 free (dest_link_val);-
2725 }
never executed: end of block
0
2726 }
never executed: end of block
0
2727 free (src_link_val);-
2728 if (symlink_err)
symlink_errDescription
TRUEnever evaluated
FALSEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
0-18
2729 {-
2730 error (0, symlink_err, _("cannot create symbolic link %s"),-
2731 quoteaf (dst_name));-
2732 goto un_backup;
never executed: goto un_backup;
0
2733 }-
2734-
2735 if (x->preserve_security_context)
x->preserve_security_contextDescription
TRUEnever evaluated
FALSEevaluated 18 times by 2 tests
Evaluated by:
  • cp
  • mv
0-18
2736 restore_default_fscreatecon_or_die ();
never executed: restore_default_fscreatecon_or_die ();
0
2737-
2738 if (x->preserve_ownership)
x->preserve_ownershipDescription
TRUEevaluated 3 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
3-15
2739 {-
2740 /* Preserve the owner and group of the just-'copied'-
2741 symbolic link, if possible. */-
2742 if (HAVE_LCHOWN-
2743 && lchown (dst_name, src_sb.st_uid, src_sb.st_gid) != 0
lchown (dst_na...b.st_gid) != 0Description
TRUEnever evaluated
FALSEevaluated 3 times by 2 tests
Evaluated by:
  • cp
  • mv
0-3
2744 && ! chown_failure_ok (x))
! chown_failure_ok (x)Description
TRUEnever evaluated
FALSEnever evaluated
0
2745 {-
2746 error (0, errno, _("failed to preserve ownership for %s"),-
2747 dst_name);-
2748 if (x->require_preserve)
x->require_preserveDescription
TRUEnever evaluated
FALSEnever evaluated
0
2749 goto un_backup;
never executed: goto un_backup;
0
2750 }
never executed: end of block
0
2751 else-
2752 {-
2753 /* Can't preserve ownership of symlinks.-
2754 FIXME: maybe give a warning or even error for symlinks-
2755 in directories with the sticky bit set -- there, not-
2756 preserving owner/group is a potential security problem. */-
2757 }
executed 3 times by 2 tests: end of block
Executed by:
  • cp
  • mv
3
2758 }-
2759 }
executed 18 times by 2 tests: end of block
Executed by:
  • cp
  • mv
18
2760 else-
2761 {-
2762 error (0, 0, _("%s has unknown file type"), quoteaf (src_name));-
2763 goto un_backup;
never executed: goto un_backup;
0
2764 }-
2765-
2766 /* With -Z or --preserve=context, set the context for existing files.-
2767 Note this is done already for copy_reg() for reasons described therein. */-
2768 if (!new_dst && !x->copy_as_regular && !S_ISDIR (src_mode)
!new_dstDescription
TRUEevaluated 112 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 68370 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
!x->copy_as_regularDescription
TRUEevaluated 15 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 97 times by 1 test
Evaluated by:
  • cp
! (((( src_mod... == (0040000))Description
TRUEnever evaluated
FALSEevaluated 15 times by 1 test
Evaluated by:
  • cp
0-68370
2769 && (x->set_security_context || x->preserve_security_context))
x->set_security_contextDescription
TRUEnever evaluated
FALSEnever evaluated
x->preserve_security_contextDescription
TRUEnever evaluated
FALSEnever evaluated
0
2770 {-
2771 if (! set_file_security_ctx (dst_name, x->preserve_security_context,
! set_file_sec...ontext, 0 , x)Description
TRUEnever evaluated
FALSEnever evaluated
0
2772 false, x))
! set_file_sec...ontext, 0 , x)Description
TRUEnever evaluated
FALSEnever evaluated
0
2773 {-
2774 if (x->require_preserve_context)
x->require_preserve_contextDescription
TRUEnever evaluated
FALSEnever evaluated
0
2775 goto un_backup;
never executed: goto un_backup;
0
2776 }
never executed: end of block
0
2777 }
never executed: end of block
0
2778-
2779 if (command_line_arg && x->dest_info)
command_line_argDescription
TRUEevaluated 4544 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 63938 times by 2 tests
Evaluated by:
  • cp
  • mv
x->dest_infoDescription
TRUEevaluated 3943 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 601 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
601-63938
2780 {-
2781 /* Now that the destination file is very likely to exist,-
2782 add its info to the set. */-
2783 struct stat sb;-
2784 if (lstat (dst_name, &sb) == 0)
lstat (dst_name, &sb) == 0Description
TRUEevaluated 3943 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEnever evaluated
0-3943
2785 record_file (x->dest_info, dst_name, &sb);
executed 3943 times by 3 tests: record_file (x->dest_info, dst_name, &sb);
Executed by:
  • cp
  • ginstall
  • mv
3943
2786 }
executed 3943 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
3943
2787-
2788 /* If we've just created a hard-link due to cp's --link option,-
2789 we're done. */-
2790 if (x->hard_link && ! S_ISDIR (src_mode)
x->hard_linkDescription
TRUEevaluated 60048 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 8434 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
! (((( src_mod... == (0040000))Description
TRUEevaluated 30030 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 30018 times by 1 test
Evaluated by:
  • cp
8434-60048
2791 && !(! CAN_HARDLINK_SYMLINKS && S_ISLNK (src_mode)
dead code: (((( src_mode )) & 0170000) == (0120000))
-
2792 && x->dereference == DEREF_NEVER))
dead code: x->dereference == DEREF_NEVER
-
2793 return delayed_ok;
executed 30030 times by 1 test: return delayed_ok;
Executed by:
  • cp
30030
2794-
2795 if (copied_as_regular)
copied_as_regularDescription
TRUEevaluated 4458 times by 3 tests
Evaluated by:
  • cp
  • ginstall
  • mv
FALSEevaluated 33994 times by 2 tests
Evaluated by:
  • cp
  • mv
4458-33994
2796 return delayed_ok;
executed 4458 times by 3 tests: return delayed_ok;
Executed by:
  • cp
  • ginstall
  • mv
4458
2797-
2798 /* POSIX says that 'cp -p' must restore the following:-
2799 - permission bits-
2800 - setuid, setgid bits-
2801 - owner and group-
2802 If it fails to restore any of those, we may give a warning but-
2803 the destination must not be removed.-
2804 FIXME: implement the above. */-
2805-
2806 /* Adjust the times (and if possible, ownership) for the copy.-
2807 chown turns off set[ug]id bits for non-root,-
2808 so do the chmod last. */-
2809-
2810 if (x->preserve_timestamps)
x->preserve_timestampsDescription
TRUEevaluated 33939 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 55 times by 1 test
Evaluated by:
  • cp
55-33939
2811 {-
2812 struct timespec timespec[2];-
2813 timespec[0] = get_stat_atime (&src_sb);-
2814 timespec[1] = get_stat_mtime (&src_sb);-
2815-
2816 if ((dest_is_symlink
(dest_is_symli...imespec)) != 0Description
TRUEnever evaluated
FALSEevaluated 33939 times by 2 tests
Evaluated by:
  • cp
  • mv
dest_is_symlinkDescription
TRUEevaluated 3 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 33936 times by 2 tests
Evaluated by:
  • cp
  • mv
0-33939
2817 ? utimens_symlink (dst_name, timespec)
(dest_is_symli...imespec)) != 0Description
TRUEnever evaluated
FALSEevaluated 33939 times by 2 tests
Evaluated by:
  • cp
  • mv
0-33939
2818 : utimens (dst_name, timespec))
(dest_is_symli...imespec)) != 0Description
TRUEnever evaluated
FALSEevaluated 33939 times by 2 tests
Evaluated by:
  • cp
  • mv
0-33939
2819 != 0)
(dest_is_symli...imespec)) != 0Description
TRUEnever evaluated
FALSEevaluated 33939 times by 2 tests
Evaluated by:
  • cp
  • mv
0-33939
2820 {-
2821 error (0, errno, _("preserving times for %s"), quoteaf (dst_name));-
2822 if (x->require_preserve)
x->require_preserveDescription
TRUEnever evaluated
FALSEnever evaluated
0
2823 return false;
never executed: return 0 ;
0
2824 }
never executed: end of block
0
2825 }
executed 33939 times by 2 tests: end of block
Executed by:
  • cp
  • mv
33939
2826-
2827 /* Avoid calling chown if we know it's not necessary. */-
2828 if (!dest_is_symlink && x->preserve_ownership
!dest_is_symlinkDescription
TRUEevaluated 33975 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 19 times by 2 tests
Evaluated by:
  • cp
  • mv
x->preserve_ownershipDescription
TRUEevaluated 33937 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 38 times by 1 test
Evaluated by:
  • cp
19-33975
2829 && (new_dst || !SAME_OWNER_AND_GROUP (src_sb, dst_sb)))
new_dstDescription
TRUEevaluated 33933 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 4 times by 1 test
Evaluated by:
  • cp
((src_sb).st_u...st_sb).st_uid)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
((src_sb).st_g...st_sb).st_gid)Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-33933
2830 {-
2831 switch (set_owner (x, dst_name, -1, &src_sb, new_dst, &dst_sb))-
2832 {-
2833 case -1:
never executed: case -1:
0
2834 return false;
never executed: return 0 ;
0
2835-
2836 case 0:
never executed: case 0:
0
2837 src_mode &= ~ (S_ISUID | S_ISGID | S_ISVTX);-
2838 break;
never executed: break;
0
2839 }-
2840 }
executed 33933 times by 2 tests: end of block
Executed by:
  • cp
  • mv
33933
2841-
2842 /* Set xattrs after ownership as changing owners will clear capabilities. */-
2843 if (x->preserve_xattr && ! copy_attr (src_name, -1, dst_name, -1, x)
x->preserve_xattrDescription
TRUEevaluated 33936 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 58 times by 1 test
Evaluated by:
  • cp
! copy_attr (s...t_name, -1, x)Description
TRUEnever evaluated
FALSEevaluated 33936 times by 2 tests
Evaluated by:
  • cp
  • mv
0-33936
2844 && x->require_preserve_xattr)
x->require_preserve_xattrDescription
TRUEnever evaluated
FALSEnever evaluated
0
2845 return false;
never executed: return 0 ;
0
2846-
2847 /* The operations beyond this point may dereference a symlink. */-
2848 if (dest_is_symlink)
dest_is_symlinkDescription
TRUEevaluated 19 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 33975 times by 2 tests
Evaluated by:
  • cp
  • mv
19-33975
2849 return delayed_ok;
executed 19 times by 2 tests: return delayed_ok;
Executed by:
  • cp
  • mv
19
2850-
2851 set_author (dst_name, -1, &src_sb);-
2852-
2853 if (x->preserve_mode || x->move_mode)
x->preserve_modeDescription
TRUEevaluated 33936 times by 2 tests
Evaluated by:
  • cp
  • mv
FALSEevaluated 39 times by 1 test
Evaluated by:
  • cp
x->move_modeDescription
TRUEnever evaluated
FALSEevaluated 39 times by 1 test
Evaluated by:
  • cp
0-33936
2854 {-
2855 if (copy_acl (src_name, -1, dst_name, -1, src_mode) != 0
copy_acl (src_...src_mode) != 0Description
TRUEnever evaluated
FALSEevaluated 33936 times by 2 tests
Evaluated by:
  • cp
  • mv
0-33936
2856 && x->require_preserve)
x->require_preserveDescription
TRUEnever evaluated
FALSEnever evaluated
0
2857 return false;
never executed: return 0 ;
0
2858 }
executed 33936 times by 2 tests: end of block
Executed by:
  • cp
  • mv
33936
2859 else if (x->set_mode)
x->set_modeDescription
TRUEnever evaluated
FALSEevaluated 39 times by 1 test
Evaluated by:
  • cp
0-39
2860 {-
2861 if (set_acl (dst_name, -1, x->mode) != 0)
set_acl (dst_n... x->mode) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2862 return false;
never executed: return 0 ;
0
2863 }
never executed: end of block
0
2864 else if (x->explicit_no_preserve_mode)
x->explicit_no_preserve_modeDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 37 times by 1 test
Evaluated by:
  • cp
2-37
2865 {-
2866 int default_permissions = S_ISDIR (src_mode) || S_ISSOCK (src_mode)
(((( src_mode ... == (0040000))Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
(((( src_mode ... == (0140000))Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
2867 ? S_IRWXUGO : MODE_RW_UGO;-
2868 if (set_acl (dst_name, -1, default_permissions & ~cached_umask ()) != 0)
set_acl (dst_n...umask ()) != 0Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • cp
0-2
2869 return false;
never executed: return 0 ;
0
2870 }
executed 2 times by 1 test: end of block
Executed by:
  • cp
2
2871 else-
2872 {-
2873 if (omitted_permissions)
omitted_permissionsDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 36 times by 1 test
Evaluated by:
  • cp
1-36
2874 {-
2875 omitted_permissions &= ~ cached_umask ();-
2876-
2877 if (omitted_permissions && !restore_dst_mode)
omitted_permissionsDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
!restore_dst_modeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1
2878 {-
2879 /* Permissions were deliberately omitted when the file-
2880 was created due to security concerns. See whether-
2881 they need to be re-added now. It'd be faster to omit-
2882 the lstat, but deducing the current destination mode-
2883 is tricky in the presence of implementation-defined-
2884 rules for special mode bits. */-
2885 if (new_dst && lstat (dst_name, &dst_sb) != 0)
new_dstDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
lstat (dst_name, &dst_sb) != 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
2886 {-
2887 error (0, errno, _("cannot stat %s"), quoteaf (dst_name));-
2888 return false;
never executed: return 0 ;
0
2889 }-
2890 dst_mode = dst_sb.st_mode;-
2891 if (omitted_permissions & ~dst_mode)
omitted_permis...ns & ~dst_modeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEnever evaluated
0-1
2892 restore_dst_mode = true;
executed 1 time by 1 test: restore_dst_mode = 1 ;
Executed by:
  • cp
1
2893 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
2894 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
2895-
2896 if (restore_dst_mode)
restore_dst_modeDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • cp
FALSEevaluated 36 times by 1 test
Evaluated by:
  • cp
1-36
2897 {-
2898 if (lchmod (dst_name, dst_mode | omitted_permissions) != 0)
chmod (dst_nam...missions) != 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
0-1
2899 {-
2900 error (0, errno, _("preserving permissions for %s"),-
2901 quoteaf (dst_name));-
2902 if (x->require_preserve)
x->require_preserveDescription
TRUEnever evaluated
FALSEnever evaluated
0
2903 return false;
never executed: return 0 ;
0
2904 }
never executed: end of block
0
2905 }
executed 1 time by 1 test: end of block
Executed by:
  • cp
1
2906 }
executed 37 times by 1 test: end of block
Executed by:
  • cp
37
2907-
2908 return delayed_ok;
executed 33975 times by 2 tests: return delayed_ok;
Executed by:
  • cp
  • mv
33975
2909-
2910un_backup:-
2911-
2912 if (x->preserve_security_context)
x->preserve_security_contextDescription
TRUEnever evaluated
FALSEevaluated 14 times by 1 test
Evaluated by:
  • cp
0-14
2913 restore_default_fscreatecon_or_die ();
never executed: restore_default_fscreatecon_or_die ();
0
2914-
2915 /* We have failed to create the destination file.-
2916 If we've just added a dev/ino entry via the remember_copied-
2917 call above (i.e., unless we've just failed to create a hard link),-
2918 remove the entry associating the source dev/ino with the-
2919 destination file name, so we don't try to 'preserve' a link-
2920 to a file we didn't create. */-
2921 if (earlier_file == NULL)
earlier_file == ((void *)0)Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 6 times by 1 test
Evaluated by:
  • cp
6-8
2922 forget_created (src_sb.st_ino, src_sb.st_dev);
executed 8 times by 1 test: forget_created (src_sb.st_ino, src_sb.st_dev);
Executed by:
  • cp
8
2923-
2924 if (dst_backup)
dst_backupDescription
TRUEnever evaluated
FALSEevaluated 14 times by 1 test
Evaluated by:
  • cp
0-14
2925 {-
2926 if (rename (dst_backup, dst_name) != 0)
rename (dst_ba...dst_name) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2927 error (0, errno, _("cannot un-backup %s"), quoteaf (dst_name));
never executed: error (0, (*__errno_location ()) , dcgettext (((void *)0), "cannot un-backup %s" , 5) , quotearg_style (shell_escape_always_quoting_style, dst_name));
0
2928 else-
2929 {-
2930 if (x->verbose)
x->verboseDescription
TRUEnever evaluated
FALSEnever evaluated
0
2931 printf (_("%s -> %s (unbackup)\n"),
never executed: printf ( dcgettext (((void *)0), "%s -> %s (unbackup)\n" , 5) , quotearg_n_style (0, shell_escape_always_quoting_style, dst_backup), quotearg_n_style (1, shell_escape_always_quoting_style, dst_name));
0
2932 quoteaf_n (0, dst_backup), quoteaf_n (1, dst_name));
never executed: printf ( dcgettext (((void *)0), "%s -> %s (unbackup)\n" , 5) , quotearg_n_style (0, shell_escape_always_quoting_style, dst_backup), quotearg_n_style (1, shell_escape_always_quoting_style, dst_name));
0
2933 }
never executed: end of block
0
2934 }-
2935 return false;
executed 14 times by 1 test: return 0 ;
Executed by:
  • cp
14
2936}-
2937-
2938static bool _GL_ATTRIBUTE_PURE-
2939valid_options (const struct cp_options *co)-
2940{-
2941 assert (co != NULL);-
2942 assert (VALID_BACKUP_TYPE (co->backup_type));-
2943 assert (VALID_SPARSE_MODE (co->sparse_mode));-
2944 assert (VALID_REFLINK_MODE (co->reflink_mode));-
2945 assert (!(co->hard_link && co->symbolic_link));-
2946 assert (!-
2947 (co->reflink_mode == REFLINK_ALWAYS-
2948 && co->sparse_mode != SPARSE_AUTO));-
2949 return true;
executed 5273 times by 3 tests: return 1 ;
Executed by:
  • cp
  • ginstall
  • mv
5273
2950}-
2951-
2952/* Copy the file SRC_NAME to the file DST_NAME. The files may be of-
2953 any type. NONEXISTENT_DST should be true if the file DST_NAME-
2954 is known not to exist (e.g., because its parent directory was just-
2955 created); NONEXISTENT_DST should be false if DST_NAME might already-
2956 exist. OPTIONS is ... FIXME-describe-
2957 Set *COPY_INTO_SELF if SRC_NAME is a parent of (or the-
2958 same as) DST_NAME; otherwise, set clear it.-
2959 Return true if successful. */-
2960-
2961extern bool-
2962copy (char const *src_name, char const *dst_name,-
2963 bool nonexistent_dst, const struct cp_options *options,-
2964 bool *copy_into_self, bool *rename_succeeded)-
2965{-
2966 assert (valid_options (options));-
2967-
2968 /* Record the file names: they're used in case of error, when copying-
2969 a directory into itself. I don't like to make these tools do *any*-
2970 extra work in the common case when that work is solely to handle-
2971 exceptional cases, but in this case, I don't see a way to derive the-
2972 top level source and destination directory names where they're used.-
2973 An alternative is to use COPY_INTO_SELF and print the diagnostic-
2974 from every caller -- but I don't want to do that. */-
2975 top_level_src_name = src_name;-
2976 top_level_dst_name = dst_name;-
2977-
2978 bool first_dir_created_per_command_line_arg = false;-
2979 return copy_internal (src_name, dst_name, nonexistent_dst, NULL, NULL,
executed 5273 times by 3 tests: return copy_internal (src_name, dst_name, nonexistent_dst, ((void *)0) , ((void *)0) , options, 1 , &first_dir_created_per_command_line_arg, copy_into_self, rename_succeeded);
Executed by:
  • cp
  • ginstall
  • mv
5273
2980 options, true,
executed 5273 times by 3 tests: return copy_internal (src_name, dst_name, nonexistent_dst, ((void *)0) , ((void *)0) , options, 1 , &first_dir_created_per_command_line_arg, copy_into_self, rename_succeeded);
Executed by:
  • cp
  • ginstall
  • mv
5273
2981 &first_dir_created_per_command_line_arg,
executed 5273 times by 3 tests: return copy_internal (src_name, dst_name, nonexistent_dst, ((void *)0) , ((void *)0) , options, 1 , &first_dir_created_per_command_line_arg, copy_into_self, rename_succeeded);
Executed by:
  • cp
  • ginstall
  • mv
5273
2982 copy_into_self, rename_succeeded);
executed 5273 times by 3 tests: return copy_internal (src_name, dst_name, nonexistent_dst, ((void *)0) , ((void *)0) , options, 1 , &first_dir_created_per_command_line_arg, copy_into_self, rename_succeeded);
Executed by:
  • cp
  • ginstall
  • mv
5273
2983}-
2984-
2985/* Set *X to the default options for a value of type struct cp_options. */-
2986-
2987extern void-
2988cp_options_default (struct cp_options *x)-
2989{-
2990 memset (x, 0, sizeof *x);-
2991#ifdef PRIV_FILE_CHOWN-
2992 {-
2993 priv_set_t *pset = priv_allocset ();-
2994 if (!pset)-
2995 xalloc_die ();-
2996 if (getppriv (PRIV_EFFECTIVE, pset) == 0)-
2997 {-
2998 x->chown_privileges = priv_ismember (pset, PRIV_FILE_CHOWN);-
2999 x->owner_privileges = priv_ismember (pset, PRIV_FILE_OWNER);-
3000 }-
3001 priv_freeset (pset);-
3002 }-
3003#else-
3004 x->chown_privileges = x->owner_privileges = (geteuid () == ROOT_UID);-
3005#endif-
3006 x->rename_errno = -1;-
3007}
executed 1606 times by 3 tests: end of block
Executed by:
  • cp
  • ginstall
  • mv
1606
3008-
3009/* Return true if it's OK for chown to fail, where errno is-
3010 the error number that chown failed with and X is the copying-
3011 option set. */-
3012-
3013extern bool-
3014chown_failure_ok (struct cp_options const *x)-
3015{-
3016 /* If non-root uses -p, it's ok if we can't preserve ownership.-
3017 But root probably wants to know, e.g. if NFS disallows it,-
3018 or if the target system doesn't support file ownership. */-
3019-
3020 return ((errno == EPERM || errno == EINVAL) && !x->chown_privileges);
never executed: return (( (*__errno_location ()) == 1 || (*__errno_location ()) == 22 ) && !x->chown_privileges);
0
3021}-
3022-
3023/* Similarly, return true if it's OK for chmod and similar operations-
3024 to fail, where errno is the error number that chmod failed with and-
3025 X is the copying option set. */-
3026-
3027static bool-
3028owner_failure_ok (struct cp_options const *x)-
3029{-
3030 return ((errno == EPERM || errno == EINVAL) && !x->owner_privileges);
never executed: return (( (*__errno_location ()) == 1 || (*__errno_location ()) == 22 ) && !x->owner_privileges);
0
3031}-
3032-
3033/* Return the user's umask, caching the result.-
3034-
3035 FIXME: If the destination's parent directory has has a default ACL,-
3036 some operating systems (e.g., GNU/Linux's "POSIX" ACLs) use that-
3037 ACL's mask rather than the process umask. Currently, the callers-
3038 of cached_umask incorrectly assume that this situation cannot occur. */-
3039extern mode_t-
3040cached_umask (void)-
3041{-
3042 static mode_t mask = (mode_t) -1;-
3043 if (mask == (mode_t) -1)
mask == (mode_t) -1Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • cp
FALSEevaluated 1 time by 1 test
Evaluated by:
  • cp
1-6
3044 {-
3045 mask = umask (0);-
3046 umask (mask);-
3047 }
executed 6 times by 1 test: end of block
Executed by:
  • cp
6
3048 return mask;
executed 7 times by 1 test: return mask;
Executed by:
  • cp
7
3049}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2