Преглед на файлове

avoid circular dependency in lseek and llseek, providing a stub lseek

Signed-off-by: Peter S. Mazinger <ps.m@gmx.net>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Peter S. Mazinger преди 13 години
родител
ревизия
29a778aa19
променени са 2 файла, в които са добавени 28 реда и са изтрити 12 реда
  1. 5 10
      libc/sysdeps/linux/common/llseek.c
  2. 23 2
      libc/sysdeps/linux/common/lseek.c

+ 5 - 10
libc/sysdeps/linux/common/llseek.c

@@ -7,8 +7,8 @@
  * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
  */
 
+#include <_lfs_64.h>
 #include <unistd.h>
-#include <sys/types.h>
 #include <sys/syscall.h>
 
 /* Newer kernel ports have llseek() instead of _llseek() */
@@ -16,24 +16,19 @@
 # define __NR__llseek __NR_llseek
 #endif
 
-#if defined __NR__llseek && defined __UCLIBC_HAS_LFS__
-
+#ifdef __NR__llseek
 loff_t lseek64(int fd, loff_t offset, int whence)
 {
 	loff_t result;
-	return (loff_t)(INLINE_SYSCALL(_llseek, 5, fd, (off_t) (offset >> 32),
-				(off_t) (offset & 0xffffffff), &result, whence) ?: result);
+	return (loff_t)INLINE_SYSCALL(_llseek, 5, fd, (off_t) (offset >> 32),
+				(off_t) (offset & 0xffffffff), &result, whence) ?: result;
 }
-
 #else
-
 loff_t lseek64(int fd, loff_t offset, int whence)
 {
-	return (loff_t)(lseek(fd, (off_t) (offset), whence));
+	return (loff_t)lseek(fd, (off_t) (offset), whence);
 }
-
 #endif
-
 #ifndef __LINUXTHREADS_OLD__
 libc_hidden_def(lseek64)
 #else

+ 23 - 2
libc/sysdeps/linux/common/lseek.c

@@ -12,12 +12,33 @@
 
 #ifdef __NR_lseek
 _syscall3(__off_t, lseek, int, fildes, __off_t, offset, int, whence)
-#else
-
+#elif defined __UCLIBC_HAS_LFS__ && defined __NR__llseek /* avoid circular dependency */
 __off_t lseek(int fildes, __off_t offset, int whence)
 {
 	return lseek64(fildes, offset, whence);
 }
+#else
+# include <errno.h>
+__off_t lseek(int fildes, __off_t offset attribute_unused, int whence)
+{
+	if (fildes < 0) {
+		__set_errno(EBADF);
+		return -1;
+	}
+
+	switch(whence) {
+		case SEEK_SET:
+		case SEEK_CUR:
+		case SEEK_END:
+			break;
+		default:
+			__set_errno(EINVAL);
+			return -1;
+	}
+
+	__set_errno(ENOSYS);
+	return -1;
+}
 #endif
 #ifndef __LINUXTHREADS_OLD__
 libc_hidden_def(lseek)