1 /* 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 #ifndef COPY_H
20 # define COPY_H
21 
22 # include <stdbool.h>
23 # include "hash.h"
24 
25 /* Control creation of sparse files (files with holes).  */
26 enum Sparse_type
27 {
28   SPARSE_UNUSED,
29 
30   /* Never create holes in DEST.  */
31   SPARSE_NEVER,
32 
33   /* This is the default.  Use a crude (and sometimes inaccurate)
34      heuristic to determine if SOURCE has holes.  If so, try to create
35      holes in DEST.  */
36   SPARSE_AUTO,
37 
38   /* For every sufficiently long sequence of bytes in SOURCE, try to
39      create a corresponding hole in DEST.  There is a performance penalty
40      here because CP has to search for holes in SRC.  But if the holes are
41      big enough, that penalty can be offset by the decrease in the amount
42      of data written to disk.   */
43   SPARSE_ALWAYS
44 };
45 
46 /* Control creation of COW files.  */
47 enum Reflink_type
48 {
49   /* Default to a standard copy.  */
50   REFLINK_NEVER,
51 
52   /* Try a COW copy and fall back to a standard copy.  */
53   REFLINK_AUTO,
54 
55   /* Require a COW copy and fail if not available.  */
56   REFLINK_ALWAYS
57 };
58 
59 /* This type is used to help mv (via copy.c) distinguish these cases.  */
60 enum Interactive
61 {
62   I_ALWAYS_YES = 1,
63   I_ALWAYS_NO,
64   I_ASK_USER,
65   I_UNSPECIFIED
66 };
67 
68 /* How to handle symbolic links.  */
69 enum Dereference_symlink
70 {
71   DEREF_UNDEFINED = 1,
72 
73   /* Copy the symbolic link itself.  -P  */
74   DEREF_NEVER,
75 
76   /* If the symbolic is a command line argument, then copy
77      its referent.  Otherwise, copy the symbolic link itself.  -H  */
78   DEREF_COMMAND_LINE_ARGUMENTS,
79 
80   /* Copy the referent of the symbolic link.  -L  */
81   DEREF_ALWAYS
82 };
83 
84 # define VALID_SPARSE_MODE(Mode)	\
85   ((Mode) == SPARSE_NEVER		\
86    || (Mode) == SPARSE_AUTO		\
87    || (Mode) == SPARSE_ALWAYS)
88 
89 # define VALID_REFLINK_MODE(Mode)	\
90   ((Mode) == REFLINK_NEVER		\
91    || (Mode) == REFLINK_AUTO		\
92    || (Mode) == REFLINK_ALWAYS)
93 
94 /* These options control how files are copied by at least the
95    following programs: mv (when rename doesn't work), cp, install.
96    So, if you add a new member, be sure to initialize it in
97    mv.c, cp.c, and install.c.  */
98 struct cp_options
99 {
100   enum backup_type backup_type;
101 
102   /* How to handle symlinks in the source.  */
103   enum Dereference_symlink dereference;
104 
105   /* This value is used to determine whether to prompt before removing
106      each existing destination file.  It works differently depending on
107      whether move_mode is set.  See code/comments in copy.c.  */
108   enum Interactive interactive;
109 
110   /* Control creation of sparse files.  */
111   enum Sparse_type sparse_mode;
112 
113   /* Set the mode of the destination file to exactly this value
114      if SET_MODE is nonzero.  */
115   mode_t mode;
116 
117   /* If true, copy all files except (directories and, if not dereferencing
118      them, symbolic links,) as if they were regular files.  */
119   bool copy_as_regular;
120 
121   /* If true, remove each existing destination nondirectory before
122      trying to open it.  */
123   bool unlink_dest_before_opening;
124 
125   /* If true, first try to open each existing destination nondirectory,
126      then, if the open fails, unlink and try again.
127      This option must be set for 'cp -f', in case the destination file
128      exists when the open is attempted.  It is irrelevant to 'mv' since
129      any destination is sure to be removed before the open.  */
130   bool unlink_dest_after_failed_open;
131 
132   /* If true, create hard links instead of copying files.
133      Create destination directories as usual. */
134   bool hard_link;
135 
136   /* If true, rather than copying, first attempt to use rename.
137      If that fails, then resort to copying.  */
138   bool move_mode;
139 
140   /* If true, install(1) is the caller.  */
141   bool install_mode;
142 
143   /* Whether this process has appropriate privileges to chown a file
144      whose owner is not the effective user ID.  */
145   bool chown_privileges;
146 
147   /* Whether this process has appropriate privileges to do the
148      following operations on a file even when it is owned by some
149      other user: set the file's atime, mtime, mode, or ACL; remove or
150      rename an entry in the file even though it is a sticky directory,
151      or to mount on the file.  */
152   bool owner_privileges;
153 
154   /* If true, when copying recursively, skip any subdirectories that are
155      on different file systems from the one we started on.  */
156   bool one_file_system;
157 
158   /* If true, attempt to give the copies the original files' permissions,
159      owner, group, and timestamps. */
160   bool preserve_ownership;
161   bool preserve_mode;
162   bool preserve_timestamps;
163   bool explicit_no_preserve_mode;
164 
165   /* If true, attempt to set specified security context */
166   bool set_security_context;
167 
168   /* Enabled for mv, and for cp by the --preserve=links option.
169      If true, attempt to preserve in the destination files any
170      logical hard links between the source files.  If used with cp's
171      --no-dereference option, and copying two hard-linked files,
172      the two corresponding destination files will also be hard linked.
173 
174      If used with cp's --dereference (-L) option, then, as that option implies,
175      hard links are *not* preserved.  However, when copying a file F and
176      a symlink S to F, the resulting S and F in the destination directory
177      will be hard links to the same file (a copy of F).  */
178   bool preserve_links;
179 
180   /* Optionally don't copy the data, either with CoW reflink files or
181      explicitly with the --attributes-only option.  */
182   bool data_copy_required;
183 
184   /* If true and any of the above (for preserve) file attributes cannot
185      be applied to a destination file, treat it as a failure and return
186      nonzero immediately.  E.g. for cp -p this must be true, for mv it
187      must be false.  */
188   bool require_preserve;
189 
190   /* If true, attempt to preserve the SELinux security context, too.
191      Set this only if the kernel is SELinux enabled.  */
192   bool preserve_security_context;
193 
194   /* Useful only when preserve_context is true.
195      If true, a failed attempt to preserve file's security context
196      propagates failure "out" to the caller, along with full diagnostics.
197      If false, a failure to preserve file's security context does not
198      change the invoking application's exit status, but may output diagnostics.
199      For example, with 'cp --preserve=context' this flag is "true",
200      while with 'cp --preserve=all' or 'cp -a', it is "false". */
201   bool require_preserve_context;
202 
203   /* If true, attempt to preserve extended attributes using libattr.
204      Ignored if coreutils are compiled without xattr support. */
205   bool preserve_xattr;
206 
207   /* Useful only when preserve_xattr is true.
208      If true, a failed attempt to preserve file's extended attributes
209      propagates failure "out" to the caller, along with full diagnostics.
210      If false, a failure to preserve file's extended attributes does not
211      change the invoking application's exit status, but may output diagnostics.
212      For example, with 'cp --preserve=xattr' this flag is "true",
213      while with 'cp --preserve=all' or 'cp -a', it is "false". */
214   bool require_preserve_xattr;
215 
216   /* This allows us to output warnings in cases 2 and 4 below,
217      while being quiet for case 1 (when reduce_diagnostics is true).
218        1. cp -a                       try to copy xattrs with no errors
219        2. cp --preserve=all           copy xattrs with all but ENOTSUP warnings
220        3. cp --preserve=xattr,context copy xattrs with all errors
221        4. mv                          copy xattrs with all but ENOTSUP warnings
222    */
223   bool reduce_diagnostics;
224 
225   /* If true, copy directories recursively and copy special files
226      as themselves rather than copying their contents. */
227   bool recursive;
228 
229   /* If true, set file mode to value of MODE.  Otherwise,
230      set it based on current umask modified by UMASK_KILL.  */
231   bool set_mode;
232 
233   /* If true, create symbolic links instead of copying files.
234      Create destination directories as usual. */
235   bool symbolic_link;
236 
237   /* If true, do not copy a nondirectory that has an existing destination
238      with the same or newer modification time. */
239   bool update;
240 
241   /* If true, display the names of the files before copying them. */
242   bool verbose;
243 
244   /* If true, stdin is a tty.  */
245   bool stdin_tty;
246 
247   /* If true, open a dangling destination symlink when not in move_mode.
248      Otherwise, copy_reg gives a diagnostic (it refuses to write through
249      such a symlink) and returns false.  */
250   bool open_dangling_dest_symlink;
251 
252   /* If true, this is the last filed to be copied.  mv uses this to
253      avoid some unnecessary work.  */
254   bool last_file;
255 
256   /* Zero if the source has already been renamed to the destination; a
257      positive errno number if this failed with the given errno; -1 if
258      no attempt has been made to rename.  Always -1, except for mv.  */
259   int rename_errno;
260 
261   /* Control creation of COW files.  */
262   enum Reflink_type reflink_mode;
263 
264   /* This is a set of destination name/inode/dev triples.  Each such triple
265      represents a file we have created corresponding to a source file name
266      that was specified on the command line.  Use it to avoid clobbering
267      source files in commands like this:
268        rm -rf a b c; mkdir a b c; touch a/f b/f; mv a/f b/f c
269      For now, it protects only regular files when copying (i.e., not renaming).
270      When renaming, it protects all non-directories.
271      Use dest_info_init to initialize it, or set it to NULL to disable
272      this feature.  */
273   Hash_table *dest_info;
274 
275   /* FIXME */
276   Hash_table *src_info;
277 };
278 
279 # define XSTAT(X, Src_name, Src_sb) \
280   ((X)->dereference == DEREF_NEVER \
281    ? lstat (Src_name, Src_sb) \
282    : stat (Src_name, Src_sb))
283 
284 /* Arrange to make rename calls go through the wrapper function
285    on systems with a rename function that fails for a source file name
286    specified with a trailing slash.  */
287 # if RENAME_TRAILING_SLASH_BUG
288 int rpl_rename (const char *, const char *);
289 #  undef rename
290 #  define rename rpl_rename
291 # endif
292 
293 bool copy (char const *src_name, char const *dst_name,
294            bool nonexistent_dst, const struct cp_options *options,
295            bool *copy_into_self, bool *rename_succeeded);
296 
297 extern bool set_process_security_ctx (char const *src_name,
298                                       char const *dst_name,
299                                       mode_t mode, bool new_dst,
300                                       const struct cp_options *x);
301 
302 extern bool set_file_security_ctx (char const *dst_name, bool process_local,
303                                    bool recurse, const struct cp_options *x);
304 
305 void dest_info_init (struct cp_options *);
306 void src_info_init (struct cp_options *);
307 
308 void cp_options_default (struct cp_options *);
309 bool chown_failure_ok (struct cp_options const *) _GL_ATTRIBUTE_PURE;
310 mode_t cached_umask (void);
311 
312 #endif
313