diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2012-03-19 12:36:11 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2012-03-19 12:36:11 +0000 |
commit | ad5b7acc19290ff91e0f42a0de448a26760fcf99 (patch) | |
tree | 2d1867758835fd0c4e443ff3cc7e5c774af85874 /src/htsnet.h |
Imported httrack 3.20.2
Diffstat (limited to 'src/htsnet.h')
-rw-r--r-- | src/htsnet.h | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/src/htsnet.h b/src/htsnet.h new file mode 100644 index 0000000..d12b1e4 --- /dev/null +++ b/src/htsnet.h @@ -0,0 +1,242 @@ +/* ------------------------------------------------------------ */ +/* +HTTrack Website Copier, Offline Browser for Windows and Unix +Copyright (C) Xavier Roche and other contributors + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +Important notes: + +- We hereby ask people using this source NOT to use it in purpose of grabbing +emails addresses, or collecting any other private information on persons. +This would disgrace our work, and spoil the many hours we spent on it. + + +Please visit our Website: http://www.httrack.com +*/ + + +/* ------------------------------------------------------------ */ +/* File: Net definitions */ +/* Used in .c files that needs connect() functions and so */ +/* Note: includes htsbasenet.h */ +/* Author: Xavier Roche */ +/* ------------------------------------------------------------ */ + +#ifndef HTS_DEFNETH +#define HTS_DEFNETH + +/* basic net definitions */ +#include "htsbasenet.h" + +#include <ctype.h> +#if HTS_WIN + // pour read + #include <io.h> + // pour FindFirstFile + #include <winbase.h> +#else + //typedef int T_SOC; + #define INVALID_SOCKET -1 + #include <netdb.h> + #include <sys/types.h> + #include <sys/socket.h> + #include <netinet/in.h> + #include <sys/time.h> + #include <sys/ioctl.h> + /* gethostname & co */ + #include <unistd.h> + /* inet_addr */ + #include <arpa/inet.h> + // pas la peine normalement.. +#if HTS_PLATFORM!=3 + #include <sys/filio.h> +#else +#ifndef HTS_DO_NOT_REDEFINE_in_addr_t + typedef unsigned long in_addr_t; +#endif +#endif +#ifndef min + #define min(a,b) ((a)>(b)?(b):(a)) + #define max(a,b) ((a)>(b)?(a):(b)) +#endif +#define Sleep(a) { if (((a)*1000)%1000000) usleep(((a)*1000)%1000000); if (((a)*1000)/1000000) sleep(((a)*1000)/1000000); } +#endif + +/* + ** ipV4 ** +*/ +#if HTS_INET6==0 + +/* Ipv4 structures */ +typedef struct in_addr INaddr; +/* This should handle all cases */ +typedef struct { + union { + struct sockaddr_in in; + struct sockaddr sa; + unsigned char v4data[4]; + unsigned char v6data[16]; + unsigned char pad[128]; + } m_addr; +} SOCaddr; + +/* Ipv4 structure members */ +#define SOCaddr_sinaddr(server) ((server).m_addr.in.sin_addr) +#define SOCaddr_sinfamily(server) ((server).m_addr.in.sin_family) +#define SOCaddr_sinport(server) ((server).m_addr.in.sin_port) + +/* AF_xx */ +#define AFinet AF_INET + +/* Set port to sockaddr structure */ +#define SOCaddr_initport(server, port) do { \ + SOCaddr_sinport(server) = htons((unsigned short int) (port)); \ +} while(0) + +/* Copy sockaddr to another one */ +#define SOCaddr_copyaddr(server, server_len, hpaddr, hpsize) do { \ +if (hpsize == sizeof(struct sockaddr_in)) { \ + server_len=sizeof(struct sockaddr_in); \ + SOCaddr_sinfamily(server) = (*(struct sockaddr_in*)(hpaddr)).sin_family; \ + memcpy(&SOCaddr_sinaddr(server), &(*(struct sockaddr_in*)(hpaddr)).sin_addr, sizeof(SOCaddr_sinaddr(server))); \ +} else if (hpsize == 4) {\ + server_len=sizeof(struct sockaddr_in); \ + SOCaddr_sinfamily(server) = AF_INET; \ + memcpy(&SOCaddr_sinaddr(server), (hpaddr), sizeof(SOCaddr_sinaddr(server))); \ +} else if ((hpsize > 0) && (hpsize <= sizeof(server))) { \ + server_len=hpsize; \ + memcpy(&(server), hpaddr, hpsize); \ +} else { \ + server_len=0; \ +} \ +} while(0) + +/* Get dotted address */ +#define SOCaddr_inetntoa(namebuf, namebuflen, ss, sslen) do { \ +char* dot = (char*) inet_ntoa(SOCaddr_sinaddr(ss)); \ +(namebuf)[0]='\0'; \ +if (dot) { \ +strcpy(namebuf, dot); \ +} \ +} while(0) + +/* Get protocol ID */ +#define SOCaddr_getproto(ss, sslen) ('1') + +/* + ** ipV6 ** +*/ +#else + +/* Ipv4 structures */ +typedef struct in6_addr INaddr; +/* This should handle all cases */ +typedef struct { + union { + struct sockaddr_in6 in6; + struct sockaddr_in in; + struct sockaddr sa; + unsigned char v4data[4]; + unsigned char v6data[16]; + unsigned char pad[128]; + } m_addr; +} SOCaddr; + +/* Ipv4 structure members */ +#define SOCaddr_sinaddr(server) ((server).m_addr.in6.sin6_addr) +#define SOCaddr_sinfamily(server) ((server).m_addr.in6.sin6_family) +#define SOCaddr_sinport(server) ((server).m_addr.in6.sin6_port) +#define SOCaddr_sinflowinfo(server) ((server).m_addr.in6.sin6_flowinfo) +/* #define SOCaddr_sinscopeid(a) ((a).m_addr.in6.sin6_scope_id) */ + +/* AF_xx */ +#define AFinet AF_INET6 + +/* Set port to sockaddr structure */ +#define SOCaddr_initport(server, port) do { \ + SOCaddr_sinport(server) = htons((unsigned short int) (port)); \ +} while(0) + +/* + Copy sockaddr to SOCaddr + + Note; + The '> sizeof(struct sockaddr_in6)' hack if for the VC6 structure which + lacks the scope id +*/ +#define SOCaddr_copyaddr(server, server_len, hpaddr, hpsize) do { \ +if (hpsize == sizeof(struct sockaddr_in6)) { \ + server_len=sizeof(struct sockaddr_in6); \ + SOCaddr_sinfamily(server) = (*(struct sockaddr_in6*)(hpaddr)).sin6_family; \ + SOCaddr_sinflowinfo(server) = (*(struct sockaddr_in6*)(hpaddr)).sin6_flowinfo; \ + memcpy(&SOCaddr_sinaddr(server), &(*(struct sockaddr_in6*)(hpaddr)).sin6_addr, sizeof(SOCaddr_sinaddr(server))); \ +} else if (hpsize > sizeof(struct sockaddr_in6)) { \ + server_len=hpsize; \ + memcpy(&(server), hpaddr, hpsize); \ +} else if (hpsize == sizeof(struct sockaddr_in)) { \ + server_len=sizeof(struct sockaddr_in); \ + (*(struct sockaddr_in*)(&server)).sin_family = AF_INET; \ + memcpy(&(*(struct sockaddr_in*)&(server)).sin_addr, &(*(struct sockaddr_in*)(hpaddr)).sin_addr, sizeof((*(struct sockaddr_in*)(hpaddr)).sin_addr)); \ +} else if (hpsize == 4) {\ + server_len=sizeof(struct sockaddr_in); \ + (*(struct sockaddr_in*)(&server)).sin_family = AF_INET; \ + memcpy(&(*(struct sockaddr_in*)&(server)).sin_addr, hpaddr, 4); \ +} else if (hpsize == 16) {\ + server_len=sizeof(struct sockaddr_in6); \ + SOCaddr_sinfamily(server) = AF_INET6; \ + memcpy(&SOCaddr_sinaddr(server), (hpaddr), 16); \ +} else if ((hpsize > 0) && (hpsize <= sizeof(server))) { \ + server_len=hpsize; \ + memcpy(&(server), hpaddr, hpsize); \ +} else { \ + server_len=0; \ +} \ +} while(0) + +/* Get dotted address */ +#define SOCaddr_inetntoa(namebuf, namebuflen, ss, sslen) do { \ +(namebuf)[0]='\0'; \ +getnameinfo((struct sockaddr *)&(ss), sslen, \ + (namebuf), namebuflen, NULL, 0, NI_NUMERICHOST); \ +} while(0) + +/* Get protocol ID */ +#define SOCaddr_getproto(ss, sslen) ((sslen == sizeof(struct sockaddr_in6))?('2'):('1')) + +#endif + +/* Buffer structure to copy various hostent structures */ +typedef struct { + t_hostent hp; + char* list[2]; + char addr[HTS_MAXADDRLEN]; /* various struct sockaddr structures */ + unsigned int addr_maxlen; +} t_fullhostent; + +/* Initialize a t_fullhostent structure */ +#define fullhostent_init(h) do { \ +memset((h), 0, sizeof(t_fullhostent)); \ +(h)->hp.h_addr_list = (char **) & ((h)->list); \ +(h)->list[0] = (char *) & ((h)->addr); \ +(h)->list[1] = NULL; \ +(h)->addr_maxlen = HTS_MAXADDRLEN; \ +} while(0) + + +#endif + + |