exp2l: Work around a NetBSD 10.0/i386 bug.
[gnulib.git] / lib / pwrite.c
blobe9c3fdac242c45cee21fc6a6d1aa16bad105de51
1 /* Write block to given position in file without changing file pointer.
2 POSIX version.
3 Copyright (C) 1997-1999, 2002, 2011-2024 Free Software Foundation, Inc.
4 This file is part of the GNU C Library.
5 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
7 This file is free software: you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as
9 published by the Free Software Foundation; either version 2.1 of the
10 License, or (at your option) any later version.
12 This file is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with this program. If not, see <https://www.gnu.org/licenses/>. */
20 #include <config.h>
22 /* Specification. */
23 #include <unistd.h>
25 #include <errno.h>
27 #define __libc_lseek(f,o,w) lseek (f, o, w)
28 #define __set_errno(Val) errno = (Val)
29 #define __libc_write(f,b,n) write (f, b, n)
31 /* Note: This implementation of pwrite is not multithread-safe. */
33 ssize_t
34 pwrite (int fd, const void *buf, size_t nbyte, off_t offset)
36 /* Since we must not change the file pointer preserve the value so that
37 we can restore it later. */
38 int saved_errno;
39 ssize_t result;
40 off_t old_offset = __libc_lseek (fd, 0, SEEK_CUR);
41 if (old_offset == (off_t) -1)
42 return -1;
44 /* Set to wanted position. */
45 if (__libc_lseek (fd, offset, SEEK_SET) == (off_t) -1)
46 return -1;
48 /* Write out the data. */
49 result = __libc_write (fd, buf, nbyte);
51 /* Now we have to restore the position. If this fails we have to
52 return this as an error. But if the writing also failed we
53 return this error. */
54 saved_errno = errno;
55 if (__libc_lseek (fd, old_offset, SEEK_SET) == (off_t) -1)
57 if (result == -1)
58 __set_errno (saved_errno);
59 return -1;
61 __set_errno (saved_errno);
63 return result;