1 /* cp.c -- file copying (main routines)
2 Copyright (C) 89, 90, 91, 1995-2000 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 Written by Torbjorn Granlund, David MacKenzie, and Jim Meyering. */
26 #include <sys/types.h>
32 #include "backupfile.h"
37 #include "path-concat.h"
40 #define ASSIGN_BASENAME_STRDUPA(Dest, File_name) \
44 ASSIGN_STRDUPA (tmp_abns_, (File_name)); \
45 strip_trailing_slashes (tmp_abns_); \
46 Dest = base_name (tmp_abns_); \
50 /* The official name of this program (e.g., no `g' prefix). */
51 #define PROGRAM_NAME "cp"
53 #define AUTHORS "Torbjorn Granlund, David MacKenzie, and Jim Meyering"
55 #ifndef _POSIX_VERSION
59 /* Used by do_copy, make_path_private, and re_protect
60 to keep a list of leading directories whose protections
61 need to be fixed after copying. */
66 struct dir_attr *next;
69 /* For long options that have no equivalent short option, use a
70 non-character as a pseudo short option, starting with CHAR_MAX + 1. */
73 TARGET_DIRECTORY_OPTION = CHAR_MAX + 1,
75 STRIP_TRAILING_SLASHES_OPTION,
82 /* Arrange to make lstat calls go through the wrapper function
83 on systems with an lstat function that does not dereference symlinks
84 that are specified with a trailing slash. */
85 #if ! LSTAT_FOLLOWS_SLASHED_SYMLINK
86 int rpl_lstat PARAMS((const char *, struct stat *));
88 # define lstat rpl_lstat
91 void strip_trailing_slashes ();
93 /* Initial number of entries in each hash table entry's table of inodes. */
94 #define INITIAL_HASH_MODULE 100
96 /* Initial number of entries in the inode hash table. */
97 #define INITIAL_ENTRY_TAB_SIZE 70
99 /* The invocation name of this program. */
102 /* If nonzero, the command "cp x/e_file e_dir" uses "e_dir/x/e_file"
103 as its destination instead of the usual "e_dir/e_file." */
104 static int flag_path = 0;
106 /* Remove any trailing slashes from each SOURCE argument. */
107 static int remove_trailing_slashes;
109 static char const *const sparse_type_string[] =
111 "never", "auto", "always", 0
114 static enum Sparse_type const sparse_type[] =
116 SPARSE_NEVER, SPARSE_AUTO, SPARSE_ALWAYS
119 /* The error code to return to the system. */
120 static int exit_status = 0;
122 static struct option const long_opts[] =
124 {"archive", no_argument, NULL, 'a'},
125 {"backup", optional_argument, NULL, 'b'},
126 {"dereference", no_argument, NULL, 'L'},
127 {"force", no_argument, NULL, 'f'},
128 {"sparse", required_argument, NULL, SPARSE_OPTION},
129 {"interactive", no_argument, NULL, 'i'},
130 {"link", no_argument, NULL, 'l'},
131 {"no-dereference", no_argument, NULL, 'd'},
132 {"one-file-system", no_argument, NULL, 'x'},
133 {"parents", no_argument, NULL, PARENTS_OPTION},
134 {"path", no_argument, NULL, PARENTS_OPTION}, /* Deprecated. */
135 {"preserve", no_argument, NULL, 'p'},
136 {"recursive", no_argument, NULL, 'R'},
137 {"strip-trailing-slash", no_argument, NULL, STRIP_TRAILING_SLASHES_OPTION},
138 {"suffix", required_argument, NULL, 'S'},
139 {"symbolic-link", no_argument, NULL, 's'},
140 {"target-directory", required_argument, NULL, TARGET_DIRECTORY_OPTION},
141 {"update", no_argument, NULL, 'u'},
142 {"verbose", no_argument, NULL, 'v'},
143 {"version-control", required_argument, NULL, 'V'}, /* Deprecated. FIXME. */
144 {GETOPT_HELP_OPTION_DECL},
145 {GETOPT_VERSION_OPTION_DECL},
153 fprintf (stderr, _("Try `%s --help' for more information.\n"),
158 Usage: %s [OPTION]... SOURCE DEST\n\
159 or: %s [OPTION]... SOURCE... DIRECTORY\n\
160 or: %s [OPTION]... --target-directory=DIRECTORY SOURCE...\n\
162 program_name, program_name, program_name);
164 Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\
166 -a, --archive same as -dpR\n\
167 --backup[=CONTROL] make a backup of each existing destination file\n\
168 -b like --backup but does not accept an argument\n\
169 -d, --no-dereference preserve links\n\
170 -f, --force remove existing destinations\n\
171 -i, --interactive prompt before overwrite\n\
172 -H follow symbolic links that are explicitly\n\
173 specified in the command line, but do not\n\
174 follow symlinks that are found via recursive\n\
176 -l, --link link files instead of copying\n\
177 -L, --dereference always follow symbolic links\n\
178 -p, --preserve preserve file attributes if possible\n\
179 --parents append source path to DIRECTORY\n\
180 -P same as `--parents' for now; soon to change to\n\
181 `--no-dereference' to conform to POSIX\n\
182 -r copy recursively, non-directories as files\n\
183 WARNING: use -R instead when you might copy\n\
184 special files like FIFOs or /dev/zero\n\
185 --sparse=WHEN control creation of sparse files\n\
186 -R, --recursive copy directories recursively\n\
187 --strip-trailing-slashes remove any trailing slashes from each SOURCE\n\
189 -s, --symbolic-link make symbolic links instead of copying\n\
190 -S, --suffix=SUFFIX override the usual backup suffix\n\
191 --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY\n\
192 -u, --update copy only when the SOURCE file is newer\n\
193 than the destination file or when the\n\
194 destination file is missing\n\
195 -v, --verbose explain what is being done\n\
196 -x, --one-file-system stay on this file system\n\
197 --help display this help and exit\n\
198 --version output version information and exit\n\
200 By default, sparse SOURCE files are detected by a crude heuristic and the\n\
201 corresponding DEST file is made sparse as well. That is the behavior\n\
202 selected by --sparse=auto. Specify --sparse=always to create a sparse DEST\n\
203 file whenever the SOURCE file contains a long enough sequence of zero bytes.\n\
204 Use --sparse=never to inhibit creation of sparse files.\n\
208 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
209 The version control method may be selected via the --backup option or through\n\
210 the VERSION_CONTROL environment variable. Here are the values:\n\
212 none, off never make backups (even if --backup is given)\n\
213 numbered, t make numbered backups\n\
214 existing, nil numbered if numbered backups exist, simple otherwise\n\
215 simple, never always make simple backups\n\
219 As a special case, cp makes a backup of SOURCE when the force and backup\n\
220 options are given and SOURCE and DEST are the same name for an existing,\n\
223 puts (_("\nReport bugs to <bug-fileutils@gnu.org>."));
228 /* Ensure that the parent directories of CONST_DST_PATH have the
229 correct protections, for the --parents option. This is done
230 after all copying has been completed, to allow permissions
231 that don't include user write/execute.
233 SRC_OFFSET is the index in CONST_DST_PATH of the beginning of the
234 source directory name.
236 ATTR_LIST is a null-terminated linked list of structures that
237 indicates the end of the filename of each intermediate directory
238 in CONST_DST_PATH that may need to have its attributes changed.
239 The command `cp --parents --preserve a/b/c d/e_dir' changes the
240 attributes of the directories d/e_dir/a and d/e_dir/a/b to match
241 the corresponding source directories regardless of whether they
242 existed before the `cp' command was given.
244 Return 0 if the parent of CONST_DST_PATH and any intermediate
245 directories specified by ATTR_LIST have the proper permissions
246 when done, otherwise 1. */
249 re_protect (const char *const_dst_path, int src_offset,
250 struct dir_attr *attr_list, const struct cp_options *x)
253 char *dst_path; /* A copy of CONST_DST_PATH we can change. */
254 char *src_path; /* The source name in `dst_path'. */
255 uid_t myeuid = geteuid ();
257 dst_path = (char *) alloca (strlen (const_dst_path) + 1);
258 strcpy (dst_path, const_dst_path);
259 src_path = dst_path + src_offset;
261 for (p = attr_list; p; p = p->next)
265 dst_path[p->slash_offset] = '\0';
267 if ((*(x->xstat)) (src_path, &src_sb))
269 error (0, errno, _("getting attributes of %s"),
274 /* Adjust the times (and if possible, ownership) for the copy.
275 chown turns off set[ug]id bits for non-root,
276 so do the chmod last. */
278 if (x->preserve_timestamps)
282 /* There's currently no interface to set file timestamps with
283 better than 1-second resolution, so discard any fractional
284 part of the source timestamp. */
286 utb.actime = src_sb.st_atime;
287 utb.modtime = src_sb.st_mtime;
289 if (utime (dst_path, &utb))
291 error (0, errno, _("preserving times for %s"), quote (dst_path));
296 if (x->preserve_owner_and_group)
298 /* If non-root uses -p, it's ok if we can't preserve ownership.
299 But root probably wants to know, e.g. if NFS disallows it,
300 or if the target system doesn't support file ownership. */
301 if (chown (dst_path, src_sb.st_uid, src_sb.st_gid)
302 && ((errno != EPERM && errno != EINVAL) || myeuid == 0))
304 error (0, errno, _("preserving ownership for %s"),
310 if (x->preserve_chmod_bits || p->is_new_dir)
312 if (chmod (dst_path, src_sb.st_mode & x->umask_kill))
314 error (0, errno, _("preserving permissions for %s"),
320 dst_path[p->slash_offset] = '/';
325 /* Ensure that the parent directory of CONST_DIRPATH exists, for
326 the --parents option.
328 SRC_OFFSET is the index in CONST_DIRPATH (which is a destination
329 path) of the beginning of the source directory name.
330 Create any leading directories that don't already exist,
331 giving them permissions MODE.
332 If VERBOSE_FMT_STRING is nonzero, use it as a printf format
333 string for printing a message after successfully making a directory.
334 The format should take two string arguments: the names of the
335 source and destination directories.
336 Creates a linked list of attributes of intermediate directories,
337 *ATTR_LIST, for re_protect to use after calling copy.
338 Sets *NEW_DST to 1 if this function creates parent of CONST_DIRPATH.
340 Return 0 if parent of CONST_DIRPATH exists as a directory with the proper
341 permissions when done, otherwise 1. */
344 make_path_private (const char *const_dirpath, int src_offset, int mode,
345 const char *verbose_fmt_string, struct dir_attr **attr_list,
346 int *new_dst, int (*xstat)())
349 char *dirpath; /* A copy of CONST_DIRPATH we can change. */
350 char *src; /* Source name in `dirpath'. */
351 char *tmp_dst_dirname; /* Leading path of `dirpath', malloc. */
352 char *dst_dirname; /* Leading path of `dirpath', alloca. */
354 dirpath = (char *) alloca (strlen (const_dirpath) + 1);
355 strcpy (dirpath, const_dirpath);
357 src = dirpath + src_offset;
359 tmp_dst_dirname = dir_name (dirpath);
360 dst_dirname = (char *) alloca (strlen (tmp_dst_dirname) + 1);
361 strcpy (dst_dirname, tmp_dst_dirname);
362 free (tmp_dst_dirname);
366 if ((*xstat) (dst_dirname, &stats))
368 /* Parent of CONST_DIRNAME does not exist.
369 Make all missing intermediate directories. */
373 while (*slash == '/')
375 while ((slash = strchr (slash, '/')))
377 /* Add this directory to the list of directories whose modes need
379 struct dir_attr *new =
380 (struct dir_attr *) xmalloc (sizeof (struct dir_attr));
381 new->slash_offset = slash - dirpath;
382 new->next = *attr_list;
386 if ((*xstat) (dirpath, &stats))
388 /* This element of the path does not exist. We must set
389 *new_dst and new->is_new_dir inside this loop because,
390 for example, in the command `cp --parents ../a/../b/c e_dir',
391 make_path_private creates only e_dir/../a if ./b already
395 if (mkdir (dirpath, mode))
397 error (0, errno, _("cannot make directory %s"),
403 if (verbose_fmt_string != NULL)
404 printf (verbose_fmt_string, src, dirpath);
407 else if (!S_ISDIR (stats.st_mode))
409 error (0, 0, _("%s exists but is not a directory"),
420 /* Avoid unnecessary calls to `stat' when given
421 pathnames containing multiple adjacent slashes. */
422 while (*slash == '/')
427 /* We get here if the parent of `dirpath' already exists. */
429 else if (!S_ISDIR (stats.st_mode))
431 error (0, 0, _("%s exists but is not a directory"), quote (dst_dirname));
441 /* Scan the arguments, and copy each by calling copy.
442 Return 0 if successful, 1 if any errors occur. */
445 do_copy (int n_files, char **file, const char *target_directory,
446 const struct cp_options *x)
456 error (0, 0, _("missing file arguments"));
459 if (n_files == 1 && !target_directory)
461 error (0, 0, _("missing destination file"));
465 if (target_directory)
466 dest = target_directory;
469 dest = file[n_files - 1];
473 if (lstat (dest, &sb))
477 error (0, errno, _("accessing %s"), quote (dest));
487 /* If `dest' is not a symlink to a nonexistent file, use
488 the results of stat instead of lstat, so we can copy files
489 into symlinks to directories. */
490 if (stat (dest, &sbx) == 0)
493 dest_is_dir = S_ISDIR (sb.st_mode);
498 if (target_directory)
500 error (0, 0, _("specified target, %s is not a directory"),
508 _("copying multiple files, but last argument %s is not a directory"),
516 /* cp file1...filen edir
517 Copy the files `file1' through `filen'
518 to the existing directory `edir'. */
521 for (i = 0; i < n_files; i++)
524 int parent_exists = 1; /* True if dir_name (dst_path) exists. */
525 struct dir_attr *attr_list;
526 char *arg_in_concat = NULL;
529 if (remove_trailing_slashes)
530 strip_trailing_slashes (arg);
534 /* Append all of `arg' to `dest'. */
535 dst_path = path_concat (dest, arg, &arg_in_concat);
536 if (dst_path == NULL)
539 /* For --parents, we have to make sure that the directory
540 dir_name (dst_path) exists. We may have to create a few
541 leading directories. */
542 parent_exists = !make_path_private (dst_path,
543 arg_in_concat - dst_path,
546 ? "%s -> %s\n" : NULL),
547 &attr_list, &new_dst,
553 /* Append the last component of `arg' to `dest'. */
555 ASSIGN_BASENAME_STRDUPA (arg_base, arg);
556 /* For `cp -R source/.. dest', don't copy into `dest/..'. */
557 dst_path = (STREQ (arg_base, "..")
559 : path_concat (dest, arg_base, NULL));
564 /* make_path_private failed, so don't even attempt the copy. */
570 ret |= copy (arg, dst_path, new_dst, x, ©_into_self, NULL);
575 ret |= re_protect (dst_path, arg_in_concat - dst_path,
584 else /* if (n_files == 1) */
589 struct stat source_stats;
594 _("when preserving paths, the destination must be a directory"));
600 /* When the force and backup options have been specified and
601 the source and destination are the same name for an existing
602 regular file, convert the user's command, e.g.,
603 `cp --force --backup foo foo' to `cp --force foo fooSUFFIX'
604 where SUFFIX is determined by any version control options used. */
607 && x->backup_type != none
608 && STREQ (source, dest)
609 && !new_dst && S_ISREG (sb.st_mode))
611 static struct cp_options x_tmp;
613 new_dest = find_backup_file_name (dest, x->backup_type);
614 /* Set x->backup_type to `none' so that the normal backup
615 mechanism is not used when performing the actual copy.
616 backup_type must be set to `none' only *after* the above
617 call to find_backup_file_name -- that function uses
618 backup_type to determine the suffix it applies. */
620 x_tmp.backup_type = none;
623 if (new_dest == NULL)
627 /* When the destination is specified with a trailing slash and the
628 source exists but is not a directory, convert the user's command
629 `cp source dest/' to `cp source dest/basename(source)'. Doing
630 this ensures that the command `cp non-directory file/' will now
631 fail rather than performing the copy. COPY diagnoses the case of
632 `cp directory non-directory'. */
634 else if (dest[strlen (dest) - 1] == '/'
635 && lstat (source, &source_stats) == 0
636 && !S_ISDIR (source_stats.st_mode))
640 ASSIGN_BASENAME_STRDUPA (source_base, source);
641 new_dest = (char *) alloca (strlen (dest)
642 + strlen (source_base) + 1);
643 stpcpy (stpcpy (new_dest, dest), source_base);
647 new_dest = (char *) dest;
650 return copy (source, new_dest, new_dst, x, &unused, NULL);
657 cp_option_init (struct cp_options *x)
659 x->copy_as_regular = 1;
660 x->dereference = DEREF_UNDEFINED;
662 x->failed_unlink_is_fatal = 1;
665 x->myeuid = geteuid ();
667 x->one_file_system = 0;
669 x->preserve_owner_and_group = 0;
670 x->preserve_chmod_bits = 0;
671 x->preserve_timestamps = 0;
673 x->require_preserve = 0;
675 x->sparse_mode = SPARSE_AUTO;
676 x->symbolic_link = 0;
680 /* Find out the current file creation mask, to knock the right bits
681 when using chmod. The creation mask is set to be liberal, so
682 that created directories can be written, even if it would not
683 have been allowed with the mask this process was started with. */
684 x->umask_kill = ~ umask (0);
691 main (int argc, char **argv)
694 int make_backups = 0;
695 char *backup_suffix_string;
696 char *version_control_string = NULL;
698 char *target_directory = NULL;
699 int used_P_option = 0;
701 program_name = argv[0];
702 setlocale (LC_ALL, "");
703 bindtextdomain (PACKAGE, LOCALEDIR);
704 textdomain (PACKAGE);
706 atexit (close_stdout);
710 /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
711 we'll actually use backup_suffix_string. */
712 backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
714 while ((c = getopt_long (argc, argv, "abdfHilLprsuvxPRS:V:", long_opts, NULL))
723 x.sparse_mode = XARGMATCH ("--sparse", optarg,
724 sparse_type_string, sparse_type);
727 case 'a': /* Like -dpR. */
728 x.dereference = DEREF_NEVER;
729 x.preserve_owner_and_group = 1;
730 x.preserve_chmod_bits = 1;
731 x.preserve_timestamps = 1;
732 x.require_preserve = 1;
734 x.copy_as_regular = 0;
737 case 'V': /* FIXME: this is deprecated. Remove it in 2001. */
739 _("warning: --version-control (-V) is obsolete; support for\
740 it\nwill be removed in some future release. Use --backup=%s instead."
747 version_control_string = optarg;
751 x.dereference = DEREF_NEVER;
759 x.dereference = DEREF_COMMAND_LINE_ARGUMENTS;
771 x.dereference = DEREF_ALWAYS;
775 x.preserve_owner_and_group = 1;
776 x.preserve_chmod_bits = 1;
777 x.preserve_timestamps = 1;
778 x.require_preserve = 1;
790 x.copy_as_regular = 1;
795 x.copy_as_regular = 0;
798 case STRIP_TRAILING_SLASHES_OPTION:
799 remove_trailing_slashes = 1;
806 error (1, 0, _("symbolic links are not supported on this system"));
810 case TARGET_DIRECTORY_OPTION:
811 target_directory = optarg;
823 x.one_file_system = 1;
828 backup_suffix_string = optarg;
831 case_GETOPT_HELP_CHAR;
833 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
840 if (x.hard_link && x.symbolic_link)
842 error (0, 0, _("cannot make both hard and symbolic links"));
850 Warning: the meaning of `-P' will change in the future to conform to POSIX.\n\
851 Use `--parents' for the old meaning, and `--no-dereference' for the new."));
854 if (backup_suffix_string)
855 simple_backup_suffix = xstrdup (backup_suffix_string);
857 x.backup_type = (make_backups
858 ? xget_version (_("backup type"),
859 version_control_string)
862 if (x.preserve_chmod_bits == 1)
863 x.umask_kill = ~ (mode_t) 0;
865 if (x.dereference == DEREF_UNDEFINED)
868 /* This is compatible with FreeBSD. */
869 x.dereference = DEREF_NEVER;
871 x.dereference = DEREF_ALWAYS;
874 /* The key difference between -d (--no-dereference) and not is the version
875 of `stat' to call. */
877 if (x.dereference == DEREF_NEVER)
881 /* For DEREF_COMMAND_LINE_ARGUMENTS, x.xstat must be stat for
882 each command line argument, but must later be `lstat' for
883 any symlinks that are found via recursive traversal. */
887 /* Allocate space for remembering copied and created files. */
889 hash_init (INITIAL_HASH_MODULE, INITIAL_ENTRY_TAB_SIZE);
891 exit_status |= do_copy (argc - optind, argv + optind, target_directory, &x);