Projet

Général

Profil

Révision 38868600

ID3886860089d9d746627f10c94c2157295877d550
Parent 95349797
Enfant bf2eff5c

Ajouté par Younes Ichiche il y a plus de 5 ans

loop over every socket/port to get the version and use it afterwards as cache

Voir les différences:

plugins/rtorrent/rtom_allsessions_peers
75 75

  
76 76
# detect rtorrent version
77 77
use version;
78
my $rtorrent_version;
78
my %rtorrent_version;
79
sub get_socket_version {
80
	my $version;
81
	my $line_version= "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>system.client_version</methodName></methodCall>";
82
	my $llen	= length $line_version;
83
	my $header	= "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
84
	my $hlen	= length $header;
85
	$line_version= "${hlen}:${header},${line_version}";
86
	print SOCK $line_version;
87
	flush SOCK;
88
	my $pattern	= qr/<value><string>([0-9.]+)<\/string><\/value>/;
89
	while ( $line = <SOCK> ) {
90
		if ( $line =~ /$pattern/ ) {
91
			$version = $1;
92
		}
93
	}
94
	close (SOCK);
95
	$rtorrent_version{$_[0]} = $version;
96
}
79 97
sub rtorrent_version_lower_than {
80
	if (not length $rtorrent_version){
98
	if (keys %rtorrent_version == 0 && not defined $_[0]){
81 99
		if ( ( defined $src ) && ( $src eq "socket" ) ) {
82
			socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die;
83
			connect( SOCK, sockaddr_un( $socket ) ) or die $!;
100
		  for $socket (@sockets)
101
		  {
102
		    socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die;
103
		    connect( SOCK, sockaddr_un( $socket ) ) or die $!;
104
		    get_socket_version $port;
105
		    close (SOCK);
106
		  }
84 107
		} else {
85
			socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) );
86
			connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) );
108
		  for $port (@ports)
109
		  {
110
		    socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) );
111
		    connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) );
112
		    get_socket_version $port;
113
		    close (SOCK);
114
		  }
87 115
		}
88
		my $line_version= "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>system.client_version</methodName></methodCall>";
89
		my $llen	= length $line_version;
90
		my $header	= "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
91
		my $hlen	= length $header;
92
		$line_version= "${hlen}:${header},${line_version}";
93
		print SOCK $line_version;
94
		flush SOCK;
95
		my $pattern	= qr/<value><string>([0-9.]+)<\/string><\/value>/;
96
		while ( $line = <SOCK> ) {
97
			if ( $line =~ /$pattern/ ) {
98
				$rtorrent_version = $1;
99
			}
100
		}
101
		close (SOCK);
102 116
	}
103
	return version->parse($rtorrent_version) < version->parse($_[0]);
117
	if(defined $_[1]){
118
		return version->parse($rtorrent_version{$_[0]}) < version->parse($_[1]);
119
	}
104 120
}
105

  
121
# init rtorrent_version
122
rtorrent_version_lower_than();
106 123

  
107 124
my $pattern  = qr/<value><(int|i4|i8|ex\.i8)>(\d+)<\/(int|i4|i8|ex\.i8)><\/value>/;
108 125
my $tpattern  = qr/[0-9A-F]{20}/;
109

  
110
my $function_multicall	= rtorrent_version_lower_than('0.9.0') ? 'd.multicall' : 'd.multicall2';
111
my $function_hash	= rtorrent_version_lower_than('0.9.0') ? 'd.get_hash=' : 'd.hash=';
112
my $line		= "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>$function_multicall</methodName><params><param><value><string>main</string></value></param><param><value><string>$function_hash</string></value></param><param><value><string>p.multicall=,p.is_encrypted=,p.is_incoming=</string></value></param></params></methodCall>";
113
my $llen  = length $line;
114
my $header  = "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
115
my $hlen  = length $header;
126
sub construct_line {
127
	my $function_multicall	= rtorrent_version_lower_than($_[0], '0.9.0') ? 'd.multicall' : 'd.multicall2';
128
	my $function_hash	= rtorrent_version_lower_than($_[0], '0.9.0') ? 'd.get_hash=' : 'd.hash=';
129
	my $line		= "<?xml version=\"1.0\" encoding=\"utf-8\"?><methodCall><methodName>$function_multicall</methodName><params><param><value><string>main</string></value></param><param><value><string>$function_hash</string></value></param><param><value><string>p.multicall=,p.is_encrypted=,p.is_incoming=</string></value></param></params></methodCall>";
130
	my $llen  = length $line;
131
	my $header  = "CONTENT_LENGTH\000${llen}\000SCGI\001\000";
132
	my $hlen  = length $header;
133
	$line = "${hlen}:${header},${line}";
134
	return $line;
135
}
116 136

  
117 137
my $tor = 0;
118 138
my $tot = 0;
......
123 143
my $out = 0;
124 144
my $pla = 0;
125 145

  
126

  
127 146
if ( ( defined $src ) && ( $src eq "socket" ) ) {
128 147
  for $socket (@sockets)
129 148
  {
130 149
    socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die;
131 150
    connect( SOCK, sockaddr_un( $socket ) ) or die $!;
132
    my $line = "${hlen}:${header},${line}";
133
    print SOCK $line;
151
    print SOCK construct_line($socket);
134 152
    flush SOCK;
135 153
    while ( $line = <SOCK> ) {
136 154
      if ( $line =~ /$tpattern/ ) {
......
154 172
  {
155 173
    socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) );
156 174
    connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) );
157
    my $line = "${hlen}:${header},${line}";
158
    print SOCK $line;
175
    print SOCK construct_line($port);
159 176
    flush SOCK;
160 177
    while ( $line = <SOCK> ) {
161 178
      if ( $line =~ /$tpattern/ ) {

Formats disponibles : Unified diff