1 /* cp.c -- file copying (main routines)
2 Copyright (C) 89, 90, 91, 1995-2003 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 "mmap-stack.h"
38 #include "path-concat.h"
41 #define ASSIGN_BASENAME_STRDUPA(Dest, File_name) \
45 ASSIGN_STRDUPA (tmp_abns_, (File_name)); \
46 strip_trailing_slashes (tmp_abns_); \
47 Dest = base_name (tmp_abns_); \
51 /* The official name of this program (e.g., no `g' prefix). */
52 #define PROGRAM_NAME "cp"
54 #define AUTHORS N_ ("Torbjorn Granlund, David MacKenzie, and Jim Meyering")
56 #ifndef _POSIX_VERSION
60 /* Used by do_copy, make_path_private, and re_protect
61 to keep a list of leading directories whose protections
62 need to be fixed after copying. */
67 struct dir_attr *next;
70 /* For long options that have no equivalent short option, use a
71 non-character as a pseudo short option, starting with CHAR_MAX + 1. */
74 COPY_CONTENTS_OPTION = CHAR_MAX + 1,
75 NO_PRESERVE_ATTRIBUTES_OPTION,
77 PRESERVE_ATTRIBUTES_OPTION,
80 STRIP_TRAILING_SLASHES_OPTION,
81 TARGET_DIRECTORY_OPTION,
82 UNLINK_DEST_BEFORE_OPENING
85 /* Initial number of entries in each hash table entry's table of inodes. */
86 #define INITIAL_HASH_MODULE 100
88 /* Initial number of entries in the inode hash table. */
89 #define INITIAL_ENTRY_TAB_SIZE 70
91 /* The invocation name of this program. */
94 /* If nonzero, the command "cp x/e_file e_dir" uses "e_dir/x/e_file"
95 as its destination instead of the usual "e_dir/e_file." */
96 static int flag_path = 0;
98 /* Remove any trailing slashes from each SOURCE argument. */
99 static int remove_trailing_slashes;
101 static char const *const sparse_type_string[] =
103 "never", "auto", "always", 0
106 static enum Sparse_type const sparse_type[] =
108 SPARSE_NEVER, SPARSE_AUTO, SPARSE_ALWAYS
111 /* Valid arguments to the `--reply' option. */
112 static char const* const reply_args[] =
114 "yes", "no", "query", 0
117 /* The values that correspond to the above strings. */
118 static int const reply_vals[] =
120 I_ALWAYS_YES, I_ALWAYS_NO, I_ASK_USER
123 static struct option const long_opts[] =
125 {"archive", no_argument, NULL, 'a'},
126 {"backup", optional_argument, NULL, 'b'},
127 {"copy-contents", no_argument, NULL, COPY_CONTENTS_OPTION},
128 {"dereference", no_argument, NULL, 'L'},
129 {"force", no_argument, NULL, 'f'},
130 {"interactive", no_argument, NULL, 'i'},
131 {"link", no_argument, NULL, 'l'},
132 {"no-dereference", no_argument, NULL, 'P'},
133 {"no-preserve", required_argument, NULL, NO_PRESERVE_ATTRIBUTES_OPTION},
134 {"one-file-system", no_argument, NULL, 'x'},
135 {"parents", no_argument, NULL, PARENTS_OPTION},
136 {"path", no_argument, NULL, PARENTS_OPTION}, /* Deprecated. */
137 {"preserve", optional_argument, NULL, PRESERVE_ATTRIBUTES_OPTION},
138 {"recursive", no_argument, NULL, 'R'},
139 {"remove-destination", no_argument, NULL, UNLINK_DEST_BEFORE_OPENING},
140 {"reply", required_argument, NULL, REPLY_OPTION},
141 {"sparse", required_argument, NULL, SPARSE_OPTION},
142 {"strip-trailing-slashes", no_argument, NULL, STRIP_TRAILING_SLASHES_OPTION},
143 {"suffix", required_argument, NULL, 'S'},
144 {"symbolic-link", no_argument, NULL, 's'},
145 {"target-directory", required_argument, NULL, TARGET_DIRECTORY_OPTION},
146 {"update", no_argument, NULL, 'u'},
147 {"verbose", no_argument, NULL, 'v'},
148 {"version-control", required_argument, NULL, 'V'}, /* Deprecated. FIXME. */
149 {GETOPT_HELP_OPTION_DECL},
150 {GETOPT_VERSION_OPTION_DECL},
158 fprintf (stderr, _("Try `%s --help' for more information.\n"),
163 Usage: %s [OPTION]... SOURCE DEST\n\
164 or: %s [OPTION]... SOURCE... DIRECTORY\n\
165 or: %s [OPTION]... --target-directory=DIRECTORY SOURCE...\n\
167 program_name, program_name, program_name);
169 Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\
173 Mandatory arguments to long options are mandatory for short options too.\n\
176 -a, --archive same as -dpR\n\
177 --backup[=CONTROL] make a backup of each existing destination file\n\
178 -b like --backup but does not accept an argument\n\
179 --copy-contents copy contents of special files when recursive\n\
180 -d same as --no-dereference --preserve=link\n\
183 --no-dereference never follow symbolic links\n\
184 -f, --force if an existing destination file cannot be\n\
185 opened, remove it and try again\n\
186 -i, --interactive prompt before overwrite\n\
187 -H follow command-line symbolic links\n\
190 -l, --link link files instead of copying\n\
191 -L, --dereference always follow symbolic links\n\
192 -p same as --preserve=mode,ownership,timestamps\n\
193 --preserve[=ATTR_LIST] preserve the specified attributes (default:\n\
194 mode,ownership,timestamps), if possible\n\
195 additional attributes: links, all\n\
198 --no-preserve=ATTR_LIST don't preserve the specified attributes\n\
199 --parents append source path to DIRECTORY\n\
200 -P same as `--no-dereference'\n\
203 -R, -r, --recursive copy directories recursively\n\
204 --remove-destination remove each existing destination file before\n\
205 attempting to open it (contrast with --force)\n\
208 --reply={yes,no,query} specify how to handle the prompt about an\n\
209 existing destination file\n\
210 --sparse=WHEN control creation of sparse files\n\
211 --strip-trailing-slashes remove any trailing slashes from each SOURCE\n\
215 -s, --symbolic-link make symbolic links instead of copying\n\
216 -S, --suffix=SUFFIX override the usual backup suffix\n\
217 --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY\n\
220 -u, --update copy only when the SOURCE file is newer\n\
221 than the destination file or when the\n\
222 destination file is missing\n\
223 -v, --verbose explain what is being done\n\
224 -x, --one-file-system stay on this file system\n\
226 fputs (HELP_OPTION_DESCRIPTION, stdout);
227 fputs (VERSION_OPTION_DESCRIPTION, stdout);
230 By default, sparse SOURCE files are detected by a crude heuristic and the\n\
231 corresponding DEST file is made sparse as well. That is the behavior\n\
232 selected by --sparse=auto. Specify --sparse=always to create a sparse DEST\n\
233 file whenever the SOURCE file contains a long enough sequence of zero bytes.\n\
234 Use --sparse=never to inhibit creation of sparse files.\n\
238 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
239 The version control method may be selected via the --backup option or through\n\
240 the VERSION_CONTROL environment variable. Here are the values:\n\
244 none, off never make backups (even if --backup is given)\n\
245 numbered, t make numbered backups\n\
246 existing, nil numbered if numbered backups exist, simple otherwise\n\
247 simple, never always make simple backups\n\
251 As a special case, cp makes a backup of SOURCE when the force and backup\n\
252 options are given and SOURCE and DEST are the same name for an existing,\n\
255 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
260 /* Ensure that the parent directories of CONST_DST_PATH have the
261 correct protections, for the --parents option. This is done
262 after all copying has been completed, to allow permissions
263 that don't include user write/execute.
265 SRC_OFFSET is the index in CONST_DST_PATH of the beginning of the
266 source directory name.
268 ATTR_LIST is a null-terminated linked list of structures that
269 indicates the end of the filename of each intermediate directory
270 in CONST_DST_PATH that may need to have its attributes changed.
271 The command `cp --parents --preserve a/b/c d/e_dir' changes the
272 attributes of the directories d/e_dir/a and d/e_dir/a/b to match
273 the corresponding source directories regardless of whether they
274 existed before the `cp' command was given.
276 Return 0 if the parent of CONST_DST_PATH and any intermediate
277 directories specified by ATTR_LIST have the proper permissions
278 when done, otherwise 1. */
281 re_protect (const char *const_dst_path, int src_offset,
282 struct dir_attr *attr_list, const struct cp_options *x)
285 char *dst_path; /* A copy of CONST_DST_PATH we can change. */
286 char *src_path; /* The source name in `dst_path'. */
287 uid_t myeuid = geteuid ();
289 dst_path = (char *) alloca (strlen (const_dst_path) + 1);
290 strcpy (dst_path, const_dst_path);
291 src_path = dst_path + src_offset;
293 for (p = attr_list; p; p = p->next)
297 dst_path[p->slash_offset] = '\0';
299 if ((*(x->xstat)) (src_path, &src_sb))
301 error (0, errno, _("failed to get attributes of %s"),
306 /* Adjust the times (and if possible, ownership) for the copy.
307 chown turns off set[ug]id bits for non-root,
308 so do the chmod last. */
310 if (x->preserve_timestamps)
314 /* There's currently no interface to set file timestamps with
315 better than 1-second resolution, so discard any fractional
316 part of the source timestamp. */
318 utb.actime = src_sb.st_atime;
319 utb.modtime = src_sb.st_mtime;
321 if (utime (dst_path, &utb))
323 error (0, errno, _("failed to preserve times for %s"),
329 if (x->preserve_ownership)
331 /* If non-root uses -p, it's ok if we can't preserve ownership.
332 But root probably wants to know, e.g. if NFS disallows it,
333 or if the target system doesn't support file ownership. */
334 if (chown (dst_path, src_sb.st_uid, src_sb.st_gid)
335 && ((errno != EPERM && errno != EINVAL) || myeuid == 0))
337 error (0, errno, _("failed to preserve ownership for %s"),
343 if (x->preserve_mode || p->is_new_dir)
345 if (chmod (dst_path, src_sb.st_mode & x->umask_kill))
347 error (0, errno, _("failed to preserve permissions for %s"),
353 dst_path[p->slash_offset] = '/';
358 /* Ensure that the parent directory of CONST_DIRPATH exists, for
359 the --parents option.
361 SRC_OFFSET is the index in CONST_DIRPATH (which is a destination
362 path) of the beginning of the source directory name.
363 Create any leading directories that don't already exist,
364 giving them permissions MODE.
365 If VERBOSE_FMT_STRING is nonzero, use it as a printf format
366 string for printing a message after successfully making a directory.
367 The format should take two string arguments: the names of the
368 source and destination directories.
369 Creates a linked list of attributes of intermediate directories,
370 *ATTR_LIST, for re_protect to use after calling copy.
371 Sets *NEW_DST to 1 if this function creates parent of CONST_DIRPATH.
373 Return 0 if parent of CONST_DIRPATH exists as a directory with the proper
374 permissions when done, otherwise 1. */
376 /* FIXME: find a way to synch this function with the one in lib/makepath.c. */
379 make_path_private (const char *const_dirpath, int src_offset, int mode,
380 const char *verbose_fmt_string, struct dir_attr **attr_list,
381 int *new_dst, int (*xstat)())
384 char *dirpath; /* A copy of CONST_DIRPATH we can change. */
385 char *src; /* Source name in `dirpath'. */
386 char *dst_dirname; /* Leading path of `dirpath'. */
387 size_t dirlen; /* Length of leading path of `dirpath'. */
389 dirpath = (char *) alloca (strlen (const_dirpath) + 1);
390 strcpy (dirpath, const_dirpath);
392 src = dirpath + src_offset;
394 dirlen = dir_len (dirpath);
395 dst_dirname = (char *) alloca (dirlen + 1);
396 memcpy (dst_dirname, dirpath, dirlen);
397 dst_dirname[dirlen] = '\0';
401 if ((*xstat) (dst_dirname, &stats))
403 /* Parent of CONST_DIRNAME does not exist.
404 Make all missing intermediate directories. */
408 while (*slash == '/')
410 while ((slash = strchr (slash, '/')))
412 /* Add this directory to the list of directories whose modes need
414 struct dir_attr *new =
415 (struct dir_attr *) xmalloc (sizeof (struct dir_attr));
416 new->slash_offset = slash - dirpath;
417 new->next = *attr_list;
421 if ((*xstat) (dirpath, &stats))
423 /* This element of the path does not exist. We must set
424 *new_dst and new->is_new_dir inside this loop because,
425 for example, in the command `cp --parents ../a/../b/c e_dir',
426 make_path_private creates only e_dir/../a if ./b already
430 if (mkdir (dirpath, mode))
432 error (0, errno, _("cannot make directory %s"),
438 if (verbose_fmt_string != NULL)
439 printf (verbose_fmt_string, src, dirpath);
442 else if (!S_ISDIR (stats.st_mode))
444 error (0, 0, _("%s exists but is not a directory"),
455 /* Avoid unnecessary calls to `stat' when given
456 pathnames containing multiple adjacent slashes. */
457 while (*slash == '/')
462 /* We get here if the parent of `dirpath' already exists. */
464 else if (!S_ISDIR (stats.st_mode))
466 error (0, 0, _("%s exists but is not a directory"), quote (dst_dirname));
476 /* Scan the arguments, and copy each by calling copy.
477 Return 0 if successful, 1 if any errors occur. */
480 do_copy (int n_files, char **file, const char *target_directory,
481 struct cp_options *x)
491 error (0, 0, _("missing file argument"));
492 usage (EXIT_FAILURE);
494 if (n_files == 1 && !target_directory)
496 error (0, 0, _("missing destination file"));
497 usage (EXIT_FAILURE);
500 if (target_directory)
501 dest = target_directory;
504 dest = file[n_files - 1];
508 /* Initialize these hash tables only if we'll need them.
509 The problems they're used to detect can arise only if
510 there are two or more files to copy. */
517 if (lstat (dest, &sb))
521 error (0, errno, _("accessing %s"), quote (dest));
531 /* If `dest' is not a symlink to a nonexistent file, use
532 the results of stat instead of lstat, so we can copy files
533 into symlinks to directories. */
534 if (stat (dest, &sbx) == 0)
537 dest_is_dir = S_ISDIR (sb.st_mode);
542 if (target_directory)
544 error (0, 0, _("%s: specified target is not a directory"),
546 usage (EXIT_FAILURE);
552 _("copying multiple files, but last argument %s is not a directory"),
554 usage (EXIT_FAILURE);
560 /* cp file1...filen edir
561 Copy the files `file1' through `filen'
562 to the existing directory `edir'. */
565 for (i = 0; i < n_files; i++)
568 int parent_exists = 1; /* True if dir_name (dst_path) exists. */
569 struct dir_attr *attr_list;
570 char *arg_in_concat = NULL;
573 /* Trailing slashes are meaningful (i.e., maybe worth preserving)
574 only in the source file names. */
575 if (remove_trailing_slashes)
576 strip_trailing_slashes (arg);
580 char *arg_no_trailing_slash;
582 /* Use `arg' without trailing slashes in constructing destination
583 file names. Otherwise, we can end up trying to create a
584 directory via `mkdir ("dst/foo/"...', which is not portable.
585 It fails, due to the trailing slash, on at least
586 NetBSD 1.[34] systems. */
587 ASSIGN_STRDUPA (arg_no_trailing_slash, arg);
588 strip_trailing_slashes (arg_no_trailing_slash);
590 /* Append all of `arg' (minus any trailing slash) to `dest'. */
591 dst_path = path_concat (dest, arg_no_trailing_slash,
593 if (dst_path == NULL)
596 /* For --parents, we have to make sure that the directory
597 dir_name (dst_path) exists. We may have to create a few
598 leading directories. */
599 parent_exists = !make_path_private (dst_path,
600 arg_in_concat - dst_path,
603 ? "%s -> %s\n" : NULL),
604 &attr_list, &new_dst,
610 /* Append the last component of `arg' to `dest'. */
612 ASSIGN_BASENAME_STRDUPA (arg_base, arg);
613 /* For `cp -R source/.. dest', don't copy into `dest/..'. */
614 dst_path = (STREQ (arg_base, "..")
616 : path_concat (dest, arg_base, NULL));
621 /* make_path_private failed, so don't even attempt the copy. */
627 ret |= copy (arg, dst_path, new_dst, x, ©_into_self, NULL);
631 ret |= re_protect (dst_path, arg_in_concat - dst_path,
640 else /* if (n_files == 1) */
645 struct stat source_stats;
650 _("when preserving paths, the destination must be a directory"));
651 usage (EXIT_FAILURE);
656 /* When the force and backup options have been specified and
657 the source and destination are the same name for an existing
658 regular file, convert the user's command, e.g.,
659 `cp --force --backup foo foo' to `cp --force foo fooSUFFIX'
660 where SUFFIX is determined by any version control options used. */
662 if (x->unlink_dest_after_failed_open
663 && x->backup_type != none
664 && STREQ (source, dest)
665 && !new_dst && S_ISREG (sb.st_mode))
667 static struct cp_options x_tmp;
669 new_dest = find_backup_file_name (dest, x->backup_type);
670 /* Set x->backup_type to `none' so that the normal backup
671 mechanism is not used when performing the actual copy.
672 backup_type must be set to `none' only *after* the above
673 call to find_backup_file_name -- that function uses
674 backup_type to determine the suffix it applies. */
676 x_tmp.backup_type = none;
679 if (new_dest == NULL)
683 /* When the destination is specified with a trailing slash and the
684 source exists but is not a directory, convert the user's command
685 `cp source dest/' to `cp source dest/basename(source)'. Doing
686 this ensures that the command `cp non-directory file/' will now
687 fail rather than performing the copy. COPY diagnoses the case of
688 `cp directory non-directory'. */
690 else if (dest[strlen (dest) - 1] == '/'
691 && lstat (source, &source_stats) == 0
692 && !S_ISDIR (source_stats.st_mode))
696 ASSIGN_BASENAME_STRDUPA (source_base, source);
697 new_dest = (char *) alloca (strlen (dest)
698 + strlen (source_base) + 1);
699 stpcpy (stpcpy (new_dest, dest), source_base);
703 new_dest = (char *) dest;
706 return copy (source, new_dest, new_dst, x, &unused, NULL);
713 cp_option_init (struct cp_options *x)
715 x->copy_as_regular = 1;
716 x->dereference = DEREF_UNDEFINED;
717 x->unlink_dest_before_opening = 0;
718 x->unlink_dest_after_failed_open = 0;
720 x->interactive = I_UNSPECIFIED;
721 x->myeuid = geteuid ();
723 x->one_file_system = 0;
725 x->preserve_ownership = 0;
726 x->preserve_links = 0;
727 x->preserve_mode = 0;
728 x->preserve_timestamps = 0;
730 x->require_preserve = 0;
732 x->sparse_mode = SPARSE_AUTO;
733 x->symbolic_link = 0;
740 /* Find out the current file creation mask, to knock the right bits
741 when using chmod. The creation mask is set to be liberal, so
742 that created directories can be written, even if it would not
743 have been allowed with the mask this process was started with. */
744 x->umask_kill = ~ umask (0);
752 /* Given a string, ARG, containing a comma-separated list of arguments
753 to the --preserve option, set the appropriate fields of X to ON_OFF. */
755 decode_preserve_arg (char const *arg, struct cp_options *x, int on_off)
765 static enum File_attribute const preserve_vals[] =
767 PRESERVE_MODE, PRESERVE_TIMESTAMPS,
768 PRESERVE_OWNERSHIP, PRESERVE_LINK, PRESERVE_ALL
771 /* Valid arguments to the `--reply' option. */
772 static char const* const preserve_args[] =
774 "mode", "timestamps",
775 "ownership", "links", "all", 0
778 char *arg_writable = xstrdup (arg);
779 char *s = arg_writable;
782 /* find next comma */
783 char *comma = strchr (s, ',');
784 enum File_attribute val;
786 /* If we found a comma, put a NUL in its place and advance. */
791 val = XARGMATCH ("--preserve", s, preserve_args, preserve_vals);
795 x->preserve_mode = on_off;
798 case PRESERVE_TIMESTAMPS:
799 x->preserve_timestamps = on_off;
802 case PRESERVE_OWNERSHIP:
803 x->preserve_ownership = on_off;
807 x->preserve_links = on_off;
811 x->preserve_mode = on_off;
812 x->preserve_timestamps = on_off;
813 x->preserve_ownership = on_off;
814 x->preserve_links = on_off;
827 static void run (size_t, char **, char const *, struct cp_options *)
829 /* Encapsulate the `copy-and-exit' functionality. */
831 run (size_t n_files, char **files, char const *target_directory,
832 struct cp_options *x)
836 /* Allocate space for remembering copied and created files. */
839 fail = do_copy (n_files, files, target_directory, x);
843 exit (fail ? EXIT_FAILURE : EXIT_SUCCESS);
847 main (int argc, char **argv)
850 int make_backups = 0;
851 char *backup_suffix_string;
852 char *version_control_string = NULL;
854 int copy_contents = 0;
855 char *target_directory = NULL;
857 program_name = argv[0];
858 setlocale (LC_ALL, "");
859 bindtextdomain (PACKAGE, LOCALEDIR);
860 textdomain (PACKAGE);
862 atexit (close_stdout);
866 /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
867 we'll actually use backup_suffix_string. */
868 backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
870 while ((c = getopt_long (argc, argv, "abdfHilLprsuvxPRS:V:", long_opts, NULL))
879 x.sparse_mode = XARGMATCH ("--sparse", optarg,
880 sparse_type_string, sparse_type);
883 case 'a': /* Like -dpPR. */
884 x.dereference = DEREF_NEVER;
885 x.preserve_links = 1;
886 x.preserve_ownership = 1;
888 x.preserve_timestamps = 1;
889 x.require_preserve = 1;
893 case 'V': /* FIXME: this is deprecated. Remove it in 2001. */
895 _("warning: --version-control (-V) is obsolete; support for\
896 it\nwill be removed in some future release. Use --backup=%s instead."
903 version_control_string = optarg;
906 case COPY_CONTENTS_OPTION:
911 x.preserve_links = 1;
912 x.dereference = DEREF_NEVER;
916 x.unlink_dest_after_failed_open = 1;
920 x.dereference = DEREF_COMMAND_LINE_ARGUMENTS;
924 x.interactive = I_ASK_USER;
932 x.dereference = DEREF_ALWAYS;
936 x.dereference = DEREF_NEVER;
939 case NO_PRESERVE_ATTRIBUTES_OPTION:
940 decode_preserve_arg (optarg, &x, 0);
943 case PRESERVE_ATTRIBUTES_OPTION:
946 /* Fall through to the case for `p' below. */
950 decode_preserve_arg (optarg, &x, 1);
951 x.require_preserve = 1;
956 x.preserve_ownership = 1;
958 x.preserve_timestamps = 1;
959 x.require_preserve = 1;
972 x.interactive = XARGMATCH ("--reply", optarg,
973 reply_args, reply_vals);
976 case UNLINK_DEST_BEFORE_OPENING:
977 x.unlink_dest_before_opening = 1;
980 case STRIP_TRAILING_SLASHES_OPTION:
981 remove_trailing_slashes = 1;
988 error (EXIT_FAILURE, 0,
989 _("symbolic links are not supported on this system"));
993 case TARGET_DIRECTORY_OPTION:
994 target_directory = optarg;
1006 x.one_file_system = 1;
1011 backup_suffix_string = optarg;
1014 case_GETOPT_HELP_CHAR;
1016 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
1019 usage (EXIT_FAILURE);
1023 if (x.hard_link && x.symbolic_link)
1025 error (0, 0, _("cannot make both hard and symbolic links"));
1026 usage (EXIT_FAILURE);
1029 if (backup_suffix_string)
1030 simple_backup_suffix = xstrdup (backup_suffix_string);
1032 x.backup_type = (make_backups
1033 ? xget_version (_("backup type"),
1034 version_control_string)
1037 if (x.preserve_mode == 1)
1038 x.umask_kill = ~ (mode_t) 0;
1040 if (x.dereference == DEREF_UNDEFINED)
1043 /* This is compatible with FreeBSD. */
1044 x.dereference = DEREF_NEVER;
1046 x.dereference = DEREF_ALWAYS;
1049 /* The key difference between -d (--no-dereference) and not is the version
1050 of `stat' to call. */
1052 if (x.dereference == DEREF_NEVER)
1056 /* For DEREF_COMMAND_LINE_ARGUMENTS, x.xstat must be stat for
1057 each command line argument, but must later be `lstat' for
1058 any symlinks that are found via recursive traversal. */
1063 x.copy_as_regular = copy_contents;
1065 /* If --force (-f) was specified and we're in link-creation mode,
1066 first remove any existing destination file. */
1067 if (x.unlink_dest_after_failed_open && (x.hard_link || x.symbolic_link))
1068 x.unlink_dest_before_opening = 1;
1070 RUN_WITH_BIG_STACK_4 (run, argc - optind, argv + optind,
1071 target_directory, &x);