6 use Net::TFTPd 0.03 qw(%OPCODES);
7 use Data::Dump qw/dump/;
11 our $debug = server::debug;
13 our $dir = "$server::base_dir/tftp";
17 my $path = glob("$dir/$glob");
18 die "can't find anything for $dir/$glob" unless $path;
26 if( $req->{'_REQUEST_'}{'OPCODE'} eq $OPCODES{'RRQ'} ) {
27 printf "RRQ %u\/%u\r", $req->{'_REQUEST_'}{'LASTACK'}, $req->{'_REQUEST_'}{'LASTBLK'};
28 } elsif ( $req->{'_REQUEST_'}{'OPCODE'} eq $OPCODES{'WRQ'} ) {
30 printf "WRQ: %u\/%u\n", $req->{'_REQUEST_'}{'LASTBLK'}, $req->{'_REQUEST_'}{'LASTACK'};
32 warn "IGNORED: ", dump( $req );
39 if ( $request->{RootDir} ne $dir ) {
40 $request->{RootDir} = $dir;
41 warn "new root: $dir";
45 printf "Received a %s for file '%s'\n", $OPCODES{$request->{'_REQUEST_'}{'OPCODE'}}, $request->{'_REQUEST_'}{'FileName'};
48 if( $request->processRQ() ) {
49 print "OK, transfer completed successfully\n";
51 warn Net::TFTPd->error;
52 $request->processRQ();
63 my $listener = Net::TFTPd->new(
67 CallBack => \&transfer_status,
68 # LocalAddr => $server::ip,
69 LocalAddr => '0.0.0.0',
72 BlkSize => 1456, # IBM GE seems to be picky
74 ) || die Net::TFTPd->error;
76 warn 'listener: ',dump( $listener ) if $debug;
80 printf "TFTP listen %s:%d timeout: %d dir: $dir\n",
81 $listener->{LocalAddr},
82 $listener->{LocalPort},
85 # wait for any request (RRQ or WRQ)
86 if(my $request = $listener->waitRQ()) {
87 tftp_request $request;
89 warn Net::TFTPd->error;