|
Packit |
8f70b4 |
/*
|
|
Packit |
8f70b4 |
* lftp - file transfer program
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* Copyright (c) 1996-2016 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
8f70b4 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
8f70b4 |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
8f70b4 |
* (at your option) any later version.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
8f70b4 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
8f70b4 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
8f70b4 |
* GNU General Public License for more details.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
8f70b4 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
8f70b4 |
*/
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#ifndef NETACCESS_H
|
|
Packit |
8f70b4 |
#define NETACCESS_H
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include "FileAccess.h"
|
|
Packit |
8f70b4 |
#include "Resolver.h"
|
|
Packit |
8f70b4 |
#include "LsCache.h"
|
|
Packit |
8f70b4 |
#include "RateLimit.h"
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class NetAccess : public FileAccess, public Networker
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
protected:
|
|
Packit |
8f70b4 |
class SiteData
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
int current_connection_limit;
|
|
Packit |
8f70b4 |
int connection_limit;
|
|
Packit |
8f70b4 |
Timer connection_limit_timer;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
SiteData(const xstring &site)
|
|
Packit |
8f70b4 |
: current_connection_limit(0), connection_limit(0),
|
|
Packit |
8f70b4 |
connection_limit_timer("net:connection-limit-timer",site) {}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SetConnectionLimit(int L) {
|
|
Packit |
8f70b4 |
connection_limit=L;
|
|
Packit |
8f70b4 |
if(L && current_connection_limit>=L) {
|
|
Packit |
8f70b4 |
current_connection_limit=L;
|
|
Packit |
8f70b4 |
connection_limit_timer.Stop();
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
int GetConnectionLimit() {
|
|
Packit |
8f70b4 |
if(current_connection_limit
|
|
Packit |
8f70b4 |
&& (!connection_limit || connection_limit>current_connection_limit)
|
|
Packit |
8f70b4 |
&& connection_limit_timer.Stopped()) {
|
|
Packit |
8f70b4 |
current_connection_limit++;
|
|
Packit |
8f70b4 |
if(!connection_limit || connection_limit>current_connection_limit)
|
|
Packit |
8f70b4 |
connection_limit_timer.Reset();
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
return current_connection_limit;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
void DecreaseConnectionLimit() {
|
|
Packit |
8f70b4 |
if(current_connection_limit>1) {
|
|
Packit |
8f70b4 |
current_connection_limit--;
|
|
Packit |
8f70b4 |
connection_limit_timer.Reset();
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static xmap_p<NetAccess::SiteData> site_data;
|
|
Packit |
8f70b4 |
SiteData *GetSiteData() const {
|
|
Packit |
8f70b4 |
const xstring& key=GetConnectURL(NO_PATH);
|
|
Packit |
8f70b4 |
SiteData *data=site_data.lookup(key);
|
|
Packit |
8f70b4 |
if(!data) {
|
|
Packit |
8f70b4 |
data=new SiteData(key);
|
|
Packit |
8f70b4 |
site_data.add(key,data);
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
data->SetConnectionLimit(connection_limit);
|
|
Packit |
8f70b4 |
return data;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int GetConnectionLimit() {
|
|
Packit |
8f70b4 |
return GetSiteData()->GetConnectionLimit();
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
SMTaskRef<Resolver> resolver;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xarray<sockaddr_u> peer;
|
|
Packit |
8f70b4 |
int peer_curr;
|
|
Packit |
8f70b4 |
void ClearPeer();
|
|
Packit |
8f70b4 |
void NextPeer();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int max_persist_retries;
|
|
Packit |
8f70b4 |
int persist_retries;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
Timer idle_timer;
|
|
Packit |
8f70b4 |
Timer timeout_timer;
|
|
Packit |
8f70b4 |
bool CheckTimeout();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int reconnect_interval;
|
|
Packit |
8f70b4 |
float reconnect_interval_current;
|
|
Packit |
8f70b4 |
float reconnect_interval_multiplier;
|
|
Packit |
8f70b4 |
int reconnect_interval_max;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int connection_limit;
|
|
Packit |
8f70b4 |
bool connection_takeover;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
Ref<RateLimit> rate_limit;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int socket_buffer;
|
|
Packit |
8f70b4 |
int socket_maxseg;
|
|
Packit |
8f70b4 |
void SetSocketBuffer(int sock) { Networker::SetSocketBuffer(sock,socket_buffer); }
|
|
Packit |
8f70b4 |
void SetSocketMaxseg(int sock) { Networker::SetSocketMaxseg(sock,socket_maxseg); }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int SocketCreate(int af,int type,int proto) { return Networker::SocketCreate(af,type,proto,hostname); }
|
|
Packit |
8f70b4 |
int SocketCreateTCP(int af) { return Networker::SocketCreateTCP(af,hostname); }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int Poll(int fd,int ev,const char **err);
|
|
Packit |
8f70b4 |
const char *CheckHangup(const struct pollfd *pfd,int num);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xstring_c proxy;
|
|
Packit |
8f70b4 |
xstring_c proxy_port;
|
|
Packit |
8f70b4 |
xstring_c proxy_user;
|
|
Packit |
8f70b4 |
xstring_c proxy_pass;
|
|
Packit |
8f70b4 |
xstring_c proxy_proto;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xstring_c home_auto;
|
|
Packit |
8f70b4 |
void PropagateHomeAuto();
|
|
Packit |
8f70b4 |
const char *FindHomeAuto();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SayConnectingTo();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SetProxy(const char *);
|
|
Packit |
8f70b4 |
static bool NoProxy(const char *);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int Resolve(const char *defp,const char *ser,const char *pr);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *DelayingMessage();
|
|
Packit |
8f70b4 |
bool ReconnectAllowed();
|
|
Packit |
8f70b4 |
bool CheckRetries(); // returns false if max-retries exceeded.
|
|
Packit |
8f70b4 |
bool NextTry(); // increments retries; does CheckRetries().
|
|
Packit |
8f70b4 |
void TrySuccess(); // reset retry counters.
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
virtual void HandleTimeout();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
void Init();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
NetAccess();
|
|
Packit |
8f70b4 |
NetAccess(const NetAccess *);
|
|
Packit |
8f70b4 |
~NetAccess();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void Reconfig(const char *name=0);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void Open(const char *fn,int mode,off_t offs);
|
|
Packit |
8f70b4 |
void ResetLocationData();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void Close();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void Cleanup();
|
|
Packit |
8f70b4 |
void CleanupThis();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int CountConnections();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static void ClassInit();
|
|
Packit |
8f70b4 |
static void ClassCleanup() {
|
|
Packit |
8f70b4 |
site_data.empty();
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class GenericParseListInfo : public ListInfo
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
bool redir_resolution;
|
|
Packit |
8f70b4 |
int redir_count;
|
|
Packit |
8f70b4 |
int max_redir;
|
|
Packit |
8f70b4 |
FileAccessRef redir_session;
|
|
Packit |
8f70b4 |
Ref<FileSet> redir_fs;
|
|
Packit |
8f70b4 |
bool ResolveRedirect(const FileInfo *fi);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
protected:
|
|
Packit |
8f70b4 |
int mode;
|
|
Packit |
8f70b4 |
SMTaskRef<IOBuffer> ubuf;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
bool get_time_for_dirs;
|
|
Packit |
8f70b4 |
bool can_get_prec_time;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
virtual FileSet *Parse(const char *buf,int len)
|
|
Packit |
8f70b4 |
{ return session->ParseLongList(buf,len); }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
GenericParseListInfo(FileAccess *session,const char *path);
|
|
Packit |
8f70b4 |
int Do();
|
|
Packit |
8f70b4 |
const char *Status();
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#endif//NETACCESS_H
|