| /* |
| * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> |
| * |
| * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. |
| */ |
| |
| #include <features.h> |
| #include <fcntl.h> |
| #include <stdarg.h> |
| #ifdef __UCLIBC_HAS_THREADS_NATIVE__ |
| #include <errno.h> |
| #include <sysdep-cancel.h> |
| #endif |
| |
| #ifdef __UCLIBC_HAS_LFS__ |
| |
| #ifndef O_LARGEFILE |
| # define O_LARGEFILE 0100000 |
| #endif |
| |
| /* Open FILE with access OFLAG. If OFLAG includes O_CREAT, |
| a third argument is the file protection. */ |
| int open64 (const char *file, int oflag, ...) |
| { |
| mode_t mode = 0; |
| |
| if (oflag & O_CREAT) |
| { |
| va_list arg; |
| va_start (arg, oflag); |
| mode = va_arg (arg, mode_t); |
| va_end (arg); |
| } |
| |
| #ifdef __UCLIBC_HAS_THREADS_NATIVE__ |
| if (SINGLE_THREAD_P) |
| return INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode); |
| |
| int oldtype = LIBC_CANCEL_ASYNC (); |
| |
| int result = INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode); |
| |
| LIBC_CANCEL_RESET (oldtype); |
| |
| return result; |
| #else |
| return open(file, oflag | O_LARGEFILE, mode); |
| #endif |
| } |
| #ifndef __LINUXTHREADS_OLD__ |
| libc_hidden_def(open64) |
| #else |
| libc_hidden_weak(open64) |
| strong_alias(open64,__libc_open64) |
| #endif |
| |
| #endif /* __UCLIBC_HAS_LFS__ */ |