2 .\" Copyright (c) 2009, Sun Microsystems, Inc. All Rights Reserved.
3 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License.
4 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License.
5 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
6 .TH SENDFILEV 3EXT "Feb 25, 2009"
8 sendfilev \- send a file
12 \fBcc\fR [ \fIflag\fR\&.\|.\|. ] \fIfile\fR\&.\|.\|. \fB-lsendfile\fR [ \fIlibrary\fR... ]
13 #include <sys/sendfile.h>
15 \fBssize_t\fR \fBsendfilev\fR(\fBint\fR \fIfildes\fR, \fBconst struct sendfilevec *\fR\fIvec\fR,
16 \fBint\fR \fIsfvcnt\fR, \fBsize_t *\fR\fIxferred\fR);
22 The \fBsendfilev()\fR function supports the following parameters:
29 A file descriptor to a regular file or to a \fBAF_NCA\fR, \fBAF_INET\fR, or
30 \fBAF_INET6\fR family type \fBSOCK_STREAM\fR socket that is open for writing.
31 For \fBAF_NCA\fR, the protocol type should be zero.
40 An array of \fBSENDFILEVEC_T\fR, as defined in the \fBsendfilevec\fR structure
50 The number of members in \fIvec\fR.
59 The total number of bytes written to \fBout_fd\fR.
65 The \fBsendfilev()\fR function attempts to write data from the \fIsfvcnt\fR
66 buffers specified by the members of \fIvec\fR array: \fBvec[0], vec[1], ... ,
67 vec[sfvcnt-1]\fR. The \fIfildes\fR argument is a file descriptor to a regular
68 file or to an \fBAF_NCA\fR, \fBAF_INET\fR, or \fBAF_INET6\fR family type
69 \fBSOCK_STREAM\fR socket that is open for writing.
72 This function is analogous to \fBwritev\fR(2), but can read from both buffers
73 and file descriptors. Unlike \fBwritev()\fR, in the case of multiple writers to
74 a file the effect of \fBsendfilev()\fR is not necessarily atomic; the writes
75 may be interleaved. Application-specific synchronization methods must be
76 employed if this causes problems.
79 The following is the \fBsendfilevec\fR structure:
83 typedef struct sendfilevec {
84 int sfv_fd; /* input fd */
85 uint_t sfv_flag; /* Flags. see below */
86 off_t sfv_off; /* offset to start reading from */
87 size_t sfv_len; /* amount of data */
90 #define SFV_FD_SELF (-2)
96 To send a file, open the file for reading and point \fBsfv_fd\fR to the file
97 descriptor returned as a result. See \fBopen\fR(2). \fBsfv_off\fR should
98 contain the offset within the file. \fBsfv_len\fR should have the length of the
99 file to be transferred.
102 The \fIxferred\fR argument is updated to record the total number of bytes
103 written to \fBout_fd\fR.
106 The \fBsfv_flag\fR field is reserved and should be set to zero.
109 To send data directly from the address space of the process, set \fBsfv_fd\fR
110 to \fBSFV_FD_SELF\fR. \fBsfv_off\fR should point to the data, with
111 \fBsfv_len\fR containing the length of the buffer.
115 Upon successful completion, the \fBsendfilev()\fR function returns total number
116 of bytes written to \fBout_fd\fR. Otherwise, it returns \fB-1\fR, and
117 \fBerrno\fR is set to indicate the error. The \fIxferred\fR argument contains
118 the amount of data successfuly transferred, which can be used to discover the
127 The process does not have appropriate privileges or one of the files pointed by
128 \fBsfv_fd\fR does not have appropriate permissions.
134 \fB\fBEAFNOSUPPORT\fR\fR
137 The implementation does not support the specified address family for socket.
146 Mandatory file or record locking is set on either the file descriptor or output
147 file descriptor if it points at regular files. \fBO_NDELAY\fR or
148 \fBO_NONBLOCK\fR is set, and there is a blocking record lock. An attempt has
149 been made to write to a stream that cannot accept data with the \fBO_NDELAY\fR
150 or the \fBO_NONBLOCK\fR flag set.
159 The \fIfildes\fR argument is not a valid descriptor open for writing or an
160 \fBsfv_fd\fR is invalid or not open for reading.
169 The \fIvec\fR argument points to an illegal address.
171 The \fIxferred\fR argument points to an illegal address.
180 A signal was caught during the write operation and no data was transferred.
189 The \fIsfvcnt\fR argument was less than or equal to \fB0\fR. One of the
190 \fBsfv_len\fR values in \fIvec\fR array was less than or equal to \fB0\fR, or
191 greater than the file size. An \fBsfv_fd\fR is not seekable.
193 Fewer bytes were transferred than were requested.
202 An I/O error occurred while accessing the file system.
211 The \fIfildes\fR argument is a socket that has been shut down for writing.
217 \fB\fBEPROTOTYPE\fR\fR
220 The socket type is not supported.
226 The \fBsendfilev()\fR function has a transitional interface for 64-bit file
227 offsets. See \fBlf64\fR(5).
231 The following example sends 2 vectors, one of HEADER data and a file of length
232 100 over \fBsockfd\fR. \fBsockfd\fR is in a connected state, that is,
233 \fBsocket()\fR, \fBaccept()\fR, and \fBbind()\fR operation are complete.
237 #include <sys/sendfile.h>
242 main (int argc, char *argv[]){
246 struct sendfilevec vec[2];
250 vec[0].sfv_fd = SFV_FD_SELF;
252 vec[0].sfv_off = "HEADER_DATA";
253 vec[0].sfv_len = strlen("HEADER_DATA");
254 vec[1].sfv_fd = open("input_file",.... );
257 vec[1].sfv_len = 100;
259 ret = sendfilev(sockfd, vec, 2, &xfer);
270 See \fBattributes\fR(5) for descriptions of the following attributes:
278 ATTRIBUTE TYPE ATTRIBUTE VALUE
280 Interface Stability Committed
288 \fBopen\fR(2), \fBwritev\fR(2), \fBlibsendfile\fR(3LIB), \fBsendfile\fR(3EXT),
289 \fBsocket\fR(3SOCKET), \fBattributes\fR(5)