# NAME

Mojo::TFTPd - Trivial File Transfer Protocol daemon

# VERSION

0.04

# SYNOPSIS

    use Mojo::TFTPd;
    my $tftpd = Mojo::TFTPd->new;

    $tftpd->on(error => sub ($tftpd, $error) { warn "TFTPd: $error\n" });

    $tftpd->on(rrq => sub ($tftpd, $connection) {
      open my $FH, '<', $connection->file;
      $connection->filehandle($FH);
      $connection->filesize(-s $connection->file);
    });

    $tftpd->on(wrq => sub ($tftpd, $connection) {
      open my $FH, '>', '/dev/null';
      $connection->filehandle($FH);
    });

    $tftpd->on(finish => sub ($tftpd, $connection, $error) {
      warn "Connection: $error\n" if $error;
    });

    $tftpd->start;
    $tftpd->ioloop->start unless $tftpd->ioloop->is_running;

# DESCRIPTION

This module implements a server for the
[Trivial File Transfer Protocol](http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol).

From Wikipedia:

    Trivial File Transfer Protocol (TFTP) is a file transfer protocol notable
    for its simplicity. It is generally used for automated transfer of
    configuration or boot files between machines in a local environment.

The connection which is referred to in this document is an instance of
[Mojo::TFTPd::Connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection).

# EVENTS

## error

    $tftpd->on(error => sub ($tftpd, $str) { ... });

This event is emitted when something goes wrong: Fail to ["listen"](#listen) to socket,
read from socket or other internal errors.

## finish

    $tftpd->on(finish => sub ($tftpd, $connection, $error) { ... });

This event is emitted when the [Mojo::TFTPd::Connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection) finish, either
successfully or due to an error. `$error` will be an empty string on success.

## rrq

    $tftpd->on(rrq => sub ($tftpd, $connection) { ... });

This event is emitted when a new read request arrives from a client. The
callback should set ["filehandle" in Mojo::TFTPd::Connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection#filehandle) or the connection
will be dropped.
["filehandle" in Mojo::TFTPd::Connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection#filehandle) can also be a [Mojo::Asset](https://metacpan.org/pod/Mojo%3A%3AAsset) reference.

## wrq

    $tftpd->on(wrq => sub ($tftpd, $connection) { ... });

This event is emitted when a new write request arrives from a client. The
callback should set ["filehandle" in Mojo::TFTPd::Connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection#filehandle) or the connection
will be dropped.
["filehandle" in Mojo::TFTPd::Connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection#filehandle) can also be a [Mojo::Asset](https://metacpan.org/pod/Mojo%3A%3AAsset) reference.

# ATTRIBUTES

## connection\_class

    $str = $tftpd->connection_class;
    $tftpd = $tftpd->connection_class($str);

Used to set a custom connection class. Defaults to [Mojo::TFTPd::Connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection).

## inactive\_timeout

    $num = $tftpd->inactive_timeout;
    $tftpd = $tftpd->inactive_timeout(15);

How long a [connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection) can stay idle before
being dropped. Default is 15 seconds.

## ioloop

    $loop = $tftpd->ioloop;
    $tftpd = $tftpd->ioloop(Mojo::IOLoop->new);

Holds an instance of [Mojo::IOLoop](https://metacpan.org/pod/Mojo%3A%3AIOLoop).

## listen

    $str = $tftpd->listen;
    $tftpd = $tftpd->listen('127.0.0.1:69');
    $tftpd = $tftpd->listen('tftp://*:69');

The bind address for this server.

## max\_connections

    $int = $tftpd->max_connections;
    $tftpd = $tftpd->max_connections(1000);

How many concurrent connections this server can handle. Default to 1000.

## retransmit

    $int = $tftpd->retransmit;
    $tftpd = $tftpd->retransmit(1);

How many times the server should try to retransmit the last packet on timeout before
dropping the [connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection). Default is 0 (disable retransmits)

## retransmit\_timeout

    $num = $tftpd->retransmit_timeout;
    $tftpd = $tftpd->retransmit_timeout(2);

How long a [connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection) can stay idle before last packet
being retransmitted. Default is 2 seconds.

## retries

    $int = $tftpd->retries;
    $tftpd = $tftpd->retries(1);

How many times the server should try to send ACK or DATA to the client before
dropping the [connection](https://metacpan.org/pod/Mojo%3A%3ATFTPd%3A%3AConnection).

# METHODS

## start

    $tftpd = $tftpd->start;

Starts listening to the address and port set in ["Listen"](#listen). The ["error"](#error)
event will be emitted if the server fail to start.

# AUTHOR

Svetoslav Naydenov - `harryl@cpan.org`

Jan Henning Thorsen - `jhthorsen@cpan.org`