1 /* cp.c -- file copying (main routines)
2 Copyright (C) 89, 90, 91, 1995-1999 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,
69 void strip_trailing_slashes ();
71 /* Initial number of entries in each hash table entry's table of inodes. */
72 #define INITIAL_HASH_MODULE 100
74 /* Initial number of entries in the inode hash table. */
75 #define INITIAL_ENTRY_TAB_SIZE 70
77 /* The invocation name of this program. */
80 /* If nonzero, the command "cp x/e_file e_dir" uses "e_dir/x/e_file"
81 as its destination instead of the usual "e_dir/e_file." */
82 static int flag_path = 0;
84 static char const *const sparse_type_string[] =
86 "never", "auto", "always", 0
89 static enum Sparse_type const sparse_type[] =
91 SPARSE_NEVER, SPARSE_AUTO, SPARSE_ALWAYS
94 /* The error code to return to the system. */
95 static int exit_status = 0;
97 static struct option const long_opts[] =
99 {"archive", no_argument, NULL, 'a'},
100 {"backup", optional_argument, NULL, 'b'},
101 {"force", no_argument, NULL, 'f'},
102 {"sparse", required_argument, NULL, SPARSE_OPTION},
103 {"interactive", no_argument, NULL, 'i'},
104 {"link", no_argument, NULL, 'l'},
105 {"no-dereference", no_argument, NULL, 'd'},
106 {"one-file-system", no_argument, NULL, 'x'},
107 {"parents", no_argument, NULL, 'P'},
108 {"path", no_argument, NULL, 'P'},
109 {"preserve", no_argument, NULL, 'p'},
110 {"recursive", no_argument, NULL, 'R'},
111 {"suffix", required_argument, NULL, 'S'},
112 {"symbolic-link", no_argument, NULL, 's'},
113 {"target-directory", required_argument, NULL, TARGET_DIRECTORY_OPTION},
114 {"update", no_argument, NULL, 'u'},
115 {"verbose", no_argument, NULL, 'v'},
116 {"version-control", required_argument, NULL, 'V'}, /* Deprecated. FIXME. */
117 {GETOPT_HELP_OPTION_DECL},
118 {GETOPT_VERSION_OPTION_DECL},
126 fprintf (stderr, _("Try `%s --help' for more information.\n"),
131 Usage: %s [OPTION]... SOURCE DEST\n\
132 or: %s [OPTION]... SOURCE... DIRECTORY\n\
133 or: %s [OPTION]... --target-directory=DIRECTORY SOURCE...\n\
135 program_name, program_name, program_name);
137 Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\
139 -a, --archive same as -dpR\n\
140 -b, --backup[=CONTROL] make a backup of each existing destination file\n\
141 -d, --no-dereference preserve links\n\
142 -f, --force remove existing destinations, never prompt\n\
143 -i, --interactive prompt before overwrite\n\
144 -l, --link link files instead of copying\n\
145 -p, --preserve preserve file attributes if possible\n\
146 -P, --parents append source path to DIRECTORY\n\
147 -r copy recursively, non-directories as files\n\
148 WARNING: use -R instead when you might copy\n\
149 special files like FIFOs or /dev/zero\n\
150 --sparse=WHEN control creation of sparse files\n\
151 -R, --recursive copy directories recursively\n\
152 -s, --symbolic-link make symbolic links instead of copying\n\
153 -S, --suffix=SUFFIX override the usual backup suffix\n\
154 --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY\n\
155 -u, --update copy only when the SOURCE file is newer\n\
156 than the destination file or when the\n\
157 destination file is missing\n\
158 -v, --verbose explain what is being done\n\
159 -x, --one-file-system stay on this file system\n\
160 --help display this help and exit\n\
161 --version output version information and exit\n\
163 By default, sparse SOURCE files are detected by a crude heuristic and the\n\
164 corresponding DEST file is made sparse as well. That is the behavior\n\
165 selected by --sparse=auto. Specify --sparse=always to create a sparse DEST\n\
166 file whenever the SOURCE file contains a long enough sequence of zero bytes.\n\
167 Use --sparse=never to inhibit creation of sparse files.\n\
171 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
172 The version control method may be selected via the --backup option or through\n\
173 the VERSION_CONTROL environment variable. Here are the values:\n\
175 none, off never make backups (even if --backup is given)\n\
176 numbered, t make numbered backups\n\
177 existing, nil numbered if numbered backups exist, simple otherwise\n\
178 simple, never always make simple backups\n\
182 As a special case, cp makes a backup of SOURCE when the force and backup\n\
183 options are given and SOURCE and DEST are the same name for an existing,\n\
186 puts (_("\nReport bugs to <bug-fileutils@gnu.org>."));
192 /* Ensure that the parent directories of CONST_DST_PATH have the
193 correct protections, for the --parents option. This is done
194 after all copying has been completed, to allow permissions
195 that don't include user write/execute.
197 SRC_OFFSET is the index in CONST_DST_PATH of the beginning of the
198 source directory name.
200 ATTR_LIST is a null-terminated linked list of structures that
201 indicates the end of the filename of each intermediate directory
202 in CONST_DST_PATH that may need to have its attributes changed.
203 The command `cp --parents --preserve a/b/c d/e_dir' changes the
204 attributes of the directories d/e_dir/a and d/e_dir/a/b to match
205 the corresponding source directories regardless of whether they
206 existed before the `cp' command was given.
208 Return 0 if the parent of CONST_DST_PATH and any intermediate
209 directories specified by ATTR_LIST have the proper permissions
210 when done, otherwise 1. */
213 re_protect (const char *const_dst_path, int src_offset,
214 struct dir_attr *attr_list, const struct cp_options *x)
217 char *dst_path; /* A copy of CONST_DST_PATH we can change. */
218 char *src_path; /* The source name in `dst_path'. */
219 uid_t myeuid = geteuid ();
221 dst_path = (char *) alloca (strlen (const_dst_path) + 1);
222 strcpy (dst_path, const_dst_path);
223 src_path = dst_path + src_offset;
225 for (p = attr_list; p; p = p->next)
229 dst_path[p->slash_offset] = '\0';
231 if ((*(x->xstat)) (src_path, &src_sb))
233 error (0, errno, "%s", src_path);
237 /* Adjust the times (and if possible, ownership) for the copy.
238 chown turns off set[ug]id bits for non-root,
239 so do the chmod last. */
241 if (x->preserve_timestamps)
245 /* There's currently no interface to set file timestamps with
246 better than 1-second resolution, so discard any fractional
247 part of the source timestamp. */
249 utb.actime = src_sb.st_atime;
250 utb.modtime = src_sb.st_mtime;
252 if (utime (dst_path, &utb))
254 error (0, errno, _("preserving times for %s"), dst_path);
259 if (x->preserve_owner_and_group)
261 /* If non-root uses -p, it's ok if we can't preserve ownership.
262 But root probably wants to know, e.g. if NFS disallows it,
263 or if the target system doesn't support file ownership. */
264 if (chown (dst_path, src_sb.st_uid, src_sb.st_gid)
265 && ((errno != EPERM && errno != EINVAL) || myeuid == 0))
267 error (0, errno, _("preserving ownership for %s"), dst_path);
272 if (x->preserve_chmod_bits || p->is_new_dir)
274 if (chmod (dst_path, src_sb.st_mode & x->umask_kill))
276 error (0, errno, _("preserving permissions for %s"), dst_path);
281 dst_path[p->slash_offset] = '/';
286 /* Ensure that the parent directory of CONST_DIRPATH exists, for
287 the --parents option.
289 SRC_OFFSET is the index in CONST_DIRPATH (which is a destination
290 path) of the beginning of the source directory name.
291 Create any leading directories that don't already exist,
292 giving them permissions MODE.
293 If VERBOSE_FMT_STRING is nonzero, use it as a printf format
294 string for printing a message after successfully making a directory.
295 The format should take two string arguments: the names of the
296 source and destination directories.
297 Creates a linked list of attributes of intermediate directories,
298 *ATTR_LIST, for re_protect to use after calling copy.
299 Sets *NEW_DST to 1 if this function creates parent of CONST_DIRPATH.
301 Return 0 if parent of CONST_DIRPATH exists as a directory with the proper
302 permissions when done, otherwise 1. */
305 make_path_private (const char *const_dirpath, int src_offset, int mode,
306 const char *verbose_fmt_string, struct dir_attr **attr_list,
307 int *new_dst, int (*xstat)())
310 char *dirpath; /* A copy of CONST_DIRPATH we can change. */
311 char *src; /* Source name in `dirpath'. */
312 char *tmp_dst_dirname; /* Leading path of `dirpath', malloc. */
313 char *dst_dirname; /* Leading path of `dirpath', alloca. */
315 dirpath = (char *) alloca (strlen (const_dirpath) + 1);
316 strcpy (dirpath, const_dirpath);
318 src = dirpath + src_offset;
320 tmp_dst_dirname = dir_name (dirpath);
321 dst_dirname = (char *) alloca (strlen (tmp_dst_dirname) + 1);
322 strcpy (dst_dirname, tmp_dst_dirname);
323 free (tmp_dst_dirname);
327 if ((*xstat) (dst_dirname, &stats))
329 /* Parent of CONST_DIRNAME does not exist.
330 Make all missing intermediate directories. */
334 while (*slash == '/')
336 while ((slash = strchr (slash, '/')))
338 /* Add this directory to the list of directories whose modes need
340 struct dir_attr *new =
341 (struct dir_attr *) xmalloc (sizeof (struct dir_attr));
342 new->slash_offset = slash - dirpath;
343 new->next = *attr_list;
347 if ((*xstat) (dirpath, &stats))
349 /* This element of the path does not exist. We must set
350 *new_dst and new->is_new_dir inside this loop because,
351 for example, in the command `cp --parents ../a/../b/c e_dir',
352 make_path_private creates only e_dir/../a if ./b already
356 if (mkdir (dirpath, mode))
358 error (0, errno, _("cannot make directory `%s'"), dirpath);
363 if (verbose_fmt_string != NULL)
364 printf (verbose_fmt_string, src, dirpath);
367 else if (!S_ISDIR (stats.st_mode))
369 error (0, 0, _("`%s' exists but is not a directory"), dirpath);
379 /* Avoid unnecessary calls to `stat' when given
380 pathnames containing multiple adjacent slashes. */
381 while (*slash == '/')
386 /* We get here if the parent of `dirpath' already exists. */
388 else if (!S_ISDIR (stats.st_mode))
390 error (0, 0, _("`%s' exists but is not a directory"), dst_dirname);
400 /* Scan the arguments, and copy each by calling copy.
401 Return 0 if successful, 1 if any errors occur. */
404 do_copy (int n_files, char **file, const char *target_directory,
405 const struct cp_options *x)
415 error (0, 0, _("missing file arguments"));
418 if (n_files == 1 && !target_directory)
420 error (0, 0, _("missing destination file"));
424 if (target_directory)
425 dest = target_directory;
428 dest = file[n_files - 1];
432 if (lstat (dest, &sb))
436 error (0, errno, "%s", dest);
446 /* If `dest' is not a symlink to a nonexistent file, use
447 the results of stat instead of lstat, so we can copy files
448 into symlinks to directories. */
449 if (stat (dest, &sbx) == 0)
452 dest_is_dir = S_ISDIR (sb.st_mode);
457 if (target_directory)
459 error (0, 0, _("specified target, `%s' is not a directory"), dest);
466 _("copying multiple files, but last argument (%s) is not a directory"),
474 /* cp file1...filen edir
475 Copy the files `file1' through `filen'
476 to the existing directory `edir'. */
479 for (i = 0; i < n_files; i++)
483 int parent_exists = 1; /* True if dir_name (dst_path) exists. */
484 struct dir_attr *attr_list;
485 char *arg_in_concat = NULL;
488 strip_trailing_slashes (arg);
492 /* Append all of `arg' to `dest'. */
493 dst_path = path_concat (dest, arg, &arg_in_concat);
494 if (dst_path == NULL)
495 error (1, 0, _("virtual memory exhausted"));
497 /* For --parents, we have to make sure that the directory
498 dir_name (dst_path) exists. We may have to create a few
499 leading directories. */
500 parent_exists = !make_path_private (dst_path,
501 arg_in_concat - dst_path,
504 ? "%s -> %s\n" : NULL),
505 &attr_list, &new_dst,
510 /* Append the last component of `arg' to `dest'. */
512 ap = base_name (arg);
513 /* For `cp -R source/.. dest', don't copy into `dest/..'. */
514 dst_path = (STREQ (ap, "..")
516 : path_concat (dest, ap, NULL));
521 /* make_path_private failed, so don't even attempt the copy. */
527 ret |= copy (arg, dst_path, new_dst, x, ©_into_self, NULL);
532 ret |= re_protect (dst_path, arg_in_concat - dst_path,
541 else /* if (n_files == 1) */
546 struct stat source_stats;
551 _("when preserving paths, the destination must be a directory"));
557 /* When the force and backup options have been specified and
558 the source and destination are the same name for an existing
559 regular file, convert the user's command, e.g.,
560 `cp --force --backup foo foo' to `cp --force foo fooSUFFIX'
561 where SUFFIX is determined by any version control options used. */
564 && x->backup_type != none
565 && STREQ (source, dest)
566 && !new_dst && S_ISREG (sb.st_mode))
568 static struct cp_options x_tmp;
570 new_dest = find_backup_file_name (dest, x->backup_type);
571 /* Set x->backup_type to `none' so that the normal backup
572 mechanism is not used when performing the actual copy.
573 backup_type must be set to `none' only *after* the above
574 call to find_backup_file_name -- that function uses
575 backup_type to determine the suffix it applies. */
577 x_tmp.backup_type = none;
580 if (new_dest == NULL)
581 error (1, 0, _("virtual memory exhausted"));
584 /* When the destination is specified with a trailing slash and the
585 source exists but is not a directory, convert the user's command
586 `cp source dest/' to `cp source dest/basename(source)'. Doing
587 this ensures that the command `cp non-directory file/' will now
588 fail rather than performing the copy. COPY diagnoses the case of
589 `cp directory non-directory'. */
591 else if (dest[strlen (dest) - 1] == '/'
592 && lstat (source, &source_stats) == 0
593 && !S_ISDIR (source_stats.st_mode))
598 tmp_source = (char *) alloca (strlen (source) + 1);
599 strcpy (tmp_source, source);
600 strip_trailing_slashes (tmp_source);
601 source_base = base_name (tmp_source);
603 new_dest = (char *) alloca (strlen (dest)
604 + strlen (source_base) + 1);
605 stpcpy (stpcpy (new_dest, dest), source_base);
609 new_dest = (char *) dest;
612 return copy (source, new_dest, new_dst, x, &unused, NULL);
619 cp_option_init (struct cp_options *x)
621 x->copy_as_regular = 1;
624 x->failed_unlink_is_fatal = 1;
627 x->myeuid = geteuid ();
629 x->one_file_system = 0;
631 x->preserve_owner_and_group = 0;
632 x->preserve_chmod_bits = 0;
633 x->preserve_timestamps = 0;
635 x->require_preserve = 0;
637 x->sparse_mode = SPARSE_AUTO;
638 x->symbolic_link = 0;
642 /* Find out the current file creation mask, to knock the right bits
643 when using chmod. The creation mask is set to be liberal, so
644 that created directories can be written, even if it would not
645 have been allowed with the mask this process was started with. */
646 x->umask_kill = ~ umask (0);
653 main (int argc, char **argv)
656 int make_backups = 0;
657 char *backup_suffix_string;
658 char *version_control_string = NULL;
660 char *target_directory = NULL;
662 program_name = argv[0];
663 setlocale (LC_ALL, "");
664 bindtextdomain (PACKAGE, LOCALEDIR);
665 textdomain (PACKAGE);
669 /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
670 we'll actually use backup_suffix_string. */
671 backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
673 while ((c = getopt_long (argc, argv, "abdfilprsuvxPRS:V:", long_opts, NULL))
682 x.sparse_mode = XARGMATCH ("--sparse", optarg,
683 sparse_type_string, sparse_type);
686 case 'a': /* Like -dpR. */
688 x.preserve_owner_and_group = 1;
689 x.preserve_chmod_bits = 1;
690 x.preserve_timestamps = 1;
691 x.require_preserve = 1;
693 x.copy_as_regular = 0;
696 case 'V': /* FIXME: this is deprecated. Remove it in 2001. */
698 _("warning: --version-control (-V) is obsolete; support for\
699 it\nwill be removed in some future release. Use --backup=%s instead."
706 version_control_string = optarg;
728 x.preserve_owner_and_group = 1;
729 x.preserve_chmod_bits = 1;
730 x.preserve_timestamps = 1;
731 x.require_preserve = 1;
740 x.copy_as_regular = 1;
745 x.copy_as_regular = 0;
752 error (1, 0, _("symbolic links are not supported on this system"));
756 case TARGET_DIRECTORY_OPTION:
757 target_directory = optarg;
769 x.one_file_system = 1;
774 backup_suffix_string = optarg;
777 case_GETOPT_HELP_CHAR;
779 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
786 if (x.hard_link && x.symbolic_link)
788 error (0, 0, _("cannot make both hard and symbolic links"));
792 if (backup_suffix_string)
793 simple_backup_suffix = xstrdup (backup_suffix_string);
795 x.backup_type = (make_backups
796 ? xget_version (_("--version-control"),
797 version_control_string)
800 if (x.preserve_chmod_bits == 1)
801 x.umask_kill = ~ (mode_t) 0;
803 /* The key difference between -d (--no-dereference) and not is the version
804 of `stat' to call. */
811 /* Allocate space for remembering copied and created files. */
813 hash_init (INITIAL_HASH_MODULE, INITIAL_ENTRY_TAB_SIZE);
815 exit_status |= do_copy (argc - optind, argv + optind, target_directory, &x);