diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2007-06-27 03:50:28 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2007-06-27 03:50:28 +0000 |
commit | 130627841138672bf26e9b4b5a1f70a240e910a6 (patch) | |
tree | fc8ffb884c15f89eb09f5ea904b29d15a9de6de1 /archive | |
parent | 543a9ec553506a206d3191503ed6a24ac7721101 (diff) | |
download | sg3_utils-130627841138672bf26e9b4b5a1f70a240e910a6.tar.gz |
To prepare to load sg3_utils-1.23 into trunk/, perform 6 renames.
* trunk//debian/libsgutils1-dev.dirs: Renamed from
trunk//debian/libsgutils1-0-dev.dirs.
* trunk//debian/libsgutils1-dev.install: Renamed from
trunk//debian/libsgutils1-0-dev.install.
* trunk//debian/libsgutils1.dirs: Renamed from
trunk//debian/libsgutils1-0.dirs.
* trunk//debian/libsgutils1.install: Renamed from
trunk//debian/libsgutils1-0.install.
* trunk//archive/llseek.c: Renamed from trunk//llseek.c.
* trunk//archive/llseek.h: Renamed from trunk//llseek.h.
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@73 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'archive')
-rw-r--r-- | archive/llseek.c | 121 | ||||
-rw-r--r-- | archive/llseek.h | 14 |
2 files changed, 135 insertions, 0 deletions
diff --git a/archive/llseek.c b/archive/llseek.c new file mode 100644 index 00000000..d07c1807 --- /dev/null +++ b/archive/llseek.c @@ -0,0 +1,121 @@ +/* + * llseek.c -- stub calling the llseek system call + * + * Copyright (C) 1994 Remy Card. This file may be redistributed + * under the terms of the GNU Public License. + * + * This file is borrowed from the util-linux-2.11z tarball's implementation + * of fdisk. It allows seeks to 64 bit offsets, if supported. + * Changed "ext2_" prefix to "llse". + */ +#define _XOPEN_SOURCE 500 +#define _GNU_SOURCE + +#include <sys/types.h> + +#include <errno.h> +#include <unistd.h> + +#if defined(__GNUC__) || defined(HAS_LONG_LONG) +typedef long long llse_loff_t; +#else +typedef long llse_loff_t; +#endif + +extern llse_loff_t llse_llseek (unsigned int, llse_loff_t, unsigned int); + +#ifdef __linux__ + +#ifdef HAVE_LLSEEK +#include <syscall.h> + +#else /* HAVE_LLSEEK */ + +#if defined(__alpha__) || defined(__ia64__) || defined(__s390x__) + +#define my_llseek lseek + +#else +#include <linux/unistd.h> /* for __NR__llseek */ + +static int _llseek (unsigned int, unsigned long, + unsigned long, llse_loff_t *, unsigned int); + +#ifdef __NR__llseek + +static _syscall5(int,_llseek,unsigned int,fd,unsigned long,offset_high, + unsigned long, offset_low,llse_loff_t *,result, + unsigned int, origin) + +#else + +/* no __NR__llseek on compilation machine - might give it explicitly */ +static int _llseek (unsigned int fd, unsigned long oh, + unsigned long ol, llse_loff_t *result, + unsigned int origin) { + errno = ENOSYS; + return -1; +} + +#endif + +static llse_loff_t my_llseek (unsigned int fd, llse_loff_t offset, + unsigned int origin) +{ + llse_loff_t result; + int retval; + + retval = _llseek (fd, ((unsigned long long) offset) >> 32, + ((unsigned long long) offset) & 0xffffffff, + &result, origin); + return (retval == -1 ? (llse_loff_t) retval : result); +} + +#endif /* __alpha__ */ + +#endif /* HAVE_LLSEEK */ + +llse_loff_t llse_llseek (unsigned int fd, llse_loff_t offset, + unsigned int origin) +{ + llse_loff_t result; + static int do_compat = 0; + + if (!do_compat) { + result = my_llseek (fd, offset, origin); + if (!(result == -1 && errno == ENOSYS)) + return result; + + /* + * Just in case this code runs on top of an old kernel + * which does not support the llseek system call + */ + do_compat = 1; + /* + * Now try ordinary lseek. + */ + } + + if ((sizeof(off_t) >= sizeof(llse_loff_t)) || + (offset < ((llse_loff_t) 1 << ((sizeof(off_t)*8) -1)))) + return lseek(fd, (off_t) offset, origin); + + errno = EINVAL; + return -1; +} + +#else /* !linux */ + +llse_loff_t llse_llseek (unsigned int fd, llse_loff_t offset, + unsigned int origin) +{ + if ((sizeof(off_t) < sizeof(llse_loff_t)) && + (offset >= ((llse_loff_t) 1 << ((sizeof(off_t)*8) -1)))) { + errno = EINVAL; + return -1; + } + return lseek (fd, (off_t) offset, origin); +} + +#endif /* linux */ + diff --git a/archive/llseek.h b/archive/llseek.h new file mode 100644 index 00000000..2f6aef0f --- /dev/null +++ b/archive/llseek.h @@ -0,0 +1,14 @@ +#ifndef LLSEEK_H +#define LLSEEK_H + +#if defined(__GNUC__) || defined(HAS_LONG_LONG) +typedef long long llse_loff_t; +#else +typedef long llse_loff_t; +#endif + +extern llse_loff_t llse_llseek(unsigned int fd, + llse_loff_t offset, + unsigned int origin); + +#endif |