summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Novoa III <mjn3@codepoet.org>2001-06-25 20:26:29 +0000
committerManuel Novoa III <mjn3@codepoet.org>2001-06-25 20:26:29 +0000
commit96b91643c34a145a2e565247ca7594c1f77fb011 (patch)
treebd7eca717f2d473cf3bcdd7bffff62e082b65f72
parent130ddae1735c638bddd24b3bd3e09e64c434f3c6 (diff)
Remove simulated d_type support for getdents and the dirent struct, and use
the straight getdents syscall instead of the wrapper (which leaked memory).
-rw-r--r--libc/misc/dirent/readdir.c12
-rw-r--r--libc/sysdeps/linux/common/Makefile4
-rwxr-xr-xlibc/sysdeps/linux/common/str_syscalls.sh2
-rw-r--r--libc/sysdeps/linux/common/syscalls.c5
-rw-r--r--libc/sysdeps/linux/i386/bits/dirent.h13
5 files changed, 17 insertions, 19 deletions
diff --git a/libc/misc/dirent/readdir.c b/libc/misc/dirent/readdir.c
index 0bb03f4c2..81575283d 100644
--- a/libc/misc/dirent/readdir.c
+++ b/libc/misc/dirent/readdir.c
@@ -55,15 +55,5 @@ struct dirent *readdir(DIR * dir)
/* We have to save the next offset here. */
dir->dd_nextoff = de->d_off;
- /* convert */
- dir->dd_buf->d_ino = de->d_ino;
- dir->dd_buf->d_off = de->d_off;
- dir->dd_buf->d_reclen = de->d_reclen;
- dir->dd_buf->d_type = 0;
- if (strlen((char *) &de->d_type) > 10)
- de->d_name[10] = 0;
- strcpy(dir->dd_buf->d_name, (char *) &de->d_name);
- __set_errno(0);
-
- return dir->dd_buf;
+ return de;
}
diff --git a/libc/sysdeps/linux/common/Makefile b/libc/sysdeps/linux/common/Makefile
index 1d4326b4c..39ead28a1 100644
--- a/libc/sysdeps/linux/common/Makefile
+++ b/libc/sysdeps/linux/common/Makefile
@@ -24,9 +24,9 @@
TOPDIR=../../../../
include $(TOPDIR)Rules.mak
-CSRC= waitpid.c getdents.c kernel_version.c statfix.c getdnnm.c tell.c gethstnm.c \
+CSRC= waitpid.c kernel_version.c statfix.c getdnnm.c tell.c gethstnm.c \
mkfifo.c setegid.c wait.c errno.c getpagesize.c seteuid.c wait3.c setpgrp.c \
- getdtablesize.c create_module.c ptrace.c
+ getdtablesize.c create_module.c ptrace.c # getdents.c
COBJS=$(patsubst %.c,%.o, $(CSRC))
MSRC=syscalls.c
diff --git a/libc/sysdeps/linux/common/str_syscalls.sh b/libc/sysdeps/linux/common/str_syscalls.sh
index a9e984821..c82521469 100755
--- a/libc/sysdeps/linux/common/str_syscalls.sh
+++ b/libc/sysdeps/linux/common/str_syscalls.sh
@@ -29,6 +29,6 @@ echo "printf(\"#define __STR_NR_fcntl __STR_NR__fcntl\n\");"
echo "printf(\"#define __STR_NR_reboot __STR_NR__reboot\n\");"
echo "printf(\"#define __STR_NR_mmap __STR_NR__mmap\n\");"
echo "printf(\"#define __STR_NR_syslog __STR_NR__syslog\n\");"
-echo "printf(\"#define __STR_NR_getdents __STR_NR__getdents\n\");"
+#echo "printf(\"#define __STR_NR_getdents __STR_NR__getdents\n\");"
echo
echo "return EXIT_SUCCESS; }"
diff --git a/libc/sysdeps/linux/common/syscalls.c b/libc/sysdeps/linux/common/syscalls.c
index e0aa4a91e..0b82f4973 100644
--- a/libc/sysdeps/linux/common/syscalls.c
+++ b/libc/sysdeps/linux/common/syscalls.c
@@ -984,11 +984,10 @@ loff_t llseek(int fd, loff_t offset, int whence)
#endif
//#define __NR_getdents 141
-#ifdef L__getdents
-#define __NR__getdents __NR_getdents
+#ifdef L_getdents
#include <unistd.h>
#include <dirent.h>
-_syscall3(int, _getdents, int, fd, char *, dirp, size_t, count);
+_syscall3(int, getdents, int, fd, char *, dirp, size_t, count);
#endif
//#define __NR__newselect 142
diff --git a/libc/sysdeps/linux/i386/bits/dirent.h b/libc/sysdeps/linux/i386/bits/dirent.h
index 30e020328..1754c7cbe 100644
--- a/libc/sysdeps/linux/i386/bits/dirent.h
+++ b/libc/sysdeps/linux/i386/bits/dirent.h
@@ -16,6 +16,16 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+/*
+ * June 25, 2001
+ *
+ * Removed d_type support for dirent and undefined _DIRENT_HAVE_D_TYPE;
+ * i.e. match the kernel structs and avoid any translation for now.
+ * Note: glibc fakes d_type for the dirent case.
+ * Note: dirent64 still has the d_type field.
+ */
+
+
#ifndef _DIRENT_H
# error "Never use <bits/dirent.h> directly; include <dirent.h> instead."
#endif
@@ -30,7 +40,6 @@ struct dirent
__off64_t d_off;
#endif
unsigned short int d_reclen;
- unsigned char d_type;
char d_name[256]; /* We must not include limits.h! */
};
@@ -50,4 +59,4 @@ struct dirent64
#undef _DIRENT_HAVE_D_NAMLEN
#define _DIRENT_HAVE_D_RECLEN
#define _DIRENT_HAVE_D_OFF
-#define _DIRENT_HAVE_D_TYPE
+#undef _DIRENT_HAVE_D_TYPE