summaryrefslogtreecommitdiffstats
path: root/disk-utils/llseek.c
diff options
context:
space:
mode:
Diffstat (limited to 'disk-utils/llseek.c')
-rw-r--r--disk-utils/llseek.c54
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 */