summaryrefslogtreecommitdiff
path: root/libguile
diff options
context:
space:
mode:
authorMaxime Devos <maximedevos@telenet.be>2021-11-16 11:06:27 +0000
committerLudovic Courtès <ludo@gnu.org>2022-10-21 17:40:37 +0200
commit6c350b609475ec7c490a8faecedd6a768afd7065 (patch)
tree1ee7625de704e661e9a045a95bd8a4f5a24be6b7 /libguile
parent9ffd297249e8c99ac276b37c49725f6d2ef20b52 (diff)
downloadguile-6c350b609475ec7c490a8faecedd6a768afd7065.tar.gz
Define ‘symlinkat’ wrapper when supported.
* configure.ac: Detect whether ‘symlinkat’ exists. * libguile/filesys.c (scm_symlinkat): Define a Scheme binding when it exists. * libguile/filesys.h: Make the binding part of the public C API. * doc/ref/posix.texi (File System): Document the binding. * test-suite/tests/filesys.test ("symlinkat"): Test it. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'libguile')
-rw-r--r--libguile/filesys.c23
-rw-r--r--libguile/filesys.h1
2 files changed, 24 insertions, 0 deletions
diff --git a/libguile/filesys.c b/libguile/filesys.c
index 1ae2c5de7..e00ddba5f 100644
--- a/libguile/filesys.c
+++ b/libguile/filesys.c
@@ -1032,6 +1032,29 @@ SCM_DEFINE (scm_symlink, "symlink", 2, 0, 0,
#undef FUNC_NAME
#endif /* HAVE_SYMLINK */
+#ifdef HAVE_SYMLINKAT
+SCM_DEFINE (scm_symlinkat, "symlinkat", 3, 0, 0,
+ (SCM dir, SCM oldpath, SCM newpath),
+ "Like @code{symlink}, but resolve @var{newpath} relative\n"
+ "to the directory referred to by the file port @var{dir}.")
+#define FUNC_NAME s_scm_symlinkat
+{
+ int val;
+ int fdes;
+
+ SCM_VALIDATE_OPFPORT (SCM_ARG1, dir);
+ fdes = SCM_FPORT_FDES (dir);
+ STRING2_SYSCALL (oldpath, c_oldpath,
+ newpath, c_newpath,
+ val = symlinkat (c_oldpath, fdes, c_newpath));
+ scm_remember_upto_here_1 (dir);
+ if (val != 0)
+ SCM_SYSERROR;
+ return SCM_UNSPECIFIED;
+}
+#undef FUNC_NAME
+#endif /* HAVE_SYMLINKAT */
+
/* Static helper function for choosing between readlink
and readlinkat. */
static int
diff --git a/libguile/filesys.h b/libguile/filesys.h
index a3b257c12..d181aca52 100644
--- a/libguile/filesys.h
+++ b/libguile/filesys.h
@@ -62,6 +62,7 @@ SCM_API SCM scm_select (SCM reads, SCM writes, SCM excepts, SCM secs, SCM msecs)
SCM_API SCM scm_fcntl (SCM object, SCM cmd, SCM value);
SCM_API SCM scm_fsync (SCM object);
SCM_API SCM scm_symlink (SCM oldpath, SCM newpath);
+SCM_API SCM scm_symlinkat (SCM dir, SCM oldpath, SCM newpath);
SCM_API SCM scm_readlink (SCM path);
SCM_API SCM scm_lstat (SCM str);
SCM_API SCM scm_copy_file (SCM oldfile, SCM newfile);