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,
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 --backup[=CONTROL] make a backup of each existing destination file\n\
141 -b like --backup but does not accept an argument\n\
142 -d, --no-dereference preserve links\n\
143 -f, --force remove existing destinations, never prompt\n\
144 -i, --interactive prompt before overwrite\n\
145 -l, --link link files instead of copying\n\
146 -p, --preserve preserve file attributes if possible\n\
147 -P, --parents append source path to DIRECTORY\n\
148 -r copy recursively, non-directories as files\n\
149 WARNING: use -R instead when you might copy\n\
150 special files like FIFOs or /dev/zero\n\
151 --sparse=WHEN control creation of sparse files\n\
152 -R, --recursive copy directories recursively\n\
153 -s, --symbolic-link make symbolic links instead of copying\n\
154 -S, --suffix=SUFFIX override the usual backup suffix\n\
155 --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY\n\
156 -u, --update copy only when the SOURCE file is newer\n\
157 than the destination file or when the\n\
158 destination file is missing\n\
159 -v, --verbose explain what is being done\n\
160 -x, --one-file-system stay on this file system\n\
161 --help display this help and exit\n\
162 --version output version information and exit\n\
164 By default, sparse SOURCE files are detected by a crude heuristic and the\n\
165 corresponding DEST file is made sparse as well. That is the behavior\n\
166 selected by --sparse=auto. Specify --sparse=always to create a sparse DEST\n\
167 file whenever the SOURCE file contains a long enough sequence of zero bytes.\n\
168 Use --sparse=never to inhibit creation of sparse files.\n\
172 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
173 The version control method may be selected via the --backup option or through\n\
174 the VERSION_CONTROL environment variable. Here are the values:\n\
176 none, off never make backups (even if --backup is given)\n\
177 numbered, t make numbered backups\n\
178 existing, nil numbered if numbered backups exist, simple otherwise\n\
179 simple, never always make simple backups\n\
183 As a special case, cp makes a backup of SOURCE when the force and backup\n\
184 options are given and SOURCE and DEST are the same name for an existing,\n\
187 puts (_("\nReport bugs to <bug-fileutils@gnu.org>."));
193 /* Ensure that the parent directories of CONST_DST_PATH have the
194 correct protections, for the --parents option. This is done
195 after all copying has been completed, to allow permissions
196 that don't include user write/execute.
198 SRC_OFFSET is the index in CONST_DST_PATH of the beginning of the
199 source directory name.
201 ATTR_LIST is a null-terminated linked list of structures that
202 indicates the end of the filename of each intermediate directory
203 in CONST_DST_PATH that may need to have its attributes changed.
204 The command `cp --parents --preserve a/b/c d/e_dir' changes the
205 attributes of the directories d/e_dir/a and d/e_dir/a/b to match
206 the corresponding source directories regardless of whether they
207 existed before the `cp' command was given.
209 Return 0 if the parent of CONST_DST_PATH and any intermediate
210 directories specified by ATTR_LIST have the proper permissions
211 when done, otherwise 1. */
214 re_protect (const char *const_dst_path, int src_offset,
215 struct dir_attr *attr_list, const struct cp_options *x)
218 char *dst_path; /* A copy of CONST_DST_PATH we can change. */
219 char *src_path; /* The source name in `dst_path'. */
220 uid_t myeuid = geteuid ();
222 dst_path = (char *) alloca (strlen (const_dst_path) + 1);
223 strcpy (dst_path, const_dst_path);
224 src_path = dst_path + src_offset;
226 for (p = attr_list; p; p = p->next)
230 dst_path[p->slash_offset] = '\0';
232 if ((*(x->xstat)) (src_path, &src_sb))
234 error (0, errno, "%s", src_path);
238 /* Adjust the times (and if possible, ownership) for the copy.
239 chown turns off set[ug]id bits for non-root,
240 so do the chmod last. */
242 if (x->preserve_timestamps)
246 /* There's currently no interface to set file timestamps with
247 better than 1-second resolution, so discard any fractional
248 part of the source timestamp. */
250 utb.actime = src_sb.st_atime;
251 utb.modtime = src_sb.st_mtime;
253 if (utime (dst_path, &utb))
255 error (0, errno, _("preserving times for %s"), dst_path);
260 if (x->preserve_owner_and_group)
262 /* If non-root uses -p, it's ok if we can't preserve ownership.
263 But root probably wants to know, e.g. if NFS disallows it,
264 or if the target system doesn't support file ownership. */
265 if (chown (dst_path, src_sb.st_uid, src_sb.st_gid)
266 && ((errno != EPERM && errno != EINVAL) || myeuid == 0))
268 error (0, errno, _("preserving ownership for %s"), dst_path);
273 if (x->preserve_chmod_bits || p->is_new_dir)
275 if (chmod (dst_path, src_sb.st_mode & x->umask_kill))
277 error (0, errno, _("preserving permissions for %s"), dst_path);
282 dst_path[p->slash_offset] = '/';
287 /* Ensure that the parent directory of CONST_DIRPATH exists, for
288 the --parents option.
290 SRC_OFFSET is the index in CONST_DIRPATH (which is a destination
291 path) of the beginning of the source directory name.
292 Create any leading directories that don't already exist,
293 giving them permissions MODE.
294 If VERBOSE_FMT_STRING is nonzero, use it as a printf format
295 string for printing a message after successfully making a directory.
296 The format should take two string arguments: the names of the
297 source and destination directories.
298 Creates a linked list of attributes of intermediate directories,
299 *ATTR_LIST, for re_protect to use after calling copy.
300 Sets *NEW_DST to 1 if this function creates parent of CONST_DIRPATH.
302 Return 0 if parent of CONST_DIRPATH exists as a directory with the proper
303 permissions when done, otherwise 1. */
306 make_path_private (const char *const_dirpath, int src_offset, int mode,
307 const char *verbose_fmt_string, struct dir_attr **attr_list,
308 int *new_dst, int (*xstat)())
311 char *dirpath; /* A copy of CONST_DIRPATH we can change. */
312 char *src; /* Source name in `dirpath'. */
313 char *tmp_dst_dirname; /* Leading path of `dirpath', malloc. */
314 char *dst_dirname; /* Leading path of `dirpath', alloca. */
316 dirpath = (char *) alloca (strlen (const_dirpath) + 1);
317 strcpy (dirpath, const_dirpath);
319 src = dirpath + src_offset;
321 tmp_dst_dirname = dir_name (dirpath);
322 dst_dirname = (char *) alloca (strlen (tmp_dst_dirname) + 1);
323 strcpy (dst_dirname, tmp_dst_dirname);
324 free (tmp_dst_dirname);
328 if ((*xstat) (dst_dirname, &stats))
330 /* Parent of CONST_DIRNAME does not exist.
331 Make all missing intermediate directories. */
335 while (*slash == '/')
337 while ((slash = strchr (slash, '/')))
339 /* Add this directory to the list of directories whose modes need
341 struct dir_attr *new =
342 (struct dir_attr *) xmalloc (sizeof (struct dir_attr));
343 new->slash_offset = slash - dirpath;
344 new->next = *attr_list;
348 if ((*xstat) (dirpath, &stats))
350 /* This element of the path does not exist. We must set
351 *new_dst and new->is_new_dir inside this loop because,
352 for example, in the command `cp --parents ../a/../b/c e_dir',
353 make_path_private creates only e_dir/../a if ./b already
357 if (mkdir (dirpath, mode))
359 error (0, errno, _("cannot make directory `%s'"), dirpath);
364 if (verbose_fmt_string != NULL)
365 printf (verbose_fmt_string, src, dirpath);
368 else if (!S_ISDIR (stats.st_mode))
370 error (0, 0, _("`%s' exists but is not a directory"), dirpath);
380 /* Avoid unnecessary calls to `stat' when given
381 pathnames containing multiple adjacent slashes. */
382 while (*slash == '/')
387 /* We get here if the parent of `dirpath' already exists. */
389 else if (!S_ISDIR (stats.st_mode))
391 error (0, 0, _("`%s' exists but is not a directory"), dst_dirname);
401 /* Scan the arguments, and copy each by calling copy.
402 Return 0 if successful, 1 if any errors occur. */
405 do_copy (int n_files, char **file, const char *target_directory,
406 const struct cp_options *x)
416 error (0, 0, _("missing file arguments"));
419 if (n_files == 1 && !target_directory)
421 error (0, 0, _("missing destination file"));
425 if (target_directory)
426 dest = target_directory;
429 dest = file[n_files - 1];
433 if (lstat (dest, &sb))
437 error (0, errno, "%s", dest);
447 /* If `dest' is not a symlink to a nonexistent file, use
448 the results of stat instead of lstat, so we can copy files
449 into symlinks to directories. */
450 if (stat (dest, &sbx) == 0)
453 dest_is_dir = S_ISDIR (sb.st_mode);
458 if (target_directory)
460 error (0, 0, _("specified target, `%s' is not a directory"), dest);
467 _("copying multiple files, but last argument (%s) is not a directory"),
475 /* cp file1...filen edir
476 Copy the files `file1' through `filen'
477 to the existing directory `edir'. */
480 for (i = 0; i < n_files; i++)
484 int parent_exists = 1; /* True if dir_name (dst_path) exists. */
485 struct dir_attr *attr_list;
486 char *arg_in_concat = NULL;
489 strip_trailing_slashes (arg);
493 /* Append all of `arg' to `dest'. */
494 dst_path = path_concat (dest, arg, &arg_in_concat);
495 if (dst_path == NULL)
496 error (1, 0, _("virtual memory exhausted"));
498 /* For --parents, we have to make sure that the directory
499 dir_name (dst_path) exists. We may have to create a few
500 leading directories. */
501 parent_exists = !make_path_private (dst_path,
502 arg_in_concat - dst_path,
505 ? "%s -> %s\n" : NULL),
506 &attr_list, &new_dst,
511 /* Append the last component of `arg' to `dest'. */
513 ap = base_name (arg);
514 /* For `cp -R source/.. dest', don't copy into `dest/..'. */
515 dst_path = (STREQ (ap, "..")
517 : path_concat (dest, ap, NULL));
522 /* make_path_private failed, so don't even attempt the copy. */
528 ret |= copy (arg, dst_path, new_dst, x, ©_into_self, NULL);
533 ret |= re_protect (dst_path, arg_in_concat - dst_path,
542 else /* if (n_files == 1) */
547 struct stat source_stats;
552 _("when preserving paths, the destination must be a directory"));
558 /* When the force and backup options have been specified and
559 the source and destination are the same name for an existing
560 regular file, convert the user's command, e.g.,
561 `cp --force --backup foo foo' to `cp --force foo fooSUFFIX'
562 where SUFFIX is determined by any version control options used. */
565 && x->backup_type != none
566 && STREQ (source, dest)
567 && !new_dst && S_ISREG (sb.st_mode))
569 static struct cp_options x_tmp;
571 new_dest = find_backup_file_name (dest, x->backup_type);
572 /* Set x->backup_type to `none' so that the normal backup
573 mechanism is not used when performing the actual copy.
574 backup_type must be set to `none' only *after* the above
575 call to find_backup_file_name -- that function uses
576 backup_type to determine the suffix it applies. */
578 x_tmp.backup_type = none;
581 if (new_dest == NULL)
582 error (1, 0, _("virtual memory exhausted"));
585 /* When the destination is specified with a trailing slash and the
586 source exists but is not a directory, convert the user's command
587 `cp source dest/' to `cp source dest/basename(source)'. Doing
588 this ensures that the command `cp non-directory file/' will now
589 fail rather than performing the copy. COPY diagnoses the case of
590 `cp directory non-directory'. */
592 else if (dest[strlen (dest) - 1] == '/'
593 && lstat (source, &source_stats) == 0
594 && !S_ISDIR (source_stats.st_mode))
599 tmp_source = (char *) alloca (strlen (source) + 1);
600 strcpy (tmp_source, source);
601 strip_trailing_slashes (tmp_source);
602 source_base = base_name (tmp_source);
604 new_dest = (char *) alloca (strlen (dest)
605 + strlen (source_base) + 1);
606 stpcpy (stpcpy (new_dest, dest), source_base);
610 new_dest = (char *) dest;
613 return copy (source, new_dest, new_dst, x, &unused, NULL);
620 cp_option_init (struct cp_options *x)
622 x->copy_as_regular = 1;
625 x->failed_unlink_is_fatal = 1;
628 x->myeuid = geteuid ();
630 x->one_file_system = 0;
632 x->preserve_owner_and_group = 0;
633 x->preserve_chmod_bits = 0;
634 x->preserve_timestamps = 0;
636 x->require_preserve = 0;
638 x->sparse_mode = SPARSE_AUTO;
639 x->symbolic_link = 0;
643 /* Find out the current file creation mask, to knock the right bits
644 when using chmod. The creation mask is set to be liberal, so
645 that created directories can be written, even if it would not
646 have been allowed with the mask this process was started with. */
647 x->umask_kill = ~ umask (0);
654 main (int argc, char **argv)
657 int make_backups = 0;
658 char *backup_suffix_string;
659 char *version_control_string = NULL;
661 char *target_directory = NULL;
663 program_name = argv[0];
664 setlocale (LC_ALL, "");
665 bindtextdomain (PACKAGE, LOCALEDIR);
666 textdomain (PACKAGE);
670 /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
671 we'll actually use backup_suffix_string. */
672 backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
674 while ((c = getopt_long (argc, argv, "abdfilprsuvxPRS:V:", long_opts, NULL))
683 x.sparse_mode = XARGMATCH ("--sparse", optarg,
684 sparse_type_string, sparse_type);
687 case 'a': /* Like -dpR. */
689 x.preserve_owner_and_group = 1;
690 x.preserve_chmod_bits = 1;
691 x.preserve_timestamps = 1;
692 x.require_preserve = 1;
694 x.copy_as_regular = 0;
697 case 'V': /* FIXME: this is deprecated. Remove it in 2001. */
699 _("warning: --version-control (-V) is obsolete; support for\
700 it\nwill be removed in some future release. Use --backup=%s instead."
707 version_control_string = optarg;
729 x.preserve_owner_and_group = 1;
730 x.preserve_chmod_bits = 1;
731 x.preserve_timestamps = 1;
732 x.require_preserve = 1;
741 x.copy_as_regular = 1;
746 x.copy_as_regular = 0;
753 error (1, 0, _("symbolic links are not supported on this system"));
757 case TARGET_DIRECTORY_OPTION:
758 target_directory = optarg;
770 x.one_file_system = 1;
775 backup_suffix_string = optarg;
778 case_GETOPT_HELP_CHAR;
780 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
787 if (x.hard_link && x.symbolic_link)
789 error (0, 0, _("cannot make both hard and symbolic links"));
793 if (backup_suffix_string)
794 simple_backup_suffix = xstrdup (backup_suffix_string);
796 x.backup_type = (make_backups
797 ? xget_version (_("backup type"),
798 version_control_string)
801 if (x.preserve_chmod_bits == 1)
802 x.umask_kill = ~ (mode_t) 0;
804 /* The key difference between -d (--no-dereference) and not is the version
805 of `stat' to call. */
812 /* Allocate space for remembering copied and created files. */
814 hash_init (INITIAL_HASH_MODULE, INITIAL_ENTRY_TAB_SIZE);
816 exit_status |= do_copy (argc - optind, argv + optind, target_directory, &x);