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
81 /* Arrange to make lstat calls go through the wrapper function
82 on systems with an lstat function that does not dereference symlinks
83 that are specified with a trailing slash. */
84 #if ! LSTAT_FOLLOWS_SLASHED_SYMLINK
85 int rpl_lstat PARAMS((const char *, struct stat *));
87 # define lstat rpl_lstat
90 void strip_trailing_slashes ();
92 /* Initial number of entries in each hash table entry's table of inodes. */
93 #define INITIAL_HASH_MODULE 100
95 /* Initial number of entries in the inode hash table. */
96 #define INITIAL_ENTRY_TAB_SIZE 70
98 /* The invocation name of this program. */
101 /* If nonzero, the command "cp x/e_file e_dir" uses "e_dir/x/e_file"
102 as its destination instead of the usual "e_dir/e_file." */
103 static int flag_path = 0;
105 /* Remove any trailing slashes from each SOURCE argument. */
106 static int remove_trailing_slashes;
108 static char const *const sparse_type_string[] =
110 "never", "auto", "always", 0
113 static enum Sparse_type const sparse_type[] =
115 SPARSE_NEVER, SPARSE_AUTO, SPARSE_ALWAYS
118 /* The error code to return to the system. */
119 static int exit_status = 0;
121 static struct option const long_opts[] =
123 {"archive", no_argument, NULL, 'a'},
124 {"backup", optional_argument, NULL, 'b'},
125 {"force", no_argument, NULL, 'f'},
126 {"sparse", required_argument, NULL, SPARSE_OPTION},
127 {"interactive", no_argument, NULL, 'i'},
128 {"link", no_argument, NULL, 'l'},
129 {"no-dereference", no_argument, NULL, 'd'},
130 {"one-file-system", no_argument, NULL, 'x'},
131 {"parents", no_argument, NULL, 'P'},
132 {"path", no_argument, NULL, 'P'},
133 {"preserve", no_argument, NULL, 'p'},
134 {"recursive", no_argument, NULL, 'R'},
135 {"strip-trailing-slash", no_argument, NULL, STRIP_TRAILING_SLASHES_OPTION},
136 {"suffix", required_argument, NULL, 'S'},
137 {"symbolic-link", no_argument, NULL, 's'},
138 {"target-directory", required_argument, NULL, TARGET_DIRECTORY_OPTION},
139 {"update", no_argument, NULL, 'u'},
140 {"verbose", no_argument, NULL, 'v'},
141 {"version-control", required_argument, NULL, 'V'}, /* Deprecated. FIXME. */
142 {GETOPT_HELP_OPTION_DECL},
143 {GETOPT_VERSION_OPTION_DECL},
151 fprintf (stderr, _("Try `%s --help' for more information.\n"),
156 Usage: %s [OPTION]... SOURCE DEST\n\
157 or: %s [OPTION]... SOURCE... DIRECTORY\n\
158 or: %s [OPTION]... --target-directory=DIRECTORY SOURCE...\n\
160 program_name, program_name, program_name);
162 Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\
164 -a, --archive same as -dpR\n\
165 --backup[=CONTROL] make a backup of each existing destination file\n\
166 -b like --backup but does not accept an argument\n\
167 -d, --no-dereference preserve links\n\
168 -f, --force remove existing destinations, never prompt\n\
169 -i, --interactive prompt before overwrite\n\
170 -l, --link link files instead of copying\n\
171 -p, --preserve preserve file attributes if possible\n\
172 -P, --parents append source path to DIRECTORY\n\
173 -r copy recursively, non-directories as files\n\
174 WARNING: use -R instead when you might copy\n\
175 special files like FIFOs or /dev/zero\n\
176 --sparse=WHEN control creation of sparse files\n\
177 -R, --recursive copy directories recursively\n\
178 --strip-trailing-slashes remove any trailing slashes from each SOURCE\n\
180 -s, --symbolic-link make symbolic links instead of copying\n\
181 -S, --suffix=SUFFIX override the usual backup suffix\n\
182 --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY\n\
183 -u, --update copy only when the SOURCE file is newer\n\
184 than the destination file or when the\n\
185 destination file is missing\n\
186 -v, --verbose explain what is being done\n\
187 -x, --one-file-system stay on this file system\n\
188 --help display this help and exit\n\
189 --version output version information and exit\n\
191 By default, sparse SOURCE files are detected by a crude heuristic and the\n\
192 corresponding DEST file is made sparse as well. That is the behavior\n\
193 selected by --sparse=auto. Specify --sparse=always to create a sparse DEST\n\
194 file whenever the SOURCE file contains a long enough sequence of zero bytes.\n\
195 Use --sparse=never to inhibit creation of sparse files.\n\
199 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
200 The version control method may be selected via the --backup option or through\n\
201 the VERSION_CONTROL environment variable. Here are the values:\n\
203 none, off never make backups (even if --backup is given)\n\
204 numbered, t make numbered backups\n\
205 existing, nil numbered if numbered backups exist, simple otherwise\n\
206 simple, never always make simple backups\n\
210 As a special case, cp makes a backup of SOURCE when the force and backup\n\
211 options are given and SOURCE and DEST are the same name for an existing,\n\
214 puts (_("\nReport bugs to <bug-fileutils@gnu.org>."));
219 /* Ensure that the parent directories of CONST_DST_PATH have the
220 correct protections, for the --parents option. This is done
221 after all copying has been completed, to allow permissions
222 that don't include user write/execute.
224 SRC_OFFSET is the index in CONST_DST_PATH of the beginning of the
225 source directory name.
227 ATTR_LIST is a null-terminated linked list of structures that
228 indicates the end of the filename of each intermediate directory
229 in CONST_DST_PATH that may need to have its attributes changed.
230 The command `cp --parents --preserve a/b/c d/e_dir' changes the
231 attributes of the directories d/e_dir/a and d/e_dir/a/b to match
232 the corresponding source directories regardless of whether they
233 existed before the `cp' command was given.
235 Return 0 if the parent of CONST_DST_PATH and any intermediate
236 directories specified by ATTR_LIST have the proper permissions
237 when done, otherwise 1. */
240 re_protect (const char *const_dst_path, int src_offset,
241 struct dir_attr *attr_list, const struct cp_options *x)
244 char *dst_path; /* A copy of CONST_DST_PATH we can change. */
245 char *src_path; /* The source name in `dst_path'. */
246 uid_t myeuid = geteuid ();
248 dst_path = (char *) alloca (strlen (const_dst_path) + 1);
249 strcpy (dst_path, const_dst_path);
250 src_path = dst_path + src_offset;
252 for (p = attr_list; p; p = p->next)
256 dst_path[p->slash_offset] = '\0';
258 if ((*(x->xstat)) (src_path, &src_sb))
260 error (0, errno, "%s", src_path);
264 /* Adjust the times (and if possible, ownership) for the copy.
265 chown turns off set[ug]id bits for non-root,
266 so do the chmod last. */
268 if (x->preserve_timestamps)
272 /* There's currently no interface to set file timestamps with
273 better than 1-second resolution, so discard any fractional
274 part of the source timestamp. */
276 utb.actime = src_sb.st_atime;
277 utb.modtime = src_sb.st_mtime;
279 if (utime (dst_path, &utb))
281 error (0, errno, _("preserving times for %s"), dst_path);
286 if (x->preserve_owner_and_group)
288 /* If non-root uses -p, it's ok if we can't preserve ownership.
289 But root probably wants to know, e.g. if NFS disallows it,
290 or if the target system doesn't support file ownership. */
291 if (chown (dst_path, src_sb.st_uid, src_sb.st_gid)
292 && ((errno != EPERM && errno != EINVAL) || myeuid == 0))
294 error (0, errno, _("preserving ownership for %s"), dst_path);
299 if (x->preserve_chmod_bits || p->is_new_dir)
301 if (chmod (dst_path, src_sb.st_mode & x->umask_kill))
303 error (0, errno, _("preserving permissions for %s"), dst_path);
308 dst_path[p->slash_offset] = '/';
313 /* Ensure that the parent directory of CONST_DIRPATH exists, for
314 the --parents option.
316 SRC_OFFSET is the index in CONST_DIRPATH (which is a destination
317 path) of the beginning of the source directory name.
318 Create any leading directories that don't already exist,
319 giving them permissions MODE.
320 If VERBOSE_FMT_STRING is nonzero, use it as a printf format
321 string for printing a message after successfully making a directory.
322 The format should take two string arguments: the names of the
323 source and destination directories.
324 Creates a linked list of attributes of intermediate directories,
325 *ATTR_LIST, for re_protect to use after calling copy.
326 Sets *NEW_DST to 1 if this function creates parent of CONST_DIRPATH.
328 Return 0 if parent of CONST_DIRPATH exists as a directory with the proper
329 permissions when done, otherwise 1. */
332 make_path_private (const char *const_dirpath, int src_offset, int mode,
333 const char *verbose_fmt_string, struct dir_attr **attr_list,
334 int *new_dst, int (*xstat)())
337 char *dirpath; /* A copy of CONST_DIRPATH we can change. */
338 char *src; /* Source name in `dirpath'. */
339 char *tmp_dst_dirname; /* Leading path of `dirpath', malloc. */
340 char *dst_dirname; /* Leading path of `dirpath', alloca. */
342 dirpath = (char *) alloca (strlen (const_dirpath) + 1);
343 strcpy (dirpath, const_dirpath);
345 src = dirpath + src_offset;
347 tmp_dst_dirname = dir_name (dirpath);
348 dst_dirname = (char *) alloca (strlen (tmp_dst_dirname) + 1);
349 strcpy (dst_dirname, tmp_dst_dirname);
350 free (tmp_dst_dirname);
354 if ((*xstat) (dst_dirname, &stats))
356 /* Parent of CONST_DIRNAME does not exist.
357 Make all missing intermediate directories. */
361 while (*slash == '/')
363 while ((slash = strchr (slash, '/')))
365 /* Add this directory to the list of directories whose modes need
367 struct dir_attr *new =
368 (struct dir_attr *) xmalloc (sizeof (struct dir_attr));
369 new->slash_offset = slash - dirpath;
370 new->next = *attr_list;
374 if ((*xstat) (dirpath, &stats))
376 /* This element of the path does not exist. We must set
377 *new_dst and new->is_new_dir inside this loop because,
378 for example, in the command `cp --parents ../a/../b/c e_dir',
379 make_path_private creates only e_dir/../a if ./b already
383 if (mkdir (dirpath, mode))
385 error (0, errno, _("cannot make directory %s"),
391 if (verbose_fmt_string != NULL)
392 printf (verbose_fmt_string, src, dirpath);
395 else if (!S_ISDIR (stats.st_mode))
397 error (0, 0, _("%s exists but is not a directory"),
408 /* Avoid unnecessary calls to `stat' when given
409 pathnames containing multiple adjacent slashes. */
410 while (*slash == '/')
415 /* We get here if the parent of `dirpath' already exists. */
417 else if (!S_ISDIR (stats.st_mode))
419 error (0, 0, _("%s exists but is not a directory"), quote (dst_dirname));
429 /* Scan the arguments, and copy each by calling copy.
430 Return 0 if successful, 1 if any errors occur. */
433 do_copy (int n_files, char **file, const char *target_directory,
434 const struct cp_options *x)
444 error (0, 0, _("missing file arguments"));
447 if (n_files == 1 && !target_directory)
449 error (0, 0, _("missing destination file"));
453 if (target_directory)
454 dest = target_directory;
457 dest = file[n_files - 1];
461 if (lstat (dest, &sb))
465 error (0, errno, "%s", dest);
475 /* If `dest' is not a symlink to a nonexistent file, use
476 the results of stat instead of lstat, so we can copy files
477 into symlinks to directories. */
478 if (stat (dest, &sbx) == 0)
481 dest_is_dir = S_ISDIR (sb.st_mode);
486 if (target_directory)
488 error (0, 0, _("specified target, %s is not a directory"),
496 _("copying multiple files, but last argument %s is not a directory"),
504 /* cp file1...filen edir
505 Copy the files `file1' through `filen'
506 to the existing directory `edir'. */
509 for (i = 0; i < n_files; i++)
512 int parent_exists = 1; /* True if dir_name (dst_path) exists. */
513 struct dir_attr *attr_list;
514 char *arg_in_concat = NULL;
517 if (remove_trailing_slashes)
518 strip_trailing_slashes (arg);
522 /* Append all of `arg' to `dest'. */
523 dst_path = path_concat (dest, arg, &arg_in_concat);
524 if (dst_path == NULL)
525 error (1, 0, _("virtual memory exhausted"));
527 /* For --parents, we have to make sure that the directory
528 dir_name (dst_path) exists. We may have to create a few
529 leading directories. */
530 parent_exists = !make_path_private (dst_path,
531 arg_in_concat - dst_path,
534 ? "%s -> %s\n" : NULL),
535 &attr_list, &new_dst,
541 /* Append the last component of `arg' to `dest'. */
543 ASSIGN_BASENAME_STRDUPA (arg_base, arg);
544 /* For `cp -R source/.. dest', don't copy into `dest/..'. */
545 dst_path = (STREQ (arg_base, "..")
547 : path_concat (dest, arg_base, NULL));
552 /* make_path_private failed, so don't even attempt the copy. */
558 ret |= copy (arg, dst_path, new_dst, x, ©_into_self, NULL);
563 ret |= re_protect (dst_path, arg_in_concat - dst_path,
572 else /* if (n_files == 1) */
577 struct stat source_stats;
582 _("when preserving paths, the destination must be a directory"));
588 /* When the force and backup options have been specified and
589 the source and destination are the same name for an existing
590 regular file, convert the user's command, e.g.,
591 `cp --force --backup foo foo' to `cp --force foo fooSUFFIX'
592 where SUFFIX is determined by any version control options used. */
595 && x->backup_type != none
596 && STREQ (source, dest)
597 && !new_dst && S_ISREG (sb.st_mode))
599 static struct cp_options x_tmp;
601 new_dest = find_backup_file_name (dest, x->backup_type);
602 /* Set x->backup_type to `none' so that the normal backup
603 mechanism is not used when performing the actual copy.
604 backup_type must be set to `none' only *after* the above
605 call to find_backup_file_name -- that function uses
606 backup_type to determine the suffix it applies. */
608 x_tmp.backup_type = none;
611 if (new_dest == NULL)
612 error (1, 0, _("virtual memory exhausted"));
615 /* When the destination is specified with a trailing slash and the
616 source exists but is not a directory, convert the user's command
617 `cp source dest/' to `cp source dest/basename(source)'. Doing
618 this ensures that the command `cp non-directory file/' will now
619 fail rather than performing the copy. COPY diagnoses the case of
620 `cp directory non-directory'. */
622 else if (dest[strlen (dest) - 1] == '/'
623 && lstat (source, &source_stats) == 0
624 && !S_ISDIR (source_stats.st_mode))
628 ASSIGN_BASENAME_STRDUPA (source_base, source);
629 new_dest = (char *) alloca (strlen (dest)
630 + strlen (source_base) + 1);
631 stpcpy (stpcpy (new_dest, dest), source_base);
635 new_dest = (char *) dest;
638 return copy (source, new_dest, new_dst, x, &unused, NULL);
645 cp_option_init (struct cp_options *x)
647 x->copy_as_regular = 1;
650 x->failed_unlink_is_fatal = 1;
653 x->myeuid = geteuid ();
655 x->one_file_system = 0;
657 x->preserve_owner_and_group = 0;
658 x->preserve_chmod_bits = 0;
659 x->preserve_timestamps = 0;
661 x->require_preserve = 0;
663 x->sparse_mode = SPARSE_AUTO;
664 x->symbolic_link = 0;
668 /* Find out the current file creation mask, to knock the right bits
669 when using chmod. The creation mask is set to be liberal, so
670 that created directories can be written, even if it would not
671 have been allowed with the mask this process was started with. */
672 x->umask_kill = ~ umask (0);
679 main (int argc, char **argv)
682 int make_backups = 0;
683 char *backup_suffix_string;
684 char *version_control_string = NULL;
686 char *target_directory = NULL;
688 program_name = argv[0];
689 setlocale (LC_ALL, "");
690 bindtextdomain (PACKAGE, LOCALEDIR);
691 textdomain (PACKAGE);
693 atexit (close_stdout);
697 /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
698 we'll actually use backup_suffix_string. */
699 backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
701 while ((c = getopt_long (argc, argv, "abdfilprsuvxPRS:V:", long_opts, NULL))
710 x.sparse_mode = XARGMATCH ("--sparse", optarg,
711 sparse_type_string, sparse_type);
714 case 'a': /* Like -dpR. */
716 x.preserve_owner_and_group = 1;
717 x.preserve_chmod_bits = 1;
718 x.preserve_timestamps = 1;
719 x.require_preserve = 1;
721 x.copy_as_regular = 0;
724 case 'V': /* FIXME: this is deprecated. Remove it in 2001. */
726 _("warning: --version-control (-V) is obsolete; support for\
727 it\nwill be removed in some future release. Use --backup=%s instead."
734 version_control_string = optarg;
754 x.preserve_owner_and_group = 1;
755 x.preserve_chmod_bits = 1;
756 x.preserve_timestamps = 1;
757 x.require_preserve = 1;
766 x.copy_as_regular = 1;
771 x.copy_as_regular = 0;
774 case STRIP_TRAILING_SLASHES_OPTION:
775 remove_trailing_slashes = 1;
782 error (1, 0, _("symbolic links are not supported on this system"));
786 case TARGET_DIRECTORY_OPTION:
787 target_directory = optarg;
799 x.one_file_system = 1;
804 backup_suffix_string = optarg;
807 case_GETOPT_HELP_CHAR;
809 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
816 if (x.hard_link && x.symbolic_link)
818 error (0, 0, _("cannot make both hard and symbolic links"));
822 if (backup_suffix_string)
823 simple_backup_suffix = xstrdup (backup_suffix_string);
825 x.backup_type = (make_backups
826 ? xget_version (_("backup type"),
827 version_control_string)
830 if (x.preserve_chmod_bits == 1)
831 x.umask_kill = ~ (mode_t) 0;
833 /* The key difference between -d (--no-dereference) and not is the version
834 of `stat' to call. */
841 /* Allocate space for remembering copied and created files. */
843 hash_init (INITIAL_HASH_MODULE, INITIAL_ENTRY_TAB_SIZE);
845 exit_status |= do_copy (argc - optind, argv + optind, target_directory, &x);