summaryrefslogtreecommitdiff
path: root/src/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cc')
-rw-r--r--src/main.cc222
1 files changed, 172 insertions, 50 deletions
diff --git a/src/main.cc b/src/main.cc
index 718ddd76..b01853b9 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -22,11 +22,13 @@
#include "HttpInitiateConnectionCommand.h"
#include "DownloadEngine.h"
#include "SegmentMan.h"
+#include "SplitSlowestSegmentSplitter.h"
#include "SimpleLogger.h"
#include "common.h"
#include "DefaultDiskWriter.h"
#include "Util.h"
#include "InitiateConnectionCommandFactory.h"
+#include "prefs.h"
#include <vector>
#include <algorithm>
#include <signal.h>
@@ -96,41 +98,68 @@ void showVersion() {
}
void showUsage() {
+ cout << endl;
cout << "Usage: " << PACKAGE_NAME << " [options] URL ..." << endl;
+ cout << endl;
cout << "Options:" << endl;
- cout << " -d, --dir=DIR The directory to store downloaded file." << endl;
- cout << " -o, --out=FILE The file name for downloaded file." << endl;
- cout << " -l, --log=LOG The file path to store log. If '-' is specified," << endl;
- cout << " log is written to stdout." << endl;
- cout << " -D, --daemon Run as daemon." << endl;
- cout << " -s, --split=N Download a file using s connections. s must be" << endl;
- cout << " between 1 and 5. If this option is specified the" << endl;
- cout << " first URL is used, and the other URLs are ignored." << endl;
- cout << " --http-proxy=HOST:PORT Use HTTP proxy server. This affects to all" << endl;
- cout << " URLs." << endl;
- cout << " --http-user=USER Set HTTP user. This affects to all URLs." << endl;
- cout << " --http-passwd=PASSWD Set HTTP password. This affects to all URLs." << endl;
- cout << " --http-proxy-user=USER Set HTTP proxy user. This affects to all URLs" << endl;
- cout << " --http-proxy-passwd=PASSWD Set HTTP proxy password. This affects to all URLs." << endl;
- cout << " --http-auth-scheme=SCHEME Set HTTP authentication scheme. Currently, BASIC" << endl;
- cout << " is the only supported scheme. You MUST specify" << endl;
- cout << " this option in order to use HTTP authentication" << endl;
- cout << " as well as --http-proxy option." << endl;
- cout << " --referer Set Referer. This affects to all URLs." << endl;
- cout << " --retry-wait Set amount of time in second between requests" << endl;
- cout << " for errors. Specify a value between 0 and 60." << endl;
- cout << " -v, --version Print the version number and exit." << endl;
- cout << " -h, --help Print this message and exit." << endl;
+ cout << " -d, --dir=DIR The directory to store downloaded file." << endl;
+ cout << " -o, --out=FILE The file name for downloaded file." << endl;
+ cout << " -l, --log=LOG The file path to store log. If '-' is specified," << endl;
+ cout << " log is written to stdout." << endl;
+ cout << " -D, --daemon Run as daemon." << endl;
+ cout << " -s, --split=N Download a file using N connections. N must be" << endl;
+ cout << " between 1 and 5. This option affects all URLs." << endl;
+ cout << " Thus, aria2 connects to each URL with N connections." << endl;
+ cout << " --retry-wait=SEC Set amount of time in second between requests" << endl;
+ cout << " for errors. Specify a value between 0 and 60." << endl;
+ cout << " Default: 5" << endl;
+ cout << " -t, --timeout=SEC Set timeout in second. Default: 60" << endl;
+ cout << " -m, --max-tries=N Set number of tries. 0 means unlimited." << endl;
+ cout << " Default: 5" << endl;
+ cout << " --min-segment-size=SIZE[K|M] Set minimum segment size. You can append" << endl;
+ cout << " K or M(1K = 1024, 1M = 1024K)." << endl;
+ cout << " --http-proxy=HOST:PORT Use HTTP proxy server. This affects to all" << endl;
+ cout << " URLs." << endl;
+ cout << " --http-user=USER Set HTTP user. This affects to all URLs." << endl;
+ cout << " --http-passwd=PASSWD Set HTTP password. This affects to all URLs." << endl;
+ cout << " --http-proxy-user=USER Set HTTP proxy user. This affects to all URLs" << endl;
+ cout << " --http-proxy-passwd=PASSWD Set HTTP proxy password. This affects to all URLs." << endl;
+ cout << " --http-proxy-method=METHOD Set the method to use in proxy request." << endl;
+ cout << " METHOD is either 'get' or 'tunnel'." << endl;
+ cout << " Default: tunnel" << endl;
+ cout << " --http-auth-scheme=SCHEME Set HTTP authentication scheme. Currently, basic" << endl;
+ cout << " is the only supported scheme. You MUST specify" << endl;
+ cout << " this option in order to use HTTP authentication" << endl;
+ cout << " as well as --http-proxy option." << endl;
+ cout << " --referer=REFERER Set Referer. This affects to all URLs." << endl;
+ cout << " --ftp-user=USER Set FTP user. This affects to all URLs." << endl;
+ cout << " Default: anonymous" << endl;
+ cout << " --ftp-passwd=PASSWD Set FTP password. This affects to all URLs." << endl;
+ cout << " Default: ARIA2USER@" << endl;
+ cout << " --ftp-type=TYPE Set FTP transfer type. TYPE is either 'binary'" << endl;
+ cout << " or 'ascii'." << endl;
+ cout << " Default: binary" << endl;
+ cout << " -p, --ftp-pasv Use passive mode in FTP." << endl;
+ cout << " --ftp-via-http-proxy=METHOD Use HTTP proxy in FTP. METHOD is either 'get' or" << endl;
+ cout << " 'tunnel'." << endl;
+ cout << " Default: tunnel" << endl;
+ cout << " -v, --version Print the version number and exit." << endl;
+ cout << " -h, --help Print this message and exit." << endl;
+ cout << endl;
cout << "URL:" << endl;
cout << " You can specify multiple URLs. All URLs must point to the same file" << endl;
- cout << " or a download fails." << endl;
+ cout << " or downloading fails." << endl;
+ cout << endl;
cout << "Examples:" << endl;
cout << " Download a file by 1 connection:" << endl;
cout << " aria2c http://AAA.BBB.CCC/file.zip" << endl;
cout << " Download a file by 2 connections:" << endl;
cout << " aria2c -s 2 http://AAA.BBB.CCC/file.zip" << endl;
- cout << " Download a file by 2 connections, each connects to a different server." << endl;
+ cout << " Download a file by 2 connections, each connects to a different server:" << endl;
cout << " aria2c http://AAA.BBB.CCC/file.zip http://DDD.EEE.FFF/GGG/file.zip" << endl;
+ cout << " You can mix up different protocols:" << endl;
+ cout << " aria2c http://AAA.BBB.CCC/file.zip ftp://DDD.EEE.FFF/GGG/file.zip" << endl;
+ cout << endl;
cout << "Reports bugs to <tujikawa at rednoah dot com>" << endl;
}
@@ -139,13 +168,21 @@ int main(int argc, char* argv[]) {
string logfile;
string dir;
string ufilename;
- int split = 0;
+ int split = 1;
bool daemonMode = false;
string referer;
int c;
Option* op = new Option();
- op->put("retry_wait", "5");
+ op->put(PREF_RETRY_WAIT, "5");
+ op->put(PREF_TIMEOUT, "60");
+ op->put(PREF_MIN_SEGMENT_SIZE, "1048576");// 1M
+ op->put(PREF_MAX_TRIES, "5");
+ op->put(PREF_HTTP_PROXY_METHOD, V_TUNNEL);
+ op->put(PREF_FTP_USER, "anonymous");
+ op->put(PREF_FTP_PASSWD, "ARIA2USER@");
+ op->put(PREF_FTP_TYPE, V_BINARY);
+ op->put(PREF_FTP_VIA_HTTP_PROXY, V_TUNNEL);
while(1) {
int optIndex = 0;
@@ -156,6 +193,8 @@ int main(int argc, char* argv[]) {
{ "out", required_argument, NULL, 'o' },
{ "log", required_argument, NULL, 'l' },
{ "split", required_argument, NULL, 's' },
+ { "timeout", required_argument, NULL, 't' },
+ { "max-retries", required_argument, NULL, 'm' },
{ "http-proxy", required_argument, &lopt, 1 },
{ "http-user", required_argument, &lopt, 2 },
{ "http-passwd", required_argument, &lopt, 3 },
@@ -164,11 +203,18 @@ int main(int argc, char* argv[]) {
{ "http-auth-scheme", required_argument, &lopt, 6 },
{ "referer", required_argument, &lopt, 7 },
{ "retry-wait", required_argument, &lopt, 8 },
+ { "ftp-user", required_argument, &lopt, 9 },
+ { "ftp-passwd", required_argument, &lopt, 10 },
+ { "ftp-type", required_argument, &lopt, 11 },
+ { "ftp-pasv", no_argument, NULL, 'p' },
+ { "ftp-via-http-proxy", required_argument, &lopt, 12 },
+ { "min-segment-size", required_argument, &lopt, 13 },
+ { "http-proxy-method", required_argument, &lopt, 14 },
{ "version", no_argument, NULL, 'v' },
{ "help", no_argument, NULL, 'h' },
{ 0, 0, 0, 0 }
};
- c = getopt_long(argc, argv, "Dd:o:l:s:vh", longOpts, &optIndex);
+ c = getopt_long(argc, argv, "Dd:o:l:s:pt:m:vh", longOpts, &optIndex);
if(c == -1) {
break;
}
@@ -185,29 +231,29 @@ int main(int argc, char* argv[]) {
showUsage();
exit(1);
}
- op->put("http_proxy_host", proxy.first);
- op->put("http_proxy_port", Util::itos(port));
- op->put("http_proxy_enabled", "true");
+ op->put(PREF_HTTP_PROXY_HOST, proxy.first);
+ op->put(PREF_HTTP_PROXY_PORT, Util::itos(port));
+ op->put(PREF_HTTP_PROXY_ENABLED, V_TRUE);
break;
}
case 2:
- op->put("http_user", optarg);
+ op->put(PREF_HTTP_USER, optarg);
break;
case 3:
- op->put("http_passwd", optarg);
+ op->put(PREF_HTTP_PASSWD, optarg);
break;
case 4:
- op->put("http_proxy_user", optarg);
- op->put("http_proxy_auth_enabled", "true");
+ op->put(PREF_HTTP_PROXY_USER, optarg);
+ op->put(PREF_HTTP_PROXY_AUTH_ENABLED, V_TRUE);
break;
case 5:
- op->put("http_proxy_passwd", optarg);
+ op->put(PREF_HTTP_PROXY_PASSWD, optarg);
break;
case 6:
- if(string("BASIC") == optarg) {
- op->put("http_auth_scheme", "BASIC");
+ if(string(V_BASIC) == optarg) {
+ op->put(PREF_HTTP_AUTH_SCHEME, V_BASIC);
} else {
- cerr << "Currently, supported authentication scheme is BASIC." << endl;
+ cerr << "Currently, supported authentication scheme is basic." << endl;
}
break;
case 7:
@@ -220,9 +266,62 @@ int main(int argc, char* argv[]) {
showUsage();
exit(1);
}
- op->put("retry-wait", Util::itos(wait));
+ op->put(PREF_RETRY_WAIT, Util::itos(wait));
+ break;
+ }
+ case 9:
+ op->put(PREF_FTP_USER, optarg);
+ break;
+ case 10:
+ op->put(PREF_FTP_PASSWD, optarg);
+ break;
+ case 11:
+ if(string(optarg) == V_BINARY || string(optarg) == V_ASCII) {
+ op->put(PREF_FTP_TYPE, optarg);
+ } else {
+ cerr << "ftp-type must be either 'binary' or 'ascii'." << endl;
+ showUsage();
+ exit(1);
+ }
+ break;
+ case 12:
+ if(string(optarg) == V_GET || string(optarg) == V_TUNNEL) {
+ op->put(PREF_FTP_VIA_HTTP_PROXY, optarg);
+ } else {
+ cerr << "ftp-via-http-proxy must be either 'get' or 'tunnel'." << endl;
+ showUsage();
+ exit(1);
+ }
+ break;
+ case 13: {
+ string::size_type p = string(optarg).find_first_of("KM");
+ int mult = 1;
+ if(p != string::npos) {
+ if(optarg[p] == 'K') {
+ mult = 1024;
+ } else if(optarg[p] == 'M') {
+ mult = 1024*1024;
+ }
+ optarg[p] = '\0';
+ }
+ long long int size = strtoll(optarg, NULL, 10)*mult;
+ if(size <= 0) {
+ cerr << "min-segment-size invalid" << endl;
+ showUsage();
+ exit(1);
+ }
+ op->put(PREF_MIN_SEGMENT_SIZE, Util::llitos(size));
break;
}
+ case 14:
+ if(string(optarg) == V_GET || string(optarg) == V_TUNNEL) {
+ op->put(PREF_HTTP_PROXY_METHOD, optarg);
+ } else {
+ cerr << "http-proxy-method must be either 'get' or 'tunnel'." << endl;
+ showUsage();
+ exit(1);
+ }
+ break;
}
break;
}
@@ -244,12 +343,36 @@ int main(int argc, char* argv[]) {
break;
case 's':
split = (int)strtol(optarg, NULL, 10);
- if(!(1 < split && split < 5)) {
+ if(!(1 <= split && split <= 5)) {
cerr << "split must be between 1 and 5." << endl;
showUsage();
exit(1);
}
break;
+ case 't': {
+ int timeout = (int)strtol(optarg, NULL, 10);
+ if(1 <= timeout && timeout <= 600) {
+ op->put(PREF_TIMEOUT, Util::itos(timeout));
+ } else {
+ cerr << "timeout must be between 1 and 600" << endl;
+ showUsage();
+ exit(1);
+ }
+ break;
+ }
+ case 'm': {
+ int retries = (int)strtol(optarg, NULL, 10);
+ if(retries < 0) {
+ cerr << "max-retires invalid" << endl;
+ showUsage();
+ exit(1);
+ }
+ op->put(PREF_MAX_TRIES, Util::itos(retries));
+ break;
+ }
+ case 'p':
+ op->put(PREF_FTP_PASV_ENABLED, V_TRUE);
+ break;
case 'v':
showVersion();
exit(0);
@@ -285,7 +408,9 @@ int main(int argc, char* argv[]) {
} else {
logger = new SimpleLogger("/dev/null");
}
-
+ SegmentSplitter* splitter = new SplitSlowestSegmentSplitter();
+ splitter->setMinSegmentSize(op->getAsLLInt(PREF_MIN_SEGMENT_SIZE));
+ splitter->logger = logger;
e = new DownloadEngine();
e->logger = logger;
e->option = op;
@@ -294,17 +419,14 @@ int main(int argc, char* argv[]) {
e->segmentMan->dir = dir;
e->segmentMan->ufilename = ufilename;
e->segmentMan->logger = logger;
+ e->segmentMan->option = op;
+ e->segmentMan->splitter = splitter;
vector<Request*> requests;
- if(split > 0) {
- for(int i = 1; i <= split; i++) {
- addCommand(i, argv[optind], referer, requests);
- }
- } else {
- for(int i = 1; optind < argc; i++) {
- addCommand(i, argv[optind++], referer, requests);
+ for(int i = 1; optind+i-1 < argc; i++) {
+ for(int s = 1; s <= split; s++) {
+ addCommand(split*(i-1)+s, argv[optind+i-1], referer, requests);
}
}
-
struct sigaction sigact;
sigact.sa_handler = handler;
sigact.sa_flags = 0;