diff options
author | Jeremy Allison <jra@samba.org> | 2004-01-06 01:22:14 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2004-01-06 01:22:14 +0000 |
commit | 0d44747df99f2168a063feedad5039f222746f61 (patch) | |
tree | 0ddeca47e4408a6fb7b86357a128caac373f028e /source3/lib | |
parent | 1fa073b55bca9bbc66b86e652e491cc44656071e (diff) | |
download | samba-0d44747df99f2168a063feedad5039f222746f61.tar.gz samba-0d44747df99f2168a063feedad5039f222746f61.tar.bz2 samba-0d44747df99f2168a063feedad5039f222746f61.zip |
Patch based on work from James Peach <jpeach@sgi.com> to convert over to
using pread/pwrite. Modified a little to ensure fsp->pos is correct.
Fix for #889.
Jeremy.
(This used to be commit 019aaaf0df091c3f67048f591e70d4353a02bb9b)
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/system.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/source3/lib/system.c b/source3/lib/system.c index 577f0b9a20..16384c8bdf 100644 --- a/source3/lib/system.c +++ b/source3/lib/system.c @@ -100,6 +100,47 @@ ssize_t sys_write(int fd, const void *buf, size_t count) return ret; } + +/******************************************************************* +A pread wrapper that will deal with EINTR and 64-bit file offsets. +********************************************************************/ + +#if defined(HAVE_PREAD) || defined(HAVE_PREAD64) +ssize_t sys_pread(int fd, void *buf, size_t count, SMB_OFF_T off) +{ + ssize_t ret; + + do { +#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_PREAD64) + ret = pread64(fd, buf, count, off); +#else + ret = pread(fd, buf, count, off); +#endif + } while (ret == -1 && errno == EINTR); + return ret; +} +#endif + +/******************************************************************* +A write wrapper that will deal with EINTR and 64-bit file offsets. +********************************************************************/ + +#if defined(HAVE_PWRITE) || defined(HAVE_PWRITE64) +ssize_t sys_pwrite(int fd, const void *buf, size_t count, SMB_OFF_T off) +{ + ssize_t ret; + + do { +#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_PWRITE64) + ret = pwrite64(fd, buf, count, off); +#else + ret = pwrite(fd, buf, count, off); +#endif + } while (ret == -1 && errno == EINTR); + return ret; +} +#endif + /******************************************************************* A send wrapper that will deal with EINTR. ********************************************************************/ |