diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2012-03-19 12:55:42 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2012-03-19 12:55:42 +0000 |
commit | 844ecc37072d515513177c65a8c9dc35c9cdfc1a (patch) | |
tree | 733b1fe039c0c37095a594b66d5076f3f5a0153d /src/htsftp.c | |
parent | 25adbdabb47499fe641c7bd9595024ff82667058 (diff) |
httrack 3.33.16
Diffstat (limited to 'src/htsftp.c')
-rw-r--r-- | src/htsftp.c | 139 |
1 files changed, 63 insertions, 76 deletions
diff --git a/src/htsftp.c b/src/htsftp.c index 68a8af5..7b04052 100644 --- a/src/htsftp.c +++ b/src/htsftp.c @@ -34,6 +34,9 @@ Please visit our Website: http://www.httrack.com /* Author: Xavier Roche */ /* ------------------------------------------------------------ */ +/* Internal engine bytecode */ +#define HTS_INTERNAL_BYTECODE + // Gestion protocole ftp // Version .05 (01/2000) @@ -43,9 +46,6 @@ Please visit our Website: http://www.httrack.com #include "htsbase.h" #include "htsnet.h" #include "htsthread.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> #if HTS_WIN #else //inet_ntoa @@ -55,9 +55,11 @@ Please visit our Website: http://www.httrack.com #if HTS_WIN #ifndef __cplusplus // DOS +#ifndef _WIN32_WCE #include <process.h> /* _beginthread, _endthread */ #endif #endif +#endif // ftp mode passif // #if HTS_INET6==0 @@ -73,31 +75,10 @@ Please visit our Website: http://www.httrack.com #define FTP_STATUS_READY 1001 #if USE_BEGINTHREAD -/* -#ifdef __cplusplus -// C++ -> Shell -UINT back_launch_ftp( LPVOID pP ) { - lien_back* back=(lien_back*) pP; - if (back == NULL) { - //back->status=FTP_STATUS_READY; // fini - //back->r.statuscode=-1; - return -1; - } - - // lancer ftp - run_launch_ftp(back); - // prêt - back->status=0; - return 0; // thread completed successfully -} -#else -*/ -PTHREAD_TYPE back_launch_ftp( void* pP ) { +PTHREAD_TYPE PTHREAD_TYPE_FNC back_launch_ftp( void* pP ) { lien_back* back=(lien_back*) pP; if (back == NULL) { - //back->status=FTP_STATUS_READY; // fini - //back->r.statuscode=-1; #if FTP_DEBUG printf("[ftp error: no args]\n"); #endif @@ -113,27 +94,19 @@ PTHREAD_TYPE back_launch_ftp( void* pP ) { #endif run_launch_ftp(back); // prêt - back->status=0; + back->status=FTP_STATUS_READY; /* Uninitialize */ hts_uninit(); return PTHREAD_RETURN; } -/*#endif*/ // lancer en back void launch_ftp(lien_back* back) { -/* -#ifdef __cplusplus - // C++ -> Shell - AfxBeginThread(back_launch_ftp,(LPVOID) back); -#else -*/ // DOS #if FTP_DEBUG printf("[Launching main ftp thread]\n"); #endif - _beginthread(back_launch_ftp, 0, (void*) back); -/*#endif*/ + (void)hts_newthread(back_launch_ftp, 0, (void*) back); } #else @@ -142,7 +115,7 @@ int back_launch_ftp(lien_back* back) { // lancer ftp run_launch_ftp(back); // prêt - back->status=0; + back->status=FTP_STATUS_READY; return 0; } void launch_ftp(lien_back* back,char* path,char* exec) { @@ -213,7 +186,7 @@ int run_launch_ftp(lien_back* back) { #if FTP_PASV int port_pasv=0; #endif - char adr_ip[1024]; + char BIGSTK adr_ip[1024]; char *adr,*real_adr; char* ftp_filename=""; int timeout = 300; // timeout @@ -281,7 +254,11 @@ int run_launch_ftp(lien_back* back) { ftp_filename=a; if (strnotempty(a)) { char* ua=unescape_http(a); - if ( + int len_a = (int) strlen(ua); + if (len_a > 0 && ua[len_a -1] == '/') { /* obviously a directory listing */ + transfer_list=1; + sprintf(line_retr,"LIST -A %s",ua); + } else if ( (strchr(ua, ' ')) || (strchr(ua, '\"')) @@ -298,7 +275,7 @@ int run_launch_ftp(lien_back* back) { } } else { strcpybuff(back->r.msg,"Unexpected PORT error"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } } @@ -332,7 +309,7 @@ int run_launch_ftp(lien_back* back) { hp = hts_gethostbyname(_adr, &fullhostent_buffer); if (hp == NULL) { strcpybuff(back->r.msg,"Unable to get server's address"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-5; _HALT_FTP return 0; @@ -349,7 +326,7 @@ int run_launch_ftp(lien_back* back) { soc_ctl=socket(SOCaddr_sinfamily(server), SOCK_STREAM, 0); if (soc_ctl==INVALID_SOCKET) { strcpybuff(back->r.msg,"Unable to create a socket"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; _HALT_FTP return 0; @@ -367,7 +344,7 @@ int run_launch_ftp(lien_back* back) { if (connect(soc_ctl, (struct sockaddr *)&server, server_size) == -1) { #endif strcpybuff(back->r.msg,"Unable to connect to the server"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; _HALT_FTP return 0; @@ -379,7 +356,7 @@ int run_launch_ftp(lien_back* back) { _CHECK_HALT_FTP; { - char line[1024]; + char BIGSTK line[1024]; // envoi du login // --USER-- @@ -400,13 +377,23 @@ int run_launch_ftp(lien_back* back) { get_ftp_line(soc_ctl,line,timeout); _CHECK_HALT_FTP; if (line[0]=='2') { // ok + send_line(soc_ctl,"TYPE I"); + get_ftp_line(soc_ctl,line,timeout); + _CHECK_HALT_FTP; + if (line[0]=='2') { + // ok + } else { + strcpybuff(back->r.msg,"TYPE I error"); + // back->status=FTP_STATUS_READY; // fini + back->r.statuscode=-1; + } #if 0 // --CWD-- char* a; a=back->url_fil + strlen(back->url_fil)-1; while( (a > back->url_fil) && (*a!='/')) a--; if (*a == '/') { // ok repéré - char target[1024]; + char BIGSTK target[1024]; target[0]='\0'; strncatbuff(target,back->url_fil,(int) (a - back->url_fil)); if (strnotempty(target)==0) @@ -424,34 +411,34 @@ int run_launch_ftp(lien_back* back) { // ok.. } else { strcpybuff(back->r.msg,"TYPE I error"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } } else { sprintf(back->r.msg,"CWD error: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } // sinon on est prêts } else { strcpybuff(back->r.msg,"Unexpected ftp error"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } #endif } else { sprintf(back->r.msg,"Bad password: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } } else { sprintf(back->r.msg,"Bad user name: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } } else { sprintf(back->r.msg,"Connection refused: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } @@ -510,7 +497,7 @@ int run_launch_ftp(lien_back* back) { // -- fin analyse de l'adresse IP et du port -- } else { sprintf(back->r.msg,"PASV incorrect: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } // sinon on est prêts } else { @@ -542,12 +529,12 @@ int run_launch_ftp(lien_back* back) { } } else { sprintf(back->r.msg,"EPSV incorrect: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } } else { sprintf(back->r.msg,"PASV/EPSV error: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } // sinon on est prêts } @@ -663,7 +650,7 @@ int run_launch_ftp(lien_back* back) { deletesoc(soc_dat); soc_dat=INVALID_SOCKET; // sprintf(back->r.msg,"RETR command errror: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } // sinon on est prêts } else { @@ -673,22 +660,22 @@ int run_launch_ftp(lien_back* back) { deletesoc(soc_dat); soc_dat=INVALID_SOCKET; // strcpybuff(back->r.msg,"Unable to connect"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } // sinon on est prêts } else { strcpybuff(back->r.msg,"Unable to create a socket"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } // sinon on est prêts } else { sprintf(back->r.msg,"Unable to resolve IP %s",adr_ip); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } // sinon on est prêts } else { sprintf(back->r.msg,"PASV incorrect: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } // sinon on est prêts #else @@ -711,17 +698,17 @@ int run_launch_ftp(lien_back* back) { int dummylen = sizeof(struct sockaddr); if ( (soc_dat=accept(soc_servdat,&dummyaddr,&dummylen)) == INVALID_SOCKET) { strcpybuff(back->r.msg,"Unable to accept connection"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } } else { sprintf(back->r.msg,"RETR command errror: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } } else { sprintf(back->r.msg,"PORT command error: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } #if HTS_WIN @@ -731,7 +718,7 @@ int run_launch_ftp(lien_back* back) { #endif } else { strcpybuff(back->r.msg,"Unable to listen to a port"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } #endif @@ -747,7 +734,7 @@ int run_launch_ftp(lien_back* back) { back->r.fp = filecreate(back->url_sav); strcpybuff(back->info,"receiving"); if (back->r.fp != NULL) { - char buff[1024]; + char BIGSTK buff[1024]; int len=1; int read_len=1024; //HTS_TOTAL_RECV_CHECK(read_len); // Diminuer au besoin si trop de données reçues @@ -758,13 +745,13 @@ int run_launch_ftp(lien_back* back) { switch(wait_socket_receive(soc_dat,timeout)) { case -1: strcpybuff(back->r.msg,"FTP read error"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; len=0; // fin break; case 0: sprintf(back->r.msg,"Time out (%d)",timeout); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; len=0; // fin break; @@ -785,17 +772,17 @@ int run_launch_ftp(lien_back* back) { } */ strcpybuff(back->r.msg,"Write error"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; len=0; // error } } else { strcpybuff(back->r.msg,"Unexpected write error"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } } else { // Erreur ou terminé - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=0; if (back->r.totalsize > 0 && back->r.size != back->r.totalsize) { back->r.statuscode=-1; @@ -812,7 +799,7 @@ int run_launch_ftp(lien_back* back) { } } else { strcpybuff(back->r.msg,"Unable to write file"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } #if HTS_WIN @@ -828,16 +815,16 @@ int run_launch_ftp(lien_back* back) { get_ftp_line(soc_ctl,line,timeout); if (line[0]=='2') { // OK strcpybuff(back->r.msg,"OK"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=200; } else { sprintf(back->r.msg,"RETR incorrect: %s",linejmp(line)); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } } else { strcpybuff(back->r.msg,"FTP read error"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; } } @@ -866,7 +853,7 @@ int run_launch_ftp(lien_back* back) { back->r.statuscode=200; strcpybuff(back->r.msg,"OK"); } - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini return 0; } @@ -976,7 +963,7 @@ FILE* dd=NULL; // routines de réception/émission // 0 = ERROR int send_line(T_SOC soc,char* data) { - char line[1024]; + char BIGSTK line[1024]; if (_DEBUG_HEAD) { if (ioinfo) { fprintf(ioinfo,"---> %s\x0d\x0a",data); @@ -1007,7 +994,7 @@ int send_line(T_SOC soc,char* data) { } int get_ftp_line(T_SOC soc,char* line,int timeout) { - char data[1024]; + char BIGSTK data[1024]; int i,ok,multiline; #if FTP_DEBUG if (dd == NULL) dd = fopen("toto.txt","w"); @@ -1152,7 +1139,7 @@ int wait_socket_receive(T_SOC soc,int timeout) { int stop_ftp(lien_back* back) { if (back->stop_ftp) { strcpybuff(back->r.msg,"Cancelled by User"); - back->status=FTP_STATUS_READY; // fini + // back->status=FTP_STATUS_READY; // fini back->r.statuscode=-1; return 1; } |