summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/dirent.h18
-rw-r--r--src/dirent/posix_getdents.c11
2 files changed, 26 insertions, 3 deletions
diff --git a/include/dirent.h b/include/dirent.h
index 2d8fffb2..7fa60e06 100644
--- a/include/dirent.h
+++ b/include/dirent.h
@@ -9,14 +9,23 @@ extern "C" {
#define __NEED_ino_t
#define __NEED_off_t
-#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
#define __NEED_size_t
-#endif
+#define __NEED_ssize_t
#include <bits/alltypes.h>
#include <bits/dirent.h>
+typedef unsigned short reclen_t;
+
+struct posix_dent {
+ ino_t d_ino;
+ off_t d_off;
+ reclen_t d_reclen;
+ unsigned char d_type;
+ char d_name[];
+};
+
typedef struct __dirstream DIR;
#define d_fileno d_ino
@@ -29,6 +38,8 @@ int readdir_r(DIR *__restrict, struct dirent *__restrict, struct dire
void rewinddir(DIR *);
int dirfd(DIR *);
+ssize_t posix_getdents(int, void *, size_t, int);
+
int alphasort(const struct dirent **, const struct dirent **);
int scandir(const char *, struct dirent ***, int (*)(const struct dirent *), int (*)(const struct dirent **, const struct dirent **));
@@ -37,7 +48,6 @@ void seekdir(DIR *, long);
long telldir(DIR *);
#endif
-#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
#define DT_UNKNOWN 0
#define DT_FIFO 1
#define DT_CHR 2
@@ -47,6 +57,8 @@ long telldir(DIR *);
#define DT_LNK 10
#define DT_SOCK 12
#define DT_WHT 14
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
#define IFTODT(x) ((x)>>12 & 017)
#define DTTOIF(x) ((x)<<12)
int getdents(int, struct dirent *, size_t);
diff --git a/src/dirent/posix_getdents.c b/src/dirent/posix_getdents.c
new file mode 100644
index 00000000..b19e8127
--- /dev/null
+++ b/src/dirent/posix_getdents.c
@@ -0,0 +1,11 @@
+#include <dirent.h>
+#include <limits.h>
+#include <errno.h>
+#include "syscall.h"
+
+int posix_getdents(int fd, void *buf, size_t len, int flags)
+{
+ if (flags) return __syscall_ret(-EOPNOTSUPP);
+ if (len>INT_MAX) len = INT_MAX;
+ return syscall(SYS_getdents, fd, buf, len);
+}