6 use Net::TFTPd 0.03 qw(%OPCODES);
8 use Data::Dump qw/dump/;
13 our $debug = server::debug;
15 our $dir = "$server::base_dir/tftp";
19 my $path = (glob("$dir/$glob"))[0];
20 die "can't find anything for $dir/$glob" unless $path;
21 warn 'path ', $path if $debug;
30 my $r = $request->{'_REQUEST_'} || die "no _REQUEST_ in ",dump( $request );
32 if( $r->{'OPCODE'} eq $OPCODES{'RRQ'} ) {
33 progress_bar::tick( $r->{FileName}, $r->{BlkSize} * $r->{LASTACK}, $r->{BlkSize} * $r->{LASTBLK} );
34 } elsif ( $r->{'OPCODE'} eq $OPCODES{'WRQ'} ) {
37 warn "IGNORED: ", dump( $request );
48 warn 'request: ', dump( $request ) if $debug;
50 if ( my $pid = fork ) {
52 warn "# forked $pid\n";
57 my $ip = $request->{_REQUEST_}->{PeerAddr};
58 config::for_ip( $ip );
60 if ( $request->{RootDir} ne $dir ) {
61 $request->{RootDir} = $dir;
62 warn "new root: $dir";
65 my $file = $request->{'_REQUEST_'}{'FileName'};
66 my $opcode = $OPCODES{$request->{'_REQUEST_'}{'OPCODE'}};
74 store::audit( $opcode, $audit );
79 if( $request->processRQ() ) {
80 my $size = -s "$dir/$file";
81 $audit->{state} = 'finish';
82 $audit->{size} = $size;
83 store::audit( $opcode, $audit );
85 $audit->{state} = 'error';
86 $audit->{error} = Net::TFTPd->error;
87 store::audit( $opcode, $audit );
99 # XXX we need to setup listener ourselfs because we need Reuse
102 # LocalAddr => $server::ip,
103 # LocalAddr => '0.0.0.0',
108 my $udpserver = IO::Socket::INET->new(%params);
109 die "can't start server ",dump( \%params ), " $!" unless $udpserver;
111 my $listener = bless {
120 CallBack => \&transfer_status,
122 BlkSize => 512, # Dell's RAC doesn't like bigger packets
123 # BlkSize => 1456, # IBM GE seems to be picky
125 %params, # merge user parameters
126 _UDPSERVER_ => $udpserver,
129 warn 'listener: ',dump( $listener ) if $debug;
131 store::audit( 'start', {
132 addr => $listener->{LocalAddr},
133 port => $listener->{LocalPort},
134 timeout => $listener->{Timeout},
135 params => { %params },
140 # wait for any request (RRQ or WRQ)
141 if(my $request = $listener->waitRQ()) {
143 tftp_request $request;
144 } elsif ( my $error = Net::TFTPd->error ) {