diff options
author | Jakob Kaivo <jkk@ung.org> | 2020-08-16 18:22:05 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2020-08-16 18:22:05 -0400 |
commit | 9ed2b0ecd370e1b0374e933ae8468b988f48e9be (patch) | |
tree | dcc3cb0b0ed4d5cfbedaade899b4b766a2c626e5 | |
parent | 868b724c674c1520785281dd44346b22032ee9bb (diff) |
clean up
-rw-r--r-- | src/dirent/readdir.c | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/src/dirent/readdir.c b/src/dirent/readdir.c index 205204d1..0ccbe790 100644 --- a/src/dirent/readdir.c +++ b/src/dirent/readdir.c @@ -1,33 +1,30 @@ #include <dirent.h> -#include "limits.h" -#include "errno.h" -#include "sys/types.h" -#include "stddef.h" +#include <limits.h> +#include <errno.h> +#include <sys/types.h> +#include <string.h> +#include <unistd.h> #include "_dirent.h" -#include "unistd.h" #include "_syscall.h" -#include "string.h" #ifndef NAME_MAX #define NAME_MAX _POSIX_NAME_MAX #endif +/** read a directory **/ + struct dirent * readdir(DIR * dirp) { - struct { - unsigned long inode; - unsigned long offset; - unsigned short length; - } kernel_de = { 0, 0, 0 }; - if (read(dirp->fd, &kernel_de, sizeof(kernel_de)) == -1) { + if (read(dirp->fd, dirp, sizeof(*dirp)) == -1) { if (errno == EISDIR) { + #ifdef __linux__ struct { long inode; off_t offset; unsigned short reclen; char name[NAME_MAX + 1]; } linux = { 0, 0, 0, "" }; - long ret = __syscall(__syscall_lookup(getdents), dirp->fd, &linux, sizeof(linux)); + long ret = __scall3(getdents, dirp->fd, &linux, sizeof(linux)); if (ret < 0) { errno = -ret; return NULL; @@ -36,20 +33,14 @@ struct dirent * readdir(DIR * dirp) #ifdef _XOPEN_SOURCE dirp->de.d_ino = linux.inode; #endif + strcpy(dirp->de.d_name, linux.name); return &dirp->de; + #endif } return NULL; } - #ifdef _XOPEN_SOURCE - dirp->de.d_ino = inode; - #endif - - if (read(dirp->fd, &dirp->de.d_name, kernel_de.length) == -1) { - return NULL; - } - return &dirp->de; } |