mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-29 22:40:34 +02:00
Define bindings to ‘mkdirat’ when the C function exists.
* configure.ac: Detect if ‘mkdirat’ exists. * libguile/filesys.c (scm_mkdirat): Define the Scheme binding. * doc/ref/posix.texi (File System): Document it. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
parent
6c350b6094
commit
58ddd5c7bc
5 changed files with 71 additions and 1 deletions
|
@ -517,7 +517,7 @@ AC_CHECK_HEADERS([crt_externs.h])
|
||||||
#
|
#
|
||||||
AC_CHECK_FUNCS([DINFINITY DQNAN cexp chsize clog clog10 ctermid \
|
AC_CHECK_FUNCS([DINFINITY DQNAN cexp chsize clog clog10 ctermid \
|
||||||
fesetround ftime ftruncate fchown fchmod fchdir readlinkat \
|
fesetround ftime ftruncate fchown fchmod fchdir readlinkat \
|
||||||
symlinkat getcwd geteuid getsid \
|
symlinkat mkdirat getcwd geteuid getsid \
|
||||||
gettimeofday getuid getgid gmtime_r ioctl lstat mkdir mkdtemp mknod \
|
gettimeofday getuid getgid gmtime_r ioctl lstat mkdir mkdtemp mknod \
|
||||||
nice readlink rmdir setegid seteuid \
|
nice readlink rmdir setegid seteuid \
|
||||||
setuid setgid setpgid setsid sigaction siginterrupt stat64 \
|
setuid setgid setpgid setsid sigaction siginterrupt stat64 \
|
||||||
|
|
|
@ -924,6 +924,12 @@ Otherwise they are set to the value specified with @var{mode}.
|
||||||
The return value is unspecified.
|
The return value is unspecified.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Scheme Procedure} mkdirat dir path [mode]
|
||||||
|
@deffnx {C Function} scm_mkdirat (dir, path, mode)
|
||||||
|
Like @code{mkdir}, but resolve @var{path} relative to the directory
|
||||||
|
referred to by the file port @var{dir} instead.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
@deffn {Scheme Procedure} rmdir path
|
@deffn {Scheme Procedure} rmdir path
|
||||||
@deffnx {C Function} scm_rmdir (path)
|
@deffnx {C Function} scm_rmdir (path)
|
||||||
Remove the existing directory named by @var{path}. The directory must
|
Remove the existing directory named by @var{path}. The directory must
|
||||||
|
|
|
@ -1351,6 +1351,31 @@ SCM_DEFINE (scm_mkdir, "mkdir", 1, 1, 0,
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
#ifdef HAVE_MKDIRAT
|
||||||
|
SCM_DEFINE (scm_mkdirat, "mkdirat", 2, 1, 0,
|
||||||
|
(SCM dir, SCM path, SCM mode),
|
||||||
|
"Like @code{mkdir}, but resolve @var{path} relative to the directory\n"
|
||||||
|
"referred to by the file port @var{dir} instead.")
|
||||||
|
#define FUNC_NAME s_scm_mkdirat
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
int dir_fdes;
|
||||||
|
mode_t c_mode;
|
||||||
|
|
||||||
|
c_mode = SCM_UNBNDP (mode) ? 0777 : scm_to_uint (mode);
|
||||||
|
SCM_VALIDATE_OPFPORT (SCM_ARG1, dir);
|
||||||
|
dir_fdes = SCM_FPORT_FDES (dir);
|
||||||
|
|
||||||
|
STRING_SYSCALL (path, c_path, rv = mkdirat (dir_fdes, c_path, c_mode));
|
||||||
|
if (rv != 0)
|
||||||
|
SCM_SYSERROR;
|
||||||
|
|
||||||
|
scm_remember_upto_here_1 (dir);
|
||||||
|
return SCM_UNSPECIFIED;
|
||||||
|
}
|
||||||
|
#undef FUNC_NAME
|
||||||
|
#endif
|
||||||
|
|
||||||
SCM_DEFINE (scm_rmdir, "rmdir", 1, 0, 0,
|
SCM_DEFINE (scm_rmdir, "rmdir", 1, 0, 0,
|
||||||
(SCM path),
|
(SCM path),
|
||||||
"Remove the existing directory named by @var{path}. The directory must\n"
|
"Remove the existing directory named by @var{path}. The directory must\n"
|
||||||
|
|
|
@ -50,6 +50,7 @@ SCM_API SCM scm_link (SCM oldpath, SCM newpath);
|
||||||
SCM_API SCM scm_rename (SCM oldname, SCM newname);
|
SCM_API SCM scm_rename (SCM oldname, SCM newname);
|
||||||
SCM_API SCM scm_delete_file (SCM str);
|
SCM_API SCM scm_delete_file (SCM str);
|
||||||
SCM_API SCM scm_mkdir (SCM path, SCM mode);
|
SCM_API SCM scm_mkdir (SCM path, SCM mode);
|
||||||
|
SCM_API SCM scm_mkdirat (SCM dir, SCM path, SCM mode);
|
||||||
SCM_API SCM scm_rmdir (SCM path);
|
SCM_API SCM scm_rmdir (SCM path);
|
||||||
SCM_API SCM scm_directory_stream_p (SCM obj);
|
SCM_API SCM scm_directory_stream_p (SCM obj);
|
||||||
SCM_API SCM scm_opendir (SCM dirname);
|
SCM_API SCM scm_opendir (SCM dirname);
|
||||||
|
|
|
@ -29,6 +29,8 @@
|
||||||
(data-file-name "filesys-test.tmp"))
|
(data-file-name "filesys-test.tmp"))
|
||||||
(define (test-symlink)
|
(define (test-symlink)
|
||||||
(data-file-name "filesys-test-link.tmp"))
|
(data-file-name "filesys-test-link.tmp"))
|
||||||
|
(define (test-directory)
|
||||||
|
(data-file-name "filesys-test-dir.tmp"))
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
|
@ -394,3 +396,39 @@
|
||||||
(throw 'unsupported))
|
(throw 'unsupported))
|
||||||
(symlinkat (call-with-port (open "." O_RDONLY) identity)
|
(symlinkat (call-with-port (open "." O_RDONLY) identity)
|
||||||
(test-file) (test-symlink))))
|
(test-file) (test-symlink))))
|
||||||
|
|
||||||
|
(with-test-prefix "mkdirat"
|
||||||
|
(define (skip-if-unsupported)
|
||||||
|
(unless (defined? 'mkdirat)
|
||||||
|
(throw 'unsupported)))
|
||||||
|
(define (maybe-delete-directory)
|
||||||
|
(when (file-exists? (test-directory))
|
||||||
|
(rmdir (test-directory))))
|
||||||
|
(maybe-delete-directory)
|
||||||
|
|
||||||
|
(pass-if-equal "create" 'directory
|
||||||
|
(skip-if-unsupported)
|
||||||
|
(call-with-port
|
||||||
|
(open "." O_RDONLY)
|
||||||
|
(lambda (port)
|
||||||
|
(mkdirat port (test-directory))
|
||||||
|
(stat:type (stat (test-directory))))))
|
||||||
|
(maybe-delete-directory)
|
||||||
|
|
||||||
|
(pass-if-equal "explicit perms" (logand #o111 (lognot (umask)))
|
||||||
|
(skip-if-unsupported)
|
||||||
|
(call-with-port
|
||||||
|
(open "." O_RDONLY)
|
||||||
|
(lambda (port)
|
||||||
|
(mkdirat port (test-directory) #o111)
|
||||||
|
(stat:perms (stat (test-directory))))))
|
||||||
|
(maybe-delete-directory)
|
||||||
|
|
||||||
|
(pass-if-equal "create, implicit perms" (logand #o777 (lognot (umask)))
|
||||||
|
(skip-if-unsupported)
|
||||||
|
(call-with-port
|
||||||
|
(open "." O_RDONLY)
|
||||||
|
(lambda (port)
|
||||||
|
(mkdirat port (test-directory))
|
||||||
|
(stat:perms (stat (test-directory))))))
|
||||||
|
(maybe-delete-directory))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue