6 use Net::TFTPd 0.03 qw(%OPCODES);
8 use Data::Dump qw/dump/;
12 our $debug = server::debug;
14 our $dir = "$server::base_dir/tftp";
18 my $path = (glob("$dir/$glob"))[0];
19 die "can't find anything for $dir/$glob" unless $path;
20 warn 'path ', $path if $debug;
29 my $r = $request->{'_REQUEST_'} || die "no _REQUEST_ in ",dump( $request );
31 if( $r->{'OPCODE'} eq $OPCODES{'RRQ'} ) {
32 progress_bar::tick( $r->{FileName}, $r->{BlkSize} * $r->{LASTACK}, $r->{BlkSize} * $r->{LASTBLK} );
33 } elsif ( $r->{'OPCODE'} eq $OPCODES{'WRQ'} ) {
36 warn "IGNORED: ", dump( $request );
47 warn 'request: ', dump( $request ) if $debug;
49 config::for_ip( $request->{_REQUEST_}->{PeerAddr} );
51 if ( $request->{RootDir} ne $dir ) {
52 $request->{RootDir} = $dir;
53 warn "new root: $dir";
56 my $file = $request->{'_REQUEST_'}{'FileName'};
58 print $OPCODES{$request->{'_REQUEST_'}{'OPCODE'}}, " $file\n";
63 if( $request->processRQ() ) {
64 print "\nOK completed $file ", -s "$dir/$file", "\n";
66 print "ERROR ", Net::TFTPd->error, "\n";
67 $request->processRQ();
78 # XXX we need to setup listener ourselfs because we need Reuse
81 # LocalAddr => $server::ip,
82 # LocalAddr => '0.0.0.0',
87 my $udpserver = IO::Socket::INET->new(%params);
88 die "can't start server ",dump( \%params ), " $!" unless $udpserver;
90 my $listener = bless {
99 CallBack => \&transfer_status,
102 BlkSize => 1456, # IBM GE seems to be picky
104 %params, # merge user parameters
105 _UDPSERVER_ => $udpserver,
108 warn 'listener: ',dump( $listener ) if $debug;
110 printf "TFTP listen %s:%d timeout: %d dir: $dir\n",
111 $listener->{LocalAddr},
112 $listener->{LocalPort},
113 $listener->{Timeout};
117 # wait for any request (RRQ or WRQ)
118 if(my $request = $listener->waitRQ()) {
119 tftp_request $request;
120 } elsif ( my $error = Net::TFTPd->error ) {