1/* Copyright (C) 1991-2025 Free Software Foundation, Inc.
  2   This file is part of the GNU C Library.
  3
  4   The GNU C Library is free software; you can redistribute it and/or
  5   modify it under the terms of the GNU Lesser General Public
  6   License as published by the Free Software Foundation; either
  7   version 2.1 of the License, or (at your option) any later version.
  8
  9   The GNU C Library is distributed in the hope that it will be useful,
 10   but WITHOUT ANY WARRANTY; without even the implied warranty of
 11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 12   Lesser General Public License for more details.
 13
 14   You should have received a copy of the GNU Lesser General Public
 15   License along with the GNU C Library; if not, see
 16   <https://www.gnu.org/licenses/>.  */
 17
 18#ifndef _SYS_UIO_H
 19#define _SYS_UIO_H	1
 20
 21#include <features.h>
 22#include <sys/types.h>
 23#include <bits/types/struct_iovec.h>
 24#include <bits/uio_lim.h>
 25#ifdef __IOV_MAX
 26# define UIO_MAXIOV __IOV_MAX
 27#else
 28# undef UIO_MAXIOV
 29#endif
 30
 31__BEGIN_DECLS
 32
 33/* Read data from file descriptor FD, and put the result in the
 34   buffers described by IOVEC, which is a vector of COUNT 'struct iovec's.
 35   The buffers are filled in the order specified.
 36   Operates just like 'read' (see <unistd.h>) except that data are
 37   put in IOVEC instead of a contiguous buffer.
 38
 39   This function is a cancellation point and therefore not marked with
 40   __THROW.  */
 41extern ssize_t readv (int __fd, const struct iovec *__iovec, int __count)
 42  __wur __attr_access ((__read_only__, 2, 3));
 43
 44/* Write data pointed by the buffers described by IOVEC, which
 45   is a vector of COUNT 'struct iovec's, to file descriptor FD.
 46   The data is written in the order specified.
 47   Operates just like 'write' (see <unistd.h>) except that the data
 48   are taken from IOVEC instead of a contiguous buffer.
 49
 50   This function is a cancellation point and therefore not marked with
 51   __THROW.  */
 52extern ssize_t writev (int __fd, const struct iovec *__iovec, int __count)
 53  __wur __attr_access ((__read_only__, 2, 3));
 54
 55
 56#ifdef __USE_MISC
 57# ifndef __USE_FILE_OFFSET64
 58/* Read data from file descriptor FD at the given position OFFSET
 59   without change the file pointer, and put the result in the buffers
 60   described by IOVEC, which is a vector of COUNT 'struct iovec's.
 61   The buffers are filled in the order specified.  Operates just like
 62   'pread' (see <unistd.h>) except that data are put in IOVEC instead
 63   of a contiguous buffer.
 64
 65   This function is a cancellation point and therefore not marked with
 66   __THROW.  */
 67extern ssize_t preadv (int __fd, const struct iovec *__iovec, int __count,
 68		       __off_t __offset)
 69  __wur __attr_access ((__read_only__, 2, 3));
 70
 71/* Write data pointed by the buffers described by IOVEC, which is a
 72   vector of COUNT 'struct iovec's, to file descriptor FD at the given
 73   position OFFSET without change the file pointer.  The data is
 74   written in the order specified.  Operates just like 'pwrite' (see
 75   <unistd.h>) except that the data are taken from IOVEC instead of a
 76   contiguous buffer.
 77
 78   This function is a cancellation point and therefore not marked with
 79   __THROW.  */
 80extern ssize_t pwritev (int __fd, const struct iovec *__iovec, int __count,
 81			__off_t __offset)
 82  __wur __attr_access ((__read_only__, 2, 3));
 83
 84# else
 85#  ifdef __REDIRECT
 86extern ssize_t __REDIRECT (preadv, (int __fd, const struct iovec *__iovec,
 87				    int __count, __off64_t __offset),
 88			   preadv64)
 89  __wur __attr_access ((__read_only__, 2, 3));
 90extern ssize_t __REDIRECT (pwritev, (int __fd, const struct iovec *__iovec,
 91				     int __count, __off64_t __offset),
 92			   pwritev64)
 93  __wur __attr_access ((__read_only__, 2, 3));
 94#  else
 95#   define preadv preadv64
 96#   define pwritev pwritev64
 97#  endif
 98# endif
 99
100# ifdef __USE_LARGEFILE64
101/* Read data from file descriptor FD at the given position OFFSET
102   without change the file pointer, and put the result in the buffers
103   described by IOVEC, which is a vector of COUNT 'struct iovec's.
104   The buffers are filled in the order specified.  Operates just like
105   'pread' (see <unistd.h>) except that data are put in IOVEC instead
106   of a contiguous buffer.
107
108   This function is a cancellation point and therefore not marked with
109   __THROW.  */
110extern ssize_t preadv64 (int __fd, const struct iovec *__iovec, int __count,
111			 __off64_t __offset)
112  __wur __attr_access ((__read_only__, 2, 3));
113
114/* Write data pointed by the buffers described by IOVEC, which is a
115   vector of COUNT 'struct iovec's, to file descriptor FD at the given
116   position OFFSET without change the file pointer.  The data is
117   written in the order specified.  Operates just like 'pwrite' (see
118   <unistd.h>) except that the data are taken from IOVEC instead of a
119   contiguous buffer.
120
121   This function is a cancellation point and therefore not marked with
122   __THROW.  */
123extern ssize_t pwritev64 (int __fd, const struct iovec *__iovec, int __count,
124			  __off64_t __offset)
125  __wur __attr_access ((__read_only__, 2, 3));
126# endif
127#endif	/* Use misc.  */
128
129
130#ifdef __USE_GNU
131# ifndef __USE_FILE_OFFSET64
132/* Same as preadv but with an additional flag argumenti defined at uio.h.  */
133extern ssize_t preadv2 (int __fp, const struct iovec *__iovec, int __count,
134			__off_t __offset, int ___flags)
135  __wur __attr_access ((__read_only__, 2, 3));
136
137/* Same as preadv but with an additional flag argument defined at uio.h.  */
138extern ssize_t pwritev2 (int __fd, const struct iovec *__iodev, int __count,
139			 __off_t __offset, int __flags) __wur;
140
141# else
142#  ifdef __REDIRECT
143extern ssize_t __REDIRECT (pwritev2, (int __fd, const struct iovec *__iovec,
144				      int __count, __off64_t __offset,
145				      int __flags),
146			   pwritev64v2)
147  __wur __attr_access ((__read_only__, 2, 3));
148extern ssize_t __REDIRECT (preadv2, (int __fd, const struct iovec *__iovec,
149				     int __count, __off64_t __offset,
150				     int __flags),
151			   preadv64v2)
152  __wur __attr_access ((__read_only__, 2, 3));
153#  else
154#   define preadv2 preadv64v2
155#   define pwritev2 pwritev64v2
156#  endif
157# endif
158
159# ifdef __USE_LARGEFILE64
160/* Same as preadv but with an additional flag argumenti defined at uio.h.  */
161extern ssize_t preadv64v2 (int __fp, const struct iovec *__iovec,
162			   int __count, __off64_t __offset,
163			   int ___flags)
164  __wur __attr_access ((__read_only__, 2, 3));
165
166/* Same as preadv but with an additional flag argument defined at uio.h.  */
167extern ssize_t pwritev64v2 (int __fd, const struct iovec *__iodev,
168			    int __count, __off64_t __offset,
169			    int __flags)
170  __wur __attr_access ((__read_only__, 2, 3));
171# endif
172#endif /* Use GNU.  */
173
174__END_DECLS
175
176/* Some operating systems provide system-specific extensions to this
177   header.  */
178#ifdef __USE_GNU
179# include <bits/uio-ext.h>
180#endif
181
182#endif /* sys/uio.h */