… | |
… | |
20 | } |
20 | } |
21 | |
21 | |
22 | sub register($$$$) { |
22 | sub register($$$$) { |
23 | my ($name, $max_detect, $detect, $serve) = @_; |
23 | my ($name, $max_detect, $detect, $serve) = @_; |
24 | |
24 | |
25 | $DETECTORS{$name} = [$max_detect, $detect, $serve]; |
25 | $DETECTORS{$name} = [$max_detect, $detect, $serve, $name]; |
26 | _update_detectors; |
26 | _update_detectors; |
27 | |
27 | |
28 | Guard::guard { |
28 | Guard::guard { |
29 | delete $DETECTORS{$name}; |
29 | delete $DETECTORS{$name}; |
30 | _update_detectors; |
30 | _update_detectors if defined &_update_detectors; |
31 | } |
31 | } |
32 | } |
32 | } |
33 | |
33 | |
34 | our $deliantra_detector = ext::tcp::register deliantra => 10, sub { |
34 | our $deliantra_detector = ext::tcp::register deliantra => 10, sub { |
35 | /^..version /s |
35 | /^..version /s |
… | |
… | |
59 | my $w; $w = AE::io $fh, 0, sub { |
59 | my $w; $w = AE::io $fh, 0, sub { |
60 | my $len = sysread $fh, $buf, 512, length $buf; |
60 | my $len = sysread $fh, $buf, 512, length $buf; |
61 | |
61 | |
62 | if ($len) { |
62 | if ($len) { |
63 | for ($buf) { |
63 | for ($buf) { |
64 | while (my ($name, $v) = each %DETECTORS) { |
64 | for my $v (values %DETECTORS) { |
65 | if (my $cb = $v->[1]()) { |
65 | if (my $cb = $v->[1]()) { |
66 | undef $w; |
66 | undef $w; |
67 | cf::debug "$id: detected protocol $name.\n"; |
67 | cf::debug "$id: detected protocol $v->[3].\n"; |
68 | $v->[2]($id, $fh, $buf); |
68 | $v->[2]($id, $fh, $buf); |
69 | return; |
69 | return; |
70 | } |
70 | } |
71 | } |
71 | } |
72 | |
72 | |