summaryrefslogtreecommitdiff
path: root/src/fileio.c
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2004-05-04 13:54:50 +0000
committerJan Djärv <jan.h.d@swipnet.se>2004-05-04 13:54:50 +0000
commitf72b5416b95d8897b009af51abf7bacede486caf (patch)
treec310eae98d1fe5a3f79c9a3f68f254c5dce4725c /src/fileio.c
parent6ab6679999a9edefc38be7c0866152cf076bfe17 (diff)
downloademacs-f72b5416b95d8897b009af51abf7bacede486caf.tar.gz
* fileio.c (barf_or_query_if_file_exists): Use lstat.
(Frename_file): Handle renaming of symlinks across file systems.
Diffstat (limited to 'src/fileio.c')
-rw-r--r--src/fileio.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/fileio.c b/src/fileio.c
index 1f7fd5753b5..04068e25f89 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2349,7 +2349,7 @@ barf_or_query_if_file_exists (absname, querystring, interactive, statptr, quick)
/* 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 @@ This is what happens in interactive use with M-x. */)
Lisp_Object args[2];
#endif
Lisp_Object handler;
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
- Lisp_Object encoded_file, encoded_newname;
+ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+ Lisp_Object encoded_file, encoded_newname, symlink_target;
- encoded_file = encoded_newname = Qnil;
- GCPRO4 (file, newname, encoded_file, encoded_newname);
+ 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 @@ This is what happens in interactive use with M-x. */)
{
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