Extended Library Functions sendfile(3EXT)
NAME
sendfile - send files over sockets or copy files to files
SYNOPSIS
cc [ flag... ] file... -lsendfile [ library... ]
#include
ssizet sendfile(int outfd, int infd, offt *off, sizet len);
DESCRIPTION
The sendfile() function copies data from infd to outfd
starting at offset off and of length len bytes. The infd
argument should be a file descriptor to a regular file
opened for reading. See open(2). The outfd argument should
be a file descriptor to a regular file opened for writing or
to a connected AFINET or AFINET6 socket of SOCKSTREAM
type. See socket(3SOCKET). The off argument is a pointer to
a variable holding the input file pointer position from
which the data will be read. After sendfile() has completed,
the variable will be set to the offset of the byte following
the last byte that was read. The sendfile() function does
not modify the current file pointer of infd, but does
modify the file pointer for outfd if it is a regular file.
The sendfile() function can also be used to send buffers by
pointing infd to SFVFDSELF.
RETURN VALUES
Upon successful completion, sendfile() returns the total
number of bytes written to outfd and also updates the
offset to point to the byte that follows the last byte read.
Otherwise, it returns -1, and errno is set to indicate the
error.
ERORS
The sendfile() function will fail if:
EAFNOSUPORT The implementation does not support the
specified address family for socket.
EAGAIN Mandatory file or record locking is set on
either the file descriptor or output file
descriptor if it points at regular files.
ONDELAY or ONONBLOCK is set, and there is
a blocking record lock. An attempt has been
made to write to a stream that cannot accept
data with the ONDELAY or the ONONBLOCK
flag set.
SunOS 5.11 Last change: 31 May 2006 1
Extended Library Functions sendfile(3EXT)
EBADF The outfd or infd argument is either not a
valid file descriptor, outfd is not opened
for writing. or infd is not opened for
reading.
EINVAL The offset cannot be represented by the
offt structure, or the length is negative
when cast to ssizet.
EIO An I/O error occurred while accessing the
file system.
ENOTCON The socket is not connected.
EOPNOTSUP The socket type is not supported.
EPIPE The outfd argument is no longer connected
to the peer endpoint.
EINTR A signal was caught during the write opera-
tion and no data was transferred.
USAGE
The sendfile() function has a transitional interface for
64-bit file offsets. See lf64(5).
EXAMPLES
Example 1 Sending a Buffer Over a Socket
The following example demonstrates how to send the buffer
buf over a socket. At the end, it prints the number of bytes
transferred over the socket from the buffer. It assumes that
addr will be filled up appropriately, depending upon where
to send the buffer.
int tfd;
offt baddr;
struct sockaddrin sin;
char buf[64 * 1024];
inaddrt addr;
sizet len;
tfd = socket(AFINET, SOCKSTREAM, 0);
SunOS 5.11 Last change: 31 May 2006 2
Extended Library Functions sendfile(3EXT)
if (tfd == -1) {
perror("socket");
exit(1);
}
sin.sinfamily = AFINET;
sin.sinaddr.saddr = addr; /* Fill in the appropriate address. */
sin.sinport = htons(2345);
if (connect(tfd, (struct sockaddr *)&sin, sizeof(sin))<0) {
perror("connect");
exit(1);
}
baddr = (offt)buf;
len = sizeof(buf);
while (len > 0) {
ssizet res;
res = sendfile(tfd, SFVFDSELF, &baddr, len);
if (res == -1)
if (errno != EINTR) {
perror("sendfile");
exit(1);
} else continue;
len -= res;
}
Example 2 Transferring Files to Sockets
The following program demonstrates a transfer of files to
sockets:
int ffd, tfd;
offt off;
struct sockaddrin sin;
inaddrt addr;
int len;
struct stat statbuf;
ssizet len;
ffd = open("file", ORDONLY);
if (ffd == -1) {
perror("open");
exit(1);
}
tfd = socket(AFINET, SOCKSTREAM, 0);
if (tfd == -1) {
perror("socket");
exit(1);
SunOS 5.11 Last change: 31 May 2006 3
Extended Library Functions sendfile(3EXT)
}
sin.sinfamily = AFINET;
sin.sinaddr = addr; /* Fill in the appropriate address. */
sin.sinport = htons(2345);
if (connect(tfd, (struct sockaddr *) &sin, sizeof(sin)) <0) {
perror("connect");
exit(1);
}
if (fstat(ffd, &statbuf) == -1) {
perror("fstat");
exit(1);
}
len = statbuf.stsize;
while (len > 0) {
ssizet res;
res = sendfile(tfd, ffd, &off, len);
if (res == -1)
if (errno != EINTR) {
perror("sendfile");
exit(1);
} else continue;
len -= res;
}
ATRIBUTES
See attributes(5) for descriptions of the following attri-
butes:
ATRIBUTE TYPE ATRIBUTE VALUE
Interface Stability Evolving
MT-Level MT-Safe
SEE ALSO
open(2), libsendfile(3LIB), sendfilev(3EXT),
socket(3SOCKET), attributes(5), lf64(5)
SunOS 5.11 Last change: 31 May 2006 4
|