Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220524080704.70894-1-jiaqing.zhao@linux.intel.com>
Date: Tue, 24 May 2022 16:07:04 +0800
From: Jiaqing Zhao <jiaqing.zhao@...ux.intel.com>
To: musl@...ts.openwall.com
Cc: Jiaqing Zhao <jiaqing.zhao@...ux.intel.com>
Subject: [PATCH] dirent: implement getdents64

In musl, getdents64 is an alias of getdents, but the type annotation
of these two functions are different according to man page[1], causing
compile errors. This patch implements the standard getdents64.
    ssize_t getdents64(int fd, void *dirp, size_t count);

[1] https://man7.org/linux/man-pages/man2/getdents.2.html

Signed-off-by: Jiaqing Zhao <jiaqing.zhao@...ux.intel.com>
---
 include/dirent.h     | 3 ++-
 src/linux/getdents.c | 6 +++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/include/dirent.h b/include/dirent.h
index 650ecf64..4c5367c2 100644
--- a/include/dirent.h
+++ b/include/dirent.h
@@ -11,6 +11,7 @@ extern "C" {
 #define __NEED_off_t
 #if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)
 #define __NEED_size_t
+#define __NEED_ssize_t
 #endif
 
 #include <bits/alltypes.h>
@@ -50,6 +51,7 @@ long           telldir(DIR *);
 #define IFTODT(x) ((x)>>12 & 017)
 #define DTTOIF(x) ((x)<<12)
 int getdents(int, struct dirent *, size_t);
+ssize_t getdents64(int, void *, size_t);
 #endif
 
 #ifdef _GNU_SOURCE
@@ -65,7 +67,6 @@ int versionsort(const struct dirent **, const struct dirent **);
 #define versionsort64 versionsort
 #define off64_t off_t
 #define ino64_t ino_t
-#define getdents64 getdents
 #endif
 
 #ifdef __cplusplus
diff --git a/src/linux/getdents.c b/src/linux/getdents.c
index 796c1e5c..923a8076 100644
--- a/src/linux/getdents.c
+++ b/src/linux/getdents.c
@@ -9,4 +9,8 @@ int getdents(int fd, struct dirent *buf, size_t len)
 	return syscall(SYS_getdents, fd, buf, len);
 }
 
-weak_alias(getdents, getdents64);
+ssize_t getdents64(int fd, void *buf, size_t len)
+{
+	if (len>INT_MAX) len = INT_MAX;
+	return syscall(SYS_getdents64, fd, buf, len);
+}
-- 
2.34.1

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.