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