summaryrefslogtreecommitdiff
path: root/libguile/filesys.c
diff options
context:
space:
mode:
authorMaxime Devos <maximedevos@telenet.be>2021-11-16 11:06:31 +0000
committerLudovic Courtès <ludo@gnu.org>2022-10-21 17:40:37 +0200
commit3a0554c60fb12857c67d2eb0bd04cf8c59014f55 (patch)
tree8ddc86f7fb394840c3a04815c571348ceed908e8 /libguile/filesys.c
parent24028e75ca6c184051ee9543ceefeefe628c025b (diff)
downloadguile-3a0554c60fb12857c67d2eb0bd04cf8c59014f55.tar.gz
Define a Scheme binding to ‘renameat’ when it exists.
* configure.ac: Detect if ‘renameat’ is defined. * libguile/filesys.c (scm_renameat): Define a Scheme binding to the ‘renameat’ system call. * doc/ref/posix.texi (File System): Document it. * libguile/filesys.h (scm_renameat): Make it part of the C API. * test-suite/tests/filesys.test ("rename-file-at"): New tests. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'libguile/filesys.c')
-rw-r--r--libguile/filesys.c34
1 files changed, 34 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),