Mercurial > emacs
changeset 61756:f53a54e241e5
(Fcopy_file): New arg MUSTBENEW.
(Frename_file): Pass new arg to Fcopy_file.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 23 Apr 2005 16:19:37 +0000 |
parents | 71259596d397 |
children | 50982fa2ada6 |
files | src/fileio.c |
diffstat | 1 files changed, 25 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fileio.c Sat Apr 23 16:18:23 2005 +0000 +++ b/src/fileio.c Sat Apr 23 16:19:37 2005 +0000 @@ -2388,7 +2388,7 @@ return; } -DEFUN ("copy-file", Fcopy_file, Scopy_file, 2, 4, +DEFUN ("copy-file", Fcopy_file, Scopy_file, 2, 5, "fCopy file: \nGCopy %s to file: \np\nP", doc: /* Copy FILE to NEWNAME. Both args must be strings. If NEWNAME names a directory, copy FILE there. @@ -2397,11 +2397,19 @@ A number as third arg means request confirmation if NEWNAME already exists. This is what happens in interactive use with M-x. Always sets the file modes of the output file to match the input file. + Fourth arg KEEP-TIME non-nil means give the output file the same last-modified time as the old one. (This works on only some systems.) +The optional fifth arg MUSTBENEW, if non-nil, insists on a check + for an existing file with the same name. If MUSTBENEW is `excl', + that means to get an error if the file already exists; never overwrite. + If MUSTBENEW is neither nil nor `excl', that means ask for + confirmation before overwriting, but do go ahead and overwrite the file + if the user confirms. + A prefix arg makes KEEP-TIME non-nil. */) - (file, newname, ok_if_already_exists, keep_time) - Lisp_Object file, newname, ok_if_already_exists, keep_time; + (file, newname, ok_if_already_exists, keep_time, mustbenew) + Lisp_Object file, newname, ok_if_already_exists, keep_time, mustbenew; { int ifd, ofd, n; char buf[16 * 1024]; @@ -2417,6 +2425,9 @@ CHECK_STRING (file); CHECK_STRING (newname); + if (!NILP (mustbenew) && !EQ (mustbenew, Qexcl)) + barf_or_query_if_file_exists (newname, "overwrite", 1, 0, 1); + if (!NILP (Ffile_directory_p (newname))) newname = Fexpand_file_name (Ffile_name_nondirectory (file), newname); else @@ -2517,9 +2528,15 @@ #else #ifdef MSDOS /* System's default file type was set to binary by _fmode in emacs.c. */ - ofd = creat (SDATA (encoded_newname), S_IREAD | S_IWRITE); -#else /* not MSDOS */ - ofd = creat (SDATA (encoded_newname), 0666); + ofd = emacs_open (SDATA (encoded_newname), + O_WRONLY | O_CREAT | buffer_file_type + | (EQ (mustbenew, Qexcl) ? O_EXCL : O_TRUNC), + S_IREAD | S_IWRITE); +#else /* not MSDOS */ + ofd = emacs_open (SDATA (encoded_newname), + O_WRONLY | O_TRUNC | O_CREAT + | (EQ (mustbenew, Qexcl) ? O_EXCL : 0), + 0666); #endif /* not MSDOS */ #endif /* VMS */ if (ofd < 0) @@ -2749,7 +2766,8 @@ Fcopy_file (file, newname, /* We have already prompted if it was an integer, so don't have copy-file prompt again. */ - NILP (ok_if_already_exists) ? Qnil : Qt, Qt); + NILP (ok_if_already_exists) ? Qnil : Qt, + Qt, Qnil); Fdelete_file (file); } else