summaryrefslogtreecommitdiff
path: root/src/httrack.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/httrack.c')
-rw-r--r--src/httrack.c377
1 files changed, 247 insertions, 130 deletions
diff --git a/src/httrack.c b/src/httrack.c
index e2b6729..778ca41 100644
--- a/src/httrack.c
+++ b/src/httrack.c
@@ -46,23 +46,24 @@ Please visit our Website: http://www.httrack.com
#include "htsglobal.h"
#include "htsbase.h"
#include "htsopt.h"
+#include "htsdefines.h"
#include "httrack.h"
+#include "htslib.h"
/* Static definitions */
-static int fexist(char* s);
+static int fexist(const char* s);
static int linput(FILE* fp,char* s,int max);
// htswrap_add
#include "htswrap.h"
-#if HTS_ANALYSTE_CONSOLE
-
/* specific definitions */
//#include "htsbase.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <signal.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
@@ -75,6 +76,34 @@ static int linput(FILE* fp,char* s,int max);
#include <ctype.h>
/* END specific definitions */
+static void __cdecl htsshow_init(t_hts_callbackarg *carg);
+static void __cdecl htsshow_uninit(t_hts_callbackarg *carg);
+static int __cdecl htsshow_start(t_hts_callbackarg *carg, httrackp* opt);
+static int __cdecl htsshow_chopt(t_hts_callbackarg *carg, httrackp* opt);
+static int __cdecl htsshow_end(t_hts_callbackarg *carg, httrackp* opt);
+static int __cdecl htsshow_preprocesshtml(t_hts_callbackarg *carg, httrackp *opt, char** html,int* len,const char* url_address,const char* url_file);
+static int __cdecl htsshow_postprocesshtml(t_hts_callbackarg *carg, httrackp *opt, char** html,int* len,const char* url_address,const char* url_file);
+static int __cdecl htsshow_checkhtml(t_hts_callbackarg *carg, httrackp *opt, char* html,int len,const char* url_address,const char* url_file);
+static int __cdecl htsshow_loop(t_hts_callbackarg *carg, httrackp *opt, lien_back* back,int back_max,int back_index,int lien_n,int lien_tot,int stat_time,hts_stat_struct* stats);
+static const char* __cdecl htsshow_query(t_hts_callbackarg *carg, httrackp *opt, const char* question);
+static const char* __cdecl htsshow_query2(t_hts_callbackarg *carg, httrackp *opt, const char* question);
+static const char* __cdecl htsshow_query3(t_hts_callbackarg *carg, httrackp *opt, const char* question);
+static int __cdecl htsshow_check(t_hts_callbackarg *carg, httrackp *opt, const char* adr,const char* fil,int status);
+static int __cdecl htsshow_check_mime(t_hts_callbackarg *carg, httrackp *opt, const char* adr,const char* fil,const char* mime,int status);
+static void __cdecl htsshow_pause(t_hts_callbackarg *carg, httrackp *opt, const char* lockfile);
+static void __cdecl htsshow_filesave(t_hts_callbackarg *carg, httrackp *opt, const char* file);
+static void __cdecl htsshow_filesave2(t_hts_callbackarg *carg, httrackp *opt, const char* adr, const char* fil, const char* save, int is_new, int is_modified,int not_updated);
+static int __cdecl htsshow_linkdetected(t_hts_callbackarg *carg, httrackp *opt, char* link);
+static int __cdecl htsshow_linkdetected2(t_hts_callbackarg *carg, httrackp *opt, char* link, const char* start_tag);
+static int __cdecl htsshow_xfrstatus(t_hts_callbackarg *carg, httrackp *opt, lien_back* back);
+static int __cdecl htsshow_savename(t_hts_callbackarg *carg, httrackp *opt, const char* adr_complete,const char* fil_complete,const char* referer_adr,const char* referer_fil,char* save);
+static int __cdecl htsshow_sendheader(t_hts_callbackarg *carg, httrackp *opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* outgoing);
+static int __cdecl htsshow_receiveheader(t_hts_callbackarg *carg, httrackp *opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* incoming);
+
+static void vt_color(int text,int back);
+static void vt_clear(void);
+static void vt_home(void);
+
// ISO VT100/220 definitions
#define VT_COL_TEXT_BLACK "30"
#define VT_COL_TEXT_RED "31"
@@ -131,100 +160,14 @@ static void vt_home(void) {
#define MAX_LEN_INPROGRESS 40
static int use_show;
+static httrackp *global_opt = NULL;
+
+static void signal_handlers(void);
int main(int argc, char **argv) {
int ret = 0;
- hts_init();
+ httrackp *opt;
- /*
- hts_htmlcheck_init = (t_hts_htmlcheck_init) htswrap_read("init");
-Log: "engine: init"
-
- hts_htmlcheck_uninit = (t_hts_htmlcheck_uninit) htswrap_read("free");
-Log: "engine: free"
-
- hts_htmlcheck_start = (t_hts_htmlcheck_start) htswrap_read("start");
-Log: "engine: start"
-
- hts_htmlcheck_end = (t_hts_htmlcheck_end) htswrap_read("end");
-Log: "engine: end"
-
- hts_htmlcheck_chopt = (t_hts_htmlcheck_chopt) htswrap_read("change-options");
-Log: "engine: change-options"
-
- hts_htmlcheck_preprocess = (t_hts_htmlcheck_process) htswrap_read("preprocess-html");
-Log: "preprocess-html: <url>"
-
- hts_htmlcheck_postprocess = (t_hts_htmlcheck_process) htswrap_read("postprocess-html");
-Log: "postprocess-html: <url>"
-
-hts_htmlcheck = (t_hts_htmlcheck) htswrap_read("check-html");
-Log: "check-html: <url>"
-
- hts_htmlcheck_query = (t_hts_htmlcheck_query) htswrap_read("query");
- hts_htmlcheck_query2 = (t_hts_htmlcheck_query2) htswrap_read("query2");
- hts_htmlcheck_query3 = (t_hts_htmlcheck_query3) htswrap_read("query3");
- hts_htmlcheck_loop = (t_hts_htmlcheck_loop) htswrap_read("loop");
- hts_htmlcheck_check = (t_hts_htmlcheck_check) htswrap_read("check-link");
- hts_htmlcheck_check_mime = (t_hts_htmlcheck_check_mime) htswrap_read("check-mime");
-Log: none
-
- hts_htmlcheck_pause = (t_hts_htmlcheck_pause) htswrap_read("pause");
-Log: "pause: <lockfile>"
-
- hts_htmlcheck_filesave = (t_hts_htmlcheck_filesave) htswrap_read("save-file");
- hts_htmlcheck_filesave2 = (t_hts_htmlcheck_filesave2) htswrap_read("save-file2");
- hts_htmlcheck_linkdetected = (t_hts_htmlcheck_linkdetected) htswrap_read("link-detected");
- hts_htmlcheck_linkdetected2 = (t_hts_htmlcheck_linkdetected2) htswrap_read("link-detected2");
-Log: none
-
- hts_htmlcheck_xfrstatus = (t_hts_htmlcheck_xfrstatus) htswrap_read("transfer-status");
-Log:
- "engine: transfer-status: link updated: <url> -> <file>"
- | "engine: transfer-status: link added: <url> -> <file>"
- | "engine: transfer-status: link recorded: <url> -> <file>"
- | "engine: transfer-status: link link error (<errno>, '<err_msg>'): <url>"
- hts_htmlcheck_savename = (t_hts_htmlcheck_savename ) htswrap_read("save-name");
-Log:
- "engine: save-name: local name: <url> -> <file>"
-*/
-
- htswrap_add("init",htsshow_init);
- htswrap_add("free",htsshow_uninit);
- htswrap_add("start",htsshow_start);
- htswrap_add("change-options",htsshow_chopt);
- htswrap_add("end",htsshow_end);
- htswrap_add("preprocess-html",htsshow_preprocesshtml);
- htswrap_add("postprocess-html",htsshow_preprocesshtml);
- htswrap_add("check-html",htsshow_checkhtml);
- htswrap_add("loop",htsshow_loop);
- htswrap_add("query",htsshow_query);
- htswrap_add("query2",htsshow_query2);
- htswrap_add("query3",htsshow_query3);
- htswrap_add("check-link",htsshow_check);
- htswrap_add("check-mime",htsshow_check_mime);
- htswrap_add("pause",htsshow_pause);
- htswrap_add("save-file",htsshow_filesave);
- htswrap_add("save-file2",htsshow_filesave2);
- htswrap_add("link-detected",htsshow_linkdetected);
- htswrap_add("link-detected2",htsshow_linkdetected2);
- htswrap_add("transfer-status",htsshow_xfrstatus);
- htswrap_add("save-name",htsshow_savename);
- htswrap_add("send-header", htsshow_sendheader);
- htswrap_add("receive-header", htsshow_receiveheader);
-
- ret = hts_main(argc,argv);
- if (ret) {
- fprintf(stderr, "* %s\n", hts_errmsg());
- }
- return ret;
-}
-
-
-/* CALLBACK FUNCTIONS */
-
-/* Initialize the Winsock */
-static void __cdecl htsshow_init(void) {
#ifdef _WIN32
{
WORD wVersionRequested; // requested version WinSock API
@@ -243,13 +186,59 @@ static void __cdecl htsshow_init(void) {
}
#endif
-}
-static void __cdecl htsshow_uninit(void) {
+ signal_handlers();
+ hts_init();
+ opt = global_opt = hts_create_opt();
+
+ CHAIN_FUNCTION(opt, init, htsshow_init, NULL);
+ CHAIN_FUNCTION(opt, uninit, htsshow_uninit, NULL);
+ CHAIN_FUNCTION(opt, start, htsshow_start, NULL);
+ CHAIN_FUNCTION(opt, end, htsshow_end, NULL);
+ CHAIN_FUNCTION(opt, chopt, htsshow_chopt, NULL);
+ CHAIN_FUNCTION(opt, preprocess, htsshow_preprocesshtml, NULL);
+ CHAIN_FUNCTION(opt, postprocess, htsshow_postprocesshtml, NULL);
+ CHAIN_FUNCTION(opt, check_html, htsshow_checkhtml, NULL);
+ CHAIN_FUNCTION(opt, query, htsshow_query, NULL);
+ CHAIN_FUNCTION(opt, query2, htsshow_query2, NULL);
+ CHAIN_FUNCTION(opt, query3, htsshow_query3, NULL);
+ CHAIN_FUNCTION(opt, loop, htsshow_loop, NULL);
+ CHAIN_FUNCTION(opt, check_link, htsshow_check, NULL);
+ CHAIN_FUNCTION(opt, check_mime, htsshow_check_mime, NULL);
+ CHAIN_FUNCTION(opt, pause, htsshow_pause, NULL);
+ CHAIN_FUNCTION(opt, filesave, htsshow_filesave, NULL);
+ CHAIN_FUNCTION(opt, filesave2, htsshow_filesave2, NULL);
+ CHAIN_FUNCTION(opt, linkdetected, htsshow_linkdetected, NULL);
+ CHAIN_FUNCTION(opt, linkdetected2, htsshow_linkdetected2, NULL);
+ CHAIN_FUNCTION(opt, xfrstatus, htsshow_xfrstatus, NULL);
+ CHAIN_FUNCTION(opt, savename, htsshow_savename, NULL);
+ CHAIN_FUNCTION(opt, sendhead, htsshow_sendheader, NULL);
+ CHAIN_FUNCTION(opt, receivehead, htsshow_receiveheader, NULL);
+
+ ret = hts_main2(argc, argv, opt);
+ if (ret) {
+ fprintf(stderr, "* %s\n", hts_errmsg(opt));
+ }
+ global_opt = NULL;
+ hts_free_opt(opt);
+ htsthread_wait(); /* wait for pending threads */
+ hts_uninit();
+
#ifdef _WIN32
WSACleanup();
#endif
+
+ return ret;
+}
+
+
+/* CALLBACK FUNCTIONS */
+
+/* Initialize the Winsock */
+static void __cdecl htsshow_init(t_hts_callbackarg *carg) {
+}
+static void __cdecl htsshow_uninit(t_hts_callbackarg *carg) {
}
-static int __cdecl htsshow_start(httrackp* opt) {
+static int __cdecl htsshow_start(t_hts_callbackarg *carg, httrackp* opt) {
use_show=0;
if (opt->verbosedisplay==2) {
use_show=1;
@@ -257,19 +246,22 @@ static int __cdecl htsshow_start(httrackp* opt) {
}
return 1;
}
-static int __cdecl htsshow_chopt(httrackp* opt) {
- return htsshow_start(opt);
+static int __cdecl htsshow_chopt(t_hts_callbackarg *carg, httrackp* opt) {
+ return htsshow_start(carg, opt);
}
-static int __cdecl htsshow_end(void) {
+static int __cdecl htsshow_end(t_hts_callbackarg *carg, httrackp* opt) {
return 1;
}
-static int __cdecl htsshow_preprocesshtml(char** html,int* len,char* url_adresse,char* url_fichier) {
+static int __cdecl htsshow_preprocesshtml(t_hts_callbackarg *carg, httrackp *opt, char** html,int* len,const char* url_address,const char* url_file) {
return 1;
}
-static int __cdecl htsshow_checkhtml(char* html,int len,char* url_adresse,char* url_fichier) {
+static int __cdecl htsshow_postprocesshtml(t_hts_callbackarg *carg, httrackp *opt, char** html,int* len,const char* url_address,const char* url_file) {
return 1;
}
-static int __cdecl htsshow_loop(lien_back* back,int back_max,int back_index,int lien_n,int lien_tot,int stat_time, hts_stat_struct* stats) { // appelé à chaque boucle de HTTrack
+static int __cdecl htsshow_checkhtml(t_hts_callbackarg *carg, httrackp *opt, char* html,int len,const char* url_address,const char* url_file) {
+ return 1;
+}
+static int __cdecl htsshow_loop(t_hts_callbackarg *carg, httrackp *opt, lien_back* back,int back_max,int back_index,int lien_n,int lien_tot,int stat_time, hts_stat_struct* stats) { // appelé à chaque boucle de HTTrack
static TStamp prev_mytime=0; /* ok */
static t_InpInfo SInfo; /* ok */
//
@@ -329,6 +321,7 @@ static int __cdecl htsshow_loop(lien_back* back,int back_max,int back_index,int
if ( ((mytime - prev_mytime)>100) || ((mytime - prev_mytime)<0) ) {
+ strc_int2bytes2 strc, strc2, strc3;
prev_mytime=mytime;
@@ -382,11 +375,11 @@ static int __cdecl htsshow_loop(lien_back* back,int back_max,int back_index,int
STYLE_STATRESET
,
/* */
- (char*)int2bytes(SInfo.stat_bytes),
+ (char*)int2bytes(&strc,SInfo.stat_bytes),
(int)lien_n,(int)SInfo.lien_tot,(int)nbk,
(char*)st,
(int)SInfo.stat_written,
- (char*)int2bytessec(SInfo.irate),(char*)int2bytessec(SInfo.rate),
+ (char*)int2bytessec(&strc2,SInfo.irate),(char*)int2bytessec(&strc3,SInfo.rate),
(int)SInfo.stat_updated,
(int)SInfo.stat_nsocket,
(int)SInfo.stat_errors
@@ -430,21 +423,21 @@ static int __cdecl htsshow_loop(lien_back* back,int back_max,int back_index,int
}
break;
case 1:
- if (back[i].status==99) {
+ if (back[i].status==STATUS_WAIT_HEADERS) {
strcpybuff(StatsBuffer[index].state,"request"); ok=1;
}
- else if (back[i].status==100) {
+ else if (back[i].status==STATUS_CONNECTING) {
strcpybuff(StatsBuffer[index].state,"connect"); ok=1;
}
- else if (back[i].status==101) {
+ else if (back[i].status==STATUS_WAIT_DNS) {
strcpybuff(StatsBuffer[index].state,"search"); ok=1;
}
- else if (back[i].status==1000) { // ohh le beau ftp
+ else if (back[i].status==STATUS_FTP_TRANSFER) { // ohh le beau ftp
sprintf(StatsBuffer[index].state,"ftp: %s",back[i].info); ok=1;
}
break;
default:
- if (back[i].status==0) { // prêt
+ if (back[i].status==STATUS_READY) { // prêt
if ((back[i].r.statuscode==200)) {
strcpybuff(StatsBuffer[index].state,"ready"); ok=1;
}
@@ -484,7 +477,7 @@ static int __cdecl htsshow_loop(lien_back* back,int back_max,int back_index,int
}
}
- if ((l=strlen(s))<MAX_LEN_INPROGRESS)
+ if ((l = (int) strlen(s))<MAX_LEN_INPROGRESS)
strcpybuff(StatsBuffer[index].name,s);
else {
// couper
@@ -498,7 +491,7 @@ static int __cdecl htsshow_loop(lien_back* back,int back_max,int back_index,int
StatsBuffer[index].sizetot=back[i].r.totalsize;
StatsBuffer[index].size=back[i].r.size;
} else { // pas de taille prédéfinie
- if (back[i].status==0) { // prêt
+ if (back[i].status==STATUS_READY) { // prêt
StatsBuffer[index].sizetot=back[i].r.size;
StatsBuffer[index].size=back[i].r.size;
} else {
@@ -520,10 +513,10 @@ static int __cdecl htsshow_loop(lien_back* back,int back_max,int back_index,int
{
int parsing=0;
printf("Current job: ");
- if (!(parsing=hts_is_parsing(-1)))
+ if (!(parsing=hts_is_parsing(opt, -1)))
printf("receiving files");
else {
- switch(hts_is_testing()) {
+ switch(hts_is_testing(opt)) {
case 0:
printf("parsing HTML file (%d%%)",parsing);
break;
@@ -556,8 +549,8 @@ static int __cdecl htsshow_loop(lien_back* back,int back_max,int back_index,int
StatsBuffer[i].state,
StatsBuffer[i].name,
StatsBuffer[i].file,
- int2bytes(StatsBuffer[i].size),
- int2bytes(StatsBuffer[i].sizetot)
+ int2bytes(&strc,StatsBuffer[i].size),
+ int2bytes(&strc2,StatsBuffer[i].sizetot)
);
}
printf("%s\n",VT_CLREOL);
@@ -573,19 +566,19 @@ static int __cdecl htsshow_loop(lien_back* back,int back_max,int back_index,int
return 1;
}
-static char* __cdecl htsshow_query(char* question) {
+static const char* __cdecl htsshow_query(t_hts_callbackarg *carg, httrackp *opt, const char* question) {
static char s[12]=""; /* ok */
printf("%s\nPress <Y><Enter> to confirm, <N><Enter> to abort\n",question);
io_flush; linput(stdin,s,4);
return s;
}
-static char* __cdecl htsshow_query2(char* question) {
+static const char* __cdecl htsshow_query2(t_hts_callbackarg *carg, httrackp *opt, const char* question) {
static char s[12]=""; /* ok */
printf("%s\nPress <Y><Enter> to confirm, <N><Enter> to abort\n",question);
io_flush; linput(stdin,s,4);
return s;
}
-static char* __cdecl htsshow_query3(char* question) {
+static const char* __cdecl htsshow_query3(t_hts_callbackarg *carg, httrackp *opt, const char* question) {
static char line[256]; /* ok */
do {
io_flush; linput(stdin,line,206);
@@ -593,44 +586,44 @@ static char* __cdecl htsshow_query3(char* question) {
printf("ok..\n");
return line;
}
-static int __cdecl htsshow_check(char* adr,char* fil,int status) {
+static int __cdecl htsshow_check(t_hts_callbackarg *carg, httrackp *opt, const char* adr,const char* fil,int status) {
return -1;
}
-static int __cdecl htsshow_check_mime(char* adr,char* fil,char* mime,int status) {
+static int __cdecl htsshow_check_mime(t_hts_callbackarg *carg, httrackp *opt, const char* adr,const char* fil,const char* mime,int status) {
return -1;
}
-static void __cdecl htsshow_pause(char* lockfile) {
+static void __cdecl htsshow_pause(t_hts_callbackarg *carg, httrackp *opt, const char* lockfile) {
while (fexist(lockfile)) {
Sleep(1000);
}
}
-static void __cdecl htsshow_filesave(char* file) {
+static void __cdecl htsshow_filesave(t_hts_callbackarg *carg, httrackp *opt, const char* file) {
}
-static void __cdecl htsshow_filesave2(char* adr, char* fil, char* save, int is_new, int is_modified,int not_updated) {
+static void __cdecl htsshow_filesave2(t_hts_callbackarg *carg, httrackp *opt, const char* adr, const char* fil, const char* save, int is_new, int is_modified,int not_updated) {
}
-static int __cdecl htsshow_linkdetected(char* link) {
+static int __cdecl htsshow_linkdetected(t_hts_callbackarg *carg, httrackp *opt, char* link) {
return 1;
}
-static int __cdecl htsshow_linkdetected2(char* link, char* start_tag) {
+static int __cdecl htsshow_linkdetected2(t_hts_callbackarg *carg, httrackp *opt, char* link, const char* start_tag) {
return 1;
}
-static int __cdecl htsshow_xfrstatus(lien_back* back) {
+static int __cdecl htsshow_xfrstatus(t_hts_callbackarg *carg, httrackp *opt, lien_back* back) {
return 1;
}
-static int __cdecl htsshow_savename(char* adr_complete,char* fil_complete,char* referer_adr,char* referer_fil,char* save) {
+static int __cdecl htsshow_savename(t_hts_callbackarg *carg, httrackp *opt, const char* adr_complete,const char* fil_complete,const char* referer_adr,const char* referer_fil,char* save) {
return 1;
}
-static int __cdecl htsshow_sendheader(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, htsblk* outgoing) {
+static int __cdecl htsshow_sendheader(t_hts_callbackarg *carg, httrackp *opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* outgoing) {
return 1;
}
-static int __cdecl htsshow_receiveheader(char* buff, char* adr, char* fil, char* referer_adr, char* referer_fil, htsblk* incoming) {
+static int __cdecl htsshow_receiveheader(t_hts_callbackarg *carg, httrackp *opt, char* buff, const char* adr, const char* fil, const char* referer_adr, const char* referer_fil, htsblk* incoming) {
return 1;
}
/* *** Various functions *** */
-static int fexist(char* s) {
+static int fexist(const char* s) {
struct stat st;
memset(&st, 0, sizeof(st));
if (stat(s, &st) == 0) {
@@ -659,4 +652,128 @@ static int linput(FILE* fp,char* s,int max) {
return j;
}
+
+// routines de détournement de SIGHUP & co (Unix)
+//
+static void sig_ignore( int code ) { // ignorer signal
+}
+static void sig_term( int code ) { // quitter brutalement
+ fprintf(stderr,"\nProgram terminated (signal %d)\n",code);
+ exit(0);
+}
+static void sig_finish( int code ) { // finir et quitter
+ signal(code,sig_term); // quitter si encore
+ if (global_opt != NULL) {
+ global_opt->state.exit_xh=1;
+ }
+ fprintf(stderr,"\nExit requested to engine (signal %d)\n",code);
+}
+#ifdef _WIN32
+static void sig_ask( int code ) { // demander
+ char s[256];
+ signal(code,sig_term); // quitter si encore
+ printf("\nQuit program/Interrupt/Cancel? (Q/I/C) ");
+ fflush(stdout);
+ scanf("%s",s);
+ if ( (s[0]=='y') || (s[0]=='Y') || (s[0]=='o') || (s[0]=='O') || (s[0]=='q') || (s[0]=='Q'))
+ exit(0); // quitter
+ else if ( (s[0]=='i') || (s[0]=='I') ) {
+ if (global_opt != NULL) {
+ // ask for stop
+ global_opt->state.stop=1;
+ }
+ }
+ signal(code,sig_ask); // remettre signal
+}
+#else
+static void sig_doback(int blind);
+static void sig_back( int code ) { // ignorer et mettre en backing
+ signal(code,sig_ignore);
+ sig_doback(0);
+}
+static void sig_ask( int code ) { // demander
+ char s[256];
+ signal(code,sig_term); // quitter si encore
+ printf("\nQuit program/Interrupt/Background/bLind background/Cancel? (Q/I/B/L/C) ");
+ fflush(stdout);
+ scanf("%s",s);
+ if ( (s[0]=='y') || (s[0]=='Y') || (s[0]=='o') || (s[0]=='O') || (s[0]=='q') || (s[0]=='Q'))
+ exit(0); // quitter
+ else if ( (s[0]=='b') || (s[0]=='B') || (s[0]=='a') || (s[0]=='A') )
+ sig_doback(0); // arrière plan
+ else if ( (s[0]=='l') || (s[0]=='L') )
+ sig_doback(1); // arrière plan
+ else if ( (s[0]=='i') || (s[0]=='I') ) {
+ if (global_opt != NULL) {
+ // ask for stop
+ printf("finishing pending transfers.. please wait\n");
+ global_opt->state.stop=1;
+ }
+ signal(code,sig_ask); // remettre signal
+ }
+ else {
+ printf("cancel..\n");
+ signal(code,sig_ask); // remettre signal
+ }
+}
+static void sig_brpipe( int code ) { // treat if necessary
+ signal(code, sig_brpipe);
+}
+static void sig_doback(int blind) { // mettre en backing
+ int out=-1;
+ //
+ printf("\nMoving into background to complete the mirror...\n"); fflush(stdout);
+
+ if (global_opt != NULL) {
+ // suppress logging and asking lousy questions
+ global_opt->quiet=1;
+ global_opt->verbosedisplay=0;
+ }
+
+ if (!blind)
+ out = open("hts-nohup.out",O_CREAT|O_WRONLY,S_IRUSR|S_IWUSR);
+ if (out == -1)
+ out = open("/dev/null",O_WRONLY,S_IRUSR|S_IWUSR);
+ close(0);
+ close(1);
+ dup(out);
+ close(2);
+ dup(out);
+ //
+ switch (fork()) {
+ case 0:
+ break;
+ case -1:
+ fprintf(stderr,"Error: can not fork process\n");
+ break;
+ default: // pere
+ usleep(100000); // pause 1/10s "A microsecond is .000001s"
+ _exit(0);
+ break;
+ }
+}
+#endif
+
+static void signal_handlers(void) {
+#ifdef _WIN32
+#ifndef _WIN32_WCE
+#if 0 /* BUG366763 */
+ signal( SIGINT , sig_ask ); // ^C
+#endif
+ signal( SIGTERM , sig_finish ); // kill <process>
+#endif
+#else
+#if 0 /* BUG366763 */
+ signal( SIGHUP , sig_back ); // close window
+#endif
+ signal( SIGTSTP , sig_back ); // ^Z
+ signal( SIGTERM , sig_finish ); // kill <process>
+#if 0 /* BUG366763 */
+ signal( SIGINT , sig_ask ); // ^C
#endif
+ signal( SIGPIPE , sig_brpipe ); // broken pipe (write into non-opened socket)
+ signal( SIGCHLD , sig_ignore ); // child change status
+#endif
+}
+
+// fin routines de détournement de SIGHUP & co