From 103b055035fea328f8bc7826801760fb1c055683 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 8 Oct 2018 13:52:14 +0200 Subject: [PATCH] Add generic implementation of fdopendir() Signed-off-by: Sebastian Huber --- newlib/libc/posix/opendir.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/newlib/libc/posix/opendir.c b/newlib/libc/posix/opendir.c index 650cbfe8d..2cf1ba541 100644 --- a/newlib/libc/posix/opendir.c +++ b/newlib/libc/posix/opendir.c @@ -43,17 +43,11 @@ static char sccsid[] = "@(#)opendir.c 5.11 (Berkeley) 2/23/91"; #include #include -/* - * open a directory. - */ -DIR * -opendir (const char *name) +static DIR * +_opendir_common(int fd) { DIR *dirp; - int fd; - if ((fd = open(name, O_RDONLY | O_DIRECTORY | O_CLOEXEC)) == -1) - return NULL; if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) { close (fd); return NULL; @@ -87,4 +81,23 @@ opendir (const char *name) return dirp; } +DIR * +opendir(const char *name) +{ + int fd; + + if ((fd = open(name, O_RDONLY | O_DIRECTORY | O_CLOEXEC)) == -1) + return (NULL); + return (_opendir_common(fd)); +} + +DIR * +fdopendir(int fd) +{ + + if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) + return (NULL); + return (_opendir_common(fd)); +} + #endif /* ! HAVE_OPENDIR */