diff --git a/doc/bash_completion/aria2c b/doc/bash_completion/aria2c index fba97156..4463d97b 100644 --- a/doc/bash_completion/aria2c +++ b/doc/bash_completion/aria2c @@ -78,7 +78,7 @@ _aria2c() esac case $cur in -*) - COMPREPLY=( $( compgen -W '--rpc-save-upload-metadata --rpc-save-upload-metadata=false --on-download-start --metalink-language --rpc-secret --torrent-file --enable-peer-exchange --enable-peer-exchange=false --http-proxy-passwd --bt-tracker-timeout --ftp-type --seed-time --keep-unfinished-download-result --keep-unfinished-download-result=false --bt-tracker-connect-timeout --bt-max-open-files --no-netrc --no-netrc=false --force-sequential --force-sequential=false --metalink-base-uri --private-key --ftp-passwd --allow-overwrite --allow-overwrite=false --rpc-allow-origin-all --rpc-allow-origin-all=false --bt-detach-seed-only --bt-detach-seed-only=false --dht-entry-point6 --summary-interval --lowest-speed-limit --bt-tracker-interval --proxy-method --metalink-preferred-protocol --enable-http-keep-alive --enable-http-keep-alive=false --metalink-version --stderr --stderr=false --bt-lpd-interface --force-save --force-save=false --rpc-secure --rpc-secure=false --listen-port --rpc-private-key --server-stat-of --server-stat-timeout --bt-load-saved-metadata --bt-load-saved-metadata=false --https-proxy-user --piece-length --dry-run --dry-run=false --truncate-console-readout --truncate-console-readout=false --save-not-found --save-not-found=false --async-dns-server --bt-max-peers --max-overall-upload-limit --rpc-user --optimize-concurrent-downloads --optimize-concurrent-downloads=true --optimize-concurrent-downloads=false --optimize-concurrent-downloads=A:B --dir --split --on-download-pause --auto-file-renaming --auto-file-renaming=false --http-proxy --save-session-interval --daemon --daemon=false --https-proxy --min-tls-version --save-cookies --out --rlimit-nofile --max-file-not-found --on-download-stop --certificate --bt-min-crypto-level --remove-control-file --remove-control-file=false --enable-dht --enable-dht=false --file-allocation --follow-metalink --on-bt-download-complete --ftp-proxy --show-files --show-files=false --timeout --bt-hash-check-seed --bt-hash-check-seed=false --ftp-pasv --ftp-pasv=false --check-certificate --check-certificate=false --always-resume --always-resume=false --load-cookies --bt-remove-unselected-file --bt-remove-unselected-file=false --bt-stop-timeout --version --max-concurrent-downloads --quiet --quiet=false --max-download-result --content-disposition-default-utf8 --content-disposition-default-utf8=false --max-resume-failure-tries --header --rpc-listen-all --rpc-listen-all=false --all-proxy-user --server-stat-if --dht-file-path6 --save-session --bt-external-ip --max-tries --conditional-get --conditional-get=false --ftp-reuse-connection --ftp-reuse-connection=false --gid --dscp --max-download-limit --bt-prioritize-piece --check-integrity --check-integrity=false --log-level --remote-time --remote-time=false --uri-selector --rpc-listen-port --index-out --bt-tracker --referer --ssh-host-key-md --console-log-level --connect-timeout --stream-piece-selector --dht-message-timeout --select-file --download-result --disable-ipv6 --disable-ipv6=false --rpc-max-request-size --rpc-passwd --stop-with-process --https-proxy-passwd --continue --continue=false --no-file-allocation-limit --netrc-path --ftp-proxy-user --enable-color --enable-color=false --metalink-location --allow-piece-length-change --allow-piece-length-change=false --max-connection-per-server --no-conf --no-conf=false --rpc-certificate --metalink-os --enable-http-pipelining --enable-http-pipelining=false --http-passwd --user-agent --enable-dht6 --enable-dht6=false --dht-file-path --http-auth-challenge --http-auth-challenge=false --bt-enable-hook-after-hash-check --bt-enable-hook-after-hash-check=false --peer-id-prefix --max-mmap-limit --enable-mmap --enable-mmap=false --use-head --use-head=false --bt-require-crypto --bt-require-crypto=false --show-console-readout --show-console-readout=false --conf-path --log --no-proxy --dht-entry-point --dht-listen-port --http-user --retry-wait --on-download-complete --help --help=#basic --help=#advanced --help=#http --help=#https --help=#ftp --help=#metalink --help=#bittorrent --help=#cookie --help=#hook --help=#file --help=#rpc --help=#checksum --help=#experimental --help=#deprecated --help=#help --help=#all --max-overall-download-limit --event-poll --http-accept-gzip --http-accept-gzip=false --metalink-file --all-proxy --disk-cache --hash-check-only --hash-check-only=false --dht-listen-addr6 --human-readable --human-readable=false --ftp-user --all-proxy-passwd --bt-exclude-tracker --pause-metadata --pause-metadata=false --http-proxy-user --deferred-input --deferred-input=false --metalink-enable-unique-protocol --metalink-enable-unique-protocol=false --stop --peer-agent --max-upload-limit --multiple-interface --realtime-chunk-checksum --realtime-chunk-checksum=false --http-no-cache --http-no-cache=false --ca-certificate --bt-force-encryption --bt-force-encryption=false --bt-save-metadata --bt-save-metadata=false --seed-ratio --follow-torrent --pause --pause=false --checksum --auto-save-interval --async-dns --async-dns=false --bt-enable-lpd --bt-enable-lpd=false --parameterized-uri --parameterized-uri=false --ftp-proxy-passwd --enable-rpc --enable-rpc=false --min-split-size --bt-seed-unverified --bt-seed-unverified=false --input-file --interface --enable-async-dns6 --enable-async-dns6=false --reuse-uri --reuse-uri=false --socket-recv-buffer-size --bt-request-peer-speed-limit --on-download-error --bt-metadata-only --bt-metadata-only=false ' -- "$cur" ) ) + COMPREPLY=( $( compgen -W '--rpc-save-upload-metadata --rpc-save-upload-metadata=false --on-download-start --metalink-language --rpc-secret --torrent-file --enable-peer-exchange --enable-peer-exchange=false --http-proxy-passwd --bt-tracker-timeout --ftp-type --seed-time --keep-unfinished-download-result --keep-unfinished-download-result=false --bt-tracker-connect-timeout --bt-max-open-files --no-netrc --no-netrc=false --force-sequential --force-sequential=false --metalink-base-uri --private-key --ftp-passwd --allow-overwrite --allow-overwrite=false --rpc-allow-origin-all --rpc-allow-origin-all=false --bt-detach-seed-only --bt-detach-seed-only=false --dht-entry-point6 --summary-interval --lowest-speed-limit --bt-tracker-interval --proxy-method --metalink-preferred-protocol --enable-http-keep-alive --enable-http-keep-alive=false --metalink-version --stderr --stderr=false --bt-lpd-interface --force-save --force-save=false --rpc-secure --rpc-secure=false --listen-port --rpc-private-key --server-stat-of --server-stat-timeout --bt-load-saved-metadata --bt-load-saved-metadata=false --https-proxy-user --piece-length --dry-run --dry-run=false --truncate-console-readout --truncate-console-readout=false --save-not-found --save-not-found=false --async-dns-server --bt-max-peers --max-overall-upload-limit --rpc-user --optimize-concurrent-downloads --optimize-concurrent-downloads=true --optimize-concurrent-downloads=false --optimize-concurrent-downloads=A:B --dir --split --on-download-pause --auto-file-renaming --auto-file-renaming=false --http-proxy --save-session-interval --daemon --daemon=false --https-proxy --min-tls-version --save-cookies --out --rlimit-nofile --max-file-not-found --on-download-stop --certificate --bt-min-crypto-level --remove-control-file --remove-control-file=false --enable-dht --enable-dht=false --file-allocation --follow-metalink --on-bt-download-complete --ftp-proxy --show-files --show-files=false --timeout --bt-hash-check-seed --bt-hash-check-seed=false --ftp-pasv --ftp-pasv=false --check-certificate --check-certificate=false --always-resume --always-resume=false --load-cookies --bt-remove-unselected-file --bt-remove-unselected-file=false --bt-stop-timeout --version --max-concurrent-downloads --quiet --quiet=false --max-download-result --content-disposition-default-utf8 --content-disposition-default-utf8=false --max-resume-failure-tries --header --rpc-listen-all --rpc-listen-all=false --all-proxy-user --server-stat-if --dht-file-path6 --save-session --bt-external-ip --max-tries --conditional-get --conditional-get=false --ftp-reuse-connection --ftp-reuse-connection=false --gid --dscp --max-download-limit --bt-prioritize-piece --check-integrity --check-integrity=false --log-level --remote-time --remote-time=false --uri-selector --rpc-listen-port --index-out --bt-tracker --referer --ssh-host-key-md --console-log-level --connect-timeout --stream-piece-selector --dht-message-timeout --select-file --download-result --disable-ipv4 --disable-ipv4=false --disable-ipv6 --disable-ipv6=false --rpc-max-request-size --rpc-passwd --stop-with-process --https-proxy-passwd --continue --continue=false --no-file-allocation-limit --netrc-path --ftp-proxy-user --enable-color --enable-color=false --metalink-location --allow-piece-length-change --allow-piece-length-change=false --max-connection-per-server --no-conf --no-conf=false --rpc-certificate --metalink-os --enable-http-pipelining --enable-http-pipelining=false --http-passwd --user-agent --enable-dht6 --enable-dht6=false --dht-file-path --http-auth-challenge --http-auth-challenge=false --bt-enable-hook-after-hash-check --bt-enable-hook-after-hash-check=false --peer-id-prefix --max-mmap-limit --enable-mmap --enable-mmap=false --use-head --use-head=false --bt-require-crypto --bt-require-crypto=false --show-console-readout --show-console-readout=false --conf-path --log --no-proxy --dht-entry-point --dht-listen-port --http-user --retry-wait --on-download-complete --help --help=#basic --help=#advanced --help=#http --help=#https --help=#ftp --help=#metalink --help=#bittorrent --help=#cookie --help=#hook --help=#file --help=#rpc --help=#checksum --help=#experimental --help=#deprecated --help=#help --help=#all --max-overall-download-limit --event-poll --http-accept-gzip --http-accept-gzip=false --metalink-file --all-proxy --disk-cache --hash-check-only --hash-check-only=false --dht-listen-addr6 --human-readable --human-readable=false --ftp-user --all-proxy-passwd --bt-exclude-tracker --pause-metadata --pause-metadata=false --http-proxy-user --deferred-input --deferred-input=false --metalink-enable-unique-protocol --metalink-enable-unique-protocol=false --stop --peer-agent --max-upload-limit --multiple-interface --realtime-chunk-checksum --realtime-chunk-checksum=false --http-no-cache --http-no-cache=false --ca-certificate --bt-force-encryption --bt-force-encryption=false --bt-save-metadata --bt-save-metadata=false --seed-ratio --follow-torrent --pause --pause=false --checksum --auto-save-interval --async-dns --async-dns=false --bt-enable-lpd --bt-enable-lpd=false --parameterized-uri --parameterized-uri=false --ftp-proxy-passwd --enable-rpc --enable-rpc=false --min-split-size --bt-seed-unverified --bt-seed-unverified=false --input-file --interface --enable-async-dns6 --enable-async-dns6=false --reuse-uri --reuse-uri=false --socket-recv-buffer-size --bt-request-peer-speed-limit --on-download-error --bt-metadata-only --bt-metadata-only=false ' -- "$cur" ) ) ;; *) _filedir '@(torrent|meta4|metalink|text|txt|list|lst)' diff --git a/doc/manual-src/en/aria2c.rst b/doc/manual-src/en/aria2c.rst index 6722e0d2..9a5091cc 100644 --- a/doc/manual-src/en/aria2c.rst +++ b/doc/manual-src/en/aria2c.rst @@ -1274,6 +1274,10 @@ Advanced Options :option:`--deferred-input` option will be disabled when :option:`--save-session` is used together. +.. option:: --disable-ipv4 [true|false] + + Disable IPv4. Default: ``false`` + .. option:: --disable-ipv6 [true|false] Disable IPv6. This is useful if you have to use broken DNS and want diff --git a/doc/manual-src/pt/aria2c.rst b/doc/manual-src/pt/aria2c.rst index 668a3331..e06109a9 100644 --- a/doc/manual-src/pt/aria2c.rst +++ b/doc/manual-src/pt/aria2c.rst @@ -1145,6 +1145,10 @@ Opções Avançadas and options at startup. Padrão: ``false`` +.. option:: --disable-ipv4 [true|false] + + Disable IPv4. Padrão: ``false`` + .. option:: --disable-ipv6 [true|false] Disable IPv6. This is useful if you have to use broken DNS and want diff --git a/doc/manual-src/ru/aria2c.rst b/doc/manual-src/ru/aria2c.rst index ebebe4f3..b36986d1 100644 --- a/doc/manual-src/ru/aria2c.rst +++ b/doc/manual-src/ru/aria2c.rst @@ -1348,6 +1348,11 @@ HTTP(S)/FTP, они тут же могут выгружаться в BitTorrent- параметр :option:`--deferred-input` будет заблокирован, если используется вместе с :option:`--save-session`. +.. option:: --disable-ipv4 [true|false] + + Отключить IPv4. + По умолчанию: ``false`` + .. option:: --disable-ipv6 [true|false] Отключить IPv6. Это полезно, если вы используете поврежденный DNS diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc index bf307b75..109f457b 100644 --- a/src/AbstractCommand.cc +++ b/src/AbstractCommand.cc @@ -808,6 +808,9 @@ std::string AbstractCommand::resolveHostname(std::vector& addrs, { NameResolver res; res.setSocktype(SOCK_STREAM); + if (e_->getOption()->getAsBool(PREF_DISABLE_IPV4)) { + res.setFamily(AF_INET6); + } if (e_->getOption()->getAsBool(PREF_DISABLE_IPV6)) { res.setFamily(AF_INET); } diff --git a/src/AsyncNameResolverMan.cc b/src/AsyncNameResolverMan.cc index be073561..aa07f59a 100644 --- a/src/AsyncNameResolverMan.cc +++ b/src/AsyncNameResolverMan.cc @@ -216,7 +216,7 @@ void configureAsyncNameResolverMan(AsyncNameResolverMan* asyncNameResolverMan, if (!net::getIPv4AddrConfigured() && !net::getIPv6AddrConfigured()) { net::checkAddrconfig(); } - if (!net::getIPv4AddrConfigured()) { + if (!net::getIPv4AddrConfigured() || option->getAsBool(PREF_DISABLE_IPV4)) { asyncNameResolverMan->setIPv4(false); } if (!net::getIPv6AddrConfigured() || option->getAsBool(PREF_DISABLE_IPV6)) { diff --git a/src/BtSetup.cc b/src/BtSetup.cc index 6732e657..f039d1a3 100644 --- a/src/BtSetup.cc +++ b/src/BtSetup.cc @@ -183,9 +183,11 @@ void BtSetup::setup(std::vector>& commands, } if (btReg->getTcpPort() == 0) { static int families[] = {AF_INET, AF_INET6}; - size_t familiesLength = + size_t familiesStart = + e->getOption()->getAsBool(PREF_DISABLE_IPV4) ? 1 : 0; + size_t familiesEnd = e->getOption()->getAsBool(PREF_DISABLE_IPV6) ? 1 : 2; - for (size_t i = 0; i < familiesLength; ++i) { + for (size_t i = familiesStart; i < familiesEnd; ++i) { auto command = make_unique(e->newCUID(), e, families[i]); bool ret; diff --git a/src/Context.cc b/src/Context.cc index c6603261..7eba76bd 100644 --- a/src/Context.cc +++ b/src/Context.cc @@ -218,6 +218,9 @@ Context::Context(bool standalone, int argc, char** argv, const KeyVals& options) } #endif // defined(HAVE_SYS_RESOURCE_H) && defined(RLIMIT_NOFILE) + if (op->getAsBool(PREF_DISABLE_IPV4)) { + SocketCore::setProtocolFamily(AF_INET6); + } if (op->getAsBool(PREF_DISABLE_IPV6)) { SocketCore::setProtocolFamily(AF_INET); } diff --git a/src/DownloadEngineFactory.cc b/src/DownloadEngineFactory.cc index 3c5bfe58..32ba8e8c 100644 --- a/src/DownloadEngineFactory.cc +++ b/src/DownloadEngineFactory.cc @@ -206,8 +206,9 @@ std::unique_ptr DownloadEngineFactory::newDownloadEngine( A2_LOG_NOTICE("RPC transport will be encrypted."); } static int families[] = {AF_INET, AF_INET6}; - size_t familiesLength = op->getAsBool(PREF_DISABLE_IPV6) ? 1 : 2; - for (size_t i = 0; i < familiesLength; ++i) { + size_t familiesStart = op->getAsBool(PREF_DISABLE_IPV4) ? 1 : 0; + size_t familiesEnd = op->getAsBool(PREF_DISABLE_IPV6) ? 1 : 2; + for (size_t i = familiesStart; i < familiesEnd; ++i) { auto httpListenCommand = make_unique( e->newCUID(), e.get(), families[i], secure); if (httpListenCommand->bindPort(op->getAsInt(PREF_RPC_LISTEN_PORT))) { diff --git a/src/InitiateConnectionCommand.cc b/src/InitiateConnectionCommand.cc index b23413e8..c2b3258f 100644 --- a/src/InitiateConnectionCommand.cc +++ b/src/InitiateConnectionCommand.cc @@ -137,7 +137,8 @@ InitiateConnectionCommand::createBackupIPv4ConnectCommand( // fashion. std::shared_ptr info; char buf[sizeof(in6_addr)]; - if (inetPton(AF_INET6, ipaddr.c_str(), &buf) == -1) { + if (inetPton(AF_INET6, ipaddr.c_str(), &buf) == -1 || + getOption()->getAsBool(PREF_DISABLE_IPV4)) { return info; } A2_LOG_INFO("Searching IPv4 address for backup connection attempt"); diff --git a/src/NameResolveCommand.cc b/src/NameResolveCommand.cc index ec0ce044..563e4e6b 100644 --- a/src/NameResolveCommand.cc +++ b/src/NameResolveCommand.cc @@ -105,6 +105,9 @@ bool NameResolveCommand::execute() { NameResolver resolver; resolver.setSocktype(SOCK_DGRAM); + if (e_->getOption()->getAsBool(PREF_DISABLE_IPV4)) { + resolver.setFamily(AF_INET6); + } if (e_->getOption()->getAsBool(PREF_DISABLE_IPV6)) { resolver.setFamily(AF_INET); } diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc index 4339c912..de315a59 100644 --- a/src/OptionHandlerFactory.cc +++ b/src/OptionHandlerFactory.cc @@ -211,6 +211,13 @@ std::vector OptionHandlerFactory::createOptionHandlers() op->setChangeOptionForReserved(true); handlers.push_back(op); } + { + OptionHandler* op(new BooleanOptionHandler(PREF_DISABLE_IPV4, + TEXT_DISABLE_IPV4, A2_V_FALSE, + OptionHandler::OPT_ARG)); + op->addTag(TAG_ADVANCED); + handlers.push_back(op); + } { OptionHandler* op(new BooleanOptionHandler(PREF_DISABLE_IPV6, TEXT_DISABLE_IPV6, diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc index 379029ec..9dfc44cf 100644 --- a/src/RequestGroup.cc +++ b/src/RequestGroup.cc @@ -346,11 +346,13 @@ void RequestGroup::createInitialCommand( downloadContext_, pieceStorage_, peerStorage, btAnnounce, btRuntime, (progressInfoFile ? progressInfoFile : progressInfoFile_))); - if (option_->getAsBool(PREF_ENABLE_DHT) || + if ((!e->getOption()->getAsBool(PREF_DISABLE_IPV4) && + option_->getAsBool(PREF_ENABLE_DHT)) || (!e->getOption()->getAsBool(PREF_DISABLE_IPV6) && option_->getAsBool(PREF_ENABLE_DHT6))) { - if (option_->getAsBool(PREF_ENABLE_DHT)) { + if (!e->getOption()->getAsBool(PREF_DISABLE_IPV4) && + option_->getAsBool(PREF_ENABLE_DHT)) { std::vector> c, rc; std::tie(c, rc) = DHTSetup().setup(e, AF_INET); diff --git a/src/prefs.cc b/src/prefs.cc index 937e927d..c1c8adf9 100644 --- a/src/prefs.cc +++ b/src/prefs.cc @@ -302,6 +302,8 @@ PrefPtr PREF_INTERFACE = makePref("interface"); // value: string PrefPtr PREF_MULTIPLE_INTERFACE = makePref("multiple-interface"); // value: true | false +PrefPtr PREF_DISABLE_IPV4 = makePref("disable-ipv4"); +// value: true | false PrefPtr PREF_DISABLE_IPV6 = makePref("disable-ipv6"); // value: true | false PrefPtr PREF_HUMAN_READABLE = makePref("human-readable"); diff --git a/src/prefs.h b/src/prefs.h index e1f83978..b1feb48d 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -255,6 +255,8 @@ extern PrefPtr PREF_INTERFACE; // value: string extern PrefPtr PREF_MULTIPLE_INTERFACE; // value: true | false +extern PrefPtr PREF_DISABLE_IPV4; +// value: true | false extern PrefPtr PREF_DISABLE_IPV6; // value: true | false extern PrefPtr PREF_HUMAN_READABLE; diff --git a/src/usage_text.h b/src/usage_text.h index d73b50d9..158de8f8 100644 --- a/src/usage_text.h +++ b/src/usage_text.h @@ -640,6 +640,8 @@ " specify interface name, IP address and hostname.\n" \ " If --interface is used, this option will be\n" \ " ignored.") +#define TEXT_DISABLE_IPV4 \ + _(" --disable-ipv4[=true|false] Disable IPv4.") #define TEXT_DISABLE_IPV6 \ _(" --disable-ipv6[=true|false] Disable IPv6.") #define TEXT_BT_SAVE_METADATA \