--- lib/PXElator/tftpd.pm 2009/08/02 12:09:02 115 +++ lib/PXElator/tftpd.pm 2009/08/04 17:29:59 141 @@ -4,8 +4,8 @@ use strict; use Net::TFTPd 0.03 qw(%OPCODES); +use IO::Socket::INET; use Data::Dump qw/dump/; -use Module::Refresh; use server; @@ -22,7 +22,6 @@ return $path; } -STDERR->autoflush(1); use progress_bar; sub transfer_status { @@ -38,12 +37,16 @@ } } +use config; + sub tftp_request { my $request = shift; + server->refresh; + warn 'request: ', dump( $request ) if $debug; - config::for_ip(); + config::for_ip( $request->{_REQUEST_}->{PeerAddr} ); if ( $request->{RootDir} ne $dir ) { $request->{RootDir} = $dir; @@ -72,18 +75,35 @@ warn 'start'; - my $listener = Net::TFTPd->new( + # XXX we need to setup listener ourselfs because we need Reuse + my %params = ( + Proto => 'udp', +# LocalAddr => $server::ip, +# LocalAddr => '0.0.0.0', + LocalPort => 69, + Reuse => 1, + ); + + my $udpserver = IO::Socket::INET->new(%params); + die "can't start server ",dump( \%params ), " $!" unless $udpserver; + + my $listener = bless { RootDir => $dir, - Writable => 0, - Timeout => 3600, + + ACKtimeout => 4, + ACKretries => 4, + Readable => 1, + Writable => 0, + Timeout => 3600, + CallBack => \&transfer_status, -# LocalAddr => $server::ip, - LocalAddr => '0.0.0.0', # BlkSize => 8192, # BlkSize => 512, BlkSize => 1456, # IBM GE seems to be picky Debug => 99, - ) || die Net::TFTPd->error; + %params, # merge user parameters + _UDPSERVER_ => $udpserver, + }, 'Net::TFTPd'; warn 'listener: ',dump( $listener ) if $debug; @@ -94,13 +114,11 @@ while(1) { - Module::Refresh->refresh; - # wait for any request (RRQ or WRQ) if(my $request = $listener->waitRQ()) { tftp_request $request; - } else { - warn Net::TFTPd->error; + } elsif ( my $error = Net::TFTPd->error ) { + warn $error; } }