core: use getdents64 syscall on linux instead of getdents.

* src/posix-io.c (get_max_fds): use getdents64 instead of getdents.
--

getdents64 was introduced in linux 2.4, so it should be widely
available.  some Linux architectures which post-date 2.4 (e.g. arm64)
appear to not have getdents at all, so it's probably better to use the
more modern interface.

Signed-off-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
This commit is contained in:
Daniel Kahn Gillmor 2017-10-11 11:38:39 -04:00 committed by Werner Koch
parent 4632adf403
commit 00daac1553
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B

View File

@ -282,13 +282,14 @@ _gpgme_io_set_nonblocking (int fd)
#ifdef USE_LINUX_GETDENTS #ifdef USE_LINUX_GETDENTS
/* This is not declared in public headers; getdents(2) says that we must /* This is not declared in public headers; getdents64(2) says that we must
* define it ourselves. */ * define it ourselves. */
struct linux_dirent struct linux_dirent64
{ {
unsigned long d_ino; ino64_t d_ino;
unsigned long d_off; off64_t d_off;
unsigned short d_reclen; unsigned short d_reclen;
unsigned char d_type;
char d_name[]; char d_name[];
}; };
@ -316,7 +317,7 @@ get_max_fds (void)
{ {
int dir_fd; int dir_fd;
char dir_buf[DIR_BUF_SIZE]; char dir_buf[DIR_BUF_SIZE];
struct linux_dirent *dir_entry; struct linux_dirent64 *dir_entry;
int r, pos; int r, pos;
const char *s; const char *s;
int x; int x;
@ -326,7 +327,7 @@ get_max_fds (void)
{ {
for (;;) for (;;)
{ {
r = syscall(SYS_getdents, dir_fd, dir_buf, DIR_BUF_SIZE); r = syscall(SYS_getdents64, dir_fd, dir_buf, DIR_BUF_SIZE);
if (r == -1) if (r == -1)
{ {
/* Fall back to other methods. */ /* Fall back to other methods. */
@ -338,7 +339,7 @@ get_max_fds (void)
for (pos = 0; pos < r; pos += dir_entry->d_reclen) for (pos = 0; pos < r; pos += dir_entry->d_reclen)
{ {
dir_entry = (struct linux_dirent *) (dir_buf + pos); dir_entry = (struct linux_dirent64 *) (dir_buf + pos);
s = dir_entry->d_name; s = dir_entry->d_name;
if (*s < '0' || *s > '9') if (*s < '0' || *s > '9')
continue; continue;