= ranch_transport:sendfile(3)

== Name

ranch_transport:sendfile - Send a file on the socket

== Description

[source,erlang]
----
sendfile(Transport :: module(),
         Socket    :: ranch_transport:socket(),
         File      :: file:name_all() | file:fd(),
         Offset    :: non_neg_integer(),
         Bytes     :: non_neg_integer(),
         Opts      :: ranch_transport:sendfile_opts())
    -> {ok, SentBytes :: non_neg_integer()} | {error, atom()}
----

Send a file on the socket.

The file may be sent full or in parts, and may be specified
by its filename or by an already open file descriptor.

This function emulates the function `file:sendfile/2,4,5`
and may be used when transports are not manipulating TCP
directly.

== Arguments

Transport::

The transport module.

Socket::

The socket.

File::

The filename or file descriptor for the file to be sent.

Offset::

Start position in the file, in bytes.

Bytes::

Length in bytes.

Opts::

Additional options.

== Return value

The number of bytes actually sent is returned on success
inside an `ok` tuple.

An `error` tuple is returned otherwise.

== Changelog

* *1.6*: The type of the `File` argument was extended.

== Examples

.Implement Transport:sendfile using the fallback
[source,erlang]
----
sendfile(Socket, Filename) ->
    sendfile(Socket, Filename, 0, 0, []).

sendfile(Socket, File, Offset, Bytes) ->
    sendfile(Socket, File, Offset, Bytes, []).

sendfile(Socket, File, Offset, Bytes, Opts) ->
    ranch_transport:sendfile(?MODULE, Socket,
        File, Offset, Bytes, Opts).
----

== See also

link:man:ranch_transport(3)[ranch_transport(3)]
