diff options
Diffstat (limited to 'libguile')
-rw-r--r-- | libguile/filesys.c | 34 | ||||
-rw-r--r-- | libguile/filesys.h | 1 |
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); |