Blame src/network.h

Packit Service a2489d
/*
Packit Service a2489d
 * lftp - file transfer program
Packit Service a2489d
 *
Packit Service a2489d
 * Copyright (c) 1996-2016 by Alexander V. Lukyanov (lav@yars.free.net)
Packit Service a2489d
 *
Packit Service a2489d
 * This program is free software; you can redistribute it and/or modify
Packit Service a2489d
 * it under the terms of the GNU General Public License as published by
Packit Service a2489d
 * the Free Software Foundation; either version 3 of the License, or
Packit Service a2489d
 * (at your option) any later version.
Packit Service a2489d
 *
Packit Service a2489d
 * This program is distributed in the hope that it will be useful,
Packit Service a2489d
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a2489d
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service a2489d
 * GNU General Public License for more details.
Packit Service a2489d
 *
Packit Service a2489d
 * You should have received a copy of the GNU General Public License
Packit Service a2489d
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service a2489d
 */
Packit Service a2489d
Packit Service a2489d
#ifndef NETWORK_H
Packit Service a2489d
#define NETWORK_H
Packit Service a2489d
Packit Service a2489d
#include <string.h>
Packit Service a2489d
#include "sockets.h"
Packit Service a2489d
#include <sys/types.h>
Packit Service a2489d
#if HAVE_SYS_SOCKET_H
Packit Service a2489d
# include <sys/socket.h>
Packit Service a2489d
#elif HAVE_WS2TCPIP_H
Packit Service a2489d
# include <ws2tcpip.h>
Packit Service a2489d
#endif
Packit Service a2489d
#include <netinet/in.h>
Packit Service a2489d
#include <arpa/inet.h>
Packit Service a2489d
Packit Service a2489d
class sockaddr_compact : public xstring
Packit Service a2489d
{
Packit Service a2489d
   void operator=(const sockaddr_compact&);   // disable assignment
Packit Service a2489d
Packit Service a2489d
public:
Packit Service a2489d
   int family() const {
Packit Service a2489d
      if(length()==16 || length()==18)
Packit Service a2489d
	 return AF_INET6;
Packit Service a2489d
      if(length()==4 || length()==6)
Packit Service a2489d
	 return AF_INET;
Packit Service a2489d
      return 0;
Packit Service a2489d
   }
Packit Service a2489d
   int port() const {
Packit Service a2489d
      if(length()==18 || length()==6)
Packit Service a2489d
	 return ((buf[length()-2]&255)<<8)|(buf[length()-1]&255);
Packit Service a2489d
      return 0;
Packit Service a2489d
   }
Packit Service a2489d
   void set_port(int p) {
Packit Service a2489d
      if(length()==18 || length()==6) {
Packit Service a2489d
	 buf[length()-2]=((p>>8)&255);
Packit Service a2489d
	 buf[length()-1]=(p&255);
Packit Service a2489d
      }
Packit Service a2489d
   }
Packit Service a2489d
   const char *address() const;
Packit Service a2489d
   static sockaddr_compact& get_tmp() {
Packit Service a2489d
      return *(sockaddr_compact*)&xstring::get_tmp("",0);
Packit Service a2489d
   }
Packit Service a2489d
   static sockaddr_compact& cast(xstring& s) { return *(sockaddr_compact*)&s; }
Packit Service a2489d
   static const sockaddr_compact& cast(const xstring& s) { return *(const sockaddr_compact*)&s; }
Packit Service a2489d
   sockaddr_compact() {}
Packit Service a2489d
   sockaddr_compact(const sockaddr_compact& c) : xstring(c.copy()) {}
Packit Service a2489d
};
Packit Service a2489d
Packit Service a2489d
union sockaddr_u
Packit Service a2489d
{
Packit Service a2489d
   struct sockaddr	sa;
Packit Service a2489d
   struct sockaddr_in	in;
Packit Service a2489d
#if INET6
Packit Service a2489d
   struct sockaddr_in6	in6;
Packit Service a2489d
#endif
Packit Service a2489d
Packit Service a2489d
   socklen_t addr_len() const {
Packit Service a2489d
      if(sa.sa_family==AF_INET)
Packit Service a2489d
	 return sizeof(in);
Packit Service a2489d
#if INET6
Packit Service a2489d
      if(sa.sa_family==AF_INET6)
Packit Service a2489d
	 return sizeof(in6);
Packit Service a2489d
#endif
Packit Service a2489d
      return sizeof(*this);
Packit Service a2489d
   }
Packit Service a2489d
   bool operator==(const sockaddr_u &o) const {
Packit Service a2489d
      return !memcmp(this,&o,addr_len());
Packit Service a2489d
   }
Packit Service a2489d
   bool operator!=(const sockaddr_u &o) const {
Packit Service a2489d
      return memcmp(this,&o,addr_len());
Packit Service a2489d
   }
Packit Service a2489d
   const char *address() const;
Packit Service a2489d
   int port() const;
Packit Service a2489d
   int bind_to(int s) const { return bind(s,&sa,addr_len()); }
Packit Service a2489d
   void clear() { memset(this,0,sizeof(*this)); }
Packit Service a2489d
   sockaddr_u() { clear(); }
Packit Service a2489d
   sockaddr_u(const sockaddr_compact& c) { clear(); set_compact(c); }
Packit Service a2489d
   bool is_reserved() const;
Packit Service a2489d
   bool is_multicast() const;
Packit Service a2489d
   bool is_loopback() const;
Packit Service a2489d
   bool is_private() const;
Packit Service a2489d
   bool is_compatible(const sockaddr_u&) const;
Packit Service a2489d
   const xstring& to_xstring() const;
Packit Service a2489d
   const char *to_string() const { return to_xstring(); }
Packit Service a2489d
   operator const char *() const { return to_string(); }
Packit Service a2489d
   bool set_defaults(int af,const char *hostname,int port);
Packit Service a2489d
   void set_port(int port);
Packit Service a2489d
   int family() const { return sa.sa_family; }
Packit Service a2489d
   bool set_compact(const char *c,size_t len);
Packit Service a2489d
   bool set_compact(const xstring& c) { return set_compact(c,c.length()); }
Packit Service a2489d
   const sockaddr_compact& compact() const;
Packit Service a2489d
   sockaddr_compact& compact_addr() const;
Packit Service a2489d
};
Packit Service a2489d
Packit Service a2489d
inline const char *sockaddr_compact::address() const
Packit Service a2489d
{
Packit Service a2489d
   return sockaddr_u(*this).address();
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
class Networker
Packit Service a2489d
{
Packit Service a2489d
protected:
Packit Service a2489d
   static void NonBlock(int fd);
Packit Service a2489d
   static void CloseOnExec(int fd);
Packit Service a2489d
   static void KeepAlive(int sock);
Packit Service a2489d
   static void MinimizeLatency(int sock);
Packit Service a2489d
   static void MaximizeThroughput(int sock);
Packit Service a2489d
   static void ReuseAddress(int sock);
Packit Service a2489d
   static int SocketBuffered(int sock);
Packit Service a2489d
   static const char *SocketNumericAddress(const sockaddr_u *u) { return u->address(); }
Packit Service a2489d
   static int SocketPort(const sockaddr_u *u) { return u->port(); }
Packit Service a2489d
   static socklen_t SocketAddrLen(const sockaddr_u *u) { return u->addr_len(); }
Packit Service a2489d
   static int SocketConnect(int fd,const sockaddr_u *u);
Packit Service a2489d
   static int SocketAccept(int fd,sockaddr_u *u,const char *hostname=0);
Packit Service a2489d
   static void SetSocketBuffer(int sock,int socket_buffer);
Packit Service a2489d
   static void SetSocketMaxseg(int sock,int socket_maxseg);
Packit Service a2489d
   static void SocketBindStd(int s,int af,const char *hostname,int port=0);
Packit Service a2489d
   static int SocketCreate(int af,int type,int proto,const char *hostname);
Packit Service a2489d
   static void SocketTuneTCP(int s,const char *hostname);
Packit Service a2489d
   static int SocketCreateTCP(int af,const char *hostname);
Packit Service a2489d
   static int SocketCreateUnbound(int af,int type,int proto,const char *hostname);
Packit Service a2489d
   static int SocketCreateUnboundTCP(int af,const char *hostname);
Packit Service a2489d
   static void SocketSinglePF(int sock,int pf);
Packit Service a2489d
};
Packit Service a2489d
Packit Service a2489d
#endif //NETWORK_H