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"
39 /* The official name of this program (e.g., no `g' prefix). */
40 #define PROGRAM_NAME "cp"
42 #define AUTHORS "Torbjorn Granlund, David MacKenzie, and Jim Meyering"
44 #ifndef _POSIX_VERSION
48 /* Used by do_copy, make_path_private, and re_protect
49 to keep a list of leading directories whose protections
50 need to be fixed after copying. */
55 struct dir_attr *next;
58 /* For long options that have no equivalent short option, use a
59 non-character as a pseudo short option, starting with CHAR_MAX + 1. */
62 TARGET_DIRECTORY_OPTION = CHAR_MAX + 1,
64 STRIP_TRAILING_SLASHES_OPTION
70 /* Arrange to make lstat calls go through the wrapper function
71 on systems with an lstat function that does not dereference symlinks
72 that are specified with a trailing slash. */
73 #if ! LSTAT_FOLLOWS_SLASHED_SYMLINK
74 int rpl_lstat PARAMS((const char *, struct stat *));
76 # define lstat rpl_lstat
79 void strip_trailing_slashes ();
81 /* Initial number of entries in each hash table entry's table of inodes. */
82 #define INITIAL_HASH_MODULE 100
84 /* Initial number of entries in the inode hash table. */
85 #define INITIAL_ENTRY_TAB_SIZE 70
87 /* The invocation name of this program. */
90 /* If nonzero, the command "cp x/e_file e_dir" uses "e_dir/x/e_file"
91 as its destination instead of the usual "e_dir/e_file." */
92 static int flag_path = 0;
94 /* Remove any trailing slashes from each SOURCE argument. */
95 static int remove_trailing_slashes;
97 static char const *const sparse_type_string[] =
99 "never", "auto", "always", 0
102 static enum Sparse_type const sparse_type[] =
104 SPARSE_NEVER, SPARSE_AUTO, SPARSE_ALWAYS
107 /* The error code to return to the system. */
108 static int exit_status = 0;
110 static struct option const long_opts[] =
112 {"archive", no_argument, NULL, 'a'},
113 {"backup", optional_argument, NULL, 'b'},
114 {"force", no_argument, NULL, 'f'},
115 {"sparse", required_argument, NULL, SPARSE_OPTION},
116 {"interactive", no_argument, NULL, 'i'},
117 {"link", no_argument, NULL, 'l'},
118 {"no-dereference", no_argument, NULL, 'd'},
119 {"one-file-system", no_argument, NULL, 'x'},
120 {"parents", no_argument, NULL, 'P'},
121 {"path", no_argument, NULL, 'P'},
122 {"preserve", no_argument, NULL, 'p'},
123 {"recursive", no_argument, NULL, 'R'},
124 {"strip-trailing-slash", no_argument, NULL, STRIP_TRAILING_SLASHES_OPTION},
125 {"suffix", required_argument, NULL, 'S'},
126 {"symbolic-link", no_argument, NULL, 's'},
127 {"target-directory", required_argument, NULL, TARGET_DIRECTORY_OPTION},
128 {"update", no_argument, NULL, 'u'},
129 {"verbose", no_argument, NULL, 'v'},
130 {"version-control", required_argument, NULL, 'V'}, /* Deprecated. FIXME. */
131 {GETOPT_HELP_OPTION_DECL},
132 {GETOPT_VERSION_OPTION_DECL},
140 fprintf (stderr, _("Try `%s --help' for more information.\n"),
145 Usage: %s [OPTION]... SOURCE DEST\n\
146 or: %s [OPTION]... SOURCE... DIRECTORY\n\
147 or: %s [OPTION]... --target-directory=DIRECTORY SOURCE...\n\
149 program_name, program_name, program_name);
151 Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\
153 -a, --archive same as -dpR\n\
154 --backup[=CONTROL] make a backup of each existing destination file\n\
155 -b like --backup but does not accept an argument\n\
156 -d, --no-dereference preserve links\n\
157 -f, --force remove existing destinations, never prompt\n\
158 -i, --interactive prompt before overwrite\n\
159 -l, --link link files instead of copying\n\
160 -p, --preserve preserve file attributes if possible\n\
161 -P, --parents append source path to DIRECTORY\n\
162 -r copy recursively, non-directories as files\n\
163 WARNING: use -R instead when you might copy\n\
164 special files like FIFOs or /dev/zero\n\
165 --sparse=WHEN control creation of sparse files\n\
166 -R, --recursive copy directories recursively\n\
167 --strip-trailing-slashes remove any trailing slashes from each SOURCE\n\
169 -s, --symbolic-link make symbolic links instead of copying\n\
170 -S, --suffix=SUFFIX override the usual backup suffix\n\
171 --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY\n\
172 -u, --update copy only when the SOURCE file is newer\n\
173 than the destination file or when the\n\
174 destination file is missing\n\
175 -v, --verbose explain what is being done\n\
176 -x, --one-file-system stay on this file system\n\
177 --help display this help and exit\n\
178 --version output version information and exit\n\
180 By default, sparse SOURCE files are detected by a crude heuristic and the\n\
181 corresponding DEST file is made sparse as well. That is the behavior\n\
182 selected by --sparse=auto. Specify --sparse=always to create a sparse DEST\n\
183 file whenever the SOURCE file contains a long enough sequence of zero bytes.\n\
184 Use --sparse=never to inhibit creation of sparse files.\n\
188 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
189 The version control method may be selected via the --backup option or through\n\
190 the VERSION_CONTROL environment variable. Here are the values:\n\
192 none, off never make backups (even if --backup is given)\n\
193 numbered, t make numbered backups\n\
194 existing, nil numbered if numbered backups exist, simple otherwise\n\
195 simple, never always make simple backups\n\
199 As a special case, cp makes a backup of SOURCE when the force and backup\n\
200 options are given and SOURCE and DEST are the same name for an existing,\n\
203 puts (_("\nReport bugs to <bug-fileutils@gnu.org>."));
208 /* Ensure that the parent directories of CONST_DST_PATH have the
209 correct protections, for the --parents option. This is done
210 after all copying has been completed, to allow permissions
211 that don't include user write/execute.
213 SRC_OFFSET is the index in CONST_DST_PATH of the beginning of the
214 source directory name.
216 ATTR_LIST is a null-terminated linked list of structures that
217 indicates the end of the filename of each intermediate directory
218 in CONST_DST_PATH that may need to have its attributes changed.
219 The command `cp --parents --preserve a/b/c d/e_dir' changes the
220 attributes of the directories d/e_dir/a and d/e_dir/a/b to match
221 the corresponding source directories regardless of whether they
222 existed before the `cp' command was given.
224 Return 0 if the parent of CONST_DST_PATH and any intermediate
225 directories specified by ATTR_LIST have the proper permissions
226 when done, otherwise 1. */
229 re_protect (const char *const_dst_path, int src_offset,
230 struct dir_attr *attr_list, const struct cp_options *x)
233 char *dst_path; /* A copy of CONST_DST_PATH we can change. */
234 char *src_path; /* The source name in `dst_path'. */
235 uid_t myeuid = geteuid ();
237 dst_path = (char *) alloca (strlen (const_dst_path) + 1);
238 strcpy (dst_path, const_dst_path);
239 src_path = dst_path + src_offset;
241 for (p = attr_list; p; p = p->next)
245 dst_path[p->slash_offset] = '\0';
247 if ((*(x->xstat)) (src_path, &src_sb))
249 error (0, errno, "%s", src_path);
253 /* Adjust the times (and if possible, ownership) for the copy.
254 chown turns off set[ug]id bits for non-root,
255 so do the chmod last. */
257 if (x->preserve_timestamps)
261 /* There's currently no interface to set file timestamps with
262 better than 1-second resolution, so discard any fractional
263 part of the source timestamp. */
265 utb.actime = src_sb.st_atime;
266 utb.modtime = src_sb.st_mtime;
268 if (utime (dst_path, &utb))
270 error (0, errno, _("preserving times for %s"), dst_path);
275 if (x->preserve_owner_and_group)
277 /* If non-root uses -p, it's ok if we can't preserve ownership.
278 But root probably wants to know, e.g. if NFS disallows it,
279 or if the target system doesn't support file ownership. */
280 if (chown (dst_path, src_sb.st_uid, src_sb.st_gid)
281 && ((errno != EPERM && errno != EINVAL) || myeuid == 0))
283 error (0, errno, _("preserving ownership for %s"), dst_path);
288 if (x->preserve_chmod_bits || p->is_new_dir)
290 if (chmod (dst_path, src_sb.st_mode & x->umask_kill))
292 error (0, errno, _("preserving permissions for %s"), dst_path);
297 dst_path[p->slash_offset] = '/';
302 /* Ensure that the parent directory of CONST_DIRPATH exists, for
303 the --parents option.
305 SRC_OFFSET is the index in CONST_DIRPATH (which is a destination
306 path) of the beginning of the source directory name.
307 Create any leading directories that don't already exist,
308 giving them permissions MODE.
309 If VERBOSE_FMT_STRING is nonzero, use it as a printf format
310 string for printing a message after successfully making a directory.
311 The format should take two string arguments: the names of the
312 source and destination directories.
313 Creates a linked list of attributes of intermediate directories,
314 *ATTR_LIST, for re_protect to use after calling copy.
315 Sets *NEW_DST to 1 if this function creates parent of CONST_DIRPATH.
317 Return 0 if parent of CONST_DIRPATH exists as a directory with the proper
318 permissions when done, otherwise 1. */
321 make_path_private (const char *const_dirpath, int src_offset, int mode,
322 const char *verbose_fmt_string, struct dir_attr **attr_list,
323 int *new_dst, int (*xstat)())
326 char *dirpath; /* A copy of CONST_DIRPATH we can change. */
327 char *src; /* Source name in `dirpath'. */
328 char *tmp_dst_dirname; /* Leading path of `dirpath', malloc. */
329 char *dst_dirname; /* Leading path of `dirpath', alloca. */
331 dirpath = (char *) alloca (strlen (const_dirpath) + 1);
332 strcpy (dirpath, const_dirpath);
334 src = dirpath + src_offset;
336 tmp_dst_dirname = dir_name (dirpath);
337 dst_dirname = (char *) alloca (strlen (tmp_dst_dirname) + 1);
338 strcpy (dst_dirname, tmp_dst_dirname);
339 free (tmp_dst_dirname);
343 if ((*xstat) (dst_dirname, &stats))
345 /* Parent of CONST_DIRNAME does not exist.
346 Make all missing intermediate directories. */
350 while (*slash == '/')
352 while ((slash = strchr (slash, '/')))
354 /* Add this directory to the list of directories whose modes need
356 struct dir_attr *new =
357 (struct dir_attr *) xmalloc (sizeof (struct dir_attr));
358 new->slash_offset = slash - dirpath;
359 new->next = *attr_list;
363 if ((*xstat) (dirpath, &stats))
365 /* This element of the path does not exist. We must set
366 *new_dst and new->is_new_dir inside this loop because,
367 for example, in the command `cp --parents ../a/../b/c e_dir',
368 make_path_private creates only e_dir/../a if ./b already
372 if (mkdir (dirpath, mode))
374 error (0, errno, _("cannot make directory `%s'"), dirpath);
379 if (verbose_fmt_string != NULL)
380 printf (verbose_fmt_string, src, dirpath);
383 else if (!S_ISDIR (stats.st_mode))
385 error (0, 0, _("`%s' exists but is not a directory"), dirpath);
395 /* Avoid unnecessary calls to `stat' when given
396 pathnames containing multiple adjacent slashes. */
397 while (*slash == '/')
402 /* We get here if the parent of `dirpath' already exists. */
404 else if (!S_ISDIR (stats.st_mode))
406 error (0, 0, _("`%s' exists but is not a directory"), dst_dirname);
416 /* Scan the arguments, and copy each by calling copy.
417 Return 0 if successful, 1 if any errors occur. */
420 do_copy (int n_files, char **file, const char *target_directory,
421 const struct cp_options *x)
431 error (0, 0, _("missing file arguments"));
434 if (n_files == 1 && !target_directory)
436 error (0, 0, _("missing destination file"));
440 if (target_directory)
441 dest = target_directory;
444 dest = file[n_files - 1];
448 if (lstat (dest, &sb))
452 error (0, errno, "%s", dest);
462 /* If `dest' is not a symlink to a nonexistent file, use
463 the results of stat instead of lstat, so we can copy files
464 into symlinks to directories. */
465 if (stat (dest, &sbx) == 0)
468 dest_is_dir = S_ISDIR (sb.st_mode);
473 if (target_directory)
475 error (0, 0, _("specified target, `%s' is not a directory"), dest);
482 _("copying multiple files, but last argument (%s) is not a directory"),
490 /* cp file1...filen edir
491 Copy the files `file1' through `filen'
492 to the existing directory `edir'. */
495 for (i = 0; i < n_files; i++)
499 int parent_exists = 1; /* True if dir_name (dst_path) exists. */
500 struct dir_attr *attr_list;
501 char *arg_in_concat = NULL;
504 if (remove_trailing_slashes)
505 strip_trailing_slashes (arg);
509 /* Append all of `arg' to `dest'. */
510 dst_path = path_concat (dest, arg, &arg_in_concat);
511 if (dst_path == NULL)
512 error (1, 0, _("virtual memory exhausted"));
514 /* For --parents, we have to make sure that the directory
515 dir_name (dst_path) exists. We may have to create a few
516 leading directories. */
517 parent_exists = !make_path_private (dst_path,
518 arg_in_concat - dst_path,
521 ? "%s -> %s\n" : NULL),
522 &attr_list, &new_dst,
527 /* Append the last component of `arg' to `dest'. */
529 ap = base_name (arg);
530 /* For `cp -R source/.. dest', don't copy into `dest/..'. */
531 dst_path = (STREQ (ap, "..")
533 : path_concat (dest, ap, NULL));
538 /* make_path_private failed, so don't even attempt the copy. */
544 ret |= copy (arg, dst_path, new_dst, x, ©_into_self, NULL);
549 ret |= re_protect (dst_path, arg_in_concat - dst_path,
558 else /* if (n_files == 1) */
563 struct stat source_stats;
568 _("when preserving paths, the destination must be a directory"));
574 /* When the force and backup options have been specified and
575 the source and destination are the same name for an existing
576 regular file, convert the user's command, e.g.,
577 `cp --force --backup foo foo' to `cp --force foo fooSUFFIX'
578 where SUFFIX is determined by any version control options used. */
581 && x->backup_type != none
582 && STREQ (source, dest)
583 && !new_dst && S_ISREG (sb.st_mode))
585 static struct cp_options x_tmp;
587 new_dest = find_backup_file_name (dest, x->backup_type);
588 /* Set x->backup_type to `none' so that the normal backup
589 mechanism is not used when performing the actual copy.
590 backup_type must be set to `none' only *after* the above
591 call to find_backup_file_name -- that function uses
592 backup_type to determine the suffix it applies. */
594 x_tmp.backup_type = none;
597 if (new_dest == NULL)
598 error (1, 0, _("virtual memory exhausted"));
601 /* When the destination is specified with a trailing slash and the
602 source exists but is not a directory, convert the user's command
603 `cp source dest/' to `cp source dest/basename(source)'. Doing
604 this ensures that the command `cp non-directory file/' will now
605 fail rather than performing the copy. COPY diagnoses the case of
606 `cp directory non-directory'. */
608 else if (dest[strlen (dest) - 1] == '/'
609 && lstat (source, &source_stats) == 0
610 && !S_ISDIR (source_stats.st_mode))
615 tmp_source = (char *) alloca (strlen (source) + 1);
616 strcpy (tmp_source, source);
617 if (remove_trailing_slashes)
618 strip_trailing_slashes (tmp_source);
619 source_base = base_name (tmp_source);
621 new_dest = (char *) alloca (strlen (dest)
622 + strlen (source_base) + 1);
623 stpcpy (stpcpy (new_dest, dest), source_base);
627 new_dest = (char *) dest;
630 return copy (source, new_dest, new_dst, x, &unused, NULL);
637 cp_option_init (struct cp_options *x)
639 x->copy_as_regular = 1;
642 x->failed_unlink_is_fatal = 1;
645 x->myeuid = geteuid ();
647 x->one_file_system = 0;
649 x->preserve_owner_and_group = 0;
650 x->preserve_chmod_bits = 0;
651 x->preserve_timestamps = 0;
653 x->require_preserve = 0;
655 x->sparse_mode = SPARSE_AUTO;
656 x->symbolic_link = 0;
660 /* Find out the current file creation mask, to knock the right bits
661 when using chmod. The creation mask is set to be liberal, so
662 that created directories can be written, even if it would not
663 have been allowed with the mask this process was started with. */
664 x->umask_kill = ~ umask (0);
671 main (int argc, char **argv)
674 int make_backups = 0;
675 char *backup_suffix_string;
676 char *version_control_string = NULL;
678 char *target_directory = NULL;
680 program_name = argv[0];
681 setlocale (LC_ALL, "");
682 bindtextdomain (PACKAGE, LOCALEDIR);
683 textdomain (PACKAGE);
685 atexit (close_stdout);
689 /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
690 we'll actually use backup_suffix_string. */
691 backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
693 while ((c = getopt_long (argc, argv, "abdfilprsuvxPRS:V:", long_opts, NULL))
702 x.sparse_mode = XARGMATCH ("--sparse", optarg,
703 sparse_type_string, sparse_type);
706 case 'a': /* Like -dpR. */
708 x.preserve_owner_and_group = 1;
709 x.preserve_chmod_bits = 1;
710 x.preserve_timestamps = 1;
711 x.require_preserve = 1;
713 x.copy_as_regular = 0;
716 case 'V': /* FIXME: this is deprecated. Remove it in 2001. */
718 _("warning: --version-control (-V) is obsolete; support for\
719 it\nwill be removed in some future release. Use --backup=%s instead."
726 version_control_string = optarg;
746 x.preserve_owner_and_group = 1;
747 x.preserve_chmod_bits = 1;
748 x.preserve_timestamps = 1;
749 x.require_preserve = 1;
758 x.copy_as_regular = 1;
763 x.copy_as_regular = 0;
766 case STRIP_TRAILING_SLASHES_OPTION:
767 remove_trailing_slashes = 1;
774 error (1, 0, _("symbolic links are not supported on this system"));
778 case TARGET_DIRECTORY_OPTION:
779 target_directory = optarg;
791 x.one_file_system = 1;
796 backup_suffix_string = optarg;
799 case_GETOPT_HELP_CHAR;
801 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
808 if (x.hard_link && x.symbolic_link)
810 error (0, 0, _("cannot make both hard and symbolic links"));
814 if (backup_suffix_string)
815 simple_backup_suffix = xstrdup (backup_suffix_string);
817 x.backup_type = (make_backups
818 ? xget_version (_("backup type"),
819 version_control_string)
822 if (x.preserve_chmod_bits == 1)
823 x.umask_kill = ~ (mode_t) 0;
825 /* The key difference between -d (--no-dereference) and not is the version
826 of `stat' to call. */
833 /* Allocate space for remembering copied and created files. */
835 hash_init (INITIAL_HASH_MODULE, INITIAL_ENTRY_TAB_SIZE);
837 exit_status |= do_copy (argc - optind, argv + optind, target_directory, &x);