6 use Net::TFTPd 0.03 qw(%OPCODES);
7 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 if( $req->{'_REQUEST_'}{'OPCODE'} eq $OPCODES{'RRQ'} ) {
30 printf STDERR "RRQ %s %u\/%u\r", map { $req->{_REQUEST_}->{$_} } ( 'FileName', 'LASTACK', 'LASTBLK' );
31 } elsif ( $req->{'_REQUEST_'}{'OPCODE'} eq $OPCODES{'WRQ'} ) {
33 printf STDERR "WRQ: %u\/%u\n", $req->{'_REQUEST_'}{'LASTBLK'}, $req->{'_REQUEST_'}{'LASTACK'};
35 warn "IGNORED: ", dump( $req );
42 warn 'request: ', dump( $request ) if $debug;
46 if ( $request->{RootDir} ne $dir ) {
47 $request->{RootDir} = $dir;
48 warn "new root: $dir";
51 my $file = $request->{'_REQUEST_'}{'FileName'};
53 print $OPCODES{$request->{'_REQUEST_'}{'OPCODE'}}, " $file\n";
56 if( $request->processRQ() ) {
57 print "\nOK completed $file ", -s "$dir/$file", "\n";
59 print "ERROR ", Net::TFTPd->error, "\n";
60 $request->processRQ();
71 my $listener = Net::TFTPd->new(
75 CallBack => \&transfer_status,
76 # LocalAddr => $server::ip,
77 LocalAddr => '0.0.0.0',
80 BlkSize => 1456, # IBM GE seems to be picky
82 ) || die Net::TFTPd->error;
84 warn 'listener: ',dump( $listener ) if $debug;
86 printf "TFTP listen %s:%d timeout: %d dir: $dir\n",
87 $listener->{LocalAddr},
88 $listener->{LocalPort},
93 Module::Refresh->refresh;
95 # wait for any request (RRQ or WRQ)
96 if(my $request = $listener->waitRQ()) {
97 tftp_request $request;
99 warn Net::TFTPd->error;