line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#$Id: adc.pm 1001 2014-05-07 13:08:30Z pro $ $URL: svn://svn.setun.net/dcppp/trunk/lib/Net/DirectConnect/adc.pm $ |
2
|
|
|
|
|
|
|
package #hide from cpan |
3
|
|
|
|
|
|
|
Net::DirectConnect::adc; |
4
|
1
|
|
|
1
|
|
2106
|
use strict; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
53
|
|
5
|
1
|
|
|
1
|
|
5
|
no strict qw(refs); |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
32
|
|
6
|
1
|
|
|
1
|
|
5
|
use warnings "NONFATAL" => "all"; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
54
|
|
7
|
1
|
|
|
1
|
|
5
|
no warnings qw(uninitialized); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
51
|
|
8
|
1
|
|
|
1
|
|
6
|
no if $] >= 5.017011, warnings => 'experimental::smartmatch'; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
10
|
|
9
|
1
|
|
|
1
|
|
61
|
use Time::HiRes qw(time sleep); |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
11
|
|
10
|
1
|
|
|
1
|
|
178
|
use Socket; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
856
|
|
11
|
1
|
|
|
1
|
|
7
|
use Data::Dumper; #dev only |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
81
|
|
12
|
|
|
|
|
|
|
$Data::Dumper::Sortkeys = $Data::Dumper::Useqq = $Data::Dumper::Indent = 1; |
13
|
|
|
|
|
|
|
#eval "use MIME::Base32 qw( RFC ); 1;" or print join ' ', ( 'err', 'cant use', $@ ); |
14
|
|
|
|
|
|
|
#use MIME::Base32 qw( RFC ); |
15
|
1
|
|
|
1
|
|
6
|
use Net::DirectConnect; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
27
|
|
16
|
|
|
|
|
|
|
#use Net::DirectConnect::clicli; |
17
|
1
|
|
|
1
|
|
645
|
use Net::DirectConnect::http; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
41
|
|
18
|
|
|
|
|
|
|
#use Net::DirectConnect::httpcli; |
19
|
1
|
|
|
1
|
|
935
|
use lib::abs('pslib'); |
|
1
|
|
|
|
|
1511
|
|
|
1
|
|
|
|
|
7
|
|
20
|
1
|
|
|
1
|
|
1532
|
use psmisc; # REMOVE |
|
1
|
|
|
|
|
4
|
|
|
1
|
|
|
|
|
152
|
|
21
|
|
|
|
|
|
|
our $VERSION = ( split( ' ', '$Revision: 1001 $' ) )[1]; |
22
|
1
|
|
|
1
|
|
8
|
use base 'Net::DirectConnect'; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
8552
|
|
23
|
|
|
|
|
|
|
our %codesSTA = ( |
24
|
|
|
|
|
|
|
'00' => 'Generic, show description', |
25
|
|
|
|
|
|
|
'x0' => 'Same as 00, but categorized according to the rough structure set below', |
26
|
|
|
|
|
|
|
'10' => 'Generic hub error', |
27
|
|
|
|
|
|
|
'11' => 'Hub full', |
28
|
|
|
|
|
|
|
'12' => 'Hub disabled', |
29
|
|
|
|
|
|
|
'20' => 'Generic login/access error', |
30
|
|
|
|
|
|
|
'21' => 'Nick invalid', |
31
|
|
|
|
|
|
|
'22' => 'Nick taken', |
32
|
|
|
|
|
|
|
'23' => 'Invalid password', |
33
|
|
|
|
|
|
|
'24' => 'CID taken', |
34
|
|
|
|
|
|
|
'25' => |
35
|
|
|
|
|
|
|
'Access denied, flag "FC" is the FOURCC of the offending command. Sent when a user is not allowed to execute a particular command', |
36
|
|
|
|
|
|
|
'26' => 'Registered users only', |
37
|
|
|
|
|
|
|
'27' => 'Invalid PID supplied', |
38
|
|
|
|
|
|
|
'30' => 'Kicks/bans/disconnects generic', |
39
|
|
|
|
|
|
|
'31' => 'Permanently banned', |
40
|
|
|
|
|
|
|
'32' => |
41
|
|
|
|
|
|
|
'Temporarily banned, flag "TL" is an integer specifying the number of seconds left until it expires (This is used for kick as well…).', |
42
|
|
|
|
|
|
|
'40' => 'Protocol error', |
43
|
|
|
|
|
|
|
'41' => |
44
|
|
|
|
|
|
|
qq{Transfer protocol unsupported, flag "TO" the token, flag "PR" the protocol string. The client receiving a CTM or RCM should send this if it doesn't support the C-C protocol. }, |
45
|
|
|
|
|
|
|
'42' => |
46
|
|
|
|
|
|
|
qq{Direct connection failed, flag "TO" the token, flag "PR" the protocol string. The client receiving a CTM or RCM should send this if it tried but couldn't connect. }, |
47
|
|
|
|
|
|
|
'43' => 'Required INF field missing/bad, flag "FM" specifies missing field, "FB" specifies invalid field.', |
48
|
|
|
|
|
|
|
'44' => 'Invalid state, flag "FC" the FOURCC of the offending command.', |
49
|
|
|
|
|
|
|
'45' => 'Required feature missing, flag "FC" specifies the FOURCC of the missing feature.', |
50
|
|
|
|
|
|
|
'46' => 'Invalid IP supplied in INF, flag "I4" or "I6" specifies the correct IP.', |
51
|
|
|
|
|
|
|
'47' => 'No hash support overlap in SUP between client and hub.', |
52
|
|
|
|
|
|
|
'50' => 'Client-client / file transfer error', |
53
|
|
|
|
|
|
|
'51' => 'File not available', |
54
|
|
|
|
|
|
|
'52' => 'File part not available', |
55
|
|
|
|
|
|
|
'53' => 'Slots full', |
56
|
|
|
|
|
|
|
'54' => 'No hash support overlap in SUP between clients.', |
57
|
|
|
|
|
|
|
); |
58
|
|
|
|
|
|
|
#eval "use Net::DirectConnect::TigerHash; 1;" or print join ' ', ( 'err', 'cant use', $@ ); |
59
|
|
|
|
|
|
|
#eval q{use Net::DirectConnect::TigerHash;}; |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
=no |
62
|
|
|
|
|
|
|
sub base32 ($) { |
63
|
|
|
|
|
|
|
#eval { |
64
|
|
|
|
|
|
|
MIME::Base32::encode( $_[0] ); |
65
|
|
|
|
|
|
|
#; } || @_; |
66
|
|
|
|
|
|
|
} |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
sub tiger ($) { |
69
|
|
|
|
|
|
|
local ($_) = @_; |
70
|
|
|
|
|
|
|
#use Mhash qw( mhash mhash_hex MHASH_TIGER); |
71
|
|
|
|
|
|
|
#eval "use MIME::Base32 qw( RFC ); use Digest::Tiger;" or $self->log('err', 'cant use', $@); |
72
|
|
|
|
|
|
|
#$_.=("\x00"x(1024 - length $_)); print ( 'hlen', length $_); |
73
|
|
|
|
|
|
|
#Digest::Tiger::hash($_); |
74
|
|
|
|
|
|
|
eval { Net::DirectConnect::TigerHash::tthbin($_); } |
75
|
|
|
|
|
|
|
#mhash(Mhash::MHASH_TIGER, $_); |
76
|
|
|
|
|
|
|
} |
77
|
|
|
|
|
|
|
sub hash ($) { base32( tiger( $_[0] ) ); } |
78
|
|
|
|
|
|
|
=cut |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
#sub init { my $self = shift; |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
=cu |
83
|
|
|
|
|
|
|
sub new { |
84
|
|
|
|
|
|
|
#psmisc::printlog('adc::new', @_); |
85
|
|
|
|
|
|
|
## my $self = ref $_[0] ? shift() : bless {}, $_[0]; |
86
|
|
|
|
|
|
|
my $self = ref $_[0] ? shift() : Net::DirectConnect->new( |
87
|
|
|
|
|
|
|
#@_ |
88
|
|
|
|
|
|
|
adcinit(bless({},shift),@_) |
89
|
|
|
|
|
|
|
); # |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
#shift if $_[0] eq __PACKAGE__; |
92
|
|
|
|
|
|
|
return $self; |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
} |
95
|
|
|
|
|
|
|
=cut |
96
|
|
|
|
|
|
|
sub func { |
97
|
0
|
0
|
|
0
|
0
|
|
my $self = shift if ref $_[0]; |
98
|
|
|
|
|
|
|
#warn 'func call'; |
99
|
|
|
|
|
|
|
#$self->log( 'func s=', $self, $self->{number}); |
100
|
0
|
|
|
|
|
|
$self->SUPER::func(@_); |
101
|
0
|
|
|
|
|
|
%_ = ( 'ID_file' => 'ID', ); |
102
|
0
|
|
0
|
|
|
|
$self->{$_} //= $_{$_} for keys %_; |
103
|
0
|
0
|
|
|
|
|
if ( Net::DirectConnect::use_try('Crypt::Rhash') ) { |
104
|
0
|
|
|
|
|
|
eval q{ |
105
|
|
|
|
|
|
|
$self->{hash} ||= sub { shift if ref $_[0]; |
106
|
|
|
|
|
|
|
Crypt::Rhash->new(Crypt::Rhash::RHASH_TTH)->update($_[0])->hash(Crypt::Rhash::RHASH_TTH, Crypt::Rhash::RHPR_BASE32 | Crypt::Rhash::RHPR_UPPERCASE); |
107
|
|
|
|
|
|
|
}; |
108
|
|
|
|
|
|
|
$self->{hash_file} ||= sub { shift if ref $_[0]; |
109
|
|
|
|
|
|
|
Crypt::Rhash->new(Crypt::Rhash::RHASH_TTH)->update_file($_[0])->hash(Crypt::Rhash::RHASH_TTH, Crypt::Rhash::RHPR_BASE32 | Crypt::Rhash::RHPR_UPPERCASE); |
110
|
|
|
|
|
|
|
}; |
111
|
|
|
|
|
|
|
}; |
112
|
|
|
|
|
|
|
} |
113
|
0
|
0
|
|
|
|
|
if ( Net::DirectConnect::use_try( 'MIME::Base32', 'RFC' ) ) { |
114
|
|
|
|
|
|
|
$self->{base_encode} ||= sub { |
115
|
0
|
0
|
|
0
|
|
|
shift if ref $_[0]; |
116
|
0
|
|
|
|
|
|
MIME::Base32::encode_rfc3548(@_); |
117
|
0
|
|
0
|
|
|
|
}; |
118
|
|
|
|
|
|
|
$self->{base_decode} ||= sub { |
119
|
0
|
0
|
|
0
|
|
|
shift if ref $_[0]; |
120
|
0
|
|
|
|
|
|
MIME::Base32::decode_rfc3548(@_); |
121
|
0
|
|
0
|
|
|
|
}; |
122
|
|
|
|
|
|
|
} else { |
123
|
0
|
|
|
|
|
|
our $warned; |
124
|
0
|
0
|
|
|
|
|
$self->log( 'err', 'cant use MIME::Base32' ) unless $warned++; |
125
|
|
|
|
|
|
|
} |
126
|
0
|
0
|
|
|
|
|
if ( Net::DirectConnect::use_try('Net::DirectConnect::TigerHash') ) { |
127
|
0
|
0
|
0
|
0
|
|
|
$self->{hash} ||= sub { shift if ref $_[0]; Net::DirectConnect::TigerHash::tthbin( $_[0] ); }; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
128
|
0
|
0
|
|
0
|
|
|
$self->{hash_file} ||= sub { shift if ref $_[0]; |
129
|
0
|
|
|
|
|
|
Net::DirectConnect::TigerHash::tthfile($_[0]); |
130
|
0
|
|
0
|
|
|
|
}; |
131
|
|
|
|
|
|
|
$self->{base_encode} ||= sub { |
132
|
0
|
0
|
|
0
|
|
|
shift if ref $_[0]; |
133
|
0
|
|
|
|
|
|
Net::DirectConnect::TigerHash::toBase32( $_[0] ); |
134
|
0
|
|
0
|
|
|
|
}; |
135
|
|
|
|
|
|
|
$self->{base_decode} ||= sub { |
136
|
0
|
0
|
|
0
|
|
|
shift if ref $_[0]; |
137
|
0
|
|
|
|
|
|
Net::DirectConnect::TigerHash::fromBase32( $_[0] ); |
138
|
0
|
|
0
|
|
|
|
}; |
139
|
|
|
|
|
|
|
} else { |
140
|
|
|
|
|
|
|
#$self->log( 'err', 'cant use Net::DirectConnect::TigerHash' ); |
141
|
|
|
|
|
|
|
} |
142
|
0
|
0
|
0
|
0
|
|
|
$self->{hash_base} ||= sub { shift if ref $_[0]; $self->base_encode( $self->hash( $_[0] ) ) }; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
#sub hash ($) { base32( tiger( $_[0] ) ); } |
144
|
|
|
|
|
|
|
$self->{cmd_direct} ||= sub { |
145
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
146
|
0
|
|
|
|
|
|
my $peerid = shift; |
147
|
0
|
0
|
0
|
|
|
|
local $self->{'host'} = $self->{'peers'}{$peerid}{'INF'}{I4}, local $self->{'port'} = $self->{'peers'}{$peerid}{'INF'}{U4} |
148
|
|
|
|
|
|
|
if $self->{'peers'}{$peerid}{'INF'}{I4} and $self->{'peers'}{$peerid}{'INF'}{U4}; |
149
|
0
|
|
|
|
|
|
$self->cmd(@_); |
150
|
0
|
|
0
|
|
|
|
}; |
151
|
|
|
|
|
|
|
$self->{ID_get} ||= sub { |
152
|
|
|
|
|
|
|
#sub ID_get { |
153
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
154
|
0
|
0
|
0
|
|
|
|
if ( -s $self->{'ID_file'} ) { $self->{'ID'} ||= psmisc::file_read( $self->{'ID_file'} ); } |
|
0
|
|
|
|
|
|
|
155
|
0
|
0
|
|
|
|
|
unless ( $self->{'ID'} ) { |
156
|
0
|
|
0
|
|
|
|
$self->{'ID'} ||= join ' ', 'perl', $self->{'myip'}, $VERSION, $0, $self->{'INF'}{'NI'}, time, |
157
|
|
|
|
|
|
|
'$Id: adc.pm 1001 2014-05-07 13:08:30Z pro $'; |
158
|
0
|
|
|
|
|
|
psmisc::file_rewrite( $self->{'ID_file'}, $self->{'ID'} ); |
159
|
|
|
|
|
|
|
} |
160
|
0
|
|
0
|
|
|
|
$self->{'PID'} ||= $self->hash( $self->{'ID'} ); |
161
|
0
|
|
0
|
|
|
|
$self->{'CID'} ||= $self->hash( $self->{'PID'} ); |
162
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'PD'} ||= $self->base_encode( $self->{'PID'} ); |
163
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'ID'} ||= $self->base_encode( $self->{'CID'} ); |
164
|
0
|
|
|
|
|
|
return $self->{'ID'}; |
165
|
0
|
|
0
|
|
|
|
}; |
166
|
|
|
|
|
|
|
#$self->log( 'sub igen ', ); |
167
|
|
|
|
|
|
|
$self->{INF_generate} ||= sub { |
168
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
169
|
|
|
|
|
|
|
#$self->log( 'dev', 'inf_generate', $self->{'myport'},$self->{'myport_udp'},$self->{'myport_sctp'}, $self->{'myip'}, Dumper $self->{'INF'}); |
170
|
|
|
|
|
|
|
#$self->{'clients'}{'listener_udp'} |
171
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'NI'} ||= $self->{'Nick'} || 'perlAdcDev'; |
|
|
|
0
|
|
|
|
|
172
|
0
|
0
|
0
|
|
|
|
$self->{'PID'} ||= MIME::Base32::decode $self->{'INF'}{'PD'} if $self->{'INF'}{'PD'}; |
173
|
0
|
0
|
0
|
|
|
|
$self->{'CID'} ||= MIME::Base32::decode $self->{'INF'}{'ID'} if $self->{'INF'}{'ID'}; |
174
|
0
|
|
|
|
|
|
$self->ID_get(); |
175
|
0
|
0
|
0
|
|
|
|
$self->{'INF'}{'SID'} ||= $self->{broadcast} ? $self->{'INF'}{'ID'} : substr $self->{'INF'}{'ID'}, 0, 4; |
176
|
|
|
|
|
|
|
#sid |
177
|
|
|
|
|
|
|
#$self->log( 'id gen',"iID=$self->{'INF'}{'ID'} iPD=$self->{'INF'}{'PD'} PID=$self->{'PID'} CID=$self->{'CID'} ID=$self->{'ID'}" ); |
178
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'SL'} ||= $self->{'S'} || '2'; |
|
|
|
0
|
|
|
|
|
179
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'SS'} ||= $self->{'sharesize'} || 20025693588; |
|
|
|
0
|
|
|
|
|
180
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'SF'} ||= 30999; |
181
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'HN'} ||= $self->{'H'} || 1; |
|
|
|
0
|
|
|
|
|
182
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'HR'} ||= $self->{'R'} || 0; |
|
|
|
0
|
|
|
|
|
183
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'HO'} ||= $self->{'O'} || 0; |
|
|
|
0
|
|
|
|
|
184
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'VE'} ||= $self->{'client'} . $self->{'V'} |
|
|
|
0
|
|
|
|
|
185
|
|
|
|
|
|
|
|| 'perl' |
186
|
|
|
|
|
|
|
. $Net::DirectConnect::VERSION . '_' |
187
|
|
|
|
|
|
|
. $VERSION; #. '_' . ( split( ' ', '$Revision: 1001 $' ) )[1]; #'++\s0.706'; |
188
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'US'} ||= 10000; |
189
|
|
|
|
|
|
|
#my $domain = '4'; |
190
|
0
|
|
|
|
|
|
my $domaindel = '4'; |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
#if ( $self->{'myip'} =~ /:/ ) { |
193
|
|
|
|
|
|
|
#$domain = '6'; |
194
|
|
|
|
|
|
|
#$domaindel = '4'; |
195
|
|
|
|
|
|
|
#} |
196
|
0
|
0
|
0
|
|
|
|
for my $domain ($self->{dev_ipv6} || $self->{'myip'} =~ /:/ ? (qw(4 6)) : (4)) { |
197
|
0
|
|
0
|
|
|
|
$self->{'INF'}{ 'U' . $domain } = $self->{'myport_udp'} || $self->{'myport'}; #maybe if broadcast only |
198
|
0
|
|
|
|
|
|
$self->{'INF'}{ 'I' . $domain } = $self->{'myip'}; |
199
|
0
|
|
|
|
|
|
$self->{'INF'}{ 'S' . $domain } = $self->{'myport_sctp'}; # if $self->{'myport_sctp'}; |
200
|
|
|
|
|
|
|
} |
201
|
0
|
|
|
|
|
|
delete $self->{'INF'}{ $_ . $domaindel } for qw(I); |
202
|
0
|
0
|
|
|
|
|
if ( $self->{'ipv6_only'} ) { |
203
|
0
|
|
|
|
|
|
delete $self->{'INF'}{ $_ . $domaindel } for qw(U S); |
204
|
|
|
|
|
|
|
} |
205
|
0
|
0
|
0
|
|
|
|
$self->{'INF'}{'SU'} ||= join ',', keys %{ $self->{'SU'} || {} }; |
|
0
|
|
|
|
|
|
|
206
|
0
|
|
|
|
|
|
return $self->{'INF'}; |
207
|
0
|
|
0
|
|
|
|
}; |
208
|
|
|
|
|
|
|
#$self->log( 'func end', ); |
209
|
|
|
|
|
|
|
} |
210
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
sub init { |
212
|
0
|
0
|
|
0
|
0
|
|
my $self = shift if ref $_[0]; |
213
|
|
|
|
|
|
|
#$self->log( 'init s=', $self, $self->{number}, __PACKAGE__); |
214
|
|
|
|
|
|
|
#shift if $_[0] eq __PACKAGE__; |
215
|
|
|
|
|
|
|
#print "adcinit SELF=", $self, "REF=", ref $self, " P=", @_, "package=", __PACKAGE__, "\n\n"; |
216
|
|
|
|
|
|
|
#$self->SUPER::new(); |
217
|
|
|
|
|
|
|
#%$self = ( |
218
|
|
|
|
|
|
|
#%$self, |
219
|
0
|
|
|
|
|
|
local %_ = ( |
220
|
|
|
|
|
|
|
'Nick' => 'NetDCBot', |
221
|
|
|
|
|
|
|
'port' => 1511, |
222
|
|
|
|
|
|
|
'host' => 'localhost', |
223
|
|
|
|
|
|
|
'protocol' => 'adc', |
224
|
|
|
|
|
|
|
'adc' => 1, |
225
|
|
|
|
|
|
|
#'Pass' => '', |
226
|
|
|
|
|
|
|
#'key' => 'zzz', |
227
|
|
|
|
|
|
|
#'auto_wait' => 1, |
228
|
|
|
|
|
|
|
'reconnects' => 99999, 'search_every' => 10, 'search_every_min' => 10, 'auto_connect' => 1, |
229
|
|
|
|
|
|
|
#ADC |
230
|
|
|
|
|
|
|
'protocol_connect' => 'ADC/1.0', |
231
|
|
|
|
|
|
|
'protocol_supported' => { 'ADC/1.0' => 'adc' }, |
232
|
|
|
|
|
|
|
'message_type' => 'H', |
233
|
|
|
|
|
|
|
#@_, |
234
|
|
|
|
|
|
|
'incomingclass' => __PACKAGE__, #'Net::DirectConnect::adc', |
235
|
|
|
|
|
|
|
no_print => { 'INF' => 1, 'QUI' => 1, 'SCH' => 1, }, |
236
|
|
|
|
|
|
|
'ID_file' => 'ID', |
237
|
|
|
|
|
|
|
'cmd_bef' => undef, |
238
|
|
|
|
|
|
|
'cmd_aft' => "\x0A", |
239
|
|
|
|
|
|
|
'auto_say_cmd' => [qw(MSG)], |
240
|
|
|
|
|
|
|
); |
241
|
0
|
|
0
|
|
|
|
$self->{$_} //= $_{$_} for keys %_; |
242
|
|
|
|
|
|
|
#!exists $self->{$_} ? $self->{$_} ||= $_{$_} : () for keys %_; |
243
|
|
|
|
|
|
|
#print 'adc init now=',Dumper $self; |
244
|
|
|
|
|
|
|
$self->{'periodic'}{ __FILE__ . __LINE__ } = sub { |
245
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
246
|
0
|
0
|
|
|
|
|
$self->search_buffer() if $self->{'socket'}; |
247
|
0
|
|
|
|
|
|
}; |
248
|
|
|
|
|
|
|
#$self->log( $self, 'inited', "MT:$self->{'message_type'}", ' with', Dumper \@_ ); |
249
|
|
|
|
|
|
|
#$self->baseinit(); #if ref $self eq __PACKAGE__; |
250
|
|
|
|
|
|
|
#$self->log( 'inited3', "MT:$self->{'message_type'}", ' with' ); |
251
|
0
|
|
|
|
|
|
$self->{SUPAD}{H}{$_} = $_ for qw(BAS0 BASE TIGR UCM0 BLO0 BZIP ); |
252
|
0
|
|
|
|
|
|
$self->{SUPAD}{I}{$_} = $_ for qw(BASE TIGR BZIP); |
253
|
0
|
|
|
|
|
|
$self->{SUPAD}{C}{$_} = $_ for qw(BASE TIGR BZIP); |
254
|
0
|
|
|
|
|
|
$self->{SU}{$_} = $_ for qw(ADC0 TCP4 UDP4); |
255
|
0
|
0
|
|
|
|
|
if ( $self->{'broadcast'} ) { $self->{SUPAD}{B} = $self->{SUPAD}{C}; |
|
0
|
|
|
|
|
|
|
256
|
0
|
|
|
|
|
|
$self->{'myport'} = $self->{'port'}; |
257
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
} |
259
|
0
|
0
|
|
|
|
|
if ( $self->{'hub'} ) { # hub listener |
|
|
0
|
|
|
|
|
|
260
|
|
|
|
|
|
|
#$self->log( 'dev', 'hub settings apply'); |
261
|
0
|
|
|
|
|
|
$self->{'auto_connect'} = 0; |
262
|
0
|
|
|
|
|
|
$self->{'auto_listen'} = 1; |
263
|
0
|
|
|
|
|
|
$self->{'status'} = 'working'; |
264
|
0
|
|
|
|
|
|
$self->{'disconnect_recursive'} = 1; |
265
|
|
|
|
|
|
|
} elsif ( $self->{parent}{hub} ) { # hub client |
266
|
|
|
|
|
|
|
#$self->log( 'dev', 'hubparent:', $self->{parent}{hub}); |
267
|
0
|
|
|
|
|
|
$self->{message_type} = 'B'; |
268
|
|
|
|
|
|
|
} else { |
269
|
0
|
|
|
|
|
|
$self->module_load('filelist'); |
270
|
|
|
|
|
|
|
} |
271
|
|
|
|
|
|
|
#if ($self->{'message_type'} eq 'H') { |
272
|
|
|
|
|
|
|
# $self->{'disconnect_recursive'} = 1; |
273
|
|
|
|
|
|
|
#} |
274
|
|
|
|
|
|
|
#$self->{$_} ||= $self->{'parent'}{$_} ||= {} for qw(peers peers_sid peers_cid want share_full share_tth); |
275
|
0
|
|
0
|
|
|
|
$self->{$_} ||= $self->{'parent'}{$_} for qw(ID PID CID INF SUPAD myport ipv6_only); |
276
|
|
|
|
|
|
|
# Proto |
277
|
0
|
0
|
|
|
|
|
$self->{message_type} = 'B' if $self->{'broadcast'}; |
278
|
|
|
|
|
|
|
#$self->log( 'funci', ); |
279
|
|
|
|
|
|
|
#$self->func(); |
280
|
0
|
|
|
|
|
|
$self->Net::DirectConnect::adc::func(); |
281
|
0
|
0
|
|
|
|
|
if ( $self->{dev_sctp} ) { |
282
|
0
|
|
|
|
|
|
$self->{SU}{$_} = $_ for qw(SCTP4); |
283
|
|
|
|
|
|
|
} |
284
|
|
|
|
|
|
|
#if ( $self->{dev_ipv6} ) { |
285
|
0
|
|
|
|
|
|
$self->{SU}{$_} = $_ for qw(TCP6 UDP6); |
286
|
0
|
0
|
|
|
|
|
if ( $self->{dev_sctp} ) { |
287
|
0
|
|
|
|
|
|
$self->{SU}{$_} = $_ for qw(SCTP6); |
288
|
|
|
|
|
|
|
} |
289
|
|
|
|
|
|
|
#} |
290
|
|
|
|
|
|
|
#warn "IG:$self->{INF_generate}"; |
291
|
|
|
|
|
|
|
#$self->log( 'igen', $self->{INF_generate}); |
292
|
0
|
|
|
|
|
|
$self->INF_generate(); |
293
|
|
|
|
|
|
|
$self->{'parse'} ||= { |
294
|
|
|
|
|
|
|
# |
295
|
|
|
|
|
|
|
#================= |
296
|
|
|
|
|
|
|
#ADC dev |
297
|
|
|
|
|
|
|
# |
298
|
|
|
|
|
|
|
#'ISUP' => sub { }, 'ISID' => sub { $self->{'INF'}{'SID'} = $_[0] }, 'IINF' => sub { $self->cmd('BINF') }, 'IQUI' => sub { }, 'ISTA' => sub { $self->log( 'dcerr', @_ ) }, |
299
|
|
|
|
|
|
|
'SUP' => sub { |
300
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
301
|
0
|
|
|
|
|
|
my ( $dst, $peerid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
302
|
|
|
|
|
|
|
#for my $feature (split /\s+/, $_[0]) |
303
|
|
|
|
|
|
|
#$self->log( 'adcdev', $dst, 'SUP:', @_ , "SID:n=$self->{'number'}; $peerid, $self->{'status'}"); |
304
|
|
|
|
|
|
|
#=z |
305
|
|
|
|
|
|
|
#if $self->{''} |
306
|
0
|
0
|
|
|
|
|
if ( $dst eq 'H' ) { |
|
|
0
|
|
|
|
|
|
307
|
0
|
|
|
|
|
|
$self->cmd( 'I', 'SUP' ); |
308
|
|
|
|
|
|
|
#$peerid ||= join '', map {} 1..4 |
309
|
0
|
|
0
|
|
|
|
$peerid ||= $self->base_encode( |
310
|
|
|
|
|
|
|
pack 'S', $self->{'number'} |
311
|
|
|
|
|
|
|
#+ int rand 100 |
312
|
|
|
|
|
|
|
); |
313
|
|
|
|
|
|
|
#$self->log( 'adcdevsid', "pack [$self->{'number'}] = [$peerid]" ); |
314
|
0
|
|
|
|
|
|
$peerid = ( 'A' x ( 4 - length $peerid ) ) . $peerid; |
315
|
0
|
|
0
|
|
|
|
$self->{'peerid'} ||= $peerid; |
316
|
|
|
|
|
|
|
#$self->log( 'adcdev', $dst, 'SUP:', @_, "SID:n=$self->{'number'}; $peerid=$self->{'peerid'}" ); |
317
|
0
|
|
|
|
|
|
$self->cmd( 'I', 'SID', $peerid ); |
318
|
0
|
|
|
|
|
|
$self->cmd( 'I', 'INF', ); #$self->{'peers'}{$_}{'INF'} |
319
|
|
|
|
|
|
|
#for keys %{$self->{'peers'}}; |
320
|
0
|
|
|
|
|
|
$self->{'status'} = 'connected'; |
321
|
|
|
|
|
|
|
} elsif ( $dst eq 'C' ) { |
322
|
0
|
|
|
|
|
|
$self->cmd( $dst, 'SUP', ); #unless $self->{count_sendcmd}{CSUP}; |
323
|
0
|
0
|
|
|
|
|
$self->cmd( $dst, 'INF', ) unless $self->{count_sendcmd}{CINF}; |
324
|
|
|
|
|
|
|
} |
325
|
0
|
|
0
|
|
|
|
$peerid ||= ''; |
326
|
0
|
|
|
|
|
|
for ( $self->adc_strings_decode(@_) ) { |
327
|
0
|
0
|
|
|
|
|
if ( (s/^(AD|RM)//)[0] eq 'RM' ) { delete $self->{'peers'}{$peerid}{'SUP'}{$_}; } |
|
0
|
|
|
|
|
|
|
328
|
0
|
|
|
|
|
|
else { $self->{'peers'}{$peerid}{'SUP'}{$_} = 1; } |
329
|
|
|
|
|
|
|
} |
330
|
|
|
|
|
|
|
#=cut |
331
|
|
|
|
|
|
|
|
332
|
|
|
|
|
|
|
=z |
333
|
|
|
|
|
|
|
my $params = $self->adc_parse_named(@_); |
334
|
|
|
|
|
|
|
for ( keys %$params ) { |
335
|
|
|
|
|
|
|
delete $self->{'peers'}{$peerid}{'SUP'}{ $params->{$_} } if $_ eq 'RM'; |
336
|
|
|
|
|
|
|
$self->{'peers'}{$peerid}{'SUP'}{ $params->{$_} } = 1 if $_ eq 'AD'; |
337
|
|
|
|
|
|
|
} |
338
|
|
|
|
|
|
|
=cut |
339
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
#$self->log('adcdev', 'SUPans:', $peerid, $self->{'peers'}{$peerid}{'INF'}{I4}, $self->{'peers'}{$peerid}{'INF'}{U4}); |
341
|
|
|
|
|
|
|
#local $self->{'host'} = $self->{'peers'}{$peerid}{'INF'}{I4}; #can answer direct |
342
|
|
|
|
|
|
|
#local $self->{'port'} = $self->{'peers'}{$peerid}{'INF'}{U4}; |
343
|
|
|
|
|
|
|
#$self->cmd( 'D', 'INF', ) if $self->{'broadcast'} and $self->{'broadcast_INF'}; |
344
|
|
|
|
|
|
|
#$self->cmd_direct( 'D', 'INF', ) if $self->{'broadcast'} and $self->{'broadcast_INF'}; |
345
|
0
|
|
|
|
|
|
return $self->{'peers'}{$peerid}{'SUP'}; |
346
|
|
|
|
|
|
|
}, |
347
|
|
|
|
|
|
|
'SID' => sub { |
348
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
349
|
0
|
|
|
|
|
|
my ( $dst, $peerid, $toid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
350
|
|
|
|
|
|
|
#$self->log('devv', '( $dst, $peerid, $toid ) = ', "( $dst, $peerid, $toid )"); |
351
|
0
|
0
|
|
|
|
|
return $self->{'INF'}{'SID'} unless $dst eq 'I'; |
352
|
0
|
|
|
|
|
|
$self->{'INF'}{'SID'} = $_[0]; |
353
|
|
|
|
|
|
|
#$self->log( 'adcdev', 'SID:', $self->{'INF'}{'SID'}, $dst ); |
354
|
0
|
0
|
|
|
|
|
if ( $dst eq 'I' ) { |
355
|
0
|
|
|
|
|
|
$self->cmd( 'B', 'INF' ); |
356
|
0
|
|
|
|
|
|
$self->{'status'} = 'connected'; #clihub |
357
|
|
|
|
|
|
|
} |
358
|
0
|
|
|
|
|
|
return $self->{'INF'}{'SID'}; |
359
|
|
|
|
|
|
|
}, |
360
|
|
|
|
|
|
|
'INF' => sub { |
361
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
362
|
0
|
|
|
|
|
|
my ( $dst, $peerid, $toid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
#test $_[1] eq 'I'! |
364
|
|
|
|
|
|
|
#$self->log('adcdev', '0INF:', "[d=$dst,p=$peerid]", join ':', @_); |
365
|
|
|
|
|
|
|
#$self->log('adcdev', 'INF1', $peerid, @_); |
366
|
0
|
|
|
|
|
|
my $params = $self->adc_parse_named(@_); |
367
|
|
|
|
|
|
|
#$self->log('adcdev', 'INF2', $peerid, @_); |
368
|
|
|
|
|
|
|
#for (@_) { |
369
|
|
|
|
|
|
|
#s/^(\w\w)//; |
370
|
|
|
|
|
|
|
#my ($code)= $1; |
371
|
|
|
|
|
|
|
#$self->log('adcdev', 'INF:', $dst, $peerid, $toid, Dumper $params); |
372
|
|
|
|
|
|
|
#$self->{'peers'}{$peerid}{'INF'}{$code} = $_; |
373
|
|
|
|
|
|
|
#} |
374
|
0
|
|
|
|
|
|
my $peersid = $peerid; |
375
|
0
|
0
|
0
|
|
|
|
if ( $dst ne 'B' and $peerid ||= $params->{ID} ) { |
|
|
|
0
|
|
|
|
|
376
|
0
|
|
|
|
|
|
$self->log( 'adcdev', 'INF:', "moving peer '' to $peerid" ); |
377
|
0
|
|
0
|
|
|
|
$self->{'peerid'} ||= $peerid; |
378
|
0
|
0
|
|
|
|
|
$self->{'peers'}{$peerid}{$_} = $self->{'peers'}{''}{$_} for keys %{ $self->{'peers'}{''} || {} }; |
|
0
|
|
|
|
|
|
|
379
|
0
|
|
|
|
|
|
delete $self->{'peers'}{''}; |
380
|
|
|
|
|
|
|
} |
381
|
|
|
|
|
|
|
#$self->log( 'adcdev', 'INF:', "existing '' peer: $peerid" ) if $self->{'peers'}{''}; |
382
|
0
|
|
|
|
|
|
my $sendbinf; |
383
|
0
|
0
|
0
|
|
|
|
if ( $self->{parent}{hub} and $dst eq 'B' ) { |
384
|
0
|
0
|
|
|
|
|
if ( !keys %{ $self->{'peers'}{$peerid}{'INF'} } ) { #join |
|
0
|
|
|
|
|
|
|
385
|
|
|
|
|
|
|
#++$sendbinf; |
386
|
|
|
|
|
|
|
#$self->log( 'adcdev', 'FIRSTINF:', $peerid, Dumper $params, $self->{'peers'} ); |
387
|
0
|
|
|
|
|
|
$self->cmd( 'B', 'INF', $_, $self->{'peers_sid'}{$_}{'INF'} ) for keys %{ $self->{'peers_sid'} }; |
|
0
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
} |
389
|
|
|
|
|
|
|
} |
390
|
|
|
|
|
|
|
#$dst eq 'I' ? |
391
|
0
|
0
|
|
|
|
|
my $v = $self->{hostip} =~ /:/ ? '6' : '4'; |
392
|
0
|
0
|
0
|
|
|
|
$self->log( 'adcdev', "ip change from [$params->{qq{I$v}}] to [$self->{hostip}] " ), $params->{"I$v"} = $self->{hostip} |
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
393
|
|
|
|
|
|
|
if $dst eq 'B' |
394
|
|
|
|
|
|
|
and $self->{parent}{hub} |
395
|
|
|
|
|
|
|
and $params->{"I$v"} |
396
|
|
|
|
|
|
|
and $params->{"I$v"} ne $self->{hostip}; #!$self->{parent}{hub} |
397
|
0
|
0
|
|
|
|
|
$v = $self->{recv_hostip} =~ /:/ ? '6' : '4'; |
398
|
0
|
0
|
|
|
|
|
if ( #$dst eq 'B' and |
399
|
|
|
|
|
|
|
$self->{broadcast} |
400
|
|
|
|
|
|
|
) |
401
|
|
|
|
|
|
|
{ |
402
|
0
|
|
|
|
|
|
$self->log( 'adcdev', |
403
|
|
|
|
|
|
|
"ip change from [$params->{qq{I$v}}] to [$self->{recv_hostip}:$self->{recv_port}] ($self->{recv_hostip}:$self->{port})" |
404
|
|
|
|
|
|
|
); |
405
|
|
|
|
|
|
|
#$params->{U4} = $self->{recv_port}; |
406
|
0
|
|
0
|
|
|
|
$params->{"U$v"} ||= $self->{port}; |
407
|
0
|
|
0
|
|
|
|
$params->{"I$v"} ||= $self->{recv_hostip}; |
408
|
|
|
|
|
|
|
} |
409
|
0
|
0
|
0
|
|
|
|
if ( $peerid eq $self->{'INF'}{'SID'} and !$self->{myip} ) { |
410
|
0
|
|
0
|
|
|
|
$self->{myip} ||= $params->{I4}; |
411
|
0
|
|
0
|
|
|
|
$self->{'INF'}{'I4'} ||= $params->{I4}; |
412
|
0
|
|
|
|
|
|
$self->log( 'adcdev', "ip detected: [$self->{myip}:$self->{myport}]" ); |
413
|
|
|
|
|
|
|
} |
414
|
|
|
|
|
|
|
#my $first_seen; |
415
|
|
|
|
|
|
|
#$first_seen = 1 unless $self->{'peers'}{$peerid}{INF}; |
416
|
|
|
|
|
|
|
#$self->log( 'adcdev', "peer[$first_seen]: $peerid : $self->{'peers'}{$peerid}"); |
417
|
0
|
|
|
|
|
|
$self->{'peers'}{$peerid}{'INF'}{$_} = $params->{$_} for keys %$params; |
418
|
0
|
|
|
|
|
|
$self->{'peers'}{$peerid}{'object'} = $self; |
419
|
0
|
|
0
|
|
|
|
$self->{'peers'}{ $params->{ID} } ||= $self->{'peers'}{$peerid}; |
420
|
0
|
|
0
|
|
|
|
$self->{'peers'}{$peerid}{'SID'} ||= $peersid; |
421
|
0
|
|
0
|
|
|
|
$self->{'peers_sid'}{$peersid} ||= $self->{'peers'}{$peerid}; |
422
|
0
|
|
0
|
|
|
|
$self->{'peers_cid'}{ $self->{'peers'}{$peerid}{'INF'}{'ID'} } ||= $self->{'peers'}{$peerid}; |
423
|
|
|
|
|
|
|
#$self->log( 'adcdev', 'INF:', $peerid, Dumper $params, $self->{'peers'} ) unless $peerid; |
424
|
|
|
|
|
|
|
#$self->log('adcdev', 'INF7', $peerid, @_); |
425
|
|
|
|
|
|
|
#if ( $dst eq 'I' ) { |
426
|
|
|
|
|
|
|
# $self->cmd( 'B', 'INF' ); |
427
|
|
|
|
|
|
|
# $self->{'status'} = 'connected'; #clihub |
428
|
|
|
|
|
|
|
#} els |
429
|
0
|
0
|
|
|
|
|
if ( $dst eq 'C' ) { |
430
|
0
|
|
|
|
|
|
$self->{'status'} = 'connected'; #clicli |
431
|
0
|
0
|
|
|
|
|
$self->cmd( $dst, 'INF' ) unless $self->{count_sendcmd}{CINF}; |
432
|
0
|
0
|
|
|
|
|
if ( $params->{TO} ) { } |
433
|
|
|
|
|
|
|
else { } |
434
|
0
|
|
|
|
|
|
$self->file_select(); |
435
|
0
|
|
|
|
|
|
$self->cmd( $dst, 'GET' ); |
436
|
|
|
|
|
|
|
} |
437
|
|
|
|
|
|
|
#$self->log('adcdev', 'INF8', $peerid, @_); |
438
|
|
|
|
|
|
|
#if ($sendbinf) { $self->cmd( 'B', 'INF', $_, $self->{'peers_sid'}{$_}{'INF'} ) for keys %{ $self->{'peers_sid'} }; } |
439
|
|
|
|
|
|
|
#$self->log('adcdev', 'INF9', $peerid, "H:$self->{parent}{hub}", @_); |
440
|
0
|
0
|
|
|
|
|
if ( $self->{parent}{hub} ) { |
441
|
0
|
|
|
|
|
|
my $params_send = \%$params; |
442
|
0
|
|
|
|
|
|
delete $params_send->{PD}; |
443
|
0
|
|
|
|
|
|
$self->cmd_all( $dst, 'INF', $peerid, $self->adc_make_string($params_send) ); |
444
|
|
|
|
|
|
|
} |
445
|
|
|
|
|
|
|
#$self->log('adcdev', "first_seen: $first_seen,$peerid ne $self->{'INF'}{'SID'} dst: $dst"); |
446
|
0
|
0
|
0
|
|
|
|
if ( #$first_seen and |
|
|
|
0
|
|
|
|
|
447
|
|
|
|
|
|
|
$self->{'broadcast'} and $peerid ne $self->{'INF'}{'SID'} and $dst eq 'B' |
448
|
|
|
|
|
|
|
) |
449
|
|
|
|
|
|
|
{ |
450
|
0
|
0
|
|
|
|
|
$self->cmd( 'D', 'INF', ) if $self->{'broadcast'}; # and $self->{'broadcast_INF'}; |
451
|
|
|
|
|
|
|
#$self->cmd_direct( $peerid, 'D', 'INF', ) if $self->{'broadcast'} and $self->{'broadcast_INF'}; |
452
|
|
|
|
|
|
|
} |
453
|
0
|
|
|
|
|
|
return $params; #$self->{'peers'}{$peerid}{'INF'}; |
454
|
|
|
|
|
|
|
}, |
455
|
|
|
|
|
|
|
'QUI' => sub { |
456
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
457
|
0
|
|
|
|
|
|
my ( $dst, $peerid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
458
|
|
|
|
|
|
|
#$peerid |
459
|
|
|
|
|
|
|
#$self->log( 'adcdev', 'QUI', $dst, $_[0], Dumper $self->{'peers'}{ $_[0] } ); |
460
|
0
|
|
|
|
|
|
delete $self->{'peers_cid'}{ $self->{'peers'}{$peerid}{'INF'}{'ID'} }; |
461
|
0
|
|
|
|
|
|
delete $self->{'peers_sid'}{$peerid}; |
462
|
0
|
|
|
|
|
|
delete $self->{'peers'}{$peerid}; # or mark time |
463
|
0
|
|
|
|
|
|
undef; |
464
|
|
|
|
|
|
|
}, |
465
|
|
|
|
|
|
|
'STA' => sub { |
466
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
467
|
0
|
|
|
|
|
|
my ( $dst, $peerid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
468
|
|
|
|
|
|
|
#$self->log( 'dcerr', @_ ); |
469
|
0
|
|
|
|
|
|
my $code = shift; |
470
|
0
|
|
|
|
|
|
$code =~ s/^(.)//; |
471
|
0
|
|
|
|
|
|
my $severity = $1; |
472
|
|
|
|
|
|
|
#TODO: $severity : |
473
|
|
|
|
|
|
|
#0 Success (used for confirming commands), error code must be "00", and an additional flag "FC" contains the FOURCC of the command being confirmed if applicable. |
474
|
|
|
|
|
|
|
#1 Recoverable (error but no disconnect) |
475
|
|
|
|
|
|
|
#2 Fatal (disconnect) |
476
|
|
|
|
|
|
|
#my $desc = $self->{'codesSTA'}{$code}; |
477
|
0
|
|
|
|
|
|
@_ = $self->adc_strings_decode(@_); |
478
|
|
|
|
|
|
|
#$self->log( 'adcdev', 'STA', $peerid, $severity, 'c=', $code, 't=',@_, "=[$Net::DirectConnect::adc::codesSTA{$code}]" ); |
479
|
0
|
0
|
0
|
|
|
|
if ( $code ~~ '20' and $_[0] =~ /^Reconnecting too fast, you have to wait (\d+) seconds before reconnecting./ ) { |
|
|
0
|
0
|
|
|
|
|
480
|
0
|
|
|
|
|
|
$self->work( $1 + 10 ); |
481
|
|
|
|
|
|
|
} elsif ( $code ~~ '30' |
482
|
|
|
|
|
|
|
and $_[0] =~ |
483
|
|
|
|
|
|
|
/^You are disconnected because: You are disconnected for hammering the hub with connect attempts, stop or you'll be kicked !!!/ # 'mc |
484
|
|
|
|
|
|
|
) |
485
|
|
|
|
|
|
|
{ |
486
|
0
|
|
|
|
|
|
$self->work(30); |
487
|
|
|
|
|
|
|
} |
488
|
0
|
|
|
|
|
|
return $severity, $code, $Net::DirectConnect::adc::codesSTA{$code}, @_; |
489
|
|
|
|
|
|
|
}, |
490
|
|
|
|
|
|
|
'SCH' => sub { |
491
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
492
|
0
|
|
|
|
|
|
my ( $dst, $peerid, @feature ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
493
|
|
|
|
|
|
|
#$self->log( 'adcdev', 'SCH', ( $dst, $peerid, 'F=>', @feature ), 'S=>', @_ ); |
494
|
0
|
|
|
|
|
|
$self->cmd_all( $dst, 'SCH', $peerid, @feature, @_ ); |
495
|
0
|
|
|
|
|
|
my $params = $self->adc_parse_named(@_); |
496
|
|
|
|
|
|
|
#DRES J3F4 KULX SI0 SL57 FN/Joculete/logs/stderr.txt TRLWPNACQDBZRYXW3VHJVCJ64QBZNGHOHHHZWCLNQ TOauto |
497
|
0
|
|
0
|
|
|
|
my $found = $self->{'share_full'}{ $params->{TR} } || $self->{'share_full'}{ $params->{AN} }; |
498
|
0
|
|
|
|
|
|
my $tth = $self->{'share_tth'}{$found}; |
499
|
0
|
0
|
|
|
|
|
if ( |
500
|
|
|
|
|
|
|
#$self->{'share_full'} and $params->{TR} and exists $self->{'share_full'}{ $params->{TR} } and -s $self->{'share_full'}{ $params->{TR} } |
501
|
|
|
|
|
|
|
$found |
502
|
|
|
|
|
|
|
) |
503
|
|
|
|
|
|
|
{ |
504
|
0
|
0
|
|
|
|
|
my $foundshow = ( $found =~ m{^/} ? () : '/' ) . ( |
505
|
|
|
|
|
|
|
#$self->{chrarset_fs} ? |
506
|
|
|
|
|
|
|
#$self->{charset_fs} ne $self->{charset_protocol} ? |
507
|
|
|
|
|
|
|
Encode::encode $self->{charset_protocol}, Encode::decode( $self->{charset_fs}, $found, Encode::FB_WARN ), |
508
|
|
|
|
|
|
|
Encode::FB_WARN |
509
|
|
|
|
|
|
|
#: $found |
510
|
|
|
|
|
|
|
); |
511
|
0
|
|
|
|
|
|
$self->log( 'adcdev', 'SCH', ( $dst, $peerid, 'F=>', @feature ), |
512
|
|
|
|
|
|
|
$found, -s $found, -e $found, 'c=', $self->{chrarset_fs}, ); |
513
|
0
|
|
0
|
|
|
|
local @_ = ( { |
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
514
|
|
|
|
|
|
|
SI => ( -s $found ) || -1, |
515
|
|
|
|
|
|
|
SL => $self->{INF}{SL}, |
516
|
|
|
|
|
|
|
FN => $self->adc_path_encode($foundshow), |
517
|
|
|
|
|
|
|
TO => $params->{TO} || $self->make_token($peerid), |
518
|
|
|
|
|
|
|
TR => $params->{TR} || $tth, |
519
|
|
|
|
|
|
|
} |
520
|
|
|
|
|
|
|
); |
521
|
0
|
0
|
0
|
|
|
|
if ( $self->{'peers'}{$peerid}{INF}{I4} and $self->{'peers'}{$peerid}{INF}{U4} ) { |
522
|
0
|
|
|
|
|
|
$self->log( |
523
|
|
|
|
|
|
|
'dcdev', 'SCH', 'i=', $self->{'peers'}{$peerid}{INF}{I4}, |
524
|
|
|
|
|
|
|
'u=', $self->{'peers'}{$peerid}{INF}{U4}, |
525
|
|
|
|
|
|
|
'T==>', 'U' . 'RES ' . $self->adc_make_string( $self->{'INF'}{'ID'}, @_ ) |
526
|
|
|
|
|
|
|
); |
527
|
0
|
|
|
|
|
|
$self->send_udp( |
528
|
|
|
|
|
|
|
$self->{'peers'}{$peerid}{INF}{I4}, $self->{'peers'}{$peerid}{INF}{U4}, |
529
|
|
|
|
|
|
|
'U' . 'RES ' . $self->adc_make_string( $self->{'INF'}{'ID'}, @_ ) #. $self->{'cmd_aft'} |
530
|
|
|
|
|
|
|
); |
531
|
|
|
|
|
|
|
} else { |
532
|
0
|
|
|
|
|
|
$self->cmd( 'D', 'RES', $self->adc_make_string( $peerid, @_ ) ); |
533
|
|
|
|
|
|
|
} |
534
|
|
|
|
|
|
|
} |
535
|
|
|
|
|
|
|
#$self->adc_make_string(@_); |
536
|
|
|
|
|
|
|
#TODO active send udp |
537
|
0
|
|
|
|
|
|
return $params; |
538
|
|
|
|
|
|
|
#TRKU2OUBVHC3VXUNOHO2BS2G4ECHYB6ESJUQPYFSY TO626120869 ] |
539
|
|
|
|
|
|
|
#TRQYKHJIZEPSISFF3T25DIGKEYI645Y7PGMSI7QII TOauto ] |
540
|
|
|
|
|
|
|
#ANthe ANhossboss TO3951841973 ] |
541
|
|
|
|
|
|
|
#FSCH ABWN +TCP4 TRKX55JDOFEBX32GLBSITTSY6KUCK4NMPU2R4XUII TOauto |
542
|
|
|
|
|
|
|
}, |
543
|
|
|
|
|
|
|
'RES' => sub { |
544
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
545
|
0
|
|
|
|
|
|
my ( $dst, $peerid, $toid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
546
|
|
|
|
|
|
|
#test $_[1] eq 'I'! |
547
|
|
|
|
|
|
|
#$self->log( 'adcdev', '0RES:', "[d=$dst,p=$peerid,t=$toid]", join ':', @_ ); |
548
|
0
|
|
|
|
|
|
my $params = $self->adc_parse_named(@_); |
549
|
|
|
|
|
|
|
#$self->log('adcdev', 'RES:',"[d=$dst,p=$peerid]",Dumper $params); |
550
|
0
|
0
|
0
|
|
|
|
if ( $dst eq 'D' and $self->{'parent'}{'hub'} and ref $self->{'peers'}{$toid}{'object'} ) { |
|
|
|
0
|
|
|
|
|
551
|
0
|
|
|
|
|
|
$self->{'peers'}{$toid}{'object'}->cmd( 'D', 'RES', $peerid, $toid, @_ ); |
552
|
|
|
|
|
|
|
} else { |
553
|
|
|
|
|
|
|
#= $1 if |
554
|
|
|
|
|
|
|
#$params->{'FN'} =~ m{([^/\\]+)$}; |
555
|
0
|
|
|
|
|
|
$params->{CID} = $peerid; |
556
|
0
|
|
|
|
|
|
( $params->{'filename'} ) = $params->{FN} =~ m{([^\\/]+)$}; |
557
|
0
|
|
0
|
|
|
|
my $wdl = $self->{'want_download'}{ $params->{'TR'} } || $self->{'want_download'}{ $params->{'filename'} }; |
558
|
0
|
0
|
|
|
|
|
if ($wdl) { #exists $self->{'want_download'}{ $params->{'TR'} } ) { |
559
|
|
|
|
|
|
|
#$self->{'want_download'}{ $params->{'TR'} } |
560
|
0
|
|
|
|
|
|
$wdl->{$peerid} = $params; #maybe not all |
561
|
0
|
0
|
|
|
|
|
if ( $params->{'filename'} ) { ++$self->{'want_download_filename'}{ $params->{TR} }{ $params->{'filename'} }; } |
|
0
|
|
|
|
|
|
|
562
|
0
|
|
|
|
|
|
$self->{'want_download'}{ $params->{TR} }{$peerid} = $params; # _tth_from |
563
|
|
|
|
|
|
|
} |
564
|
|
|
|
|
|
|
} |
565
|
0
|
|
|
|
|
|
$params; |
566
|
|
|
|
|
|
|
}, |
567
|
|
|
|
|
|
|
'MSG' => sub { |
568
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
569
|
0
|
|
|
|
|
|
my ( $dst, $peerid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
570
|
|
|
|
|
|
|
#@_ = map {adc_string_decode} @_; |
571
|
0
|
|
|
|
|
|
$self->cmd_all( $dst, 'MSG', $peerid, @_ ); |
572
|
0
|
|
|
|
|
|
@_ = $self->adc_strings_decode(@_); |
573
|
0
|
|
|
|
|
|
$self->log( 'adcdev', $dst, 'MSG', $peerid, "<" . $self->{'peers'}{$peerid}{'INF'}{'NI'} . '>', @_ ); |
574
|
0
|
|
|
|
|
|
@_; |
575
|
|
|
|
|
|
|
}, |
576
|
|
|
|
|
|
|
'RCM' => sub { |
577
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
578
|
0
|
|
|
|
|
|
my ( $dst, $peerid, $toid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
579
|
0
|
|
0
|
|
|
|
$toid ||= shift; |
580
|
|
|
|
|
|
|
#$self->log( 'dcdev', "RCM( $dst, RCM, $peerid, $toid me=[$self->{'INF'}{'SID'}:$self->{'myport'}] )", @_ ); |
581
|
0
|
0
|
0
|
|
|
|
$self->cmd( $dst, 'CTM', $peerid, $self->{'protocol_supported'}{ $_[0] } || $self->{'protocol_connect'}, |
582
|
|
|
|
|
|
|
$self->{'myport'}, $_[1], ) |
583
|
|
|
|
|
|
|
if $toid eq $self->{'INF'}{'SID'}; |
584
|
0
|
0
|
0
|
|
|
|
if ( $dst eq 'D' and $self->{'parent'}{'hub'} and ref $self->{'peers'}{$toid}{'object'} ) { |
|
|
|
0
|
|
|
|
|
585
|
0
|
|
|
|
|
|
$self->{'peers'}{$toid}{'object'}->cmd( 'D', 'RCM', $peerid, $toid, @_ ); |
586
|
|
|
|
|
|
|
} |
587
|
|
|
|
|
|
|
|
588
|
|
|
|
|
|
|
=z |
589
|
|
|
|
|
|
|
my $host= $self->{'peers'}{$toid}{I4}; |
590
|
|
|
|
|
|
|
my $port= $self->{'peers'}{$toid}{U4} |
591
|
|
|
|
|
|
|
$self->{'clients'}{ $host . ':' . $port } = __PACKAGE__->new( |
592
|
|
|
|
|
|
|
#%$self, $self->clear(), |
593
|
|
|
|
|
|
|
'parent' => $self, |
594
|
|
|
|
|
|
|
'host' => $host, |
595
|
|
|
|
|
|
|
'port' => $port, |
596
|
|
|
|
|
|
|
#'want' => \%{ $self->{'want'} }, |
597
|
|
|
|
|
|
|
#'NickList' => \%{ $self->{'NickList'} }, |
598
|
|
|
|
|
|
|
#'IpList' => \%{ $self->{'IpList'} }, |
599
|
|
|
|
|
|
|
#'PortList' => \%{ $self->{'PortList'} }, |
600
|
|
|
|
|
|
|
#'handler' => \%{ $self->{'handler'} }, |
601
|
|
|
|
|
|
|
'auto_connect' => 1, |
602
|
|
|
|
|
|
|
); |
603
|
|
|
|
|
|
|
=cut |
604
|
|
|
|
|
|
|
|
605
|
|
|
|
|
|
|
}, |
606
|
|
|
|
|
|
|
'CTM' => sub { |
607
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
608
|
0
|
|
|
|
|
|
my ( $dst, $peerid, $toid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
609
|
0
|
|
0
|
|
|
|
$toid ||= shift; |
610
|
0
|
0
|
0
|
|
|
|
if ( $dst eq 'D' and $self->{'parent'}{'hub'} and ref $self->{'peers'}{$toid}{'object'} ) { |
|
|
|
0
|
|
|
|
|
611
|
0
|
|
|
|
|
|
return $self->{'peers'}{$toid}{'object'}->cmd( 'D', 'CTM', $peerid, $toid, @_ ); |
612
|
|
|
|
|
|
|
} |
613
|
0
|
|
|
|
|
|
my ( $proto, $port, $token ) = @_; |
614
|
0
|
|
|
|
|
|
my $host = $self->{'peers'}{$peerid}{'INF'}{'I4'}; |
615
|
0
|
|
|
|
|
|
$self->log( |
616
|
|
|
|
|
|
|
'dcdev', |
617
|
|
|
|
|
|
|
"( $dst, CTM, $peerid, $toid ) - ($proto, $port, $token) me=$self->{'INF'}{'SID'} p=", |
618
|
|
|
|
|
|
|
$self->{'protocol_supported'}{$proto} |
619
|
|
|
|
|
|
|
); |
620
|
0
|
0
|
|
|
|
|
$self->log( 'dcerr', 'CTM: unknown host', "( $dst, CTM, $peerid, $toid ) - ($proto, $port, $token)" ) unless $host; |
621
|
0
|
|
|
|
|
|
$self->{'clients'}{ $self->{'peers'}{$peerid}{'INF'}{ID} or $host . ':' . $port } = __PACKAGE__->new( |
622
|
|
|
|
|
|
|
#%$self, $self->clear(), |
623
|
|
|
|
|
|
|
protocol => $self->{'protocol_supported'}{$proto} || 'adc', |
624
|
|
|
|
|
|
|
parent => $self, |
625
|
|
|
|
|
|
|
'host' => $host, |
626
|
|
|
|
|
|
|
'port' => $port, |
627
|
|
|
|
|
|
|
#'parse' => $self->{'parse'}, |
628
|
|
|
|
|
|
|
#'cmd' => $self->{'cmd'}, |
629
|
|
|
|
|
|
|
#'want' => $self->{'want'}, |
630
|
|
|
|
|
|
|
#'want' => \%{ $self->{'want'} }, |
631
|
|
|
|
|
|
|
#'NickList' => \%{ $self->{'NickList'} }, |
632
|
|
|
|
|
|
|
#'IpList' => \%{ $self->{'IpList'} }, |
633
|
|
|
|
|
|
|
#'PortList' => \%{ $self->{'PortList'} }, |
634
|
|
|
|
|
|
|
#'handler' => \%{ $self->{'handler'} }, |
635
|
|
|
|
|
|
|
#'TO' => $token, |
636
|
0
|
0
|
0
|
|
|
|
'INF' => { %{ $self->{'INF'} }, 'TO' => $token }, |
|
|
|
0
|
|
|
|
|
637
|
|
|
|
|
|
|
'message_type' => 'C', |
638
|
|
|
|
|
|
|
'auto_connect' => 1, |
639
|
|
|
|
|
|
|
'reconnects' => 0, |
640
|
|
|
|
|
|
|
no_listen => 1, |
641
|
|
|
|
|
|
|
) if $toid eq $self->{'INF'}{'SID'}; |
642
|
|
|
|
|
|
|
}, |
643
|
|
|
|
|
|
|
'SND' => sub { |
644
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
645
|
0
|
|
|
|
|
|
my ( $dst, $peerid, $toid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
646
|
|
|
|
|
|
|
#CSND file files.xml.bz2 0 6117 |
647
|
0
|
|
0
|
|
|
|
$self->{'filetotal'} //= $_[2] + $_[3]; |
648
|
0
|
|
|
|
|
|
return $self->file_open(); |
649
|
|
|
|
|
|
|
}, |
650
|
|
|
|
|
|
|
#CGET file TTH/YDIXOH7A3W233WTOQUET3JUGMHNBYNFZ4UBXGNY 637534208 6291456 |
651
|
|
|
|
|
|
|
'GET' => sub { |
652
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
653
|
0
|
|
|
|
|
|
my ( $dst, $peerid, $toid ) = @{ shift() }; |
|
0
|
|
|
|
|
|
|
654
|
0
|
|
|
|
|
|
$self->file_send_parse(@_); |
655
|
|
|
|
|
|
|
|
656
|
|
|
|
|
|
|
=z |
657
|
|
|
|
|
|
|
if ( $_[0] eq 'file' ) { |
658
|
|
|
|
|
|
|
my $file = $_[1]; |
659
|
|
|
|
|
|
|
if ( $file =~ s{^TTH/}{} ) { $self->file_send_tth( $file, $_[2], $_[3] ); } |
660
|
|
|
|
|
|
|
else { |
661
|
|
|
|
|
|
|
#$self->file_send($file, $_[2], $_[3]); |
662
|
|
|
|
|
|
|
} |
663
|
|
|
|
|
|
|
} else { |
664
|
|
|
|
|
|
|
$self->log( 'dcerr', 'SND', "unknown type", @_ ); |
665
|
|
|
|
|
|
|
} |
666
|
|
|
|
|
|
|
=cut |
667
|
|
|
|
|
|
|
|
668
|
|
|
|
|
|
|
}, |
669
|
0
|
|
0
|
|
|
|
}; |
670
|
|
|
|
|
|
|
|
671
|
|
|
|
|
|
|
=COMMANDS |
672
|
|
|
|
|
|
|
|
673
|
|
|
|
|
|
|
|
674
|
|
|
|
|
|
|
|
675
|
|
|
|
|
|
|
|
676
|
|
|
|
|
|
|
|
677
|
|
|
|
|
|
|
|
678
|
|
|
|
|
|
|
|
679
|
|
|
|
|
|
|
|
680
|
|
|
|
|
|
|
=cut |
681
|
|
|
|
|
|
|
|
682
|
|
|
|
|
|
|
$self->{'cmd'} = { |
683
|
|
|
|
|
|
|
#move to main |
684
|
|
|
|
|
|
|
'search_send' => sub { |
685
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
686
|
0
|
0
|
|
|
|
|
$self->cmd_adc( 'B', 'SCH', @{ $_[0] || $self->{'search_last'} } ); |
|
0
|
|
|
|
|
|
|
687
|
|
|
|
|
|
|
#$self->send_udp(inet_ntoa(INADDR_BROADCAST), $self->{'dev_broadcast'}, $self->adc_make_string( 'BSCH', @{ $_[0] || $self->{'search_last'} })) if $self->{'dev_broadcast'}; |
688
|
|
|
|
|
|
|
}, |
689
|
|
|
|
|
|
|
'search_tth' => sub { |
690
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
691
|
0
|
|
|
|
|
|
$self->{'search_last_string'} = undef; |
692
|
0
|
|
|
|
|
|
$self->log( 'search_tth', @_ ); |
693
|
0
|
|
|
|
|
|
local $_ = shift; |
694
|
0
|
0
|
|
|
|
|
if ( $self->{'adc'} ) { $self->search_buffer( { TO => $self->make_token(), TR => $_, @_ } ); } #toauto |
|
0
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
else { |
696
|
|
|
|
|
|
|
#$self->cmd( 'search_buffer', 'F', 'T', '0', '9', 'TTH:' . $_[0] ); |
697
|
|
|
|
|
|
|
} |
698
|
|
|
|
|
|
|
}, |
699
|
|
|
|
|
|
|
'search_string' => sub { |
700
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
701
|
0
|
|
|
|
|
|
my $string = shift; |
702
|
0
|
0
|
|
|
|
|
if ( $self->{'adc'} ) { |
703
|
|
|
|
|
|
|
#$self->cmd( 'search_buffer', { TO => 'auto', map AN => $_, split /\s+/, $string } ); |
704
|
0
|
|
|
|
|
|
$self->search_buffer( ( map { 'AN' . $_ } split /\s+/, $string ), { TO => $self->make_token(), @_ } ); #TOauto |
|
0
|
|
|
|
|
|
|
705
|
|
|
|
|
|
|
} else { |
706
|
|
|
|
|
|
|
#$self->{'search_last_string'} = $string; |
707
|
|
|
|
|
|
|
#$string =~ tr/ /$/; |
708
|
|
|
|
|
|
|
#$self->cmd( 'search_buffer', 'F', 'T', '0', '1', $string ); |
709
|
|
|
|
|
|
|
} |
710
|
|
|
|
|
|
|
}, |
711
|
|
|
|
|
|
|
#'make_hub' => sub { |
712
|
|
|
|
|
|
|
#my $self = shift if ref $_[0]; |
713
|
|
|
|
|
|
|
#$self->{'hub'} ||= $self->{'host'} . ( ( $self->{'port'} and $self->{'port'} != 411 ) ? ':' . $self->{'port'} : '' ); |
714
|
|
|
|
|
|
|
#}, |
715
|
|
|
|
|
|
|
'nick_generate' => sub { |
716
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
717
|
0
|
|
0
|
|
|
|
$self->{'nick_base'} ||= $self->{'Nick'}; |
718
|
0
|
|
0
|
|
|
|
$self->{'Nick'} = $self->{'nick_base'} . int( rand( $self->{'nick_random'} || 100 ) ); |
719
|
|
|
|
|
|
|
}, |
720
|
|
|
|
|
|
|
# |
721
|
|
|
|
|
|
|
#================= |
722
|
|
|
|
|
|
|
#ADC dev |
723
|
|
|
|
|
|
|
# |
724
|
|
|
|
|
|
|
'connect_aft' => sub { |
725
|
|
|
|
|
|
|
#print "RUNADC![$self->{'protocol'}:$self->{'adc'}]"; |
726
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
727
|
|
|
|
|
|
|
#$self->log( $self, 'connect_aft inited', "MT:$self->{'message_type'}", ' :', $self->{'broadcast'}, $self->{'parent'}{'hub'} ); |
728
|
|
|
|
|
|
|
#{ |
729
|
0
|
|
|
|
|
|
$self->cmd( $self->{'message_type'}, 'SUP' ); |
730
|
|
|
|
|
|
|
#} |
731
|
0
|
0
|
|
|
|
|
if ( $self->{'broadcast'} ) { $self->cmd( $self->{'message_type'}, 'INF' ); } |
|
0
|
|
|
|
|
|
|
732
|
|
|
|
|
|
|
#$self->cmd( $self->{'message_type'}, 'SUP' ) if $self->{'parent'}{'hub'}; |
733
|
|
|
|
|
|
|
#else |
734
|
|
|
|
|
|
|
}, |
735
|
|
|
|
|
|
|
'accept_aft' => sub { |
736
|
|
|
|
|
|
|
#print "RUNADC![$self->{'protocol'}:$self->{'adc'}]"; |
737
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
738
|
|
|
|
|
|
|
#$self->log($self, 'accept_aft inited',"MT:$self->{'message_type'}", ' :', $self->{'broadcast'}, $self->{'parent'}{'hub'}); |
739
|
|
|
|
|
|
|
#{ |
740
|
|
|
|
|
|
|
#$self->cmd( $self->{'message_type'}, 'SUP' ); |
741
|
|
|
|
|
|
|
#} |
742
|
|
|
|
|
|
|
#$self->cmd( $self->{'message_type'}, 'INF' ); |
743
|
|
|
|
|
|
|
}, |
744
|
|
|
|
|
|
|
'cmd_all' => sub { |
745
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
746
|
|
|
|
|
|
|
return if #( $_[0] ne 'B' and $_[0] ne 'F' and $_[0] ne 'I' ) or |
747
|
0
|
0
|
|
|
|
|
!$self->{'parent'}{'hub'}; |
748
|
0
|
|
|
|
|
|
$self->{'parent'}->sendcmd_all(@_); #for keys %{ $self->{'peers_sid'} }; |
749
|
|
|
|
|
|
|
}, |
750
|
|
|
|
|
|
|
'SUP' => sub { |
751
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
752
|
0
|
|
|
|
|
|
my $dst = shift; |
753
|
|
|
|
|
|
|
#$self->log($self, 'SUP inited',"MT:$self->{'message_type'}", "=== $dst"); |
754
|
|
|
|
|
|
|
#$self->{SUPADS} ||= [qw(BASE TIGR)] if $dst eq 'I'; #PING |
755
|
|
|
|
|
|
|
#$self->{SUPADS} ||= [qw(BAS0 BASE TIGR UCM0 BLO0 BZIP )]; #PING ZLIG |
756
|
|
|
|
|
|
|
#$self->{SUPRMS} ||= [qw()]; |
757
|
|
|
|
|
|
|
#$self->{SUP} ||= { ( map { $_ => 1 } @{ $self->{'SUPADS'} } ), ( map { $_ => 0 } @{ $self->{'SUPRMS'} } ) }; |
758
|
|
|
|
|
|
|
#$self->{'SUPAD'} ||= { map { $_ => 1 } @{ $self->{'SUPADS'} } }; |
759
|
|
|
|
|
|
|
#$self->cmd_adc( $dst, 'SUP', ( map { 'AD' . $_ } @{ $self->{'SUPADS'} } ), ( map { 'RM' . $_ } keys %{ $self->{'SUPRM'} } ), ); |
760
|
|
|
|
|
|
|
#$self->log( 'SUP', "sidp=[$self->{'INF'}{'SID'}]"); |
761
|
|
|
|
|
|
|
#{ |
762
|
0
|
0
|
|
|
|
|
local $self->{'INF'}{'SID'} = undef unless $self->{'broadcast'}; |
763
|
0
|
|
|
|
|
|
$self->cmd_adc( |
764
|
|
|
|
|
|
|
$dst, 'SUP', |
765
|
0
|
|
|
|
|
|
( map { 'AD' . $_ } sort keys %{ $self->{SUPAD}{$dst} } ), |
|
0
|
|
|
|
|
|
|
766
|
0
|
|
|
|
|
|
( map { 'RM' . $_ } sort keys %{ $self->{SUPRM}{$dst} } ), |
|
0
|
|
|
|
|
|
|
767
|
|
|
|
|
|
|
); |
768
|
|
|
|
|
|
|
#} |
769
|
|
|
|
|
|
|
#$self->log( 'SUP', "sida=[$self->{'INF'}{'SID'}]"); |
770
|
|
|
|
|
|
|
#ADBAS0 ADBASE ADTIGR ADUCM0 ADBLO0 |
771
|
|
|
|
|
|
|
}, |
772
|
|
|
|
|
|
|
'SID' => sub { |
773
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
774
|
0
|
|
|
|
|
|
my $dst = shift; |
775
|
|
|
|
|
|
|
#$self->{'peerid'} |
776
|
0
|
|
|
|
|
|
local $self->{'INF'}{'SID'} = undef; #!? unless $self->{'broadcast'}; |
777
|
0
|
|
0
|
|
|
|
$self->cmd_adc( $dst, 'SID', $_[0] || $self->{'peerid'} ); |
778
|
|
|
|
|
|
|
}, |
779
|
|
|
|
|
|
|
'INF' => sub { |
780
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
781
|
0
|
|
|
|
|
|
my $dst = shift; |
782
|
|
|
|
|
|
|
#$self->{'BINFS'} ||= [qw(ID PD I4 I6 U4 U6 SS SF VE US DS SL AS AM EM NI DE HN HR HO TO CT AW SU RF)]; |
783
|
|
|
|
|
|
|
#$self->log('infsend', $dst, 'h=',$self->{parent}{hub}); |
784
|
0
|
0
|
|
|
|
|
if ( $self->{parent}{hub} ) { |
785
|
0
|
0
|
|
|
|
|
if ( $dst eq 'I' ) { |
|
|
0
|
|
|
|
|
|
786
|
0
|
|
|
|
|
|
$self->{'INF'} = { CT => 32, VE => 'perl' . $VERSION, NI => 'devhub', DE => 'hubdev', }; |
787
|
|
|
|
|
|
|
#IINF CT32 VEuHub/0.3.0-rc4\s(git:\sd2da49d...) NI"??????????\s?3\\14?" DE?????,\s??????,\s?????????.\s???\s????????\s-\s???\s????????. |
788
|
|
|
|
|
|
|
} elsif ( $dst eq 'B' ) { |
789
|
0
|
|
|
|
|
|
$self->cmd_adc #sendcmd |
790
|
|
|
|
|
|
|
( |
791
|
|
|
|
|
|
|
$dst, 'INF', #$self->{'INF'}{'SID'}, |
792
|
|
|
|
|
|
|
@_, |
793
|
|
|
|
|
|
|
#map { $_ . $self->{'INF'}{$_} } $dst eq 'C' ? qw(ID TO) : sort keys %{ $self->{'INF'} } |
794
|
|
|
|
|
|
|
); |
795
|
0
|
|
|
|
|
|
return; |
796
|
|
|
|
|
|
|
} |
797
|
|
|
|
|
|
|
} else { |
798
|
0
|
|
|
|
|
|
$self->INF_generate(); |
799
|
|
|
|
|
|
|
#$self->{''} ||= $self->{''} || ''; |
800
|
|
|
|
|
|
|
#$self->sendcmd( $dst, 'INF', $self->{'INF'}{'SID'}, map { $_ . $self->{$_} } grep { length $self->{$_} } @{ $self->{'BINFS'} } ); |
801
|
|
|
|
|
|
|
} |
802
|
|
|
|
|
|
|
#$self->log(Dumper $self); |
803
|
|
|
|
|
|
|
#$self->log('infsend inf', Dumper$self->{'INF'}); |
804
|
0
|
|
|
|
|
|
$self->cmd_adc #sendcmd |
805
|
|
|
|
|
|
|
( |
806
|
|
|
|
|
|
|
$dst, 'INF', #$self->{'INF'}{'SID'}, |
807
|
0
|
0
|
|
|
|
|
map { $_ . $self->{'INF'}{$_} } grep { length $self->{'INF'}{$_} } $dst eq 'C' ? qw(ID TO) |
|
0
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
808
|
|
|
|
|
|
|
: @_ ? @_ |
809
|
|
|
|
|
|
|
: ( |
810
|
|
|
|
|
|
|
qw(ID I4 U4 I6 U6 S4 S6 SS SF VE US DS SL AS AM EM NI HN HR HO TO CT SU RF), |
811
|
|
|
|
|
|
|
( $self->{'message_type'} eq 'H' ? 'PD' : () ) |
812
|
|
|
|
|
|
|
) #sort keys %{ $self->{'INF'} } |
813
|
|
|
|
|
|
|
); |
814
|
|
|
|
|
|
|
#grep { length $self->{$_} } @{ $self->{'BINFS'} } ); |
815
|
|
|
|
|
|
|
#$self->cmd_adc( $dst, 'INF', $self->{'INF'}{'SID'}, map { $_ . $self->{$_} } grep { $self->{$_} } @{ $self->{'BINFS'} } ); |
816
|
|
|
|
|
|
|
#BINF UUXX IDFXC3WTTDXHP7PLCCGZ6ZKBHRVAKBQ4KUINROXXI PDP26YAWX3HUNSTEXXYRGOIAAM2ZPMLD44HCWQEDY NIïûðûî SL2 SS20025693588 |
817
|
|
|
|
|
|
|
#SF30999 HN2 HR0 HO0 VE++\s0.706 US5242 SUADC0 |
818
|
|
|
|
|
|
|
}, |
819
|
|
|
|
|
|
|
'GET' => sub { |
820
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
821
|
0
|
|
|
|
|
|
my $dst = shift; |
822
|
|
|
|
|
|
|
#$self->sendcmd( $dst, 'CTM', $self->{'protocol_connect'},@_); |
823
|
0
|
|
|
|
|
|
local @_ = @_; |
824
|
0
|
0
|
|
|
|
|
if ( !@_ ) { |
825
|
0
|
0
|
0
|
|
|
|
@_ = ( 'file', $self->{'filename'}, $self->{'file_recv_from'} || '0', $self->{'file_recv_to'} || '-1' ) |
|
|
|
0
|
|
|
|
|
826
|
|
|
|
|
|
|
if $self->{'filename'}; |
827
|
0
|
0
|
|
|
|
|
$self->log( 'err', "Nothing to get" ), return unless @_; |
828
|
|
|
|
|
|
|
} |
829
|
0
|
|
|
|
|
|
$self->cmd_adc( $dst, 'GET', @_ ); |
830
|
|
|
|
|
|
|
}, |
831
|
|
|
|
|
|
|
'stat_hub' => sub { |
832
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
833
|
0
|
|
|
|
|
|
local %_; |
834
|
0
|
|
|
|
|
|
for my $w (qw(SS SF)) { |
835
|
|
|
|
|
|
|
#$self->log( 'dev', 'calc', $_, $w), |
836
|
0
|
0
|
|
|
|
|
$_{$w} += $self->{'peers'}{$_}{INF}{$w} for grep { $_ and $_ ne $self->{'INF'}{'SID'} } keys %{ $self->{'peers_sid'} }; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
837
|
|
|
|
|
|
|
} |
838
|
0
|
|
|
|
|
|
$_{UC} = keys %{ $self->{'peers'} }; |
|
0
|
|
|
|
|
|
|
839
|
0
|
|
|
|
|
|
return \%_; |
840
|
|
|
|
|
|
|
}, |
841
|
0
|
|
|
|
|
|
}; |
842
|
|
|
|
|
|
|
|
843
|
|
|
|
|
|
|
=auto |
844
|
|
|
|
|
|
|
'CTM' => sub { |
845
|
|
|
|
|
|
|
my $self = shift if ref $_[0]; |
846
|
|
|
|
|
|
|
my $dst = shift; |
847
|
|
|
|
|
|
|
#$self->sendcmd( $dst, 'CTM', $self->{'protocol_connect'},@_); |
848
|
|
|
|
|
|
|
$self->cmd_adc( $dst, 'CTM', @_ ); |
849
|
|
|
|
|
|
|
}, |
850
|
|
|
|
|
|
|
'RCM' => sub { |
851
|
|
|
|
|
|
|
my $self = shift if ref $_[0]; |
852
|
|
|
|
|
|
|
my $dst = shift; |
853
|
|
|
|
|
|
|
#$self->sendcmd( $dst, 'CTM', $self->{'protocol_connect'},@_); |
854
|
|
|
|
|
|
|
$self->cmd_adc( $dst, 'RCM', @_ ); |
855
|
|
|
|
|
|
|
}, |
856
|
|
|
|
|
|
|
'SND' => sub { |
857
|
|
|
|
|
|
|
my $self = shift if ref $_[0]; |
858
|
|
|
|
|
|
|
my $dst = shift; |
859
|
|
|
|
|
|
|
#$self->sendcmd( $dst, 'CTM', $self->{'protocol_connect'},@_); |
860
|
|
|
|
|
|
|
$self->cmd_adc( $dst, 'SND', @_ ); |
861
|
|
|
|
|
|
|
}, |
862
|
|
|
|
|
|
|
=cut |
863
|
|
|
|
|
|
|
|
864
|
|
|
|
|
|
|
#$self->log( 'dev', "0making listeners [$self->{'M'}]:$self->{'no_listen'}; auto=$self->{'auto_listen'}" ); |
865
|
0
|
0
|
|
|
|
|
if ( !$self->{'no_listen'} ) { |
866
|
|
|
|
|
|
|
#$self->log( 'dev', 'nyportgen',"$self->{'M'} eq 'A' or !$self->{'M'} ) and !$self->{'auto_listen'} and !$self->{'incoming'}" ); |
867
|
0
|
0
|
0
|
|
|
|
if ( |
868
|
|
|
|
|
|
|
#( $self->{'M'} eq 'A' or !$self->{'M'} ) and |
869
|
|
|
|
|
|
|
!$self->{'incoming'} and !$self->{'auto_listen'} |
870
|
|
|
|
|
|
|
) |
871
|
|
|
|
|
|
|
{ |
872
|
|
|
|
|
|
|
#$self->log( 'dev', __FILE__, __LINE__, " myptr", $self->{'auto_listen'}, $self->{broadcast}); |
873
|
|
|
|
|
|
|
#if ( |
874
|
|
|
|
|
|
|
#!$self->{'auto_listen'} or #$self->{'Proto'} ne 'tcp' |
875
|
|
|
|
|
|
|
#$self->{broadcast} |
876
|
|
|
|
|
|
|
# 1 |
877
|
|
|
|
|
|
|
# ) |
878
|
|
|
|
|
|
|
#{ |
879
|
|
|
|
|
|
|
#$self->log( 'dev', __FILE__, __LINE__, " myptr"); |
880
|
0
|
|
|
|
|
|
$self->log( 'dev', "making listeners: tcp; class=", $self->{'incomingclass'} ); |
881
|
0
|
|
|
|
|
|
$self->{'clients'}{'listener_tcp'} = $self->{'incomingclass'}->new( |
882
|
|
|
|
|
|
|
'parent' => $self, |
883
|
|
|
|
|
|
|
'protocol' => 'adc', |
884
|
|
|
|
|
|
|
'auto_listen' => 1, |
885
|
|
|
|
|
|
|
); |
886
|
|
|
|
|
|
|
#$self->log( 'dev', __FILE__, __LINE__, " myptr"); |
887
|
0
|
|
|
|
|
|
$self->{'myport'} = $self->{'myport_tcp'} = $self->{'clients'}{'listener_tcp'}{'myport'}; |
888
|
0
|
0
|
|
|
|
|
$self->log( 'err', "cant listen tcp (file transfers)" ) unless $self->{'myport_tcp'}; |
889
|
|
|
|
|
|
|
#} |
890
|
|
|
|
|
|
|
#if ( |
891
|
|
|
|
|
|
|
# !$self->{'auto_listen'} |
892
|
|
|
|
|
|
|
#and $self->{'Proto'} ne 'udp' |
893
|
|
|
|
|
|
|
# ) |
894
|
|
|
|
|
|
|
#{ |
895
|
0
|
|
|
|
|
|
$self->log( 'dev', "making listeners: udp ($self->{'auto_listen'})" ); |
896
|
0
|
|
|
|
|
|
$self->{'clients'}{'listener_udp'} = $self->{'incomingclass'}->new( |
897
|
|
|
|
|
|
|
'parent' => $self, |
898
|
|
|
|
|
|
|
'Proto' => 'udp', |
899
|
|
|
|
|
|
|
'protocol' => 'adc', |
900
|
|
|
|
|
|
|
'auto_listen' => 1, |
901
|
|
|
|
|
|
|
#$self->{'clients'}{''} = $self->{'incomingclass'}->new( %$self, $self->clear(), |
902
|
|
|
|
|
|
|
#'LocalPort'=>$self->{'myport'}, |
903
|
|
|
|
|
|
|
#'debug'=>1, |
904
|
|
|
|
|
|
|
#'nonblocking' => 0, |
905
|
|
|
|
|
|
|
#'NONONOparse' => { |
906
|
|
|
|
|
|
|
#'SR' => $self->{'parse'}{'SR'}, |
907
|
|
|
|
|
|
|
#'PSR' => sub { #U |
908
|
|
|
|
|
|
|
# #$self->log( 'dev', "UPSR", @_ ); |
909
|
|
|
|
|
|
|
#}, |
910
|
|
|
|
|
|
|
#2008/12/14-13:30:50 [3] rcv: welcome UPSR FQ2DNFEXG72IK6IXALNSMBAGJ5JAYOQXJGCUZ4A NIsss2911 HI81.9.63.68:4111 U40 TRZ34KN23JX2BQC2USOTJLGZNEWGDFB327RRU3VUQ PC4 PI0,64,92,94,100,128,132,135 RI64,65,66,67,68,68,69,70,71,72 |
911
|
|
|
|
|
|
|
#UPSR CDARCZ6URO4RAZKK6NDFTVYUQNLMFHS6YAR3RKQ NIAspid HI81.9.63.68:411 U40 TRQ6SHQECTUXWJG5ZHG3L322N5B2IV7YN2FG4YXFI PC2 PI15,17,20,128 RI128,129,130,131 |
912
|
|
|
|
|
|
|
#$SR [Predator]Wolf DC++\Btyan Adams - Please Forgive Me.mp314217310 18/20TTH:G7DXSTGPHTXSD2ZZFQEUBWI7PORILSKD4EENOII (81.9.63.68:4111) |
913
|
|
|
|
|
|
|
#2008/12/14-13:30:50 welcome UPSR FQ2DNFEXG72IK6IXALNSMBAGJ5JAYOQXJGCUZ4A NIsss2911 HI81.9.63.68:4111 U40 TRZ34KN23JX2BQC2USOTJLGZNEWGDFB327RRU3VUQ PC4 PI0,64,92,94,100,128,132,135 RI64,65,66,67,68,68,69,70,71,72 |
914
|
|
|
|
|
|
|
#UPSR CDARCZ6URO4RAZKK6NDFTVYUQNLMFHS6YAR3RKQ NIAspid HI81.9.63.68:411 U40 TRQ6SHQECTUXWJG5ZHG3L322N5B2IV7YN2FG4YXFI PC2 PI15,17,20,128 RI128,129,130,131 |
915
|
|
|
|
|
|
|
#$SR [Predator]Wolf DC++\Btyan Adams - Please Forgive Me.mp314217310 18/20TTH:G7DXSTGPHTXSD2ZZFQEUBWI7PORILSKD4EENOII (81.9.63.68:4111) |
916
|
|
|
|
|
|
|
#}, |
917
|
|
|
|
|
|
|
); |
918
|
0
|
|
|
|
|
|
$self->{'myport_udp'} = $self->{'clients'}{'listener_udp'}{'myport'}; |
919
|
|
|
|
|
|
|
#$self->log( 'dev', 'nyportgen', $self->{'myport_udp'} ); |
920
|
0
|
0
|
|
|
|
|
$self->log( 'err', "cant listen udp (search repiles)" ) unless $self->{'myport_udp'}; |
921
|
|
|
|
|
|
|
#} |
922
|
0
|
0
|
|
|
|
|
if ( |
923
|
|
|
|
|
|
|
#!$self->{'auto_listen'} and |
924
|
|
|
|
|
|
|
$self->{'dev_sctp'} |
925
|
|
|
|
|
|
|
) |
926
|
|
|
|
|
|
|
{ |
927
|
0
|
|
|
|
|
|
$self->log( 'dev', "making listeners: sctp", "h=$self->{'hub'}" ); |
928
|
0
|
|
|
|
|
|
$self->{'clients'}{'listener_sctp'} = $self->{'incomingclass'}->new( |
929
|
|
|
|
|
|
|
'parent' => $self, |
930
|
|
|
|
|
|
|
'Proto' => 'sctp', |
931
|
|
|
|
|
|
|
'protocol' => 'adc', |
932
|
|
|
|
|
|
|
'auto_listen' => 1, |
933
|
|
|
|
|
|
|
); |
934
|
0
|
|
|
|
|
|
$self->{'myport_sctp'} = $self->{'clients'}{'listener_sctp'}{'myport'}; |
935
|
|
|
|
|
|
|
#$self->log( 'dev', 'nyportgen', $self->{'myport_sctp'} ); |
936
|
0
|
0
|
|
|
|
|
$self->log( 'err', "cant listen sctp" ) unless $self->{'myport_sctp'}; |
937
|
|
|
|
|
|
|
} |
938
|
|
|
|
|
|
|
} |
939
|
|
|
|
|
|
|
#DEV=z |
940
|
|
|
|
|
|
|
|
941
|
|
|
|
|
|
|
=no |
942
|
|
|
|
|
|
|
if ( $self->{'dev_broadcast'} ) { |
943
|
|
|
|
|
|
|
$self->log( 'info', 'listening broadcast ', $self->{'dev_broadcast'} || $self->{'port'}); |
944
|
|
|
|
|
|
|
$self->{'clients'}{'listener_udp_broadcast'} = $self->{'incomingclass'}->new( |
945
|
|
|
|
|
|
|
#%$self, $self->clear(), |
946
|
|
|
|
|
|
|
'parent' => $self, 'Proto' => 'udp', 'auto_listen' => 1, |
947
|
|
|
|
|
|
|
'sockopts' => {%{$self->{'sockopts'}||{}}, 'Broadcast'=>1}, |
948
|
|
|
|
|
|
|
myport => $self->{'dev_broadcast'} || $self->{'port'}, |
949
|
|
|
|
|
|
|
); |
950
|
|
|
|
|
|
|
$self->log( 'err', "cant listen broadcast (hubless)" ) unless $self->{'clients'}{'listener_udp_broadcast'}{'myport'}; |
951
|
|
|
|
|
|
|
} |
952
|
|
|
|
|
|
|
=cut |
953
|
|
|
|
|
|
|
|
954
|
0
|
0
|
|
|
|
|
if ( $self->{'dev_http'} ) { |
955
|
0
|
|
|
|
|
|
$self->log( 'dev', "making listeners: http" ); |
956
|
|
|
|
|
|
|
#$self->{'clients'}{'listener_http'} = Net::DirectConnect::http->new( |
957
|
0
|
|
0
|
|
|
|
$self->{'clients'}{'listener_http'} = Net::DirectConnect->new( |
|
|
|
0
|
|
|
|
|
958
|
|
|
|
|
|
|
#%$self, $self->clear(), |
959
|
|
|
|
|
|
|
#'want' => \%{ $self->{'want'} }, |
960
|
|
|
|
|
|
|
#'NickList' => \%{ $self->{'NickList'} }, |
961
|
|
|
|
|
|
|
#'IpList' => \%{ $self->{'IpList'} }, |
962
|
|
|
|
|
|
|
## 'PortList' => \%{ $self->{'PortList'} }, |
963
|
|
|
|
|
|
|
#'handler' => \%{ $self->{'handler'} }, |
964
|
|
|
|
|
|
|
#$self->{'clients'}{''} = $self->{'incomingclass'}->new( %$self, $self->clear(), |
965
|
|
|
|
|
|
|
#'LocalPort'=>$self->{'myport'}, |
966
|
|
|
|
|
|
|
#'debug'=>1, |
967
|
|
|
|
|
|
|
#@_, |
968
|
|
|
|
|
|
|
'incomingclass' => 'Net::DirectConnect::http', |
969
|
|
|
|
|
|
|
'auto_connect' => 0, |
970
|
|
|
|
|
|
|
'auto_listen' => 1, |
971
|
|
|
|
|
|
|
'protocol' => 'http', |
972
|
|
|
|
|
|
|
#'auto_listen' => 1, |
973
|
|
|
|
|
|
|
#'HubName' => 'Net::DirectConnect test hub', |
974
|
|
|
|
|
|
|
#'myport' => 80, |
975
|
|
|
|
|
|
|
'myport' => Net::DirectConnect::notone( $self->{'dev_http'} ) || 8000, |
976
|
|
|
|
|
|
|
'myport_base' => Net::DirectConnect::notone( $self->{'dev_http'} ) || 8000, |
977
|
|
|
|
|
|
|
'myport_random' => 99, |
978
|
|
|
|
|
|
|
'myport_tries' => 5, |
979
|
|
|
|
|
|
|
'parent' => $self, |
980
|
|
|
|
|
|
|
#'allow' => ( $self->{http_allow} || '127.0.0.1' ), |
981
|
|
|
|
|
|
|
#'auto_listen' => 0, |
982
|
|
|
|
|
|
|
); |
983
|
0
|
|
|
|
|
|
$self->{'myport_http'} = $self->{'clients'}{'listener_http'}{'myport'}; |
984
|
0
|
0
|
|
|
|
|
$self->log( 'err', "cant listen http" ) unless $self->{'myport_http'}; |
985
|
|
|
|
|
|
|
} |
986
|
0
|
0
|
0
|
|
|
|
if ( $self->{'hub'} and $self->{'dev_sctp'} ) { |
987
|
0
|
|
|
|
|
|
$self->log( 'dev', "making listeners: fallback tcp; $self->{'incomingclass'}" ); |
988
|
0
|
|
|
|
|
|
$self->{'clients'}{'listener_tcp'} = $self->{'incomingclass'}->new( |
989
|
|
|
|
|
|
|
'parent' => $self, |
990
|
|
|
|
|
|
|
'Proto' => 'tcp', |
991
|
0
|
|
|
|
|
|
( map { $_ => $self->{$_} } qw(myport hub) ), |
992
|
|
|
|
|
|
|
'auto_listen' => 1, |
993
|
|
|
|
|
|
|
); |
994
|
0
|
|
|
|
|
|
$self->{'myport_tcp'} = $self->{'clients'}{'listener_tcp'}{'myport'}; |
995
|
|
|
|
|
|
|
#$self->log( 'dev', 'nyportgen_tcp', $self->{'myport_tcp'} ); |
996
|
0
|
0
|
|
|
|
|
$self->log( 'err', "cant listen tcp" ) unless $self->{'myport_tcp'}; |
997
|
|
|
|
|
|
|
} |
998
|
|
|
|
|
|
|
} |
999
|
|
|
|
|
|
|
#=cut |
1000
|
|
|
|
|
|
|
$self->{'handler_int'}{'disconnect_aft'} = sub { |
1001
|
0
|
0
|
|
0
|
|
|
my $self = shift if ref $_[0]; |
1002
|
0
|
|
|
|
|
|
my $peerid = $self->{'peerid'}; |
1003
|
|
|
|
|
|
|
#$self->log('dev', 'adc disconnecting', $peerid); |
1004
|
0
|
|
|
|
|
|
delete $self->{'peers_cid'}{ $self->{'peers'}{$peerid}{'INF'}{'ID'} }; |
1005
|
0
|
|
|
|
|
|
delete $self->{'peers_sid'}{$peerid}; |
1006
|
0
|
|
|
|
|
|
delete $self->{'peers'}{ $self->{'peers'}{$peerid}{'INF'}{'ID'} }; |
1007
|
0
|
|
|
|
|
|
delete $self->{'peers'}{$peerid}; |
1008
|
0
|
0
|
0
|
|
|
|
$self->cmd_all( 'I', 'QUI', $self->{'peerid'}, ) if $self->{'parent'}{'hub'} and $self->{'peerid'}; |
1009
|
0
|
0
|
|
|
|
|
delete $self->{'INF'}{'SID'} unless $self->{'parent'}; |
1010
|
|
|
|
|
|
|
#$self->log( |
1011
|
|
|
|
|
|
|
# 'dev', 'disconnect int', #psmisc::caller_trace(30) |
1012
|
|
|
|
|
|
|
# 'hub=', $self->{'parent'}{'hub'}, |
1013
|
|
|
|
|
|
|
#); #if $self and $self->{'log'}; |
1014
|
|
|
|
|
|
|
#psmisc::caller_trace 15; |
1015
|
0
|
|
|
|
|
|
}; |
1016
|
0
|
0
|
|
|
|
|
$self->get_peer_addr() if $self->{'socket'}; |
1017
|
|
|
|
|
|
|
#$self->log( 'err', 'cant load TigerHash module' ) if !$INC{'Net/DirectConnect/TigerHash.pm'} and !our $tigerhashreported++; |
1018
|
0
|
0
|
|
|
|
|
$self->accept_aft() if $self->{'incoming'}; |
1019
|
0
|
|
|
|
|
|
return $self; |
1020
|
|
|
|
|
|
|
} |
1021
|
|
|
|
|
|
|
1; |