From 54ad1ad4d560f802e7c3cbec1eac74358f0c126a Mon Sep 17 00:00:00 2001 From: Younes Ichiche Date: Tue, 31 Mar 2020 21:24:50 +0200 Subject: [PATCH] discovering the version of rtorrent, and depending on that, using the correct functions in the xmlrpc call --- plugins/rtorrent/rtom_allsessions_mem | 41 ++++++++++++++++----- plugins/rtorrent/rtom_allsessions_peers | 43 +++++++++++++++++----- plugins/rtorrent/rtom_allsessions_spdd | 43 +++++++++++++++++----- plugins/rtorrent/rtom_allsessions_vol | 47 +++++++++++++++++++------ plugins/rtorrent/rtom_mem | 39 +++++++++++++++----- plugins/rtorrent/rtom_peers | 41 ++++++++++++++++----- plugins/rtorrent/rtom_spdd | 42 +++++++++++++++++----- plugins/rtorrent/rtom_vol | 44 +++++++++++++++++++---- 8 files changed, 272 insertions(+), 68 deletions(-) diff --git a/plugins/rtorrent/rtom_allsessions_mem b/plugins/rtorrent/rtom_allsessions_mem index 82c6dcd4..0e63c4db 100755 --- a/plugins/rtorrent/rtom_allsessions_mem +++ b/plugins/rtorrent/rtom_allsessions_mem @@ -27,7 +27,6 @@ # ip rTorrent's ip address - using scgi_port - needed, when "src" is NOT set to "socket" # port rTorrent's scgi port (scgi_port) - using scgi_port - needed, when "src" is NOT set to "socket" # category Change graph category -# api use "pre09" (pre 0.9.0) or "current" (0.9.0+, the default) API calls # # Configuration example # @@ -36,7 +35,6 @@ # env.src socket # env.socket /home/user/torrent/.socket/rpc.socket,/home/user/torrent/.socket/rpc.socket # env.category Category -# env.api current # # [rtom_allsessions_*] # user username @@ -64,16 +62,41 @@ my $src = $ENV{"src"} || ""; my @sockets = split /,/, $ENV{"socket"} || ""; my $ip = $ENV{"ip"} || "127.0.0.1"; my @ports = split /,/, $ENV{"port"} || ""; -my $api = $ENV{"api"} || "current"; + +# detect rtorrent version +use version; +my $rtorrent_version; +sub rtorrent_version_lower_than { + if (not length $rtorrent_version){ + if ( ( defined $src ) && ( $src eq "socket" ) ) { + socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; + connect( SOCK, sockaddr_un( $socket ) ) or die $!; + } else { + socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); + connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); + } + my $line_version= "system.client_version"; + my $llen = length $line_version; + my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; + my $hlen = length $header; + $line_version= "${hlen}:${header},${line_version}"; + print SOCK $line_version; + flush SOCK; + my $pattern = qr/([0-9.]+)<\/string><\/value>/; + while ( $line = ) { + if ( $line =~ /$pattern/ ) { + $rtorrent_version = $1; + } + } + close (SOCK); + } + return version->parse($rtorrent_version) < version->parse($_[0]); +} my $mem = 0; my $pattern = qr/<(int|i4|i8|ex\.i8)>(\d+)<\/(int|i4|i8|ex\.i8)><\/value>/; -my $line = ""; -if ($api =~ /pre09/) { - $line = "get_memory_usage"; -} else { - $line = "pieces.memory.current"; -} +my $function = rtorrent_version_lower_than('0.9.0') ? 'get_memory_usage' : 'pieces.memory.current'; +my $line = "$function"; my $llen = length $line; my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; my $hlen = length $header; diff --git a/plugins/rtorrent/rtom_allsessions_peers b/plugins/rtorrent/rtom_allsessions_peers index 93a06a38..115b0e93 100755 --- a/plugins/rtorrent/rtom_allsessions_peers +++ b/plugins/rtorrent/rtom_allsessions_peers @@ -25,7 +25,6 @@ # src "socket" when using scgi_socket, or anything else when using scgi_port # socket rTorrent's rpc socket (scgi_local) - using scgi_local - needed, when "src" is set to "socket" # category Change graph category -# api use "pre09" (pre 0.9.0) or "current" (0.9.0+, the default) API calls # # Configuration example # @@ -34,7 +33,6 @@ # env.src socket # env.socket /home/user/torrent/.socket/rpc.socket,/home/user/torrent/.socket/rpc.socket # env.category Category -# env.api current # # [rtom_allsessions_*] # user username @@ -74,17 +72,44 @@ my $src = $ENV{"src"} || ""; my @sockets = split /,/, $ENV{"socket"} || ""; my $ip = $ENV{"ip"} || "127.0.0.1"; my @ports = split /,/, $ENV{"port"} || ""; -my $api = $ENV{"api"} || "current"; + +# detect rtorrent version +use version; +my $rtorrent_version; +sub rtorrent_version_lower_than { + if (not length $rtorrent_version){ + if ( ( defined $src ) && ( $src eq "socket" ) ) { + socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; + connect( SOCK, sockaddr_un( $socket ) ) or die $!; + } else { + socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); + connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); + } + my $line_version= "system.client_version"; + my $llen = length $line_version; + my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; + my $hlen = length $header; + $line_version= "${hlen}:${header},${line_version}"; + print SOCK $line_version; + flush SOCK; + my $pattern = qr/([0-9.]+)<\/string><\/value>/; + while ( $line = ) { + if ( $line =~ /$pattern/ ) { + $rtorrent_version = $1; + } + } + close (SOCK); + } + return version->parse($rtorrent_version) < version->parse($_[0]); +} + my $pattern = qr/<(int|i4|i8|ex\.i8)>(\d+)<\/(int|i4|i8|ex\.i8)><\/value>/; my $tpattern = qr/[0-9A-F]{20}/; -my $line = ""; -if ($api =~ /pre09/) { - $line = "d.multicallmaind.get_hash=p.multicall=,p.is_encrypted=,p.is_incoming="; -} else { - $line = "d.multicall2maind.hash=p.multicall=,p.is_encrypted=,p.is_incoming="; -} +my $function_multicall = rtorrent_version_lower_than('0.9.0') ? 'd.multicall' : 'd.multicall2'; +my $function_hash = rtorrent_version_lower_than('0.9.0') ? 'd.get_hash=' : 'd.hash='; +my $line = "$function_multicallmain$function_hashp.multicall=,p.is_encrypted=,p.is_incoming="; my $llen = length $line; my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; my $hlen = length $header; diff --git a/plugins/rtorrent/rtom_allsessions_spdd b/plugins/rtorrent/rtom_allsessions_spdd index cf893cb5..70bc1f96 100755 --- a/plugins/rtorrent/rtom_allsessions_spdd +++ b/plugins/rtorrent/rtom_allsessions_spdd @@ -36,7 +36,6 @@ # src "socket" when using scgi_socket, or anything else when using scgi_port # socket rTorrent's rpc socket (scgi_local) - using scgi_local - needed, when "src" is set to "socket" # diff "yes" for using bps for upload and Bps for download, or anything else for using Bps for both -# api use "pre09" (pre 0.9.0) or "current" (0.9.0+, the default) API calls # # # Configuration example @@ -46,7 +45,6 @@ # env.src socket # env.socket /home/user/torrent/.socket/rpc.socket,/home/user/torrent/.socket/rpc.socket # env.category Category -# env.api pre09 # # [rtom_allsessions_*] # user username @@ -88,15 +86,42 @@ my $src = $ENV{"src"} || ""; my @sockets = split /,/, $ENV{"socket"} || ""; my $ip = $ENV{"ip"} || "127.0.0.1"; my @ports = split /,/, $ENV{"port"} || ""; -my $api = $ENV{"api"} || "current"; -my $pattern = qr/<(int|i4|i8|ex\.i8)>([-]{0,1}\d+)<\/(int|i4|i8|ex\.i8)><\/value>/; -my $line = ""; -if ($api =~ /pre09/) { - $line = "system.multicallmethodNameget_up_totalparamsmethodNameget_down_totalparamsmethodNameget_upload_rateparamsmethodNameget_download_rateparams"; -} else { - $line = "system.multicallmethodNamethrottle.global_up.totalparamsmethodNamethrottle.global_down.totalparamsmethodNamethrottle.global_up.max_rateparamsmethodNamethrottle.global_down.max_rateparams"; +# detect rtorrent version +use version; +my $rtorrent_version; +sub rtorrent_version_lower_than { + if (not length $rtorrent_version){ + if ( ( defined $src ) && ( $src eq "socket" ) ) { + socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; + connect( SOCK, sockaddr_un( $socket ) ) or die $!; + } else { + socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); + connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); + } + my $line_version= "system.client_version"; + my $llen = length $line_version; + my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; + my $hlen = length $header; + $line_version= "${hlen}:${header},${line_version}"; + print SOCK $line_version; + flush SOCK; + my $pattern = qr/([0-9.]+)<\/string><\/value>/; + while ( $line = ) { + if ( $line =~ /$pattern/ ) { + $rtorrent_version = $1; + } + } + close (SOCK); + } + return version->parse($rtorrent_version) < version->parse($_[0]); } +my $pattern = qr/<(int|i4|i8|ex\.i8)>([-]{0,1}\d+)<\/(int|i4|i8|ex\.i8)><\/value>/; +my $function_totalup = rtorrent_version_lower_than('0.9.0') ? 'get_up_total' : 'throttle.global_up.total'; +my $function_totaldown = rtorrent_version_lower_than('0.9.0') ? 'get_down_total' : 'throttle.global_down.total'; +my $function_rateup = rtorrent_version_lower_than('0.9.0') ? 'get_upload_rate' : 'throttle.global_up.max_rate'; +my $function_ratedown = rtorrent_version_lower_than('0.9.0') ? 'get_download_rate' : 'throttle.global_down.max_rate'; +my $line = "system.multicallmethodName$function_totalupparamsmethodName$function_totaldownparamsmethodName$function_rateupparamsmethodName$function_ratedownparams"; my $llen = length $line; my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; diff --git a/plugins/rtorrent/rtom_allsessions_vol b/plugins/rtorrent/rtom_allsessions_vol index ed483e66..d067fde7 100755 --- a/plugins/rtorrent/rtom_allsessions_vol +++ b/plugins/rtorrent/rtom_allsessions_vol @@ -25,7 +25,6 @@ # src "socket" when using scgi_socket, or anything else when using scgi_port # socket rTorrent's rpc socket (scgi_local) - using scgi_local - needed, when "src" is set to "socket" # category Change graph category -# api use "pre09" (pre 0.9.0) or "current" (0.9.0+, the default) API calls # # Configuration example # @@ -34,13 +33,11 @@ # env.src socket # env.socket /home/user/torrent/.socket/rpc.socket,/home/user/torrent/.socket/rpc.socket # env.category Category -# env.api current # # [rtom_allsessions_*] # user username # env.port 5000,5001,5002,5003 # env.category Category -# env.api pre09 # #%# family=auto @@ -79,18 +76,48 @@ my $src = $ENV{"src"} || ""; my @sockets = split /,/, $ENV{"socket"} || ""; my $ip = $ENV{"ip"} || "127.0.0.1"; my @ports = split /,/, $ENV{"port"} || ""; -my $api = $ENV{"api"} || "current"; + +# detect rtorrent version +use version; +my $rtorrent_version; +sub rtorrent_version_lower_than { + if (not length $rtorrent_version){ + if ( ( defined $src ) && ( $src eq "socket" ) ) { + socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; + connect( SOCK, sockaddr_un( $socket ) ) or die $!; + } else { + socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); + connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); + } + my $line_version= "system.client_version"; + my $llen = length $line_version; + my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; + my $hlen = length $header; + $line_version= "${hlen}:${header},${line_version}"; + print SOCK $line_version; + flush SOCK; + my $pattern = qr/([0-9.]+)<\/string><\/value>/; + while ( $line = ) { + if ( $line =~ /$pattern/ ) { + $rtorrent_version = $1; + } + } + close (SOCK); + } + return version->parse($rtorrent_version) < version->parse($_[0]); +} + my $pattern = qr/([A-Z0-9]+)<\/string><\/value>/; +my $function_multicall; +my $function_hash; + foreach ( @views ) { my $num = 0; - my $line = ""; - if ($api =~ /pre09/) { - $line = "d.multicall${_}d.get_hash="; - } else { - $line = "d.multicall2${_}d.hash="; - } + $function_multicall = rtorrent_version_lower_than('0.9.0')? 'd.multicall' : 'd.multicall2'; + $function_hash = rtorrent_version_lower_than('0.9.0')? 'd.get_hash=' : 'd.hash='; + $line = "$function_multicall${_}$function_hash"; my $llen = length $line; my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; my $hlen = length $header; diff --git a/plugins/rtorrent/rtom_mem b/plugins/rtorrent/rtom_mem index 13ad209c..63428052 100755 --- a/plugins/rtorrent/rtom_mem +++ b/plugins/rtorrent/rtom_mem @@ -27,7 +27,6 @@ # ip rTorrent's ip address - using scgi_port - needed, when "src" is NOT set to "socket" # port rTorrent's scgi port (scgi_port) - using scgi_port - needed, when "src" is NOT set to "socket" # category Change graph category -# api use "pre09" (pre 0.9.0) or "current" (0.9.0+, the default) API calls # # Configuration example # @@ -64,16 +63,40 @@ my $src = $ENV{"src"} || ""; my $ip = $ENV{"ip"} || "127.0.0.1"; my $port = $ENV{"port"} || "5000"; my $socket = $ENV{"socket"} || ""; -my $api = $ENV{"api"} || "current"; -my $pattern = qr/<(int|i4|i8|ex\.i8)>(\d+)<\/(int|i4|i8|ex\.i8)><\/value>/; -my $line = ""; -if ($api =~ /pre09/) { - $line = "get_memory_usage"; -} else { - $line = "pieces.memory.current"; +# detect rtorrent version +use version; +my $rtorrent_version; +sub rtorrent_version_lower_than { + if (not length $rtorrent_version){ + if ( ( defined $src ) && ( $src eq "socket" ) ) { + socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; + connect( SOCK, sockaddr_un( $socket ) ) or die $!; + } else { + socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); + connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); + } + my $line_version= "system.client_version"; + my $llen = length $line_version; + my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; + my $hlen = length $header; + $line_version= "${hlen}:${header},${line_version}"; + print SOCK $line_version; + flush SOCK; + my $pattern = qr/([0-9.]+)<\/string><\/value>/; + while ( $line = ) { + if ( $line =~ /$pattern/ ) { + $rtorrent_version = $1; + } + } + close (SOCK); + } + return version->parse($rtorrent_version) < version->parse($_[0]); } +my $pattern = qr/<(int|i4|i8|ex\.i8)>(\d+)<\/(int|i4|i8|ex\.i8)><\/value>/; +my $function = rtorrent_version_lower_than('0.9.0') ? 'get_memory_usage' : 'pieces.memory.current'; +my $line = "$function"; my $llen = length $line; my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; my $hlen = length $header; diff --git a/plugins/rtorrent/rtom_peers b/plugins/rtorrent/rtom_peers index b5adab66..0fbfae9e 100755 --- a/plugins/rtorrent/rtom_peers +++ b/plugins/rtorrent/rtom_peers @@ -27,7 +27,6 @@ # ip rTorrent's ip address - using scgi_port - needed, when "src" is NOT set to "socket" # port rTorrent's scgi port (scgi_port) - using scgi_port - needed, when "src" is NOT set to "socket" # category Change graph category -# api use "pre09" (pre 0.9.0) or "current" (0.9.0+, the default) API calls # # Configuration example # @@ -75,17 +74,43 @@ my $src = $ENV{"src"} || ""; my $ip = $ENV{"ip"} || "127.0.0.1"; my $port = $ENV{"port"} || "5000"; my $socket = $ENV{"socket"} || ""; -my $api = $ENV{"api"} || "current"; + +# detect rtorrent version +use version; +my $rtorrent_version; +sub rtorrent_version_lower_than { + if (not length $rtorrent_version){ + if ( ( defined $src ) && ( $src eq "socket" ) ) { + socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; + connect( SOCK, sockaddr_un( $socket ) ) or die $!; + } else { + socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); + connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); + } + my $line_version= "system.client_version"; + my $llen = length $line_version; + my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; + my $hlen = length $header; + $line_version= "${hlen}:${header},${line_version}"; + print SOCK $line_version; + flush SOCK; + my $pattern = qr/([0-9.]+)<\/string><\/value>/; + while ( $line = ) { + if ( $line =~ /$pattern/ ) { + $rtorrent_version = $1; + } + } + close (SOCK); + } + return version->parse($rtorrent_version) < version->parse($_[0]); +} my $pattern = qr/<(int|i4|i8|ex\.i8)>(\d+)<\/(int|i4|i8|ex\.i8)><\/value>/; my $tpattern = qr/[0-9A-F]{20}/; -my $line = ""; -if ($api =~ /pre09/) { - $line = "d.multicallmaind.get_hash=p.multicall=,p.is_encrypted=,p.is_incoming="; -} else { - $line = "d.multicall2maind.hash=p.multicall=,p.is_encrypted=,p.is_incoming="; -} +my $function_multicall = rtorrent_version_lower_than('0.9.0') ? 'd.multicall' : 'd.multicall2'; +my $function_hash = rtorrent_version_lower_than('0.9.0') ? 'd.get_hash=' : 'd.hash='; +my $line = "$function_multicallmain$function_hashp.multicall=,p.is_encrypted=,p.is_incoming="; my $llen = length $line; my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; my $hlen = length $header; diff --git a/plugins/rtorrent/rtom_spdd b/plugins/rtorrent/rtom_spdd index 8a6f24e7..b4476e35 100755 --- a/plugins/rtorrent/rtom_spdd +++ b/plugins/rtorrent/rtom_spdd @@ -39,7 +39,6 @@ # port rTorrent's scgi port (scgi_port) - using scgi_port - needed, when "src" is NOT set to "socket" # category Change graph category # diff "yes" for using bps for upload and Bps for download, or anything else for using Bps for both -# api use "pre09" (pre 0.9.0) or "current" (0.9.0+, the default) API calls # # # Configuration example @@ -103,16 +102,43 @@ my $src = $ENV{"src"} || ""; my $ip = $ENV{"ip"} || "127.0.0.1"; my $port = $ENV{"port"} || "5000"; my $socket = $ENV{"socket"} || ""; -my $api = $ENV{"api"} || "current"; +# detect rtorrent version +use version; +my $rtorrent_version; +sub rtorrent_version_lower_than { + if (not length $rtorrent_version){ + if ( ( defined $src ) && ( $src eq "socket" ) ) { + socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; + connect( SOCK, sockaddr_un( $socket ) ) or die $!; + } else { + socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); + connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); + } + my $line_version= "system.client_version"; + my $llen = length $line_version; + my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; + my $hlen = length $header; + $line_version= "${hlen}:${header},${line_version}"; + print SOCK $line_version; + flush SOCK; + my $pattern = qr/([0-9.]+)<\/string><\/value>/; + while ( $line = ) { + if ( $line =~ /$pattern/ ) { + $rtorrent_version = $1; + } + } + close (SOCK); + } + return version->parse($rtorrent_version) < version->parse($_[0]); +} my $pattern = qr/<(int|i4|i8|ex\.i8)>([-]{0,1}\d+)<\/(int|i4|i8|ex\.i8)><\/value>/; -my $line = ""; -if ($api =~ /pre09/) { - $line = "system.multicallmethodNameget_up_totalparamsmethodNameget_down_totalparamsmethodNameget_upload_rateparamsmethodNameget_download_rateparams"; -} else { - $line = "system.multicallmethodNamethrottle.global_up.totalparamsmethodNamethrottle.global_down.totalparamsmethodNamethrottle.global_up.max_rateparamsmethodNamethrottle.global_down.max_rateparams"; -} +my $function_totalup = rtorrent_version_lower_than('0.9.0') ? 'get_up_total' : 'throttle.global_up.total'; +my $function_totaldown = rtorrent_version_lower_than('0.9.0') ? 'get_down_total' : 'throttle.global_down.total'; +my $function_rateup = rtorrent_version_lower_than('0.9.0') ? 'get_upload_rate' : 'throttle.global_up.max_rate'; +my $function_ratedown = rtorrent_version_lower_than('0.9.0') ? 'get_download_rate' : 'throttle.global_down.max_rate'; +my $line = "system.multicallmethodName$function_totalupparamsmethodName$function_totaldownparamsmethodName$function_rateupparamsmethodName$function_ratedownparams"; my $llen = length $line; my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; diff --git a/plugins/rtorrent/rtom_vol b/plugins/rtorrent/rtom_vol index 4d366751..e121aa39 100755 --- a/plugins/rtorrent/rtom_vol +++ b/plugins/rtorrent/rtom_vol @@ -27,7 +27,6 @@ # ip rTorrent's ip address - using scgi_port - needed, when "src" is NOT set to "socket" # port rTorrent's scgi port (scgi_port) - using scgi_port - needed, when "src" is NOT set to "socket" # category Change graph category -# api use "pre09" (pre 0.9.0) or "current" (0.9.0+, the default) API calls # # Configuration example # @@ -79,7 +78,36 @@ my $src = $ENV{"src"} || ""; my $ip = $ENV{"ip"} || "127.0.0.1"; my $port = $ENV{"port"} || "5000"; my $socket = $ENV{"socket"} || ""; -my $api = $ENV{"api"} || "current"; + +# detect rtorrent version +use version; +my $rtorrent_version; +sub rtorrent_version_lower_than { + if (not length $rtorrent_version){ + if ( ( defined $src ) && ( $src eq "socket" ) ) { + socket( SOCK, PF_UNIX, SOCK_STREAM, 0 ) or die; + connect( SOCK, sockaddr_un( $socket ) ) or die $!; + } else { + socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname( "tcp" ) ); + connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); + } + my $line_version= "system.client_version"; + my $llen = length $line_version; + my $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; + my $hlen = length $header; + $line_version= "${hlen}:${header},${line_version}"; + print SOCK $line_version; + flush SOCK; + my $pattern = qr/([0-9.]+)<\/string><\/value>/; + while ( $line = ) { + if ( $line =~ /$pattern/ ) { + $rtorrent_version = $1; + } + } + close (SOCK); + } + return version->parse($rtorrent_version) < version->parse($_[0]); +} my $pattern = qr/([A-Z0-9]+)<\/string><\/value>/; @@ -88,6 +116,9 @@ my $llenmy; my $header; my $hlen; +my $function_multicall; +my $function_hash; + my $num; foreach ( @views ) { if ( ( defined $src ) && ( $src eq "socket" ) ) { @@ -98,11 +129,10 @@ foreach ( @views ) { connect( SOCK, sockaddr_in( $port, inet_aton( $ip ) ) ); } - if ($api =~ /pre09/) { - $line = "d.multicall${_}d.get_hash="; - } else { - $line = "d.multicall2${_}d.hash="; - } + $function_multicall = rtorrent_version_lower_than('0.9.0')? 'd.multicall' : 'd.multicall2'; + $function_hash = rtorrent_version_lower_than('0.9.0')? 'd.get_hash=' : 'd.hash='; + $line = "$function_multicall${_}$function_hash"; + $llen = length $line; $header = "CONTENT_LENGTH\000${llen}\000SCGI\001\000"; $hlen = length $header;