1 /* core functions for copying files and directories
2 Copyright (C) 89, 90, 91, 1995-2005 Free Software Foundation.
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 2, or (at your option)
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.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
18 /* Extracted from cp.c and librarified by Jim Meyering. */
27 /* Control creation of sparse files (files with holes). */
32 /* Never create holes in DEST. */
35 /* This is the default. Use a crude (and sometimes inaccurate)
36 heuristic to determine if SOURCE has holes. If so, try to create
40 /* For every sufficiently long sequence of bytes in SOURCE, try to
41 create a corresponding hole in DEST. There is a performance penalty
42 here because CP has to search for holes in SRC. But if the holes are
43 big enough, that penalty can be offset by the decrease in the amount
44 of data written to disk. */
48 /* This type is used to help mv (via copy.c) distinguish these cases. */
57 /* How to handle symbolic links. */
58 enum Dereference_symlink
62 /* Copy the symbolic link itself. -P */
65 /* If the symbolic is a command line argument, then copy
66 its referent. Otherwise, copy the symbolic link itself. -H */
67 DEREF_COMMAND_LINE_ARGUMENTS
,
69 /* Copy the referent of the symbolic link. -L */
73 # define VALID_SPARSE_MODE(Mode) \
74 ((Mode) == SPARSE_NEVER \
75 || (Mode) == SPARSE_AUTO \
76 || (Mode) == SPARSE_ALWAYS)
78 /* These options control how files are copied by at least the
79 following programs: mv (when rename doesn't work), cp, install.
80 So, if you add a new member, be sure to initialize it in
81 mv.c, cp.c, and install.c. */
84 enum backup_type backup_type
;
86 /* If true, copy all files except (directories and, if not dereferencing
87 them, symbolic links,) as if they were regular files. */
90 /* How to handle symlinks. */
91 enum Dereference_symlink dereference
;
93 /* If true, remove each existing destination nondirectory before
95 bool unlink_dest_before_opening
;
97 /* If true, first try to open each existing destination nondirectory,
98 then, if the open fails, unlink and try again.
99 This option must be set for `cp -f', in case the destination file
100 exists when the open is attempted. It is irrelevant to `mv' since
101 any destination is sure to be removed before the open. */
102 bool unlink_dest_after_failed_open
;
104 /* If true, create hard links instead of copying files.
105 Create destination directories as usual. */
108 /* This value is used to determine whether to prompt before removing
109 each existing destination file. It works differently depending on
110 whether move_mode is set. See code/comments in copy.c. */
111 enum Interactive interactive
;
113 /* If true, rather than copying, first attempt to use rename.
114 If that fails, then resort to copying. */
117 /* Whether this process has appropriate privileges to chown a file
118 whose owner is not the effective user ID. */
119 bool chown_privileges
;
121 /* If true, when copying recursively, skip any subdirectories that are
122 on different file systems from the one we started on. */
123 bool one_file_system
;
125 /* If true, attempt to give the copies the original files' permissions,
126 owner, group, and timestamps. */
127 bool preserve_ownership
;
129 bool preserve_timestamps
;
131 /* Enabled for mv, and for cp by the --preserve=links option.
132 If true, attempt to preserve in the destination files any
133 logical hard links between the source files. If used with cp's
134 --no-dereference option, and copying two hard-linked files,
135 the two corresponding destination files will also be hard linked.
137 If used with cp's --dereference (-L) option, then, as that option implies,
138 hard links are *not* preserved. However, when copying a file F and
139 a symlink S to F, the resulting S and F in the destination directory
140 will be hard links to the same file (a copy of F). */
143 /* If true and any of the above (for preserve) file attributes cannot
144 be applied to a destination file, treat it as a failure and return
145 nonzero immediately. E.g. cp -p requires this be nonzero, mv requires
147 bool require_preserve
;
149 /* If true, copy directories recursively and copy special files
150 as themselves rather than copying their contents. */
153 /* If true, set file mode to value of MODE. Otherwise,
154 set it based on current umask modified by UMASK_KILL. */
157 /* Set the mode of the destination file to exactly this value
158 if SET_MODE is nonzero. */
161 /* Control creation of sparse files. */
162 enum Sparse_type sparse_mode
;
164 /* If true, create symbolic links instead of copying files.
165 Create destination directories as usual. */
168 /* If true, do not copy a nondirectory that has an existing destination
169 with the same or newer modification time. */
172 /* If true, display the names of the files before copying them. */
175 /* If true, stdin is a tty. */
178 /* This is a set of destination name/inode/dev triples. Each such triple
179 represents a file we have created corresponding to a source file name
180 that was specified on the command line. Use it to avoid clobbering
181 source files in commands like this:
182 rm -rf a b c; mkdir a b c; touch a/f b/f; mv a/f b/f c
183 For now, it protects only regular files when copying (i.e. not renaming).
184 When renaming, it protects all non-directories.
185 Use dest_info_init to initialize it, or set it to NULL to disable
187 Hash_table
*dest_info
;
190 Hash_table
*src_info
;
193 # define XSTAT(X, Src_name, Src_sb) \
194 ((X)->dereference == DEREF_NEVER \
195 ? lstat (Src_name, Src_sb) \
196 : stat (Src_name, Src_sb))
198 /* Arrange to make rename calls go through the wrapper function
199 on systems with a rename function that fails for a source file name
200 specified with a trailing slash. */
201 # if RENAME_TRAILING_SLASH_BUG
202 int rpl_rename (const char *, const char *);
204 # define rename rpl_rename
207 bool copy (char const *src_name
, char const *dst_name
,
208 bool nonexistent_dst
, const struct cp_options
*options
,
209 bool *copy_into_self
, bool *rename_succeeded
);
211 void dest_info_init (struct cp_options
*);
212 void src_info_init (struct cp_options
*);
214 bool chown_privileges (void);
215 bool chown_failure_ok (struct cp_options
const *);