Convert "`%s'" in format strings to "%s", and wrap each
[platform/upstream/coreutils.git] / src / cp.c
1 /* cp.c  -- file copying (main routines)
2    Copyright (C) 89, 90, 91, 1995-2000 Free Software Foundation.
3
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)
7    any later version.
8
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.
13
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.
17
18    Written by Torbjorn Granlund, David MacKenzie, and Jim Meyering. */
19
20 #ifdef _AIX
21  #pragma alloca
22 #endif
23
24 #include <config.h>
25 #include <stdio.h>
26 #include <sys/types.h>
27 #include <assert.h>
28 #include <getopt.h>
29
30 #include "system.h"
31 #include "argmatch.h"
32 #include "backupfile.h"
33 #include "copy.h"
34 #include "cp-hash.h"
35 #include "error.h"
36 #include "dirname.h"
37 #include "path-concat.h"
38 #include "quote.h"
39
40 /* The official name of this program (e.g., no `g' prefix).  */
41 #define PROGRAM_NAME "cp"
42
43 #define AUTHORS "Torbjorn Granlund, David MacKenzie, and Jim Meyering"
44
45 #ifndef _POSIX_VERSION
46 uid_t geteuid ();
47 #endif
48
49 /* Used by do_copy, make_path_private, and re_protect
50    to keep a list of leading directories whose protections
51    need to be fixed after copying. */
52 struct dir_attr
53 {
54   int is_new_dir;
55   int slash_offset;
56   struct dir_attr *next;
57 };
58
59 /* For long options that have no equivalent short option, use a
60    non-character as a pseudo short option, starting with CHAR_MAX + 1.  */
61 enum
62 {
63   TARGET_DIRECTORY_OPTION = CHAR_MAX + 1,
64   SPARSE_OPTION,
65   STRIP_TRAILING_SLASHES_OPTION
66 };
67
68 int stat ();
69 int lstat ();
70
71 /* Arrange to make lstat calls go through the wrapper function
72    on systems with an lstat function that does not dereference symlinks
73    that are specified with a trailing slash.  */
74 #if ! LSTAT_FOLLOWS_SLASHED_SYMLINK
75 int rpl_lstat PARAMS((const char *, struct stat *));
76 # undef lstat
77 # define lstat rpl_lstat
78 #endif
79
80 void strip_trailing_slashes ();
81
82 /* Initial number of entries in each hash table entry's table of inodes.  */
83 #define INITIAL_HASH_MODULE 100
84
85 /* Initial number of entries in the inode hash table.  */
86 #define INITIAL_ENTRY_TAB_SIZE 70
87
88 /* The invocation name of this program.  */
89 char *program_name;
90
91 /* If nonzero, the command "cp x/e_file e_dir" uses "e_dir/x/e_file"
92    as its destination instead of the usual "e_dir/e_file." */
93 static int flag_path = 0;
94
95 /* Remove any trailing slashes from each SOURCE argument.  */
96 static int remove_trailing_slashes;
97
98 static char const *const sparse_type_string[] =
99 {
100   "never", "auto", "always", 0
101 };
102
103 static enum Sparse_type const sparse_type[] =
104 {
105   SPARSE_NEVER, SPARSE_AUTO, SPARSE_ALWAYS
106 };
107
108 /* The error code to return to the system. */
109 static int exit_status = 0;
110
111 static struct option const long_opts[] =
112 {
113   {"archive", no_argument, NULL, 'a'},
114   {"backup", optional_argument, NULL, 'b'},
115   {"force", no_argument, NULL, 'f'},
116   {"sparse", required_argument, NULL, SPARSE_OPTION},
117   {"interactive", no_argument, NULL, 'i'},
118   {"link", no_argument, NULL, 'l'},
119   {"no-dereference", no_argument, NULL, 'd'},
120   {"one-file-system", no_argument, NULL, 'x'},
121   {"parents", no_argument, NULL, 'P'},
122   {"path", no_argument, NULL, 'P'},
123   {"preserve", no_argument, NULL, 'p'},
124   {"recursive", no_argument, NULL, 'R'},
125   {"strip-trailing-slash", no_argument, NULL, STRIP_TRAILING_SLASHES_OPTION},
126   {"suffix", required_argument, NULL, 'S'},
127   {"symbolic-link", no_argument, NULL, 's'},
128   {"target-directory", required_argument, NULL, TARGET_DIRECTORY_OPTION},
129   {"update", no_argument, NULL, 'u'},
130   {"verbose", no_argument, NULL, 'v'},
131   {"version-control", required_argument, NULL, 'V'}, /* Deprecated. FIXME. */
132   {GETOPT_HELP_OPTION_DECL},
133   {GETOPT_VERSION_OPTION_DECL},
134   {NULL, 0, NULL, 0}
135 };
136
137 void
138 usage (int status)
139 {
140   if (status != 0)
141     fprintf (stderr, _("Try `%s --help' for more information.\n"),
142              program_name);
143   else
144     {
145       printf (_("\
146 Usage: %s [OPTION]... SOURCE DEST\n\
147   or:  %s [OPTION]... SOURCE... DIRECTORY\n\
148   or:  %s [OPTION]... --target-directory=DIRECTORY SOURCE...\n\
149 "),
150               program_name, program_name, program_name);
151       printf (_("\
152 Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\
153 \n\
154   -a, --archive                same as -dpR\n\
155       --backup[=CONTROL]       make a backup of each existing destination file\n\
156   -b                           like --backup but does not accept an argument\n\
157   -d, --no-dereference         preserve links\n\
158   -f, --force                  remove existing destinations, never prompt\n\
159   -i, --interactive            prompt before overwrite\n\
160   -l, --link                   link files instead of copying\n\
161   -p, --preserve               preserve file attributes if possible\n\
162   -P, --parents                append source path to DIRECTORY\n\
163   -r                           copy recursively, non-directories as files\n\
164                                  WARNING: use -R instead when you might copy\n\
165                                  special files like FIFOs or /dev/zero\n\
166       --sparse=WHEN            control creation of sparse files\n\
167   -R, --recursive              copy directories recursively\n\
168       --strip-trailing-slashes remove any trailing slashes from each SOURCE\n\
169                                  argument\n\
170   -s, --symbolic-link          make symbolic links instead of copying\n\
171   -S, --suffix=SUFFIX          override the usual backup suffix\n\
172       --target-directory=DIRECTORY  move all SOURCE arguments into DIRECTORY\n\
173   -u, --update                 copy only when the SOURCE file is newer\n\
174                                  than the destination file or when the\n\
175                                  destination file is missing\n\
176   -v, --verbose                explain what is being done\n\
177   -x, --one-file-system        stay on this file system\n\
178       --help                   display this help and exit\n\
179       --version                output version information and exit\n\
180 \n\
181 By default, sparse SOURCE files are detected by a crude heuristic and the\n\
182 corresponding DEST file is made sparse as well.  That is the behavior\n\
183 selected by --sparse=auto.  Specify --sparse=always to create a sparse DEST\n\
184 file whenever the SOURCE file contains a long enough sequence of zero bytes.\n\
185 Use --sparse=never to inhibit creation of sparse files.\n\
186 \n\
187 "));
188       printf (_("\
189 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
190 The version control method may be selected via the --backup option or through\n\
191 the VERSION_CONTROL environment variable.  Here are the values:\n\
192 \n\
193   none, off       never make backups (even if --backup is given)\n\
194   numbered, t     make numbered backups\n\
195   existing, nil   numbered if numbered backups exist, simple otherwise\n\
196   simple, never   always make simple backups\n\
197 "));
198       printf (_("\
199 \n\
200 As a special case, cp makes a backup of SOURCE when the force and backup\n\
201 options are given and SOURCE and DEST are the same name for an existing,\n\
202 regular file.\n\
203 "));
204       puts (_("\nReport bugs to <bug-fileutils@gnu.org>."));
205     }
206   exit (status);
207 }
208
209 /* Ensure that the parent directories of CONST_DST_PATH have the
210    correct protections, for the --parents option.  This is done
211    after all copying has been completed, to allow permissions
212    that don't include user write/execute.
213
214    SRC_OFFSET is the index in CONST_DST_PATH of the beginning of the
215    source directory name.
216
217    ATTR_LIST is a null-terminated linked list of structures that
218    indicates the end of the filename of each intermediate directory
219    in CONST_DST_PATH that may need to have its attributes changed.
220    The command `cp --parents --preserve a/b/c d/e_dir' changes the
221    attributes of the directories d/e_dir/a and d/e_dir/a/b to match
222    the corresponding source directories regardless of whether they
223    existed before the `cp' command was given.
224
225    Return 0 if the parent of CONST_DST_PATH and any intermediate
226    directories specified by ATTR_LIST have the proper permissions
227    when done, otherwise 1. */
228
229 static int
230 re_protect (const char *const_dst_path, int src_offset,
231             struct dir_attr *attr_list, const struct cp_options *x)
232 {
233   struct dir_attr *p;
234   char *dst_path;               /* A copy of CONST_DST_PATH we can change. */
235   char *src_path;               /* The source name in `dst_path'. */
236   uid_t myeuid = geteuid ();
237
238   dst_path = (char *) alloca (strlen (const_dst_path) + 1);
239   strcpy (dst_path, const_dst_path);
240   src_path = dst_path + src_offset;
241
242   for (p = attr_list; p; p = p->next)
243     {
244       struct stat src_sb;
245
246       dst_path[p->slash_offset] = '\0';
247
248       if ((*(x->xstat)) (src_path, &src_sb))
249         {
250           error (0, errno, "%s", src_path);
251           return 1;
252         }
253
254       /* Adjust the times (and if possible, ownership) for the copy.
255          chown turns off set[ug]id bits for non-root,
256          so do the chmod last.  */
257
258       if (x->preserve_timestamps)
259         {
260           struct utimbuf utb;
261
262           /* There's currently no interface to set file timestamps with
263              better than 1-second resolution, so discard any fractional
264              part of the source timestamp.  */
265
266           utb.actime = src_sb.st_atime;
267           utb.modtime = src_sb.st_mtime;
268
269           if (utime (dst_path, &utb))
270             {
271               error (0, errno, _("preserving times for %s"), dst_path);
272               return 1;
273             }
274         }
275
276       if (x->preserve_owner_and_group)
277         {
278           /* If non-root uses -p, it's ok if we can't preserve ownership.
279              But root probably wants to know, e.g. if NFS disallows it,
280              or if the target system doesn't support file ownership.  */
281           if (chown (dst_path, src_sb.st_uid, src_sb.st_gid)
282               && ((errno != EPERM && errno != EINVAL) || myeuid == 0))
283             {
284               error (0, errno, _("preserving ownership for %s"), dst_path);
285               return 1;
286             }
287         }
288
289       if (x->preserve_chmod_bits || p->is_new_dir)
290         {
291           if (chmod (dst_path, src_sb.st_mode & x->umask_kill))
292             {
293               error (0, errno, _("preserving permissions for %s"), dst_path);
294               return 1;
295             }
296         }
297
298       dst_path[p->slash_offset] = '/';
299     }
300   return 0;
301 }
302
303 /* Ensure that the parent directory of CONST_DIRPATH exists, for
304    the --parents option.
305
306    SRC_OFFSET is the index in CONST_DIRPATH (which is a destination
307    path) of the beginning of the source directory name.
308    Create any leading directories that don't already exist,
309    giving them permissions MODE.
310    If VERBOSE_FMT_STRING is nonzero, use it as a printf format
311    string for printing a message after successfully making a directory.
312    The format should take two string arguments: the names of the
313    source and destination directories.
314    Creates a linked list of attributes of intermediate directories,
315    *ATTR_LIST, for re_protect to use after calling copy.
316    Sets *NEW_DST to 1 if this function creates parent of CONST_DIRPATH.
317
318    Return 0 if parent of CONST_DIRPATH exists as a directory with the proper
319    permissions when done, otherwise 1. */
320
321 static int
322 make_path_private (const char *const_dirpath, int src_offset, int mode,
323                    const char *verbose_fmt_string, struct dir_attr **attr_list,
324                    int *new_dst, int (*xstat)())
325 {
326   struct stat stats;
327   char *dirpath;                /* A copy of CONST_DIRPATH we can change. */
328   char *src;                    /* Source name in `dirpath'. */
329   char *tmp_dst_dirname;        /* Leading path of `dirpath', malloc. */
330   char *dst_dirname;            /* Leading path of `dirpath', alloca. */
331
332   dirpath = (char *) alloca (strlen (const_dirpath) + 1);
333   strcpy (dirpath, const_dirpath);
334
335   src = dirpath + src_offset;
336
337   tmp_dst_dirname = dir_name (dirpath);
338   dst_dirname = (char *) alloca (strlen (tmp_dst_dirname) + 1);
339   strcpy (dst_dirname, tmp_dst_dirname);
340   free (tmp_dst_dirname);
341
342   *attr_list = NULL;
343
344   if ((*xstat) (dst_dirname, &stats))
345     {
346       /* Parent of CONST_DIRNAME does not exist.
347          Make all missing intermediate directories. */
348       char *slash;
349
350       slash = src;
351       while (*slash == '/')
352         slash++;
353       while ((slash = strchr (slash, '/')))
354         {
355           /* Add this directory to the list of directories whose modes need
356              fixing later. */
357           struct dir_attr *new =
358             (struct dir_attr *) xmalloc (sizeof (struct dir_attr));
359           new->slash_offset = slash - dirpath;
360           new->next = *attr_list;
361           *attr_list = new;
362
363           *slash = '\0';
364           if ((*xstat) (dirpath, &stats))
365             {
366               /* This element of the path does not exist.  We must set
367                  *new_dst and new->is_new_dir inside this loop because,
368                  for example, in the command `cp --parents ../a/../b/c e_dir',
369                  make_path_private creates only e_dir/../a if ./b already
370                  exists. */
371               *new_dst = 1;
372               new->is_new_dir = 1;
373               if (mkdir (dirpath, mode))
374                 {
375                   error (0, errno, _("cannot make directory %s"),
376                          quote (dirpath));
377                   return 1;
378                 }
379               else
380                 {
381                   if (verbose_fmt_string != NULL)
382                     printf (verbose_fmt_string, src, dirpath);
383                 }
384             }
385           else if (!S_ISDIR (stats.st_mode))
386             {
387               error (0, 0, _("%s exists but is not a directory"),
388                      quote (dirpath));
389               return 1;
390             }
391           else
392             {
393               new->is_new_dir = 0;
394               *new_dst = 0;
395             }
396           *slash++ = '/';
397
398           /* Avoid unnecessary calls to `stat' when given
399              pathnames containing multiple adjacent slashes.  */
400           while (*slash == '/')
401             slash++;
402         }
403     }
404
405   /* We get here if the parent of `dirpath' already exists. */
406
407   else if (!S_ISDIR (stats.st_mode))
408     {
409       error (0, 0, _("%s exists but is not a directory"), quote (dst_dirname));
410       return 1;
411     }
412   else
413     {
414       *new_dst = 0;
415     }
416   return 0;
417 }
418
419 /* Scan the arguments, and copy each by calling copy.
420    Return 0 if successful, 1 if any errors occur. */
421
422 static int
423 do_copy (int n_files, char **file, const char *target_directory,
424          const struct cp_options *x)
425 {
426   const char *dest;
427   struct stat sb;
428   int new_dst = 0;
429   int ret = 0;
430   int dest_is_dir = 0;
431
432   if (n_files <= 0)
433     {
434       error (0, 0, _("missing file arguments"));
435       usage (1);
436     }
437   if (n_files == 1 && !target_directory)
438     {
439       error (0, 0, _("missing destination file"));
440       usage (1);
441     }
442
443   if (target_directory)
444     dest = target_directory;
445   else
446     {
447       dest = file[n_files - 1];
448       --n_files;
449     }
450
451   if (lstat (dest, &sb))
452     {
453       if (errno != ENOENT)
454         {
455           error (0, errno, "%s", dest);
456           return 1;
457         }
458
459       new_dst = 1;
460     }
461   else
462     {
463       struct stat sbx;
464
465       /* If `dest' is not a symlink to a nonexistent file, use
466          the results of stat instead of lstat, so we can copy files
467          into symlinks to directories. */
468       if (stat (dest, &sbx) == 0)
469         sb = sbx;
470
471       dest_is_dir = S_ISDIR (sb.st_mode);
472     }
473
474   if (!dest_is_dir)
475     {
476       if (target_directory)
477         {
478           error (0, 0, _("specified target, %s is not a directory"),
479                  quote (dest));
480           usage (1);
481         }
482
483       if (n_files > 1)
484         {
485           error (0, 0,
486          _("copying multiple files, but last argument %s is not a directory"),
487              quote (dest));
488           usage (1);
489         }
490     }
491
492   if (dest_is_dir)
493     {
494       /* cp file1...filen edir
495          Copy the files `file1' through `filen'
496          to the existing directory `edir'. */
497       int i;
498
499       for (i = 0; i < n_files; i++)
500         {
501           char *ap;
502           char *dst_path;
503           int parent_exists = 1; /* True if dir_name (dst_path) exists. */
504           struct dir_attr *attr_list;
505           char *arg_in_concat = NULL;
506           char *arg = file[i];
507
508           if (remove_trailing_slashes)
509             strip_trailing_slashes (arg);
510
511           if (flag_path)
512             {
513               /* Append all of `arg' to `dest'.  */
514               dst_path = path_concat (dest, arg, &arg_in_concat);
515               if (dst_path == NULL)
516                 error (1, 0, _("virtual memory exhausted"));
517
518               /* For --parents, we have to make sure that the directory
519                  dir_name (dst_path) exists.  We may have to create a few
520                  leading directories. */
521               parent_exists = !make_path_private (dst_path,
522                                                   arg_in_concat - dst_path,
523                                                   S_IRWXU,
524                                                   (x->verbose
525                                                    ? "%s -> %s\n" : NULL),
526                                                   &attr_list, &new_dst,
527                                                   x->xstat);
528             }
529           else
530             {
531               /* Append the last component of `arg' to `dest'.  */
532
533               ap = base_name (arg);
534               /* For `cp -R source/.. dest', don't copy into `dest/..'. */
535               dst_path = (STREQ (ap, "..")
536                           ? xstrdup (dest)
537                           : path_concat (dest, ap, NULL));
538             }
539
540           if (!parent_exists)
541             {
542               /* make_path_private failed, so don't even attempt the copy. */
543               ret = 1;
544             }
545           else
546             {
547               int copy_into_self;
548               ret |= copy (arg, dst_path, new_dst, x, &copy_into_self, NULL);
549               forget_all ();
550
551               if (flag_path)
552                 {
553                   ret |= re_protect (dst_path, arg_in_concat - dst_path,
554                                      attr_list, x);
555                 }
556             }
557
558           free (dst_path);
559         }
560       return ret;
561     }
562   else /* if (n_files == 1) */
563     {
564       char *new_dest;
565       char *source;
566       int unused;
567       struct stat source_stats;
568
569       if (flag_path)
570         {
571           error (0, 0,
572                _("when preserving paths, the destination must be a directory"));
573           usage (1);
574         }
575
576       source = file[0];
577
578       /* When the force and backup options have been specified and
579          the source and destination are the same name for an existing
580          regular file, convert the user's command, e.g.,
581          `cp --force --backup foo foo' to `cp --force foo fooSUFFIX'
582          where SUFFIX is determined by any version control options used.  */
583
584       if (x->force
585           && x->backup_type != none
586           && STREQ (source, dest)
587           && !new_dst && S_ISREG (sb.st_mode))
588         {
589           static struct cp_options x_tmp;
590
591           new_dest = find_backup_file_name (dest, x->backup_type);
592           /* Set x->backup_type to `none' so that the normal backup
593              mechanism is not used when performing the actual copy.
594              backup_type must be set to `none' only *after* the above
595              call to find_backup_file_name -- that function uses
596              backup_type to determine the suffix it applies.  */
597           x_tmp = *x;
598           x_tmp.backup_type = none;
599           x = &x_tmp;
600
601           if (new_dest == NULL)
602             error (1, 0, _("virtual memory exhausted"));
603         }
604
605       /* When the destination is specified with a trailing slash and the
606          source exists but is not a directory, convert the user's command
607          `cp source dest/' to `cp source dest/basename(source)'.  Doing
608          this ensures that the command `cp non-directory file/' will now
609          fail rather than performing the copy.  COPY diagnoses the case of
610          `cp directory non-directory'.  */
611
612       else if (dest[strlen (dest) - 1] == '/'
613           && lstat (source, &source_stats) == 0
614           && !S_ISDIR (source_stats.st_mode))
615         {
616           char *source_base;
617           char *tmp_source;
618
619           tmp_source = (char *) alloca (strlen (source) + 1);
620           strcpy (tmp_source, source);
621           if (remove_trailing_slashes)
622             strip_trailing_slashes (tmp_source);
623           source_base = base_name (tmp_source);
624
625           new_dest = (char *) alloca (strlen (dest)
626                                       + strlen (source_base) + 1);
627           stpcpy (stpcpy (new_dest, dest), source_base);
628         }
629       else
630         {
631           new_dest = (char *) dest;
632         }
633
634       return copy (source, new_dest, new_dst, x, &unused, NULL);
635     }
636
637   /* unreachable */
638 }
639
640 static void
641 cp_option_init (struct cp_options *x)
642 {
643   x->copy_as_regular = 1;
644   x->dereference = 1;
645   x->force = 0;
646   x->failed_unlink_is_fatal = 1;
647   x->hard_link = 0;
648   x->interactive = 0;
649   x->myeuid = geteuid ();
650   x->move_mode = 0;
651   x->one_file_system = 0;
652
653   x->preserve_owner_and_group = 0;
654   x->preserve_chmod_bits = 0;
655   x->preserve_timestamps = 0;
656
657   x->require_preserve = 0;
658   x->recursive = 0;
659   x->sparse_mode = SPARSE_AUTO;
660   x->symbolic_link = 0;
661   x->set_mode = 0;
662   x->mode = 0;
663
664   /* Find out the current file creation mask, to knock the right bits
665      when using chmod.  The creation mask is set to be liberal, so
666      that created directories can be written, even if it would not
667      have been allowed with the mask this process was started with.  */
668   x->umask_kill = ~ umask (0);
669
670   x->update = 0;
671   x->verbose = 0;
672 }
673
674 int
675 main (int argc, char **argv)
676 {
677   int c;
678   int make_backups = 0;
679   char *backup_suffix_string;
680   char *version_control_string = NULL;
681   struct cp_options x;
682   char *target_directory = NULL;
683
684   program_name = argv[0];
685   setlocale (LC_ALL, "");
686   bindtextdomain (PACKAGE, LOCALEDIR);
687   textdomain (PACKAGE);
688
689   atexit (close_stdout);
690
691   cp_option_init (&x);
692
693   /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
694      we'll actually use backup_suffix_string.  */
695   backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
696
697   while ((c = getopt_long (argc, argv, "abdfilprsuvxPRS:V:", long_opts, NULL))
698          != -1)
699     {
700       switch (c)
701         {
702         case 0:
703           break;
704
705         case SPARSE_OPTION:
706           x.sparse_mode = XARGMATCH ("--sparse", optarg,
707                                      sparse_type_string, sparse_type);
708           break;
709
710         case 'a':               /* Like -dpR. */
711           x.dereference = 0;
712           x.preserve_owner_and_group = 1;
713           x.preserve_chmod_bits = 1;
714           x.preserve_timestamps = 1;
715           x.require_preserve = 1;
716           x.recursive = 1;
717           x.copy_as_regular = 0;
718           break;
719
720         case 'V':  /* FIXME: this is deprecated.  Remove it in 2001.  */
721           error (0, 0,
722                  _("warning: --version-control (-V) is obsolete;  support for\
723  it\nwill be removed in some future release.  Use --backup=%s instead."
724                    ), optarg);
725           /* Fall through.  */
726
727         case 'b':
728           make_backups = 1;
729           if (optarg)
730             version_control_string = optarg;
731           break;
732
733         case 'd':
734           x.dereference = 0;
735           break;
736
737         case 'f':
738           x.force = 1;
739           break;
740
741         case 'i':
742           x.interactive = 1;
743           break;
744
745         case 'l':
746           x.hard_link = 1;
747           break;
748
749         case 'p':
750           x.preserve_owner_and_group = 1;
751           x.preserve_chmod_bits = 1;
752           x.preserve_timestamps = 1;
753           x.require_preserve = 1;
754           break;
755
756         case 'P':
757           flag_path = 1;
758           break;
759
760         case 'r':
761           x.recursive = 1;
762           x.copy_as_regular = 1;
763           break;
764
765         case 'R':
766           x.recursive = 1;
767           x.copy_as_regular = 0;
768           break;
769
770         case STRIP_TRAILING_SLASHES_OPTION:
771           remove_trailing_slashes = 1;
772           break;
773
774         case 's':
775 #ifdef S_ISLNK
776           x.symbolic_link = 1;
777 #else
778           error (1, 0, _("symbolic links are not supported on this system"));
779 #endif
780           break;
781
782         case TARGET_DIRECTORY_OPTION:
783           target_directory = optarg;
784           break;
785
786         case 'u':
787           x.update = 1;
788           break;
789
790         case 'v':
791           x.verbose = 1;
792           break;
793
794         case 'x':
795           x.one_file_system = 1;
796           break;
797
798         case 'S':
799           make_backups = 1;
800           backup_suffix_string = optarg;
801           break;
802
803         case_GETOPT_HELP_CHAR;
804
805         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
806
807         default:
808           usage (1);
809         }
810     }
811
812   if (x.hard_link && x.symbolic_link)
813     {
814       error (0, 0, _("cannot make both hard and symbolic links"));
815       usage (1);
816     }
817
818   if (backup_suffix_string)
819     simple_backup_suffix = xstrdup (backup_suffix_string);
820
821   x.backup_type = (make_backups
822                    ? xget_version (_("backup type"),
823                                    version_control_string)
824                    : none);
825
826   if (x.preserve_chmod_bits == 1)
827     x.umask_kill = ~ (mode_t) 0;
828
829   /* The key difference between -d (--no-dereference) and not is the version
830      of `stat' to call.  */
831
832   if (x.dereference)
833     x.xstat = stat;
834   else
835     x.xstat = lstat;
836
837   /* Allocate space for remembering copied and created files.  */
838
839   hash_init (INITIAL_HASH_MODULE, INITIAL_ENTRY_TAB_SIZE);
840
841   exit_status |= do_copy (argc - optind, argv + optind, target_directory, &x);
842
843   exit (exit_status);
844 }