commit 6e41885
Michael Forney
·
2026-03-07 21:31:06 +0000 UTC
parent 21b190e
musl: Add patch to implement posix_getdents
4 files changed,
+121,
-1
+1,
-0
1@@ -127,6 +127,7 @@ return {
2 'src/dirent/dirfd.c',
3 'src/dirent/fdopendir.c',
4 'src/dirent/opendir.c',
5+ 'src/dirent/posix_getdents.c',
6 'src/dirent/readdir.c',
7 'src/dirent/readdir_r.c',
8 'src/dirent/rewinddir.c',
1@@ -0,0 +1,90 @@
2+From c926062544498d920fec3c586e5eaa5e941ceafd Mon Sep 17 00:00:00 2001
3+From: Rich Felker <dalias@aerifal.cx>
4+Date: Wed, 8 May 2024 08:50:03 -0400
5+Subject: [PATCH] implement posix_getdents adopted for next issue of POSIX
6+
7+this interface was added as the outcome of Austin Group tracker issue
8+697. no error is specified for unsupported flags, which is probably an
9+oversight. for now, EOPNOTSUPP is used so as not to overload EINVAL.
10+---
11+ include/dirent.h | 18 +++++++++++++++---
12+ src/dirent/posix_getdents.c | 11 +++++++++++
13+ 2 files changed, 26 insertions(+), 3 deletions(-)
14+ create mode 100644 src/dirent/posix_getdents.c
15+
16+diff --git a/include/dirent.h b/include/dirent.h
17+index 2d8fffb2..7fa60e06 100644
18+--- a/include/dirent.h
19++++ b/include/dirent.h
20+@@ -9,14 +9,23 @@ extern "C" {
21+
22+ #define __NEED_ino_t
23+ #define __NEED_off_t
24+-#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
25+ #define __NEED_size_t
26+-#endif
27++#define __NEED_ssize_t
28+
29+ #include <bits/alltypes.h>
30+
31+ #include <bits/dirent.h>
32+
33++typedef unsigned short reclen_t;
34++
35++struct posix_dent {
36++ ino_t d_ino;
37++ off_t d_off;
38++ reclen_t d_reclen;
39++ unsigned char d_type;
40++ char d_name[];
41++};
42++
43+ typedef struct __dirstream DIR;
44+
45+ #define d_fileno d_ino
46+@@ -29,6 +38,8 @@ int readdir_r(DIR *__restrict, struct dirent *__restrict, struct dire
47+ void rewinddir(DIR *);
48+ int dirfd(DIR *);
49+
50++ssize_t posix_getdents(int, void *, size_t, int);
51++
52+ int alphasort(const struct dirent **, const struct dirent **);
53+ int scandir(const char *, struct dirent ***, int (*)(const struct dirent *), int (*)(const struct dirent **, const struct dirent **));
54+
55+@@ -37,7 +48,6 @@ void seekdir(DIR *, long);
56+ long telldir(DIR *);
57+ #endif
58+
59+-#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
60+ #define DT_UNKNOWN 0
61+ #define DT_FIFO 1
62+ #define DT_CHR 2
63+@@ -47,6 +57,8 @@ long telldir(DIR *);
64+ #define DT_LNK 10
65+ #define DT_SOCK 12
66+ #define DT_WHT 14
67++
68++#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
69+ #define IFTODT(x) ((x)>>12 & 017)
70+ #define DTTOIF(x) ((x)<<12)
71+ int getdents(int, struct dirent *, size_t);
72+diff --git a/src/dirent/posix_getdents.c b/src/dirent/posix_getdents.c
73+new file mode 100644
74+index 00000000..b19e8127
75+--- /dev/null
76++++ b/src/dirent/posix_getdents.c
77+@@ -0,0 +1,11 @@
78++#include <dirent.h>
79++#include <limits.h>
80++#include <errno.h>
81++#include "syscall.h"
82++
83++int posix_getdents(int fd, void *buf, size_t len, int flags)
84++{
85++ if (flags) return __syscall_ret(-EOPNOTSUPP);
86++ if (len>INT_MAX) len = INT_MAX;
87++ return syscall(SYS_getdents, fd, buf, len);
88++}
89+--
90+2.49.0
91+
1@@ -0,0 +1,29 @@
2+From ecb9e060f7f5bc596b9be8043bba33840c85bc5a Mon Sep 17 00:00:00 2001
3+From: Rich Felker <dalias@aerifal.cx>
4+Date: Sun, 12 May 2024 15:33:15 -0400
5+Subject: [PATCH] fix mismatched type in posix_getdents definition
6+
7+commit 1b0d48517f816e98f19111df82f32bfc1608ecec wrongly copied the
8+getdents return type of int rather than matching the ssize_t used by
9+posix_getdents. this was overlooked in testing on 32-bit archs but
10+obviously broke 64-bit archs.
11+---
12+ src/dirent/posix_getdents.c | 2 +-
13+ 1 file changed, 1 insertion(+), 1 deletion(-)
14+
15+diff --git a/src/dirent/posix_getdents.c b/src/dirent/posix_getdents.c
16+index b19e8127..26c16ac6 100644
17+--- a/src/dirent/posix_getdents.c
18++++ b/src/dirent/posix_getdents.c
19+@@ -3,7 +3,7 @@
20+ #include <errno.h>
21+ #include "syscall.h"
22+
23+-int posix_getdents(int fd, void *buf, size_t len, int flags)
24++ssize_t posix_getdents(int fd, void *buf, size_t len, int flags)
25+ {
26+ if (flags) return __syscall_ret(-EOPNOTSUPP);
27+ if (len>INT_MAX) len = INT_MAX;
28+--
29+2.49.0
30+
+1,
-1
1@@ -1 +1 @@
2-1.2.5 r2
3+1.2.5 r3