changeset 55364:1d5e786cd260

* fileio.c (barf_or_query_if_file_exists): Use lstat. (Frename_file): Handle renaming of symlinks across file systems.
author Jan Djärv <jan.h.d@swipnet.se>
date Tue, 04 May 2004 13:54:50 +0000
parents f247bdf135a8
children fb268a65aee2
files src/ChangeLog src/fileio.c
diffstat 2 files changed, 20 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue May 04 13:45:52 2004 +0000
+++ b/src/ChangeLog	Tue May 04 13:54:50 2004 +0000
@@ -1,3 +1,8 @@
+2004-05-04  Jan Dj,Ad(Brv  <jan.h.d@swipnet.se>
+
+	* fileio.c (barf_or_query_if_file_exists): Use lstat.
+	(Frename_file): Handle renaming of symlinks across file systems.
+
 2004-05-04  Kim F. Storm  <storm@cua.dk>
 
 	* xdisp.c (Qtotal): New var.
--- a/src/fileio.c	Tue May 04 13:45:52 2004 +0000
+++ b/src/fileio.c	Tue May 04 13:54:50 2004 +0000
@@ -2349,7 +2349,7 @@
 
   /* stat is a good way to tell whether the file exists,
      regardless of what access permissions it has.  */
-  if (stat (SDATA (encoded_filename), &statbuf) >= 0)
+  if (lstat (SDATA (encoded_filename), &statbuf) >= 0)
     {
       if (! interactive)
 	Fsignal (Qfile_already_exists,
@@ -2684,11 +2684,11 @@
   Lisp_Object args[2];
 #endif
   Lisp_Object handler;
-  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
-  Lisp_Object encoded_file, encoded_newname;
-
-  encoded_file = encoded_newname = Qnil;
-  GCPRO4 (file, newname, encoded_file, encoded_newname);
+  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  Lisp_Object encoded_file, encoded_newname, symlink_target;
+
+  symlink_target = encoded_file = encoded_newname = Qnil;
+  GCPRO5 (file, newname, encoded_file, encoded_newname, symlink_target);
   CHECK_STRING (file);
   CHECK_STRING (newname);
   file = Fexpand_file_name (file, Qnil);
@@ -2725,10 +2725,15 @@
     {
       if (errno == EXDEV)
 	{
-	  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);
+          symlink_target = Ffile_symlink_p (file);
+          if (NILP (symlink_target))
+            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);
+          else
+            Fmake_symbolic_link (symlink_target, newname,
+                                 NILP (ok_if_already_exists) ? Qnil : Qt, Qt);
 	  Fdelete_file (file);
 	}
       else