NAME POE::Component::TFTPd - A tftp-server, implemented through POE VERSION 0.0302 SYNOPSIS POE::Session->create( inline_states => { _start => sub { POE::Component::TFTPd->create; $_[KERNEL]->post($alias => 'start'); }, tftpd_init => sub { my($client, $fh) = ($_[ARG0], undef); open($fh, "<", $client->filename) if($client->rrq); open($fh, ">", $client->filename) if($client->wrq); $client->{'fh'} = $fh; }, tftpd_done => sub { my $client = $_[ARG0]; close $client->{'fh'}; }, tftpd_send => sub { my $client = $_[ARG0]; if ($client->{'fh'}) { seek $client->{'fh'}, $client->last_block * $client->block_size, 0; read $client->{'fh'}, my $data, $client->block_size; $_[KERNEL]->post($alias => send_data => $client, $data); } }, tftpd_receive => sub { my($client, $data) = @_[ARG0,ARG1]; print { $client->{'fh'} } $data; $_[KERNEL]->post($alias => send_ack => $client); }, tftpd_log => sub { my($level, $client, $msg) = @_[ARG0..ARG2]; warn(sprintf "%s - %s:%i - %s\n", $level, $client->address, $client->port, $msg, ); }, }, ); METHODS create(%args) Component constructor. Args: Name => default # Comment -------------------------------------------------------------------- alias => TFTPd # Alias for the POE session address => 127.0.0.1 # Address to listen to port => 69 # Port to listen to timeout => 10 # Seconds between block sent and ACK retries => 3 # How many retries before giving up on host max_clients => undef # Maximum concurrent connections clients Returns a hash-ref, containing all the clients: $client_id => $client_obj See "POE::Component::TFTPd::Client" for details max_clients Pointer to max number of concurrent clients: print $self->max_clients; $self->max_clients = 4; retries Pointer to the number of retries: print $self->retries; $self->retries = 4; timeout Pointer to the timeout in seconds: print $self->timeout; $self->timeout = 4; address Returns the address the server listens to. alias The alias for the POE session. kernel Method alias for $_[KERNEL]. port Returns the local port sender Returns the sender session. server Returns the server: "POE::Wheel::UDP". session Returns this session. cleanup 1. Logs that the server is done with the client 2. deletes the client from C<$self-Eclients> 3. Calls C event in sender session log Calls SENDER with event name 'tftpd_log' and these arguments: $_[ARG0] = $level $_[ARG1] = $client $_[ARG2] = $msg $level is the same as "Log::Log4perl" use. STATES start Starts the server, by setting up "POE::Wheel::UDP". stop Stops the TFTPd server, by deleting the UDP wheel. check_connections Checks for connections that have timed out, and destroys them. This is done periodically, every second. input Takes some input, figure out the opcode and pass the request on to the next stage. opcode | event | method -------|----------|------------- rrq | init_rrq | init_request wrq | init_wrq | init_request ack | get_ack | get_data data | get_data | get_data send_data => $client, $data Sends data to the client. Used for both ACK and DATA. It resends data automatically on failure, and decreases "$client->retries". get_data => $client, $data Handles both ACK and DATA packets. If correct packet-number: 1. Logs the packet number 2. Calls C / C in sender session On failure: 1. Logs failure 2. Resends the last packet init_request => $args, $opcode, $data 1. Checks if max_clients limit is reached. If not, sets up $client->filename = $file; # the filename to read/write $client->mode = uc $mode; # only OCTET is valid $client->rfc = [ ... ]; $client->timestamp = time; 2. Calls C in sender session. 3. Calls C in sender session, if read-request from client send_error => $client, $error_key [, $args] Sends an error to the client. $error_key referes to C<%TFTP_ERROR> $args is an array ref that can be used to replace %x in the error string FUNCTIONS TFTP_MIN_BLKSIZE TFTP_MAX_BLKSIZE TFTP_MIN_TIMEOUT TFTP_MAX_TIMEOUT TFTP_DEFAULT_PORT TFTP_OPCODE_RRQ TFTP_OPCODE_WRQ TFTP_OPCODE_DATA TFTP_OPCODE_ACK TFTP_OPCODE_ERROR TFTP_OPCODE_OACK AUTHOR Jan Henning Thorsen, "" COPYRIGHT & LICENSE Copyright 2007 Jan Henning Thorsen, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.