Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Message-ID: <3EFAC669.30325C05@dessent.net> Date: Thu, 26 Jun 2003 03:09:45 -0700 From: Brian Dessent Organization: My own little world... X-Accept-Language: en,pdf MIME-Version: 1.0 To: "Cygwin AT Cygwin DOT Com" Subject: Re: _pread() _pwrite References: Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Ronald Landheer-Cieslak wrote: > > pread and pwrite are not in Cygwin (or at least are not exported by > cygwin1.dll). They are hardly the most portable functions in the world. I > suggest you write a wrapper. Something like: > > > ssize_t pread(int fd, void *buf, size_t count, off_t offset) > { > if (lseek(fd, offset, SEEK_SET) == (off_t)-1) > { > return(-1); > } > return(read(fd, buf, count)); > } > > and > ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) > { > if (lseek(fd, offset, SEEK_SET) == (off_t)-1) > { > return(-1); > } > return(write(fd, buf, count)); > } > You'll want to save the original file position and restore it after the operation, e.g. ssize_t pread(int fd, void *p, size_t n, off_t off) { off_t ooff; int oerrno; if ((ooff = lseek(fd, off, SEEK_SET)) == -1) return -1; n = read(fd, p, n); oerrno = errno; lseek(fd, ooff, SEEK_SET); errno = oerrno; return n; } ssize_t pwrite(int fd, const void *p, size_t n, off_t off) { off_t ooff; int oerrno; if ((ooff = lseek(fd, off, SEEK_SET)) == -1) return -1; n = write(fd, p, n); oerrno = errno; lseek(fd, ooff, SEEK_SET); errno = oerrno; return n; } -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/