|
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
|