Blame src/NetAccess.h

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