mirror of git://git.musl-libc.org/musl
implement posix_getdents adopted for next issue of POSIX
this interface was added as the outcome of Austin Group tracker issue 697. no error is specified for unsupported flags, which is probably an oversight. for now, EOPNOTSUPP is used so as not to overload EINVAL.
This commit is contained in:
parent
2c124e13bd
commit
1b0d48517f
|
@ -9,14 +9,23 @@ extern "C" {
|
||||||
|
|
||||||
#define __NEED_ino_t
|
#define __NEED_ino_t
|
||||||
#define __NEED_off_t
|
#define __NEED_off_t
|
||||||
#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
|
|
||||||
#define __NEED_size_t
|
#define __NEED_size_t
|
||||||
#endif
|
#define __NEED_ssize_t
|
||||||
|
|
||||||
#include <bits/alltypes.h>
|
#include <bits/alltypes.h>
|
||||||
|
|
||||||
#include <bits/dirent.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;
|
typedef struct __dirstream DIR;
|
||||||
|
|
||||||
#define d_fileno d_ino
|
#define d_fileno d_ino
|
||||||
|
@ -29,6 +38,8 @@ int readdir_r(DIR *__restrict, struct dirent *__restrict, struct dire
|
||||||
void rewinddir(DIR *);
|
void rewinddir(DIR *);
|
||||||
int dirfd(DIR *);
|
int dirfd(DIR *);
|
||||||
|
|
||||||
|
ssize_t posix_getdents(int, void *, size_t, int);
|
||||||
|
|
||||||
int alphasort(const struct dirent **, const struct dirent **);
|
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 **));
|
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 *);
|
long telldir(DIR *);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
|
||||||
#define DT_UNKNOWN 0
|
#define DT_UNKNOWN 0
|
||||||
#define DT_FIFO 1
|
#define DT_FIFO 1
|
||||||
#define DT_CHR 2
|
#define DT_CHR 2
|
||||||
|
@ -47,6 +57,8 @@ long telldir(DIR *);
|
||||||
#define DT_LNK 10
|
#define DT_LNK 10
|
||||||
#define DT_SOCK 12
|
#define DT_SOCK 12
|
||||||
#define DT_WHT 14
|
#define DT_WHT 14
|
||||||
|
|
||||||
|
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
||||||
#define IFTODT(x) ((x)>>12 & 017)
|
#define IFTODT(x) ((x)>>12 & 017)
|
||||||
#define DTTOIF(x) ((x)<<12)
|
#define DTTOIF(x) ((x)<<12)
|
||||||
int getdents(int, struct dirent *, size_t);
|
int getdents(int, struct dirent *, size_t);
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
Loading…
Reference in New Issue