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',
+90, -0
 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+
+29, -0
 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