summaryrefslogtreecommitdiff
path: root/src/htsnet.h
diff options
context:
space:
mode:
authorXavier Roche <xroche@users.noreply.github.com>2012-03-19 12:36:11 +0000
committerXavier Roche <xroche@users.noreply.github.com>2012-03-19 12:36:11 +0000
commitad5b7acc19290ff91e0f42a0de448a26760fcf99 (patch)
tree2d1867758835fd0c4e443ff3cc7e5c774af85874 /src/htsnet.h
Imported httrack 3.20.2
Diffstat (limited to 'src/htsnet.h')
-rw-r--r--src/htsnet.h242
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
+
+