Mercurial > emacs
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