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 {"force", no_argument, NULL, 'f'},
127 {"sparse", required_argument, NULL, SPARSE_OPTION},
128 {"interactive", no_argument, NULL, 'i'},
129 {"link", no_argument, NULL, 'l'},
130 {"no-dereference", no_argument, NULL, 'd'},
131 {"one-file-system", no_argument, NULL, 'x'},
132 {"parents", no_argument, NULL, PARENTS_OPTION},
133 {"path", no_argument, NULL, PARENTS_OPTION}, /* Deprecated. */
134 {"preserve", no_argument, NULL, 'p'},
135 {"recursive", no_argument, NULL, 'R'},
136 {"strip-trailing-slash", no_argument, NULL, STRIP_TRAILING_SLASHES_OPTION},
137 {"suffix", required_argument, NULL, 'S'},
138 {"symbolic-link", no_argument, NULL, 's'},
139 {"target-directory", required_argument, NULL, TARGET_DIRECTORY_OPTION},
140 {"update", no_argument, NULL, 'u'},
141 {"verbose", no_argument, NULL, 'v'},
142 {"version-control", required_argument, NULL, 'V'}, /* Deprecated. FIXME. */
143 {GETOPT_HELP_OPTION_DECL},
144 {GETOPT_VERSION_OPTION_DECL},
152 fprintf (stderr, _("Try `%s --help' for more information.\n"),
157 Usage: %s [OPTION]... SOURCE DEST\n\
158 or: %s [OPTION]... SOURCE... DIRECTORY\n\
159 or: %s [OPTION]... --target-directory=DIRECTORY SOURCE...\n\
161 program_name, program_name, program_name);
163 Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\
165 -a, --archive same as -dpR\n\
166 --backup[=CONTROL] make a backup of each existing destination file\n\
167 -b like --backup but does not accept an argument\n\
168 -d, --no-dereference preserve links\n\
169 -f, --force remove existing destinations, never prompt\n\
170 -i, --interactive prompt before overwrite\n\
171 -l, --link link files instead of copying\n\
172 -p, --preserve preserve file attributes if possible\n\
173 --parents append source path to DIRECTORY\n\
174 -P same as `--parents' for now; soon to change to\n\
175 produce the POSIX-mandated behavior\n\
176 -r copy recursively, non-directories as files\n\
177 WARNING: use -R instead when you might copy\n\
178 special files like FIFOs or /dev/zero\n\
179 --sparse=WHEN control creation of sparse files\n\
180 -R, --recursive copy directories recursively\n\
181 --strip-trailing-slashes remove any trailing slashes from each SOURCE\n\
183 -s, --symbolic-link make symbolic links instead of copying\n\
184 -S, --suffix=SUFFIX override the usual backup suffix\n\
185 --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY\n\
186 -u, --update copy only when the SOURCE file is newer\n\
187 than the destination file or when the\n\
188 destination file is missing\n\
189 -v, --verbose explain what is being done\n\
190 -x, --one-file-system stay on this file system\n\
191 --help display this help and exit\n\
192 --version output version information and exit\n\
194 By default, sparse SOURCE files are detected by a crude heuristic and the\n\
195 corresponding DEST file is made sparse as well. That is the behavior\n\
196 selected by --sparse=auto. Specify --sparse=always to create a sparse DEST\n\
197 file whenever the SOURCE file contains a long enough sequence of zero bytes.\n\
198 Use --sparse=never to inhibit creation of sparse files.\n\
202 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
203 The version control method may be selected via the --backup option or through\n\
204 the VERSION_CONTROL environment variable. Here are the values:\n\
206 none, off never make backups (even if --backup is given)\n\
207 numbered, t make numbered backups\n\
208 existing, nil numbered if numbered backups exist, simple otherwise\n\
209 simple, never always make simple backups\n\
213 As a special case, cp makes a backup of SOURCE when the force and backup\n\
214 options are given and SOURCE and DEST are the same name for an existing,\n\
217 puts (_("\nReport bugs to <bug-fileutils@gnu.org>."));
222 /* Ensure that the parent directories of CONST_DST_PATH have the
223 correct protections, for the --parents option. This is done
224 after all copying has been completed, to allow permissions
225 that don't include user write/execute.
227 SRC_OFFSET is the index in CONST_DST_PATH of the beginning of the
228 source directory name.
230 ATTR_LIST is a null-terminated linked list of structures that
231 indicates the end of the filename of each intermediate directory
232 in CONST_DST_PATH that may need to have its attributes changed.
233 The command `cp --parents --preserve a/b/c d/e_dir' changes the
234 attributes of the directories d/e_dir/a and d/e_dir/a/b to match
235 the corresponding source directories regardless of whether they
236 existed before the `cp' command was given.
238 Return 0 if the parent of CONST_DST_PATH and any intermediate
239 directories specified by ATTR_LIST have the proper permissions
240 when done, otherwise 1. */
243 re_protect (const char *const_dst_path, int src_offset,
244 struct dir_attr *attr_list, const struct cp_options *x)
247 char *dst_path; /* A copy of CONST_DST_PATH we can change. */
248 char *src_path; /* The source name in `dst_path'. */
249 uid_t myeuid = geteuid ();
251 dst_path = (char *) alloca (strlen (const_dst_path) + 1);
252 strcpy (dst_path, const_dst_path);
253 src_path = dst_path + src_offset;
255 for (p = attr_list; p; p = p->next)
259 dst_path[p->slash_offset] = '\0';
261 if ((*(x->xstat)) (src_path, &src_sb))
263 error (0, errno, _("getting attributes of %s"),
268 /* Adjust the times (and if possible, ownership) for the copy.
269 chown turns off set[ug]id bits for non-root,
270 so do the chmod last. */
272 if (x->preserve_timestamps)
276 /* There's currently no interface to set file timestamps with
277 better than 1-second resolution, so discard any fractional
278 part of the source timestamp. */
280 utb.actime = src_sb.st_atime;
281 utb.modtime = src_sb.st_mtime;
283 if (utime (dst_path, &utb))
285 error (0, errno, _("preserving times for %s"), quote (dst_path));
290 if (x->preserve_owner_and_group)
292 /* If non-root uses -p, it's ok if we can't preserve ownership.
293 But root probably wants to know, e.g. if NFS disallows it,
294 or if the target system doesn't support file ownership. */
295 if (chown (dst_path, src_sb.st_uid, src_sb.st_gid)
296 && ((errno != EPERM && errno != EINVAL) || myeuid == 0))
298 error (0, errno, _("preserving ownership for %s"),
304 if (x->preserve_chmod_bits || p->is_new_dir)
306 if (chmod (dst_path, src_sb.st_mode & x->umask_kill))
308 error (0, errno, _("preserving permissions for %s"),
314 dst_path[p->slash_offset] = '/';
319 /* Ensure that the parent directory of CONST_DIRPATH exists, for
320 the --parents option.
322 SRC_OFFSET is the index in CONST_DIRPATH (which is a destination
323 path) of the beginning of the source directory name.
324 Create any leading directories that don't already exist,
325 giving them permissions MODE.
326 If VERBOSE_FMT_STRING is nonzero, use it as a printf format
327 string for printing a message after successfully making a directory.
328 The format should take two string arguments: the names of the
329 source and destination directories.
330 Creates a linked list of attributes of intermediate directories,
331 *ATTR_LIST, for re_protect to use after calling copy.
332 Sets *NEW_DST to 1 if this function creates parent of CONST_DIRPATH.
334 Return 0 if parent of CONST_DIRPATH exists as a directory with the proper
335 permissions when done, otherwise 1. */
338 make_path_private (const char *const_dirpath, int src_offset, int mode,
339 const char *verbose_fmt_string, struct dir_attr **attr_list,
340 int *new_dst, int (*xstat)())
343 char *dirpath; /* A copy of CONST_DIRPATH we can change. */
344 char *src; /* Source name in `dirpath'. */
345 char *tmp_dst_dirname; /* Leading path of `dirpath', malloc. */
346 char *dst_dirname; /* Leading path of `dirpath', alloca. */
348 dirpath = (char *) alloca (strlen (const_dirpath) + 1);
349 strcpy (dirpath, const_dirpath);
351 src = dirpath + src_offset;
353 tmp_dst_dirname = dir_name (dirpath);
354 dst_dirname = (char *) alloca (strlen (tmp_dst_dirname) + 1);
355 strcpy (dst_dirname, tmp_dst_dirname);
356 free (tmp_dst_dirname);
360 if ((*xstat) (dst_dirname, &stats))
362 /* Parent of CONST_DIRNAME does not exist.
363 Make all missing intermediate directories. */
367 while (*slash == '/')
369 while ((slash = strchr (slash, '/')))
371 /* Add this directory to the list of directories whose modes need
373 struct dir_attr *new =
374 (struct dir_attr *) xmalloc (sizeof (struct dir_attr));
375 new->slash_offset = slash - dirpath;
376 new->next = *attr_list;
380 if ((*xstat) (dirpath, &stats))
382 /* This element of the path does not exist. We must set
383 *new_dst and new->is_new_dir inside this loop because,
384 for example, in the command `cp --parents ../a/../b/c e_dir',
385 make_path_private creates only e_dir/../a if ./b already
389 if (mkdir (dirpath, mode))
391 error (0, errno, _("cannot make directory %s"),
397 if (verbose_fmt_string != NULL)
398 printf (verbose_fmt_string, src, dirpath);
401 else if (!S_ISDIR (stats.st_mode))
403 error (0, 0, _("%s exists but is not a directory"),
414 /* Avoid unnecessary calls to `stat' when given
415 pathnames containing multiple adjacent slashes. */
416 while (*slash == '/')
421 /* We get here if the parent of `dirpath' already exists. */
423 else if (!S_ISDIR (stats.st_mode))
425 error (0, 0, _("%s exists but is not a directory"), quote (dst_dirname));
435 /* Scan the arguments, and copy each by calling copy.
436 Return 0 if successful, 1 if any errors occur. */
439 do_copy (int n_files, char **file, const char *target_directory,
440 const struct cp_options *x)
450 error (0, 0, _("missing file arguments"));
453 if (n_files == 1 && !target_directory)
455 error (0, 0, _("missing destination file"));
459 if (target_directory)
460 dest = target_directory;
463 dest = file[n_files - 1];
467 if (lstat (dest, &sb))
471 error (0, errno, _("accessing %s"), quote (dest));
481 /* If `dest' is not a symlink to a nonexistent file, use
482 the results of stat instead of lstat, so we can copy files
483 into symlinks to directories. */
484 if (stat (dest, &sbx) == 0)
487 dest_is_dir = S_ISDIR (sb.st_mode);
492 if (target_directory)
494 error (0, 0, _("specified target, %s is not a directory"),
502 _("copying multiple files, but last argument %s is not a directory"),
510 /* cp file1...filen edir
511 Copy the files `file1' through `filen'
512 to the existing directory `edir'. */
515 for (i = 0; i < n_files; i++)
518 int parent_exists = 1; /* True if dir_name (dst_path) exists. */
519 struct dir_attr *attr_list;
520 char *arg_in_concat = NULL;
523 if (remove_trailing_slashes)
524 strip_trailing_slashes (arg);
528 /* Append all of `arg' to `dest'. */
529 dst_path = path_concat (dest, arg, &arg_in_concat);
530 if (dst_path == NULL)
533 /* For --parents, we have to make sure that the directory
534 dir_name (dst_path) exists. We may have to create a few
535 leading directories. */
536 parent_exists = !make_path_private (dst_path,
537 arg_in_concat - dst_path,
540 ? "%s -> %s\n" : NULL),
541 &attr_list, &new_dst,
547 /* Append the last component of `arg' to `dest'. */
549 ASSIGN_BASENAME_STRDUPA (arg_base, arg);
550 /* For `cp -R source/.. dest', don't copy into `dest/..'. */
551 dst_path = (STREQ (arg_base, "..")
553 : path_concat (dest, arg_base, NULL));
558 /* make_path_private failed, so don't even attempt the copy. */
564 ret |= copy (arg, dst_path, new_dst, x, ©_into_self, NULL);
569 ret |= re_protect (dst_path, arg_in_concat - dst_path,
578 else /* if (n_files == 1) */
583 struct stat source_stats;
588 _("when preserving paths, the destination must be a directory"));
594 /* When the force and backup options have been specified and
595 the source and destination are the same name for an existing
596 regular file, convert the user's command, e.g.,
597 `cp --force --backup foo foo' to `cp --force foo fooSUFFIX'
598 where SUFFIX is determined by any version control options used. */
601 && x->backup_type != none
602 && STREQ (source, dest)
603 && !new_dst && S_ISREG (sb.st_mode))
605 static struct cp_options x_tmp;
607 new_dest = find_backup_file_name (dest, x->backup_type);
608 /* Set x->backup_type to `none' so that the normal backup
609 mechanism is not used when performing the actual copy.
610 backup_type must be set to `none' only *after* the above
611 call to find_backup_file_name -- that function uses
612 backup_type to determine the suffix it applies. */
614 x_tmp.backup_type = none;
617 if (new_dest == NULL)
621 /* When the destination is specified with a trailing slash and the
622 source exists but is not a directory, convert the user's command
623 `cp source dest/' to `cp source dest/basename(source)'. Doing
624 this ensures that the command `cp non-directory file/' will now
625 fail rather than performing the copy. COPY diagnoses the case of
626 `cp directory non-directory'. */
628 else if (dest[strlen (dest) - 1] == '/'
629 && lstat (source, &source_stats) == 0
630 && !S_ISDIR (source_stats.st_mode))
634 ASSIGN_BASENAME_STRDUPA (source_base, source);
635 new_dest = (char *) alloca (strlen (dest)
636 + strlen (source_base) + 1);
637 stpcpy (stpcpy (new_dest, dest), source_base);
641 new_dest = (char *) dest;
644 return copy (source, new_dest, new_dst, x, &unused, NULL);
651 cp_option_init (struct cp_options *x)
653 x->copy_as_regular = 1;
656 x->failed_unlink_is_fatal = 1;
659 x->myeuid = geteuid ();
661 x->one_file_system = 0;
663 x->preserve_owner_and_group = 0;
664 x->preserve_chmod_bits = 0;
665 x->preserve_timestamps = 0;
667 x->require_preserve = 0;
669 x->sparse_mode = SPARSE_AUTO;
670 x->symbolic_link = 0;
674 /* Find out the current file creation mask, to knock the right bits
675 when using chmod. The creation mask is set to be liberal, so
676 that created directories can be written, even if it would not
677 have been allowed with the mask this process was started with. */
678 x->umask_kill = ~ umask (0);
685 main (int argc, char **argv)
688 int make_backups = 0;
689 char *backup_suffix_string;
690 char *version_control_string = NULL;
692 char *target_directory = NULL;
693 int used_P_option = 0;
695 program_name = argv[0];
696 setlocale (LC_ALL, "");
697 bindtextdomain (PACKAGE, LOCALEDIR);
698 textdomain (PACKAGE);
700 atexit (close_stdout);
704 /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
705 we'll actually use backup_suffix_string. */
706 backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
708 while ((c = getopt_long (argc, argv, "abdfilprsuvxPRS:V:", long_opts, NULL))
717 x.sparse_mode = XARGMATCH ("--sparse", optarg,
718 sparse_type_string, sparse_type);
721 case 'a': /* Like -dpR. */
723 x.preserve_owner_and_group = 1;
724 x.preserve_chmod_bits = 1;
725 x.preserve_timestamps = 1;
726 x.require_preserve = 1;
728 x.copy_as_regular = 0;
731 case 'V': /* FIXME: this is deprecated. Remove it in 2001. */
733 _("warning: --version-control (-V) is obsolete; support for\
734 it\nwill be removed in some future release. Use --backup=%s instead."
741 version_control_string = optarg;
761 x.preserve_owner_and_group = 1;
762 x.preserve_chmod_bits = 1;
763 x.preserve_timestamps = 1;
764 x.require_preserve = 1;
776 x.copy_as_regular = 1;
782 x.copy_as_regular = 0;
785 case STRIP_TRAILING_SLASHES_OPTION:
786 remove_trailing_slashes = 1;
793 error (1, 0, _("symbolic links are not supported on this system"));
797 case TARGET_DIRECTORY_OPTION:
798 target_directory = optarg;
810 x.one_file_system = 1;
815 backup_suffix_string = optarg;
818 case_GETOPT_HELP_CHAR;
820 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
827 if (x.hard_link && x.symbolic_link)
829 error (0, 0, _("cannot make both hard and symbolic links"));
836 _("warning: the meaning of `-P' will change to conform with\
837 the POSIX\nspecification in an upcoming release; if you want the old\
838 behavior,\nuse the `--parents' option instead."));
841 if (backup_suffix_string)
842 simple_backup_suffix = xstrdup (backup_suffix_string);
844 x.backup_type = (make_backups
845 ? xget_version (_("backup type"),
846 version_control_string)
849 if (x.preserve_chmod_bits == 1)
850 x.umask_kill = ~ (mode_t) 0;
852 /* The key difference between -d (--no-dereference) and not is the version
853 of `stat' to call. */
860 /* Allocate space for remembering copied and created files. */
862 hash_init (INITIAL_HASH_MODULE, INITIAL_ENTRY_TAB_SIZE);
864 exit_status |= do_copy (argc - optind, argv + optind, target_directory, &x);