summaryrefslogtreecommitdiff
path: root/src/htslib.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/htslib.h')
-rw-r--r--src/htslib.h339
1 files changed, 339 insertions, 0 deletions
diff --git a/src/htslib.h b/src/htslib.h
new file mode 100644
index 0000000..9b2aca3
--- /dev/null
+++ b/src/htslib.h
@@ -0,0 +1,339 @@
+/* ------------------------------------------------------------ */
+/*
+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: Subroutines .h */
+/* Author: Xavier Roche */
+/* ------------------------------------------------------------ */
+
+// Fichier librairie .h
+
+#ifndef HTS_DEFH
+#define HTS_DEFH
+
+/* définitions globales */
+#include "htsglobal.h"
+
+/* basic net definitions */
+#include "htsbasenet.h"
+
+/* cookies et auth */
+#include "htsbauth.h"
+
+// Attention, définition existante également dans le shell
+// (à modifier avec celle-ci)
+#define POSTTOK "?>post"
+
+#include <stdio.h>
+
+#include "htsopt.h"
+
+// structure pour paramètres supplémentaires lors de la requête
+typedef struct {
+ short int user_agent_send; // user agent (ex: httrack/1.0 [sun])
+ short int http11; // l'en tête peut (doit) être signé HTTP/1.1 et non HTTP/1.0
+ short int range_used; // Range utilisé
+ short int nocompression; // Pas de compression
+ char user_agent[64];
+ char lang_iso[64];
+ t_proxy proxy; // proxy
+} htsrequest;
+
+
+// structure pour retour d'une connexion/prise d'en tête
+typedef struct {
+ int statuscode; // status-code, -1=erreur, 200=OK,201=..etc (cf RFC1945)
+ short int notmodified; // page ou fichier NON modifié (transféré)
+ short int is_write; // sortie sur disque (out) ou en mémoire (adr)
+ short int is_chunk; // mode chunk
+ short int compressed; // compressé?
+ char* adr; // adresse du bloc de mémoire, NULL=vide
+ FILE* out; // écriture directe sur disque (si is_write=1)
+ LLint size; // taille fichier
+ char msg[80]; // message éventuel si échec ("\0"=non précisé)
+ char contenttype[64]; // content-type ("text/html" par exemple)
+ char contentencoding[64]; // content-encoding ("gzip" par exemple)
+ char* location; // on copie dedans éventuellement la véritable 'location'
+ LLint totalsize; // taille totale à télécharger (-1=inconnue)
+ short int is_file; // ce n'est pas une socket mais un descripteur de fichier si 1
+ T_SOC soc; // ID socket
+ FILE* fp; // fichier pour file://
+#if HTS_USEOPENSSL
+ short int ssl; // is this connection a SSL one? (https)
+ // BIO* ssl_soc; // SSL structure
+ SSL * ssl_con; // connection structure
+#endif
+ char lastmodified[64]; // Last-Modified
+ char etag[64]; // Etag
+ char cdispo[256]; // Content-Disposition coupé
+ LLint crange; // Content-Range
+ /* */
+ htsrequest req; // paramètres pour la requête
+ /*char digest[32+2]; // digest md5 généré par le moteur ("" si non généré)*/
+} htsblk;
+
+
+/* ANCIENNE STURCTURE pour cache 1.0 */
+typedef struct {
+ int statuscode; // ANCIENNE STURCTURE - status-code, -1=erreur, 200=OK,201=..etc (cf RFC1945)
+ int notmodified; // ANCIENNE STURCTURE - page ou fichier NON modifié (transféré)
+ int is_write; // ANCIENNE STURCTURE - sortie sur disque (out) ou en mémoire (adr)
+ char* adr; // ANCIENNE STURCTURE - adresse du bloc de mémoire, NULL=vide
+ FILE* out; // ANCIENNE STURCTURE - écriture directe sur disque (si is_write=1)
+ int size; // ANCIENNE STURCTURE - taille fichier
+ char msg[80]; // ANCIENNE STURCTURE - message éventuel si échec ("\0"=non précisé)
+ char contenttype[64]; // ANCIENNE STURCTURE - content-type ("text/html" par exemple)
+ char* location; // ANCIENNE STURCTURE - on copie dedans éventuellement la véritable 'location'
+ int totalsize; // ANCIENNE STURCTURE - taille totale à télécharger (-1=inconnue)
+ int is_file; // ANCIENNE STURCTURE - ce n'est pas une socket mais un descripteur de fichier si 1
+ T_SOC soc; // ANCIENNE STURCTURE - ID socket
+ FILE* fp; // ANCIENNE STURCTURE - fichier pour file://
+ t_proxy proxy; // ANCIENNE STURCTURE - proxy
+ int user_agent_send; // ANCIENNE STURCTURE - user agent (ex: httrack/1.0 [sun])
+ char user_agent[64];
+ int http11; // ANCIENNE STURCTURE - l'en tête doit être signé HTTP/1.1 et non HTTP/1.0
+} OLD_htsblk;
+/* fin ANCIENNE STURCTURE pour cache 1.0 */
+
+// cache pour le dns, pour éviter de faire des gethostbyname sans arrêt
+typedef struct t_dnscache {
+ char iadr[1024];
+ struct t_dnscache* n;
+ char host_addr[HTS_MAXADDRLEN]; // 4 octets (v4), ou 16 octets (v6)
+ int host_length; // 4 normalement - ==0 alors en cours de résolution
+ // ou >16 si sockaddr
+ // ==-1 alors erreur (host n'éxiste pas)
+} t_dnscache;
+
+
+
+
+/*
+#ifdef __cplusplus
+extern "C" {
+#endif
+*/
+
+// fonctions unix/winsock
+int hts_read(htsblk* r,char* buff,int size);
+//int HTS_TOTAL_RECV_CHECK(int var);
+LLint check_downloadable_bytes(int rate);
+
+int hts_init(void);
+int hts_uninit(void);
+
+
+// fonctions principales
+int http_fopen(char* adr,char* fil,htsblk* retour);
+int http_xfopen(int mode,int treat,int waitconnect,char* xsend,char* adr,char* fil,htsblk* retour);
+int http_sendhead(t_cookie* cookie,int mode,char* xsend,char* adr,char* fil,char* referer_adr,char* referer_fil,htsblk* retour);
+htsblk httpget(char* url);
+//int newhttp(char* iadr,char* err=NULL);
+int newhttp(char* iadr,htsblk* retour,int port,int waitconnect);
+HTS_INLINE void deletehttp(htsblk* r);
+HTS_INLINE void deletesoc(T_SOC soc);
+HTS_INLINE void deletesoc_r(htsblk* r);
+htsblk http_location(char* adr,char* fil,char* loc);
+htsblk http_test(char* adr,char* fil,char* loc);
+int check_readinput(htsblk* r);
+void http_fread(T_SOC soc,htsblk* retour);
+LLint http_fread1(htsblk* r);
+void treathead(t_cookie* cookie,char* adr,char* fil,htsblk* retour,char* rcvd);
+void treatfirstline(htsblk* retour,char* rcvd);
+void infostatuscode(char* msg,int statuscode);
+
+// sous-fonctions
+htsblk xhttpget(char* adr,char* fil);
+htsblk http_gethead(char* adr,char* fil);
+LLint http_xfread1(htsblk* r,int bufl);
+HTS_INLINE t_hostent* hts_gethostbyname(char* iadr, void* v_buffer);
+t_hostent* vxgethostbyname(char* hostname, void* v_buffer);
+t_hostent* _hts_ghbn(t_dnscache* cache,char* iadr,t_hostent* retour);
+int ftp_available(void);
+#if HTS_DNSCACHE
+int hts_dnstest(char* _iadr);
+t_dnscache* _hts_cache(void);
+int _hts_lockdns(int i);
+#endif
+
+// outils divers
+HTS_INLINE TStamp time_local(void);
+HTS_INLINE TStamp mtime_local(void);
+void sec2str(char *s,TStamp t);
+void qsec2str(char *st,TStamp t);
+void time_gmt_rfc822(char* s);
+void time_local_rfc822(char* s);
+struct tm* convert_time_rfc822(char* s);
+int set_filetime(char* file,struct tm* tm_time);
+int set_filetime_rfc822(char* file,char* date);
+HTS_INLINE void time_rfc822(char* s,struct tm * A);
+HTS_INLINE void time_rfc822_local(char* s,struct tm * A);
+char* int2char(int n);
+char* int2bytes(LLint n);
+char* int2bytessec(long int n);
+char** int2bytes2(LLint n);
+HTS_INLINE int sendc(htsblk* r, char* s);
+void finput(int fd,char* s,int max);
+int binput(char* buff,char* s,int max);
+int linput(FILE* fp,char* s,int max);
+int linput_trim(FILE* fp,char* s,int max);
+int linput_cpp(FILE* fp,char* s,int max);
+void rawlinput(FILE* fp,char* s,int max);
+int strfield(const char* f,const char* s);
+#define strfield2(f,s) ( (strlen(f)!=strlen(s)) ? 0 : (strfield(f,s)) )
+char* strstrcase(char *s,char *o);
+int ident_url_absolute(char* url,char* adr,char* fil);
+void fil_simplifie(char* f);
+int is_unicode_utf8(unsigned char* buffer, unsigned int size);
+void map_characters(unsigned char* buffer, unsigned int size, unsigned int* map);
+int ishtml(char* urlfil);
+int ishtml_ext(char* a);
+int ishttperror(int err);
+void guess_httptype(char *s,char *fil);
+void get_httptype(char *s,char *fil,int flag);
+int get_userhttptype(int setdefs,char *s,char *ext);
+void give_mimext(char *s,char *st);
+int is_knowntype(char *fil);
+int is_userknowntype(char *fil);
+int is_dyntype(char *fil);
+char* get_ext(char *fil);
+int may_unknown(char* st);
+char* jump_identification(char*);
+char* jump_toport(char*);
+char* strrchr_limit(char* s, char c, char* limit);
+HTS_INLINE char* jump_protocol(char* source);
+void code64(char* a,char* b);
+void unescape_amp(char* s);
+void escape_spc_url(char* s);
+void escape_in_url(char* s);
+void escape_uri(char* s);
+void escape_uri_utf(char* s);
+void escape_check_url(char* s);
+char* escape_check_url_addr(char* s);
+void x_escape_http(char* s,int mode);
+HTS_INLINE int ehexh(char c);
+char* unescape_http(char* s);
+char* unescape_http_unharm(char* s, int no_high);
+char* antislash_unescaped(char* s);
+int ehex(char* s);
+char* concat(const char* a,const char* b);
+#define copychar(a) concat((a),NULL)
+#if HTS_DOSNAME
+char* fconcat(char* a,char* b);
+char* fconv(char* a);
+#else
+#define fconv(a) (a)
+#define fconcat(a,b) concat(a,b)
+#endif
+char* fslash(char* a);
+char* __fslash(char* a);
+
+char* convtolower(char* a);
+char* concat(const char* a,const char* b);
+void hts_lowcase(char* s);
+void hts_replace(char *s,char from,char to);
+
+/* Spaces: CR,LF,TAB,FF */
+#define is_space(c) ( ((c)==' ') || ((c)=='\"') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)=='\'') )
+#define is_realspace(c) ( ((c)==' ') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) )
+#define is_taborspace(c) ( ((c)==' ') || ((c)==9) )
+#define is_quote(c) ( ((c)=='\"') || ((c)=='\'') )
+//HTS_INLINE int is_space(char);
+//HTS_INLINE int is_realspace(char);
+
+void fprintfio(FILE* fp,char* buff,char* prefix);
+
+#if HTS_WIN
+#else
+int sig_ignore_flag( int setflag ); // flag ignore
+#endif
+
+void cut_path(char* fullpath,char* path,char* pname);
+int fexist(char* s);
+/*LLint fsize(char* s); */
+int fpsize(FILE* fp);
+int fsize(char* s);
+/* root dir */
+char* hts_rootdir(char* file);
+
+// Threads
+#if USE_PTHREAD
+typedef void* ( *beginthread_type )( void * );
+unsigned long _beginthread( beginthread_type start_address, unsigned stack_size, void *arglist );
+#endif
+
+/*
+#ifdef __cplusplus
+}
+#endif
+*/
+
+
+
+/* variables globales */
+//extern LLint HTS_TOTAL_RECV; // flux entrant reçu
+//extern int HTS_TOTAL_RECV_STATE; // status: 0 tout va bien 1: ralentir un peu 2: ralentir 3: beaucoup
+extern hts_stat_struct HTS_STAT;
+extern int _DEBUG_HEAD;
+extern FILE* ioinfo;
+
+/* constantes */
+extern const char hts_mime_keep[][32];
+extern const char hts_mime[][2][32];
+extern const char hts_detect[][32];
+extern const char hts_detectbeg[][32];
+extern const char hts_nodetect[][32];
+extern const char hts_detectURL[][32];
+extern const char hts_detectandleave[][32];
+extern const char hts_detect_js[][32];
+
+// defaut wrappers
+void __cdecl htsdefault_init(void);
+void __cdecl htsdefault_uninit(void);
+int __cdecl htsdefault_start(void* opt);
+int __cdecl htsdefault_chopt(void* opt);
+int __cdecl htsdefault_end(void);
+int __cdecl htsdefault_checkhtml(char* html,int len,char* url_adresse,char* url_fichier);
+int __cdecl htsdefault_loop(void* back,int back_max,int back_index,int lien_n,int lien_tot,int stat_time,hts_stat_struct* stats);
+char* __cdecl htsdefault_query(char* question);
+char* __cdecl htsdefault_query2(char* question);
+char* __cdecl htsdefault_query3(char* question);
+int __cdecl htsdefault_check(char* adr,char* fil,int status);
+void __cdecl htsdefault_pause(char* lockfile);
+void __cdecl htsdefault_filesave(char*);
+int __cdecl htsdefault_linkdetected(char* link);
+int __cdecl htsdefault_xfrstatus(void* back);
+int __cdecl htsdefault_savename(char* adr_complete,char* fil_complete,char* referer_adr,char* referer_fil,char* save);
+// end defaut wrappers
+
+#endif
+
+