MyWebUniversity.com Home Page
 



OpenSolaris man pages main menu


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



OpenSolaris man pages main menu

Contact us      |       About us      |       Term of use      |       Copyright © 2000-2010 MyWebUniversity.com ™