diff options
Diffstat (limited to 'disk-utils/llseek.c')
-rw-r--r-- | disk-utils/llseek.c | 54 |
1 files changed, 18 insertions, 36 deletions
diff --git a/disk-utils/llseek.c b/disk-utils/llseek.c index dcbfb2a45..a9cd5a3ac 100644 --- a/disk-utils/llseek.c +++ b/disk-utils/llseek.c @@ -5,29 +5,18 @@ * under the terms of the GNU Public License. */ -#define FOR_UTIL_LINUX - #include <sys/types.h> #include <errno.h> #include <unistd.h> -#ifndef FOR_UTIL_LINUX - -#include "et/com_err.h" -#include "ext2fs/io.h" - -#else /* FOR_UTIL_LINUX */ - #if defined(__GNUC__) || defined(HAS_LONG_LONG) typedef long long ext2_loff_t; #else typedef long ext2_loff_t; #endif -ext2_loff_t ext2_llseek (unsigned int, ext2_loff_t, unsigned int); - -#endif /* FOR_UTIL_LINUX */ +extern ext2_loff_t ext2_llseek (unsigned int, ext2_loff_t, unsigned int); #ifdef __linux__ @@ -40,13 +29,8 @@ ext2_loff_t ext2_llseek (unsigned int, ext2_loff_t, unsigned int); #define my_llseek lseek -#elif __i386__ - -#include <linux/unistd.h> - -#ifndef __NR__llseek -#define __NR__llseek 140 -#endif +#else +#include <linux/unistd.h> /* for __NR__llseek */ static int _llseek (unsigned int, unsigned long, unsigned long, ext2_loff_t *, unsigned int); @@ -67,10 +51,6 @@ static ext2_loff_t my_llseek (unsigned int fd, ext2_loff_t offset, return (retval == -1 ? (ext2_loff_t) retval : result); } -#else - -#error "llseek() is not available" - #endif /* __alpha__ */ #endif /* HAVE_LLSEEK */ @@ -81,25 +61,27 @@ ext2_loff_t ext2_llseek (unsigned int fd, ext2_loff_t offset, ext2_loff_t result; static int do_compat = 0; - if ((sizeof(off_t) >= sizeof(ext2_loff_t)) || - (offset < ((ext2_loff_t) 1 << ((sizeof(off_t)*8) -1)))) - return lseek(fd, (off_t) offset, origin); + if (!do_compat) { + result = my_llseek (fd, offset, origin); + if (!(result == -1 && errno == ENOSYS)) + return result; - if (do_compat) { - errno = EINVAL; - return -1; - } - - result = my_llseek (fd, offset, origin); - if (result == -1 && errno == ENOSYS) { /* * Just in case this code runs on top of an old kernel * which does not support the llseek system call */ - do_compat++; - errno = EINVAL; + do_compat = 1; + /* + * Now try ordinary lseek. + */ } - return result; + + if ((sizeof(off_t) >= sizeof(ext2_loff_t)) || + (offset < ((ext2_loff_t) 1 << ((sizeof(off_t)*8) -1)))) + return lseek(fd, (off_t) offset, origin); + + errno = EINVAL; + return -1; } #else /* !linux */ |