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
;
61 void strip_trailing_slashes ();
64 /* Initial number of entries in each hash table entry's table of inodes. */
65 #define INITIAL_HASH_MODULE 100
67 /* Initial number of entries in the inode hash table. */
68 #define INITIAL_ENTRY_TAB_SIZE 70
70 /* The invocation name of this program. */
73 /* If nonzero, the command "cp x/e_file e_dir" uses "e_dir/x/e_file"
74 as its destination instead of the usual "e_dir/e_file." */
75 static int flag_path
= 0;
77 static char const *const sparse_type_string
[] =
79 "never", "auto", "always", 0
82 static enum Sparse_type
const sparse_type
[] =
84 SPARSE_NEVER
, SPARSE_AUTO
, SPARSE_ALWAYS
87 /* The error code to return to the system. */
88 static int exit_status
= 0;
90 static struct option
const long_opts
[] =
92 {"archive", no_argument
, NULL
, 'a'},
93 {"backup", no_argument
, NULL
, 'b'},
94 {"force", no_argument
, NULL
, 'f'},
95 {"sparse", required_argument
, NULL
, CHAR_MAX
+ 1},
96 {"interactive", no_argument
, NULL
, 'i'},
97 {"link", no_argument
, NULL
, 'l'},
98 {"no-dereference", no_argument
, NULL
, 'd'},
99 {"one-file-system", no_argument
, NULL
, 'x'},
100 {"parents", no_argument
, NULL
, 'P'},
101 {"path", no_argument
, NULL
, 'P'},
102 {"preserve", no_argument
, NULL
, 'p'},
103 {"recursive", no_argument
, NULL
, 'R'},
104 {"suffix", required_argument
, NULL
, 'S'},
105 {"symbolic-link", no_argument
, NULL
, 's'},
106 {"update", no_argument
, NULL
, 'u'},
107 {"verbose", no_argument
, NULL
, 'v'},
108 {"version-control", required_argument
, NULL
, 'V'},
109 {GETOPT_HELP_OPTION_DECL
},
110 {GETOPT_VERSION_OPTION_DECL
},
118 fprintf (stderr
, _("Try `%s --help' for more information.\n"),
123 Usage: %s [OPTION]... SOURCE DEST\n\
124 or: %s [OPTION]... SOURCE... DIRECTORY\n\
126 program_name
, program_name
);
128 Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\
130 -a, --archive same as -dpR\n\
131 -b, --backup make backup before removal\n\
132 -d, --no-dereference preserve links\n\
133 -f, --force remove existing destinations, never prompt\n\
134 -i, --interactive prompt before overwrite\n\
135 -l, --link link files instead of copying\n\
136 -p, --preserve preserve file attributes if possible\n\
137 -P, --parents append source path to DIRECTORY\n\
138 -r copy recursively, non-directories as files\n\
139 --sparse=WHEN control creation of sparse files\n\
140 -R, --recursive copy directories recursively\n\
141 -s, --symbolic-link make symbolic links instead of copying\n\
142 -S, --suffix=SUFFIX override the usual backup suffix\n\
143 -u, --update copy only when the SOURCE file is newer\n\
144 than the destination file or when the\n\
145 destination file is missing\n\
146 -v, --verbose explain what is being done\n\
147 -V, --version-control=WORD override the usual version control\n\
148 -x, --one-file-system stay on this file system\n\
149 --help display this help and exit\n\
150 --version output version information and exit\n\
152 By default, sparse SOURCE files are detected by a crude heuristic and the\n\
153 corresponding DEST file is made sparse as well. That is the behavior\n\
154 selected by --sparse=auto. Specify --sparse=always to create a sparse DEST\n\
155 file whenever the SOURCE file contains a long enough sequence of zero bytes.\n\
156 Use --sparse=never to inhibit creation of sparse files.\n\
160 The backup suffix is ~, unless set with SIMPLE_BACKUP_SUFFIX. The\n\
161 version control may be set with VERSION_CONTROL, values are:\n\
163 none, off never make backups (even if --backup is given)\n\
164 numbered, t make numbered backups\n\
165 existing, nil numbered if numbered backups exist, simple otherwise\n\
166 simple, never always make simple backups\n\
170 As a special case, cp makes a backup of SOURCE when the force and backup\n\
171 options are given and SOURCE and DEST are the same name for an existing,\n\
174 puts (_("\nReport bugs to <bug-fileutils@gnu.org>."));
180 /* Ensure that the parent directories of CONST_DST_PATH have the
181 correct protections, for the --parents option. This is done
182 after all copying has been completed, to allow permissions
183 that don't include user write/execute.
185 SRC_OFFSET is the index in CONST_DST_PATH of the beginning of the
186 source directory name.
188 ATTR_LIST is a null-terminated linked list of structures that
189 indicates the end of the filename of each intermediate directory
190 in CONST_DST_PATH that may need to have its attributes changed.
191 The command `cp --parents --preserve a/b/c d/e_dir' changes the
192 attributes of the directories d/e_dir/a and d/e_dir/a/b to match
193 the corresponding source directories regardless of whether they
194 existed before the `cp' command was given.
196 Return 0 if the parent of CONST_DST_PATH and any intermediate
197 directories specified by ATTR_LIST have the proper permissions
198 when done, otherwise 1. */
201 re_protect (const char *const_dst_path
, int src_offset
,
202 struct dir_attr
*attr_list
, const struct cp_options
*x
)
205 char *dst_path
; /* A copy of CONST_DST_PATH we can change. */
206 char *src_path
; /* The source name in `dst_path'. */
207 uid_t myeuid
= geteuid ();
209 dst_path
= (char *) alloca (strlen (const_dst_path
) + 1);
210 strcpy (dst_path
, const_dst_path
);
211 src_path
= dst_path
+ src_offset
;
213 for (p
= attr_list
; p
; p
= p
->next
)
217 dst_path
[p
->slash_offset
] = '\0';
219 if ((*(x
->xstat
)) (src_path
, &src_sb
))
221 error (0, errno
, "%s", src_path
);
225 /* Adjust the times (and if possible, ownership) for the copy.
226 chown turns off set[ug]id bits for non-root,
227 so do the chmod last. */
229 if (x
->preserve_timestamps
)
233 /* There's currently no interface to set file timestamps with
234 better than 1-second resolution, so discard any fractional
235 part of the source timestamp. */
237 utb
.actime
= src_sb
.st_atime
;
238 utb
.modtime
= src_sb
.st_mtime
;
240 if (utime (dst_path
, &utb
))
242 error (0, errno
, _("preserving times for %s"), dst_path
);
247 if (x
->preserve_owner_and_group
)
249 /* If non-root uses -p, it's ok if we can't preserve ownership.
250 But root probably wants to know, e.g. if NFS disallows it,
251 or if the target system doesn't support file ownership. */
252 if (chown (dst_path
, src_sb
.st_uid
, src_sb
.st_gid
)
253 && ((errno
!= EPERM
&& errno
!= EINVAL
) || myeuid
== 0))
255 error (0, errno
, _("preserving ownership for %s"), dst_path
);
260 if (x
->preserve_chmod_bits
|| p
->is_new_dir
)
262 if (chmod (dst_path
, src_sb
.st_mode
& x
->umask_kill
))
264 error (0, errno
, _("preserving permissions for %s"), dst_path
);
269 dst_path
[p
->slash_offset
] = '/';
274 /* Ensure that the parent directory of CONST_DIRPATH exists, for
275 the --parents option.
277 SRC_OFFSET is the index in CONST_DIRPATH (which is a destination
278 path) of the beginning of the source directory name.
279 Create any leading directories that don't already exist,
280 giving them permissions MODE.
281 If VERBOSE_FMT_STRING is nonzero, use it as a printf format
282 string for printing a message after successfully making a directory.
283 The format should take two string arguments: the names of the
284 source and destination directories.
285 Creates a linked list of attributes of intermediate directories,
286 *ATTR_LIST, for re_protect to use after calling copy.
287 Sets *NEW_DST to 1 if this function creates parent of CONST_DIRPATH.
289 Return 0 if parent of CONST_DIRPATH exists as a directory with the proper
290 permissions when done, otherwise 1. */
293 make_path_private (const char *const_dirpath
, int src_offset
, int mode
,
294 const char *verbose_fmt_string
, struct dir_attr
**attr_list
,
295 int *new_dst
, int (*xstat
)())
298 char *dirpath
; /* A copy of CONST_DIRPATH we can change. */
299 char *src
; /* Source name in `dirpath'. */
300 char *tmp_dst_dirname
; /* Leading path of `dirpath', malloc. */
301 char *dst_dirname
; /* Leading path of `dirpath', alloca. */
303 dirpath
= (char *) alloca (strlen (const_dirpath
) + 1);
304 strcpy (dirpath
, const_dirpath
);
306 src
= dirpath
+ src_offset
;
308 tmp_dst_dirname
= dir_name (dirpath
);
309 dst_dirname
= (char *) alloca (strlen (tmp_dst_dirname
) + 1);
310 strcpy (dst_dirname
, tmp_dst_dirname
);
311 free (tmp_dst_dirname
);
315 if ((*xstat
) (dst_dirname
, &stats
))
317 /* Parent of CONST_DIRNAME does not exist.
318 Make all missing intermediate directories. */
322 while (*slash
== '/')
324 while ((slash
= strchr (slash
, '/')))
326 /* Add this directory to the list of directories whose modes need
328 struct dir_attr
*new =
329 (struct dir_attr
*) xmalloc (sizeof (struct dir_attr
));
330 new->slash_offset
= slash
- dirpath
;
331 new->next
= *attr_list
;
335 if ((*xstat
) (dirpath
, &stats
))
337 /* This element of the path does not exist. We must set
338 *new_dst and new->is_new_dir inside this loop because,
339 for example, in the command `cp --parents ../a/../b/c e_dir',
340 make_path_private creates only e_dir/../a if ./b already
344 if (mkdir (dirpath
, mode
))
346 error (0, errno
, _("cannot make directory `%s'"), dirpath
);
351 if (verbose_fmt_string
!= NULL
)
352 printf (verbose_fmt_string
, src
, dirpath
);
355 else if (!S_ISDIR (stats
.st_mode
))
357 error (0, 0, _("`%s' exists but is not a directory"), dirpath
);
367 /* Avoid unnecessary calls to `stat' when given
368 pathnames containing multiple adjacent slashes. */
369 while (*slash
== '/')
374 /* We get here if the parent of `dirpath' already exists. */
376 else if (!S_ISDIR (stats
.st_mode
))
378 error (0, 0, _("`%s' exists but is not a directory"), dst_dirname
);
388 /* Scan the arguments, and copy each by calling copy.
389 Return 0 if successful, 1 if any errors occur. */
392 do_copy (int argc
, char **argv
, const struct cp_options
*x
)
401 error (0, 0, _("missing file arguments"));
404 if (optind
>= argc
- 1)
406 error (0, 0, _("missing destination file"));
410 dest
= argv
[argc
- 1];
412 if (lstat (dest
, &sb
))
416 error (0, errno
, "%s", dest
);
426 /* If `dest' is not a symlink to a nonexistent file, use
427 the results of stat instead of lstat, so we can copy files
428 into symlinks to directories. */
429 if (stat (dest
, &sbx
) == 0)
433 if (!new_dst
&& S_ISDIR (sb
.st_mode
))
435 /* cp file1...filen edir
436 Copy the files `file1' through `filen'
437 to the existing directory `edir'. */
444 int parent_exists
= 1; /* True if dir_name (dst_path) exists. */
445 struct dir_attr
*attr_list
;
446 char *arg_in_concat
= NULL
;
450 strip_trailing_slashes (arg
);
454 /* Append all of `arg' to `dest'. */
455 dst_path
= path_concat (dest
, arg
, &arg_in_concat
);
456 if (dst_path
== NULL
)
457 error (1, 0, _("virtual memory exhausted"));
459 /* For --parents, we have to make sure that the directory
460 dir_name (dst_path) exists. We may have to create a few
461 leading directories. */
462 parent_exists
= !make_path_private (dst_path
,
463 arg_in_concat
- dst_path
,
466 ? "%s -> %s\n" : NULL
),
467 &attr_list
, &new_dst
,
472 /* Append the last component of `arg' to `dest'. */
474 ap
= base_name (arg
);
475 /* For `cp -R source/.. dest', don't copy into `dest/..'. */
476 dst_path
= (STREQ (ap
, "..")
478 : path_concat (dest
, ap
, NULL
));
483 /* make_path_private failed, so don't even attempt the copy. */
489 ret
|= copy (arg
, dst_path
, new_dst
, x
, ©_into_self
, NULL
);
494 ret
|= re_protect (dst_path
, arg_in_concat
- dst_path
,
501 if (optind
== argc
- 1)
506 else if (argc
- optind
== 2)
511 struct stat source_stats
;
516 _("when preserving paths, last argument must be a directory"));
520 source
= argv
[optind
];
522 /* When the force and backup options have been specified and
523 the source and destination are the same name for an existing
524 regular file, convert the user's command, e.g.,
525 `cp --force --backup foo foo' to `cp --force foo fooSUFFIX'
526 where SUFFIX is determined by any version control options used. */
529 && x
->backup_type
!= none
530 && STREQ (source
, dest
)
531 && !new_dst
&& S_ISREG (sb
.st_mode
))
533 static struct cp_options x_tmp
;
535 new_dest
= find_backup_file_name (dest
, x
->backup_type
);
536 /* Set x->backup_type to `none' so that the normal backup
537 mechanism is not used when performing the actual copy.
538 backup_type must be set to `none' only *after* the above
539 call to find_backup_file_name -- that function uses
540 backup_type to determine the suffix it applies. */
542 x_tmp
.backup_type
= none
;
545 if (new_dest
== NULL
)
546 error (1, 0, _("virtual memory exhausted"));
549 /* When the destination is specified with a trailing slash and the
550 source exists but is not a directory, convert the user's command
551 `cp source dest/' to `cp source dest/basename(source)'. Doing
552 this ensures that the command `cp non-directory file/' will now
553 fail rather than performing the copy. COPY diagnoses the case of
554 `cp directory non-directory'. */
556 else if (dest
[strlen (dest
) - 1] == '/'
557 && lstat (source
, &source_stats
) == 0
558 && !S_ISDIR (source_stats
.st_mode
))
563 tmp_source
= (char *) alloca (strlen (source
) + 1);
564 strcpy (tmp_source
, source
);
565 strip_trailing_slashes (tmp_source
);
566 source_base
= base_name (tmp_source
);
568 new_dest
= (char *) alloca (strlen (dest
)
569 + strlen (source_base
) + 1);
570 stpcpy (stpcpy (new_dest
, dest
), source_base
);
577 return copy (source
, new_dest
, new_dst
, x
, &unused
, NULL
);
582 _("copying multiple files, but last argument (%s) \
583 is not a directory"),
593 cp_option_init (struct cp_options
*x
)
595 x
->copy_as_regular
= 1;
598 x
->failed_unlink_is_fatal
= 1;
601 x
->myeuid
= geteuid ();
603 x
->one_file_system
= 0;
605 x
->preserve_owner_and_group
= 0;
606 x
->preserve_chmod_bits
= 0;
607 x
->preserve_timestamps
= 0;
609 x
->require_preserve
= 0;
611 x
->sparse_mode
= SPARSE_AUTO
;
612 x
->symbolic_link
= 0;
616 /* Find out the current file creation mask, to knock the right bits
617 when using chmod. The creation mask is set to be liberal, so
618 that created directories can be written, even if it would not
619 have been allowed with the mask this process was started with. */
620 x
->umask_kill
= ~ umask (0);
627 main (int argc
, char **argv
)
630 int make_backups
= 0;
634 program_name
= argv
[0];
635 setlocale (LC_ALL
, "");
636 bindtextdomain (PACKAGE
, LOCALEDIR
);
637 textdomain (PACKAGE
);
641 /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
642 we'll actually use simple_backup_suffix. */
643 version
= getenv ("SIMPLE_BACKUP_SUFFIX");
645 simple_backup_suffix
= version
;
648 while ((c
= getopt_long (argc
, argv
, "abdfilprsuvxPRS:V:", long_opts
, NULL
))
657 x
.sparse_mode
= XARGMATCH ("--sparse", optarg
,
658 sparse_type_string
, sparse_type
);
661 case 'a': /* Like -dpR. */
663 x
.preserve_owner_and_group
= 1;
664 x
.preserve_chmod_bits
= 1;
665 x
.preserve_timestamps
= 1;
666 x
.require_preserve
= 1;
668 x
.copy_as_regular
= 0;
694 x
.preserve_owner_and_group
= 1;
695 x
.preserve_chmod_bits
= 1;
696 x
.preserve_timestamps
= 1;
697 x
.require_preserve
= 1;
706 x
.copy_as_regular
= 1;
711 x
.copy_as_regular
= 0;
718 error (1, 0, _("symbolic links are not supported on this system"));
731 x
.one_file_system
= 1;
735 simple_backup_suffix
= optarg
;
742 case_GETOPT_HELP_CHAR
;
744 case_GETOPT_VERSION_CHAR (PROGRAM_NAME
, AUTHORS
);
751 if (x
.hard_link
&& x
.symbolic_link
)
753 error (0, 0, _("cannot make both hard and symbolic links"));
757 x
.backup_type
= (make_backups
758 ? xget_version (_("--version-control"), version
)
761 if (x
.preserve_chmod_bits
== 1)
762 x
.umask_kill
= ~ (mode_t
) 0;
764 /* The key difference between -d (--no-dereference) and not is the version
765 of `stat' to call. */
772 /* Allocate space for remembering copied and created files. */
774 hash_init (INITIAL_HASH_MODULE
, INITIAL_ENTRY_TAB_SIZE
);
776 exit_status
|= do_copy (argc
, argv
, &x
);