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

add posix_fadvise / posix_fadvise64 support

Mike Frysinger преди 19 години
родител
ревизия
0695d2cabc
променени са 3 файла, в които са добавени 99 реда и са изтрити 8 реда
  1. 8 8
      libc/sysdeps/linux/common/Makefile
  2. 34 0
      libc/sysdeps/linux/common/posix_fadvise.c
  3. 57 0
      libc/sysdeps/linux/common/posix_fadvise64.c

+ 8 - 8
libc/sysdeps/linux/common/Makefile

@@ -37,14 +37,14 @@ CSRC=	__rt_sigtimedwait.c __socketcall.c __syscall_fcntl.c \
 	mlockall.c mmap.c mmap64.c modify_ldt.c mount.c mprotect.c \
 	mremap.c msync.c munlock.c munlockall.c munmap.c nanosleep.c \
 	nice.c noophooks.c ntp_gettime.c open.c open64.c pause.c \
-	personality.c pipe.c pivot_root.c poll.c prctl.c pread_write.c \
-	ptrace.c query_module.c quotactl.c read.c readlink.c readv.c \
-	reboot.c rename.c rmdir.c sched_get_priority_max.c \
-	sched_get_priority_min.c sched_getparam.c sched_getscheduler.c \
-	sched_rr_get_interval.c sched_setparam.c sched_setscheduler.c \
-	sched_yield.c select.c sendfile.c sendfile64.c setdomainname.c \
-	setegid.c seteuid.c setfsgid.c setfsuid.c setgid.c setgroups.c \
-	sethostname.c setitimer.c setpgid.c setpgrp.c setpriority.c \
+	personality.c pipe.c pivot_root.c poll.c posix_fadvise.c \
+	posix_fadvise64.c prctl.c pread_write.c ptrace.c query_module.c \
+	quotactl.c read.c readlink.c readv.c reboot.c rename.c rmdir.c \
+	sched_get_priority_max.c sched_get_priority_min.c sched_getparam.c \
+	sched_getscheduler.c sched_rr_get_interval.c sched_setparam.c \
+	sched_setscheduler.c sched_yield.c select.c sendfile.c sendfile64.c \
+	setdomainname.c setegid.c seteuid.c setfsgid.c setfsuid.c setgid.c \
+	setgroups.c sethostname.c setitimer.c setpgid.c setpgrp.c setpriority.c \
 	setregid.c setresgid.c setresuid.c setreuid.c setrlimit.c \
 	setrlimit64.c setsid.c settimeofday.c setuid.c sigaltstack.c \
 	sigpending.c sigprocmask.c sigsuspend.c stat.c stat64.c statfs.c \

+ 34 - 0
libc/sysdeps/linux/common/posix_fadvise.c

@@ -0,0 +1,34 @@
+/* vi: set sw=4 ts=4: */
+/* 
+ * posix_fadvise() for uClibc
+ * http://www.opengroup.org/onlinepubs/009695399/functions/posix_fadvise.html
+ *
+ * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
+ *
+ * GNU Library General Public License (LGPL) version 2 or later.
+ */
+
+#include "syscalls.h"
+#include <fcntl.h>
+
+#ifdef __NR_fadvise64
+#define __NR___syscall_fadvise64 __NR_fadvise64
+_syscall4(int, __syscall_fadvise64, int, fd, off_t, offset, 
+          off_t, len, int, advice);
+int __libc_posix_fadvise(int fd, off_t offset, off_t len, int advice)
+{
+	return (__syscall_fadvise64(fd, offset, len, advice));
+}
+weak_alias(__libc_posix_fadvise, posix_fadvise);
+
+#else
+int posix_fadvise(int fd, off_t offset, off_t len, int advice)
+{
+    __set_errno(ENOSYS);
+    return -1;
+}
+#endif
+
+#if ! defined __NR_fadvise64_64 && defined __UCLIBC_HAS_LFS__
+weak_alias(__libc_posix_fadvise, posix_fadvise64);
+#endif

+ 57 - 0
libc/sysdeps/linux/common/posix_fadvise64.c

@@ -0,0 +1,57 @@
+/* vi: set sw=4 ts=4: */
+/* 
+ * posix_fadvise64() for uClibc
+ * http://www.opengroup.org/onlinepubs/009695399/functions/posix_fadvise.html
+ *
+ * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
+ *
+ * GNU Library General Public License (LGPL) version 2 or later.
+ */
+
+#include <features.h>
+#include <unistd.h>
+#include <errno.h>
+#include <endian.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <fcntl.h>
+
+#if defined __UCLIBC_HAS_LFS__ && defined __NR_fadvise64_64
+#define __NR___syscall_fadvise64_64 __NR_fadvise64_64
+
+/* 64 bit implementation is cake ... or more like pie ... */
+#if __WORDSIZE == 64
+_syscall4(int, __syscall_fadvise64_64, int, fd, __off64_t, offset, 
+          __off64_t, len, int, advice);
+int __libc_posix_fadvise64(int fd, __off64_t offset, __off64_t len, int advice)
+{
+	return (__syscall_fadvise64_64(fd, offset, len, advice));
+}
+weak_alias(__libc_posix_fadvise64, posix_fadvise64);
+
+/* 32 bit implementation is kind of a pita */
+#elif __WORDSIZE == 32
+
+#ifdef _syscall6 /* workaround until everyone has _syscall6() */
+_syscall6(int, __syscall_fadvise64_64, int, fd, 
+          unsigned long, high_offset, unsigned long, low_offset, 
+          unsigned long, high_len, unsigned long, low_len, 
+          int, advice);
+int __libc_posix_fadvise64(int fd, __off64_t offset, __off64_t len, int advice)
+{
+	return (__syscall_fadvise64_64(fd,
+	        __LONG_LONG_PAIR(offset >> 32, offset &  0xffffffff),
+	        __LONG_LONG_PAIR(len >> 32, len & 0xffffffff),
+	        advice));
+}
+weak_alias(__libc_posix_fadvise64, posix_fadvise64);
+#else
+#warning _syscall6 has not been defined for your machine :(
+#endif /* _syscall6 */
+
+#else
+#error your machine is neither 32 bit or 64 bit ... it must be magical
+#endif
+
+#endif