summaryrefslogtreecommitdiff
path: root/libguile
diff options
context:
space:
mode:
Diffstat (limited to 'libguile')
-rw-r--r--libguile/filesys.c34
-rw-r--r--libguile/filesys.h1
2 files changed, 35 insertions, 0 deletions
diff --git a/libguile/filesys.c b/libguile/filesys.c
index 29787a83f..fc7867fb8 100644
--- a/libguile/filesys.c
+++ b/libguile/filesys.c
@@ -1408,6 +1408,40 @@ SCM_DEFINE (scm_rename, "rename-file", 2, 0, 0,
}
#undef FUNC_NAME
+#ifdef HAVE_RENAMEAT
+SCM_DEFINE (scm_renameat, "rename-file-at", 4, 0, 0,
+ (SCM olddir, SCM oldname, SCM newdir, SCM newname),
+ "Like @code{rename-file}, but when @var{olddir} or @var{newdir}\n"
+ "is true, resolve @var{oldname} or @var{newname} relative to\n"
+ "the directory specified by file port @var{olddir} or\n"
+ "@var{newdir} instead of the current working directory.")
+#define FUNC_NAME s_scm_renameat
+{
+ int rv;
+ int old_fdes, new_fdes;
+
+ old_fdes = AT_FDCWD;
+ new_fdes = AT_FDCWD;
+
+ if (scm_is_true (olddir)) {
+ SCM_VALIDATE_OPFPORT (SCM_ARG1, olddir);
+ old_fdes = SCM_FPORT_FDES (olddir);
+ }
+ if (scm_is_true (newdir)) {
+ SCM_VALIDATE_OPFPORT (SCM_ARG3, newdir);
+ new_fdes = SCM_FPORT_FDES (newdir);
+ }
+
+ STRING2_SYSCALL (oldname, c_oldname,
+ newname, c_newname,
+ rv = renameat (old_fdes, c_oldname, new_fdes, c_newname));
+ scm_remember_upto_here_2 (olddir, newdir);
+ if (rv != 0)
+ SCM_SYSERROR;
+ return SCM_UNSPECIFIED;
+}
+#undef FUNC_NAME
+#endif
SCM_DEFINE (scm_delete_file, "delete-file", 1, 0, 0,
(SCM str),
diff --git a/libguile/filesys.h b/libguile/filesys.h
index f0dd35ede..7e17cc585 100644
--- a/libguile/filesys.h
+++ b/libguile/filesys.h
@@ -48,6 +48,7 @@ SCM_API SCM scm_close_fdes (SCM fd);
SCM_API SCM scm_stat (SCM object, SCM exception_on_error);
SCM_API SCM scm_link (SCM oldpath, SCM newpath);
SCM_API SCM scm_rename (SCM oldname, SCM newname);
+SCM_API SCM scm_renameat (SCM olddir, SCM oldname, SCM newdir, SCM newname);
SCM_API SCM scm_delete_file (SCM str);
SCM_API SCM scm_mkdir (SCM path, SCM mode);
SCM_API SCM scm_mkdirat (SCM dir, SCM path, SCM mode);