// conversion chemin de fichier/dossier vers 8-3 ou ISO9660 void long_to_83(int mode, char *n83, char *save) { n83[0] = '\0'; while(*save) { char fn83[256], fnl[256]; size_t i, j; fn83[0] = fnl[0] = '\0'; for(i = j = 0 ; save[i] && save[i] != '/' ; i++) { if (j + 1 < sizeof(fnl)) { fnl[j++] = save[i]; } } fnl[j] = '\0'; // conversion longfile_to_83(mode, fn83, fnl); strcatbuff(n83, fn83); save += i; if (*save == '/') { strcatbuff(n83, "/"); save++; } } }
// insertion chaine ins avant s void cookie_insert(char *s, char *ins) { char *buff; if (strnotempty(s) == 0) { // rien à faire, juste concat strcatbuff(s, ins); } else { buff = (char *) malloct(strlen(s) + 2); if (buff) { strcpybuff(buff, s); // copie temporaire strcpybuff(s, ins); // insérer strcatbuff(s, buff); // copier freet(buff); } } }
// conversion chemin de fichier/dossier vers 8-3 ou ISO9660 void long_to_83(int mode,char* n83,char* save) { n83[0]='\0'; while(*save) { char fn83[256],fnl[256]; int i=0; fn83[0]=fnl[0]='\0'; while((save[i]) && (save[i]!='/')) { fnl[i]=save[i]; i++; } fnl[i]='\0'; // conversion longfile_to_83(mode,fn83,fnl); strcatbuff(n83,fn83); save+=i; if (*save=='/') { strcatbuff(n83,"/"); save++; } } }
/* Convert ~/foo into /home/smith/foo */ void expand_home(String * str) { if (StringSub(*str, 1) == '~') { char BIGSTK tempo[HTS_URLMAXSIZE * 2]; strcpybuff(tempo, hts_gethome()); strcatbuff(tempo, StringBuff(*str) + 1); StringCopy(*str, tempo); } }
void CNewProj::Changeprojname(CString stl) { char catbuff[CATBUFF_SIZE]; CWaitCursor wait; CString st; // if (stl.GetLength()==0 || stl.GetLength() > HTS_URLMAXSIZE) { //m_ctl_idok.ModifyStyle(0,WS_DISABLED); SetDlgItemTextCP(this, IDC_STATIC_comments,LANG(LANG_S30)); SetDlgItemTextCP(this, IDC_STATIC_projname,LANG(LANG_S11c)); this_CWizTab->SetWizardButtons(PSWIZB_BACK); can_click_next=FALSE; } else { char tempo[HTS_URLMAXSIZE*2]; GetDlgItemText(IDC_projpath,st); if (st.GetLength() + stl.GetLength() + 32 > sizeof(tempo)) { can_click_next=FALSE; } else { strcpybuff(tempo,st); strcatbuff(tempo,"/"); strcatbuff(tempo,stl); strcatbuff(tempo,"/"); if (fexist(fconcat(catbuff,tempo,"hts-cache/winprofile.ini")) // un cache est présent && fsize(fconcat(catbuff,tempo,"hts-cache/winprofile.ini"))>0) { // taille log contrôle>0 CString strSection = "OptionsValues"; CString st = MyGetProfileString(fconcat(catbuff,tempo,"hts-cache/winprofile.ini"),strSection,"CurrentUrl"); CString st2 = MyGetProfileString(fconcat(catbuff,tempo,"hts-cache/winprofile.ini"),strSection,"Category"); // SetDlgItemTextCP(this, IDC_STATIC_comments, st); SetDlgItemTextCP(this, IDC_projcateg, st2); // Static SetDlgItemTextCP(this, IDC_STATIC_projname,LANG(LANG_S11b)); } else { SetDlgItemTextCP(this, IDC_STATIC_comments,LANG(LANG_S31)); SetDlgItemTextCP(this, IDC_STATIC_projname,LANG(LANG_S11)); } //m_ctl_idok.ModifyStyle(WS_DISABLED,0); //if (!can_click_next) this_CWizTab->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT); can_click_next=TRUE; } } //m_ctl_idok.RedrawWindow(); }
BOOL CDialogHtmlHelp::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(httrack_icon,false); SetIcon(httrack_icon,true); EnableToolTips(true); // TOOL TIPS SetForegroundWindow(); // yop en premier plan! strcpybuff(home,"file://"); { char* a=home+strlen(home); ::GetModuleFileName(NULL, a, sizeof(home)/sizeof(TCHAR) - 1 - strlen(home)); // strcatbuff(home,AfxGetApp()->m_pszHelpFilePath); a = home + strlen(home) -1; while( (*a!='\\') && ( a > home ) ) a--; if (*a=='\\') { *(a+1)='\0'; } strcatbuff(home,"html\\"); strcpybuff(home_dir,home); strcatbuff(home,"index.html"); } // créer if (m_page.CreateFromStatic(IDC_HTMLVIEW, this)) { m_page.SetToolBar(false); m_page.SetMenuBar(false); m_page.SetStatusBar(false); m_page.SetRegisterAsBrowser(false); m_page.SetFullScreen(false); if (page.GetLength()==0) OnHome(); else Go(page); UpdateWindow(); } else { EndDialog(IDCANCEL); if (!ShellExecute(NULL,"open",home+strlen("file://"),"","",SW_RESTORE)) AfxMessageBox(LANG(LANG_DIAL1)); } return TRUE; }
void CDialogHtmlHelp::Go(CString st) { if (st.Left(7)!="http://") { char tempo[1024]; strcpybuff(tempo,home_dir); strcatbuff(tempo,st); m_page.Navigate2(tempo); } else m_page.Navigate2(st); m_page.ShowWindow(SW_SHOW); this->GetDlgItem(IDC_HTMLVIEW)->SetFocus(); }
/* // Example: find_handle h = hts_findfirst("/tmp"); if (h) { do { if (hts_findisfile(h)) printf("File: %s (%d octets)\n",hts_findgetname(h),hts_findgetsize(h)); else if (hts_findisdir(h)) printf("Dir: %s\n",hts_findgetname(h)); } while(hts_findnext(h)); hts_findclose(h); } */ HTSEXT_API find_handle hts_findfirst(char* path) { if (path) { if (strnotempty(path)) { find_handle_struct* find = (find_handle_struct*) calloc(1,sizeof(find_handle_struct)); if (find) { memset(find, 0, sizeof(find_handle_struct)); #ifdef _WIN32 { char BIGSTK rpath[1024*2]; strcpybuff(rpath,path); if (rpath[0]) { if (rpath[strlen(rpath)-1]!='\\') strcatbuff(rpath,"\\"); } strcatbuff(rpath,"*.*"); find->handle = FindFirstFileA(rpath,&find->hdata); if (find->handle != INVALID_HANDLE_VALUE) return find; } #else strcpybuff(find->path,path); { if (find->path[0]) { if (find->path[strlen(find->path)-1]!='/') strcatbuff(find->path,"/"); } } find->hdir=opendir(path); if (find->hdir != NULL) { if (hts_findnext(find) == 1) return find; } #endif free((void*)find); } } } return NULL; }
void COptionTab7::OnAdd2() { char s[1024]; s[0]='\0'; NewFilter(1,s); if (strlen(s)>0) { char tempo[HTS_URLMAXSIZE*16]; { CString st; GetDlgItemText(IDC_URL2,st); if (st.GetLength() < sizeof(tempo) - 2) strcpybuff(tempo,st); else tempo[0] = '\0'; } if (strlen(tempo)>0) { if ((tempo[strlen(tempo)-1]!=' ') && (tempo[strlen(tempo)-1]!='\n') && (tempo[strlen(tempo)-1]!=13)) strcatbuff(tempo,"\x0d\x0a"); } strcatbuff(tempo,s); // m_url2=tempo; SetDlgItemTextCP(this, IDC_URL2,tempo); } }
char *bauth_prefix(char *prefix, char *adr, char *fil) { char *a; strcpybuff(prefix, jump_identification(adr)); strcatbuff(prefix, fil); a = strchr(prefix, '?'); if (a) *a = '\0'; if (strchr(prefix, '/')) { a = prefix + strlen(prefix) - 1; while(*a != '/') a--; *(a + 1) = '\0'; } return prefix; }
void Cinprogress::Oniplog(int mode) { char catbuff[CATBUFF_SIZE]; if (!BackAffLog) { // pas encore lancé strcpybuff(pathlog,dialog0->GetPath()); if (strlen(pathlog)>0) if ((pathlog[strlen(pathlog)-1]!='/') && (pathlog[strlen(pathlog)-1]!='\\')) strcatbuff(pathlog,"/"); // fichier log existe ou on est télécommandé par un ! if ( (fexist(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-err.txt"))) || (fexist(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-log.txt"))) || (ShellOptions != NULL && ShellOptions->choixdeb[0]=='!') ) { if (mode) form.type_log=0; else form.type_log=1; strcpybuff(form.pathlog,pathlog); BackAffLog = AfxBeginThread(AffLog,this); } else { char s[1024]; sprintf(s,LANG(LANG_H2 /*"No log files in %s!","Aucun fichier d'audit dans %s!"*/),pathlog); AfxMessageBox(s,MB_OK+MB_ICONEXCLAMATION); } } }
void NewFilter(int i,char* s) { // 0: forbid 1: accept CAddFilter AddF; AddF.type=i; if (AddF.type==0) AddF.m_addtype=LANG(LANG_B20); /*"Links following this rule will be forbidden:"*/ else AddF.m_addtype=LANG(LANG_B21); // "Links following this rule will be accepted:"; if (AddF.DoModal()==IDOK) { char query[2048],t[256],as[256]; char* q; // error if (AddF.m_afquery.GetLength() >= sizeof(query) - 2 ) { return; } strcpybuff(s,""); strcpybuff(query,AddF.m_afquery); q=query; if (AddF.m_aftype==10) { if (i==0) strcpybuff(s,"-"); else strcpybuff(s,"+"); strcatbuff(s,"*"); } else { while(strlen(q)>0) { while ((*q==' ') || (*q==',')) q++; strcpybuff(t,""); { // prochain (séparé par des ,) char *a,*b; a=strchr(q,' '); b=strchr(q,','); if (a && b) { // départager if ( b < a) a=b; } else if (b) a=b; if (a) { strcpybuff (t,""); strncat(t,q,a-q); q=a+1; } else { strcpybuff(t,q); strcpybuff(q,""); } } if (strlen(t)>0) { strcpybuff(as,""); switch (AddF.m_aftype) { case 0: // ext sprintf(as,"*.%s",t); break; case 1: // contient sprintf(as,"*/*%s*",t); break; case 2: // this one sprintf(as,"*/%s",t); break; case 3: // folder contains sprintf(as,"*/*%s*/*",t); break; case 4: // this folder sprintf(as,"*/%s/*",t); break; case 5: // domaine sprintf(as,"*[name].%s/*",t); break; case 6: // contien sprintf(as,"*[name].*[name]%s*[name].*[name]/*",t); break; case 7: // host sprintf(as,"%s/*",t); break; case 8: // link contient sprintf(as,"*%s*",t); break; case 9: // lien exact sprintf(as,"%s",t); break; } if (strlen(as)>0) { if (i==0) strcatbuff(s,"-"); else strcatbuff(s,"+"); strcatbuff(s,as); strcatbuff(s,"\x0d\x0a"); } } } } } else strcpybuff(s,""); }
static int hts_acceptlink_(httrackp* opt, int ptr,int lien_tot,lien_url** liens, char* adr,char* fil, char* tag, char* attribute, int* set_prio_to, int* just_test_it) { int forbidden_url=-1; int meme_adresse; int embedded_triggered = 0; #define _FILTERS (*opt->filters.filters) #define _FILTERS_PTR (opt->filters.filptr) #define _ROBOTS ((robots_wizard*)opt->robotsptr) int may_set_prio_to=0; // -------------------- PHASE 0 -------------------- /* Infos */ if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"wizard test begins: %s%s"LF,adr,fil); test_flush; } /* Already exists? Then, we know that we knew that this link had to be known */ if (adr[0] != '\0' && fil[0] != '\0' && opt->hash != NULL && hash_read(opt->hash, adr, fil, 1, opt->urlhack) >= 0 ) { return 0; /* Yokai */ } // -------------------- PRELUDE OF PHASE 3-BIS -------------------- /* Built-in known tags (<img src=..>, ..) */ if (forbidden_url != 0 && opt->nearlink && tag != NULL && attribute != NULL) { int i; for(i = 0 ; hts_detect_embed[i].tag != NULL ; i++) { if (cmp_token(tag, hts_detect_embed[i].tag) && cmp_token(attribute, hts_detect_embed[i].attr) ) { embedded_triggered = 1; break; } } } // -------------------- PHASE 1 -------------------- /* Doit-on traiter les non html? */ if ((opt->getmode & 2)==0) { // non on ne doit pas if (!ishtml(opt,fil)) { // non il ne faut pas //adr[0]='\0'; // ne pas traiter ce lien, pas traiter forbidden_url=1; // interdire récupération du lien if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"non-html file ignored at %s : %s"LF,adr,fil); test_flush; } } } /* Niveau 1: ne pas parser suivant! */ if (ptr>0) { if ( ( liens[ptr]->depth <= 0 ) || ( liens[ptr]->depth <= 1 && !embedded_triggered ) ) { forbidden_url=1; // interdire récupération du lien if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"file from too far level ignored at %s : %s"LF,adr,fil); test_flush; } } } /* en cas d'échec en phase 1, retour immédiat! */ if (forbidden_url == 1) { return forbidden_url; } // -------------------- PHASE 2 -------------------- // ------------------------------------------------------ // doit-on traiter ce lien?.. vérifier droits de déplacement meme_adresse=strfield2(adr,urladr); if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); if (meme_adresse) fprintf(opt->log,"Compare addresses: %s=%s"LF,adr,urladr); else fprintf(opt->log,"Compare addresses: %s!=%s"LF,adr,urladr); test_flush; } if (meme_adresse) { // même adresse { // tester interdiction de descendre // MODIFIE : en cas de remontée puis de redescente, il se pouvait qu'on ne puisse pas atteindre certains fichiers // problème: si un fichier est virtuellement accessible via une page mais dont le lien est sur une autre *uniquement*.. char BIGSTK tempo[HTS_URLMAXSIZE*2]; char BIGSTK tempo2[HTS_URLMAXSIZE*2]; tempo[0] = tempo2[0] = '\0'; // note (up/down): on calcule à partir du lien primaire, ET du lien précédent. // ex: si on descend 2 fois on peut remonter 1 fois if (lienrelatif(tempo,fil,liens[liens[ptr]->premier]->fil)==0) { if (lienrelatif(tempo2,fil,liens[ptr]->fil)==0) { if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"build relative links to test: %s %s (with %s and %s)"LF,tempo,tempo2,liens[liens[ptr]->premier]->fil,liens[ptr]->fil); test_flush; } // si vient de primary, ne pas tester lienrelatif avec (car host "différent") /*if (liens[liens[ptr]->premier] == 0) { // vient de primary } */ // NEW: finalement OK, sauf pour les moved repérés par link_import // PROBLEME : annulé a cause d'un lien éventuel isolé accepté..qui entrainerait un miroir // (test même niveau (NOUVEAU à cause de certains problèmes de filtres non intégrés)) // NEW if ( (tempo[0] != '\0' && tempo[1] != '\0' && strchr(tempo+1,'/') == 0) || (tempo2[0] != '\0' && tempo2[1] != '\0' && strchr(tempo2+1,'/') == 0) ) { if (!liens[ptr]->link_import) { // ne résulte pas d'un 'moved' forbidden_url=0; if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"same level link authorized: %s%s"LF,adr,fil); test_flush; } } } // down if ( (strncmp(tempo,"../",3)) || (strncmp(tempo2,"../",3))) { // pas montée sinon ne nbous concerne pas int test1,test2; if (!strncmp(tempo,"../",3)) test1=0; else test1 = (strchr(tempo +((*tempo =='/')?1:0),'/')!=NULL); if (!strncmp(tempo2,"../",3)) test2=0; else test2 = (strchr(tempo2+((*tempo2=='/')?1:0),'/')!=NULL); if ( (test1) && (test2) ) { // on ne peut que descendre if ((opt->seeker & 1)==0) { // interdiction de descendre forbidden_url=1; if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"lower link canceled: %s%s"LF,adr,fil); test_flush; } } else { // autorisé à priori - NEW if (!liens[ptr]->link_import) { // ne résulte pas d'un 'moved' forbidden_url=0; if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"lower link authorized: %s%s"LF,adr,fil); test_flush; } } } } else if ( (test1) || (test2) ) { // on peut descendre pour accéder au lien if ((opt->seeker & 1)!=0) { // on peut descendre - NEW if (!liens[ptr]->link_import) { // ne résulte pas d'un 'moved' forbidden_url=0; if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"lower link authorized: %s%s"LF,adr,fil); test_flush; } } } } } // up if ( (!strncmp(tempo,"../",3)) && (!strncmp(tempo2,"../",3)) ) { // impossible sans monter if ((opt->seeker & 2)==0) { // interdiction de monter forbidden_url=1; if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"upper link canceled: %s%s"LF,adr,fil); test_flush; } } else { // autorisé à monter - NEW if (!liens[ptr]->link_import) { // ne résulte pas d'un 'moved' forbidden_url=0; if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"upper link authorized: %s%s"LF,adr,fil); test_flush; } } } } else if ( (!strncmp(tempo,"../",3)) || (!strncmp(tempo2,"../",3)) ) { // Possible en montant if ((opt->seeker & 2)!=0) { // autorisé à monter - NEW if (!liens[ptr]->link_import) { // ne résulte pas d'un 'moved' forbidden_url=0; if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"upper link authorized: %s%s"LF,adr,fil); test_flush; } } } // sinon autorisé en descente } } else { if (opt->log) { fprintf(opt->log,"Error building relative link %s and %s"LF,fil,liens[ptr]->fil); test_flush; } } } else { if (opt->log) { fprintf(opt->log,"Error building relative link %s and %s"LF,fil,liens[liens[ptr]->premier]->fil); test_flush; } } } // tester interdiction de descendre? { // tester interdiction de monter char BIGSTK tempo[HTS_URLMAXSIZE*2]; char BIGSTK tempo2[HTS_URLMAXSIZE*2]; if (lienrelatif(tempo,fil,liens[liens[ptr]->premier]->fil)==0) { if (lienrelatif(tempo2,fil,liens[ptr]->fil)==0) { } else { if (opt->log) { fprintf(opt->log,"Error building relative link %s and %s"LF,fil,liens[ptr]->fil); test_flush; } } } else { if (opt->log) { fprintf(opt->log,"Error building relative link %s and %s"LF,fil,liens[liens[ptr]->premier]->fil); test_flush; } } } // fin tester interdiction de monter } else { // adresse différente, sortir? //if (!opt->wizard) { // mode non wizard // doit-on traiter ce lien?.. vérifier droits de sortie switch((opt->travel & 255)) { case 0: if (!opt->wizard) // mode non wizard forbidden_url=1; break; // interdicton de sortir au dela de l'adresse case 1: { // sortie sur le même dom.xxx size_t i = strlen(adr)-1; size_t j = strlen(urladr)-1; while( (i>0) && (adr[i]!='.')) i--; while( (j>0) && (urladr[j]!='.')) j--; i--; j--; while( (i>0) && (adr[i]!='.')) i--; while( (j>0) && (urladr[j]!='.')) j--; if ((i>0) && (j>0)) { if (!strfield2(adr+i,urladr+j)) { // != if (!opt->wizard) { // mode non wizard //printf("refused: %s\n",adr); forbidden_url=1; // pas même domaine if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"foreign domain link canceled: %s%s"LF,adr,fil); test_flush; } } } else { if (opt->wizard) { // mode wizard forbidden_url=0; // même domaine if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"same domain link authorized: %s%s"LF,adr,fil); test_flush; } } } } else forbidden_url=1; } break; case 2: { // sortie sur le même .xxx size_t i = strlen(adr)-1; size_t j = strlen(urladr)-1; while( (i>0) && (adr[i]!='.')) i--; while( (j>0) && (urladr[j]!='.')) j--; if ((i>0) && (j>0)) { if (!strfield2(adr+i,urladr+j)) { // !- if (!opt->wizard) { // mode non wizard //printf("refused: %s\n",adr); forbidden_url=1; // pas même .xx if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"foreign location link canceled: %s%s"LF,adr,fil); test_flush; } } } else { if (opt->wizard) { // mode wizard forbidden_url=0; // même domaine if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"same location link authorized: %s%s"LF,adr,fil); test_flush; } } } } else forbidden_url=1; } break; case 7: // everywhere!! if (opt->wizard) { // mode wizard forbidden_url=0; break; } } // switch // ANCIENNE POS -- récupérer les liens à côtés d'un lien (nearlink) } // fin test adresse identique/différente // -------------------- PHASE 3 -------------------- // récupérer les liens à côtés d'un lien (nearlink) (nvelle pos) if (forbidden_url != 0 && opt->nearlink) { if (!ishtml(opt,fil)) { // non html //printf("ok %s%s\n",ad,fil); forbidden_url=0; // autoriser may_set_prio_to=1+1; // set prio to 1 (parse but skip urls) if near is the winner if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"near link authorized: %s%s"LF,adr,fil); test_flush; } } } // -------------------- PHASE 3-BIS -------------------- /* Built-in known tags (<img src=..>, ..) */ if (forbidden_url != 0 && embedded_triggered) { forbidden_url=0; // autoriser may_set_prio_to=1+1; // set prio to 1 (parse but skip urls) if near is the winner if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"near link authorized (friendly tag): %s%s"LF,adr,fil); test_flush; } } // -------------------- PHASE 4 -------------------- // ------------------------------------------------------ // Si wizard, il se peut qu'on autorise ou qu'on interdise // un lien spécial avant même de tester sa position, sa hiérarchie etc. // peut court-circuiter le forbidden_url précédent if (opt->wizard) { // le wizard entre en action.. // int question=1; // poser une question int force_mirror=0; // pour mirror links int filters_answer=0; // décision prise par les filtres char BIGSTK l[HTS_URLMAXSIZE*2]; char BIGSTK lfull[HTS_URLMAXSIZE*2]; if (forbidden_url!=-1) question=0; // pas de question, résolu // former URL complète du lien actuel strcpybuff(l,jump_identification(adr)); if (*fil!='/') strcatbuff(l,"/"); strcatbuff(l,fil); // full version (http://foo:[email protected]/bar.html) if (!link_has_authority(adr)) strcpybuff(lfull,"http://"); else lfull[0]='\0'; strcatbuff(lfull,adr); if (*fil!='/') strcatbuff(lfull,"/"); strcatbuff(lfull,fil); // tester filters (URLs autorisées ou interdites explicitement) // si lien primaire on saute le joker, on est pas lémur if (ptr==0) { // lien primaire, autoriser question=1; // la question sera résolue automatiquement forbidden_url=0; may_set_prio_to=0; // clear may-set flag } else { // eternal depth first // vérifier récursivité extérieure if (opt->extdepth>0) { if ( /*question && */ (ptr>0) && (!force_mirror)) { // well, this is kinda a hak // we don't want to mirror EVERYTHING, and we have to decide where to stop // there is no way yet to tag "external" links, and therefore links that are // "weak" (authorized depth < external depth) are just not considered for external // hack if (liens[ptr]->depth > opt->extdepth) { // *set_prio_to = opt->extdepth + 1; *set_prio_to = 1 + (opt->extdepth); may_set_prio_to=0; // clear may-set flag forbidden_url=0; // autorisé question=0; // résolution auto if ((opt->debug>1) && (opt->log!=NULL)) { if (question) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"(wizard) ambiguous link accepted (external depth): link %s at %s%s"LF,l,urladr,urlfil); } else { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"(wizard) forced to accept link (external depth): link %s at %s%s"LF,l,urladr,urlfil); } test_flush; } } } } // filters { int jok; char* mdepth=""; // filters, 0=sait pas 1=ok -1=interdit { int jokDepth1=0,jokDepth2=0; int jok1=0,jok2=0; jok1 = fa_strjoker(/*url*/0, _FILTERS,*_FILTERS_PTR,lfull,NULL,NULL,&jokDepth1); jok2 = fa_strjoker(/*url*/0, _FILTERS,*_FILTERS_PTR,l, NULL,NULL,&jokDepth2); if (jok2 == 0) { // #2 doesn't know jok = jok1; // then, use #1 mdepth = _FILTERS[jokDepth1]; } else if (jok1 == 0) { // #1 doesn't know jok = jok2; // then, use #2 mdepth = _FILTERS[jokDepth2]; } else if (jokDepth1 >= jokDepth2) { // #1 matching rule is "after" #2, then it is prioritary jok = jok1; mdepth = _FILTERS[jokDepth1]; } else { // #2 matching rule is "after" #1, then it is prioritary jok = jok2; mdepth = _FILTERS[jokDepth2]; } } if (jok == 1) { // autorisé filters_answer=1; // décision prise par les filtres question=0; // ne pas poser de question, autorisé forbidden_url=0; // URL autorisée may_set_prio_to=0; // clear may-set flag if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"(wizard) explicit authorized (%s) link: link %s at %s%s"LF,mdepth,l,urladr,urlfil); test_flush; } } else if (jok == -1) { // forbidden filters_answer=1; // décision prise par les filtres question=0; // ne pas poser de question: forbidden_url=1; // URL interdite if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"(wizard) explicit forbidden (%s) link: link %s at %s%s"LF,mdepth,l,urladr,urlfil); test_flush; } } // sinon on touche à rien } } // vérifier mode mirror links if (question) { if (opt->mirror_first_page) { // mode mirror links if (liens[ptr]->precedent==0) { // parent=primary! forbidden_url=0; // autorisé may_set_prio_to=0; // clear may-set flag question=1; // résolution auto force_mirror=5; // mirror (5) if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"(wizard) explicit mirror link: link %s at %s%s"LF,l,urladr,urlfil); test_flush; } } } } // on doit poser la question.. peut on la poser? // (oui je sais quel preuve de délicatesse, merci merci) if ((question) && (ptr>0) && (!force_mirror)) { if (opt->wizard==2) { // éliminer tous les liens non répertoriés comme autorisés (ou inconnus) question=0; forbidden_url=1; if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"(wizard) ambiguous forbidden link: link %s at %s%s"LF,l,urladr,urlfil); test_flush; } } } // vérifier robots.txt if (opt->robots) { int r = checkrobots(_ROBOTS,adr,fil); if (r == -1) { // interdiction #if DEBUG_ROBOTS printf("robots.txt forbidden: %s%s\n",adr,fil); #endif // question résolue, par les filtres, et mode robot non strict if ((!question) && (filters_answer) && (opt->robots == 1) && (forbidden_url!=1)) { r=0; // annuler interdiction des robots if (!forbidden_url) { if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"Warning link followed against robots.txt: link %s at %s%s"LF,l,adr,fil); test_flush; } } } if (r == -1) { // interdire forbidden_url=1; question=0; if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"(robots.txt) forbidden link: link %s at %s%s"LF,l,adr,fil); test_flush; } } } } if (!question) { if ((opt->debug>1) && (opt->log!=NULL)) { if (!forbidden_url) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"(wizard) shared foreign domain link: link %s at %s%s"LF,l,urladr,urlfil); } else { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"(wizard) cancelled foreign domain link: link %s at %s%s"LF,l,urladr,urlfil); } test_flush; } #if BDEBUG==3 printf("at %s in %s, wizard says: url %s ",urladr,urlfil,l); if (forbidden_url) printf("cancelled"); else printf(">SHARED<"); printf("\n"); #endif } /* en cas de question, ou lien primaire (enregistrer autorisations) */ if (question || (ptr==0)) { const char* s; int n=0; // si primaire (plus bas) alors ... if ((ptr!=0) && (force_mirror==0)) { char BIGSTK tempo[HTS_URLMAXSIZE*2]; tempo[0]='\0'; strcatbuff(tempo,adr); strcatbuff(tempo,fil); s = RUN_CALLBACK1(opt, query3, tempo); if (strnotempty(s)==0) // entrée n=0; else if (isdigit((unsigned char)*s)) sscanf(s,"%d",&n); else { switch(*s) { case '*': n=-1; break; case '!': n=-999; { /*char *a; int i; a=copie_de_adr-128; if (a<r.adr) a=r.adr; for(i=0;i<256;i++) { if (a==copie_de_adr) printf("\nHERE:\n"); printf("%c",*a++); } printf("\n\n"); */ } break; default: n=-999; printf("What did you say?\n"); break; } } io_flush; } else { // lien primaire: autoriser répertoire entier if (!force_mirror) { if ((opt->seeker & 1)==0) { // interdiction de descendre n=7; } else { n=5; // autoriser miroir répertoires descendants (lien primaire) } } else // forcer valeur (sub-wizard) n=force_mirror; } /* sanity check - reallocate filters HERE */ if ((*_FILTERS_PTR) + 1 >= opt->maxfilter) { opt->maxfilter += HTS_FILTERSINC; if (filters_init(&_FILTERS, opt->maxfilter, HTS_FILTERSINC) == 0) { printf("PANIC! : Too many filters : >%d [%d]\n", (*_FILTERS_PTR),__LINE__); fflush(stdout); if (opt->log) { fprintf(opt->log,LF"Too many filters, giving up..(>%d)"LF, (*_FILTERS_PTR) ); fprintf(opt->log,"To avoid that: use #F option for more filters (example: -#F5000)"LF); test_flush; } assertf("too many filters - giving up" == NULL); // wild.. } } // here we have enough room for a new filter if necessary switch(n) { case -1: // sauter tout le reste forbidden_url=1; opt->wizard=2; // sauter tout le reste break; case 0: // interdire les mêmes liens: adr/fil forbidden_url=1; HT_INSERT_FILTERS0; // insérer en 0 strcpybuff(_FILTERS[0],"-"); strcatbuff(_FILTERS[0],jump_identification(adr)); if (*fil!='/') strcatbuff(_FILTERS[0],"/"); strcatbuff(_FILTERS[0],fil); break; case 1: // éliminer répertoire entier et sous rép: adr/path/ * forbidden_url=1; { size_t i = strlen(fil)-1; while((fil[i]!='/') && (i>0)) i--; if (fil[i]=='/') { HT_INSERT_FILTERS0; // insérer en 0 strcpybuff(_FILTERS[0],"-"); strcatbuff(_FILTERS[0],jump_identification(adr)); if (*fil!='/') strcatbuff(_FILTERS[0],"/"); strncatbuff(_FILTERS[0] ,fil,i); if (_FILTERS[0][strlen(_FILTERS[0])-1]!='/') strcatbuff(_FILTERS[0],"/"); strcatbuff(_FILTERS[0],"*"); } } // ** ... break; case 2: // adresse adr* forbidden_url=1; HT_INSERT_FILTERS0; // insérer en 0 strcpybuff(_FILTERS[0],"-"); strcatbuff(_FILTERS[0],jump_identification(adr)); strcatbuff(_FILTERS[0],"*"); break; case 3: // ** A FAIRE forbidden_url=1; /* { int i=strlen(adr)-1; while((adr[i]!='/') && (i>0)) i--; if (i>0) { } }*/ break; // case 4: // same link // PAS BESOIN!! /*HT_INSERT_FILTERS0; // insérer en 0 strcpybuff(_FILTERS[0],"+"); strcatbuff(_FILTERS[0],adr); if (*fil!='/') strcatbuff(_FILTERS[0],"/"); strcatbuff(_FILTERS[0],fil);*/ // étant donné le renversement wizard/primary filter (les primary autorisent up/down ET interdisent) // il faut éviter d'un lien isolé effectue un miroir total.. *set_prio_to = 0+1; // niveau de récursion=0 (pas de miroir) break; case 5: // autoriser répertoire entier et fils if ((opt->seeker & 2)==0) { // interdiction de monter size_t i = strlen(fil)-1; while((fil[i]!='/') && (i>0)) i--; if (fil[i]=='/') { HT_INSERT_FILTERS0; // insérer en 0 strcpybuff(_FILTERS[0],"+"); strcatbuff(_FILTERS[0],jump_identification(adr)); if (*fil!='/') strcatbuff(_FILTERS[0],"/"); strncatbuff(_FILTERS[0],fil,i+1); strcatbuff(_FILTERS[0],"*"); } } else { // autoriser domaine alors!! HT_INSERT_FILTERS0; // insérer en 0 strcpybuff(filters[filptr],"+"); strcpybuff(_FILTERS[0],"+"); strcatbuff(_FILTERS[0],jump_identification(adr)); strcatbuff(_FILTERS[0],"*"); } break; case 6: // same domain HT_INSERT_FILTERS0; // insérer en 0 strcpybuff(filters[filptr],"+"); strcpybuff(_FILTERS[0],"+"); strcatbuff(_FILTERS[0],jump_identification(adr)); strcatbuff(_FILTERS[0],"*"); break; // case 7: // autoriser ce répertoire { size_t i = strlen(fil)-1; while((fil[i]!='/') && (i>0)) i--; if (fil[i]=='/') { HT_INSERT_FILTERS0; // insérer en 0 strcpybuff(_FILTERS[0],"+"); strcatbuff(_FILTERS[0],jump_identification(adr)); if (*fil!='/') strcatbuff(_FILTERS[0],"/"); strncatbuff(_FILTERS[0],fil,i+1); strcatbuff(_FILTERS[0],"*[file]"); } } break; case 50: // on fait rien break; } // switch } // test du wizard sur l'url } // fin du test wizard.. // -------------------- PHASE 5 -------------------- // lien non autorisé, peut-on juste le tester? if (just_test_it) { if (forbidden_url==1) { if (opt->travel&256) { // tester tout de même if (strfield(adr,"ftp://")==0 #if HTS_USEMMS && strfield(adr,"mms://")==0 #endif ) { // PAS ftp! forbidden_url=1; // oui oui toujours interdit (note: sert à rien car ==1 mais c pour comprendre) *just_test_it=1; // mais on teste if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"Testing link %s%s"LF,adr,fil); } } } } //adr[0]='\0'; // cancel } // -------------------- FINAL PHASE -------------------- // Test if the "Near" test won if (may_set_prio_to && forbidden_url == 0) { *set_prio_to = may_set_prio_to; } return forbidden_url; #undef _FILTERS #undef _FILTERS_PTR #undef _ROBOTS }
/* Check for alias in command-line argc,argv as in main() n_arg argument position return_argv a char[2][] where to put result return_error buffer in case of syntax error return value: number of arguments treated (0 if error) */ int optalias_check(int argc, const char *const *argv, int n_arg, int *return_argc, char **return_argv, char *return_error) { return_error[0] = '\0'; *return_argc = 1; if (argv[n_arg][0] == '-') if (argv[n_arg][1] == '-') { char command[1000]; char param[1000]; char addcommand[256]; /* */ char *position; int need_param = 1; //int return_param=0; int pos; command[0] = param[0] = addcommand[0] = '\0'; /* --sockets=8 */ if ((position = strchr(argv[n_arg], '='))) { /* Copy command */ strncatbuff(command, argv[n_arg] + 2, (int) (position - (argv[n_arg] + 2))); /* Copy parameter */ strcpybuff(param, position + 1); } /* --nocache */ else if (strncmp(argv[n_arg] + 2, "no", 2) == 0) { strcpybuff(command, argv[n_arg] + 4); strcpybuff(param, "0"); } /* --sockets 8 */ else { if (strncmp(argv[n_arg] + 2, "wide-", 5) == 0) { strcpybuff(addcommand, "c32"); strcpybuff(command, strchr(argv[n_arg] + 2, '-') + 1); } else if (strncmp(argv[n_arg] + 2, "tiny-", 5) == 0) { strcpybuff(addcommand, "c1"); strcpybuff(command, strchr(argv[n_arg] + 2, '-') + 1); } else strcpybuff(command, argv[n_arg] + 2); need_param = 2; } /* Now solve the alias */ pos = optalias_find(command); if (pos >= 0) { /* Copy real name */ strcpybuff(command, hts_optalias[pos][1]); /* With parameters? */ if (strncmp(hts_optalias[pos][2], "param", 5) == 0) { /* Copy parameters? */ if (need_param == 2) { if ((n_arg + 1 >= argc) || (argv[n_arg + 1][0] == '-')) { /* no supplemental parameter */ sprintf(return_error, "Syntax error:\n\tOption %s needs to be followed by a parameter: %s <param>\n\t%s\n", command, command, _NOT_NULL(optalias_help(command))); return 0; } strcpybuff(param, argv[n_arg + 1]); need_param = 2; } } else need_param = 1; /* Final result */ /* Must be alone (-P /tmp) */ if (strcmp(hts_optalias[pos][2], "param1") == 0) { strcpybuff(return_argv[0], command); strcpybuff(return_argv[1], param); *return_argc = 2; /* 2 parameters returned */ } /* Alone with parameter (+*.gif) */ else if (strcmp(hts_optalias[pos][2], "param0") == 0) { /* Command */ strcpybuff(return_argv[0], command); strcatbuff(return_argv[0], param); } /* Together (-c8) */ else { /* Command */ strcpybuff(return_argv[0], command); /* Parameters accepted */ if (strncmp(hts_optalias[pos][2], "param", 5) == 0) { /* --cache=off or --index=on */ if (strcmp(param, "off") == 0) strcatbuff(return_argv[0], "0"); else if (strcmp(param, "on") == 0) { // on is the default // strcatbuff(return_argv[0],"1"); } else strcatbuff(return_argv[0], param); } *return_argc = 1; /* 1 parameter returned */ } } else { sprintf(return_error, "Unknown option: %s\n", command); return 0; } return need_param; } /* Check -O <path> */ { int pos; if ((pos = optreal_find(argv[n_arg])) >= 0) { if ((strcmp(hts_optalias[pos][2], "param1") == 0) || (strcmp(hts_optalias[pos][2], "param0") == 0)) { if ((n_arg + 1 >= argc) || (argv[n_arg + 1][0] == '-')) { /* no supplemental parameter */ sprintf(return_error, "Syntax error:\n\tOption %s needs to be followed by a parameter: %s <param>\n\t%s\n", argv[n_arg], argv[n_arg], _NOT_NULL(optalias_help(argv[n_arg]))); return 0; } /* Copy parameters */ strcpybuff(return_argv[0], argv[n_arg]); strcpybuff(return_argv[1], argv[n_arg + 1]); /* And return */ *return_argc = 2; /* 2 parameters returned */ return 2; /* 2 parameters used */ } } } /* Copy and return other unknown option */ strcpybuff(return_argv[0], argv[n_arg]); return 1; }
/* Note: NOT utf-8 */ int optinclude_file(const char *name, int *argc, char **argv, char *x_argvblk, int *x_ptr) { FILE *fp; fp = fopen(name, "rb"); if (fp) { char line[256]; int insert_after = 1; /* first, insert after program filename */ while(!feof(fp)) { char *a, *b; int result; /* read line */ linput(fp, line, 250); hts_lowcase(line); if (strnotempty(line)) { /* no comment line: # // ; */ if (strchr("#/;", line[0]) == NULL) { /* right trim */ a = line + strlen(line) - 1; while(is_realspace(*a)) *(a--) = '\0'; /* jump "set " and spaces */ a = line; while(is_realspace(*a)) a++; if (strncmp(a, "set", 3) == 0) { if (is_realspace(*(a + 3))) { a += 4; } } while(is_realspace(*a)) a++; /* delete = ("sockets=8") */ if ((b = strchr(a, '='))) *b = ' '; /* isolate option and parameter */ b = a; while((!is_realspace(*b)) && (*b)) b++; if (*b) { *b = '\0'; b++; } /* a is now the option, b the parameter */ { int return_argc; char return_error[256]; char _tmp_argv[4][HTS_CDLMAXSIZE]; char *tmp_argv[4]; tmp_argv[0] = _tmp_argv[0]; tmp_argv[1] = _tmp_argv[1]; tmp_argv[2] = _tmp_argv[2]; tmp_argv[3] = _tmp_argv[3]; strcpybuff(_tmp_argv[0], "--"); strcatbuff(_tmp_argv[0], a); strcpybuff(_tmp_argv[1], b); result = optalias_check(2, (const char *const *) tmp_argv, 0, &return_argc, (tmp_argv + 2), return_error); if (!result) { printf("%s\n", return_error); } else { int insert_after_argc; /* Insert parameters BUT so that they can be in the same order */ /* temporary argc: Number of parameters after minus insert_after_argc */ insert_after_argc = (*argc) - insert_after; cmdl_ins((tmp_argv[2]), insert_after_argc, (argv + insert_after), x_argvblk, (*x_ptr)); *argc = insert_after_argc + insert_after; insert_after++; /* Second one */ if (return_argc > 1) { insert_after_argc = (*argc) - insert_after; cmdl_ins((tmp_argv[3]), insert_after_argc, (argv + insert_after), x_argvblk, (*x_ptr)); *argc = insert_after_argc + insert_after; insert_after++; } /* increment to nbr of used parameters */ /* insert_after+=result; */ } } } } } fclose(fp); return 1; } return 0; }
// gestion des cookie // ajoute, dans l'ordre // !=0 : erreur int cookie_add(t_cookie * cookie, char *cook_name, char *cook_value, char *domain, char *path) { char buffer[8192]; char *a = cookie->data; char *insert; char cook[16384]; // effacer éventuel cookie en double cookie_del(cookie, cook_name, domain, path); if ((int) strlen(cook_value) > 1024) return -1; // trop long if ((int) strlen(cook_name) > 256) return -1; // trop long if ((int) strlen(domain) > 256) return -1; // trop long if ((int) strlen(path) > 256) return -1; // trop long if ((int) (strlen(cookie->data) + strlen(cook_value) + strlen(cook_name) + strlen(domain) + strlen(path) + 256) > cookie->max_len) return -1; // impossible d'ajouter insert = a; // insérer ici while(*a) { if (strlen(cookie_get(buffer, a, 2)) < strlen(path)) // long. path (le + long est prioritaire) a = cookie->data + strlen(cookie->data); // fin else { a = strchr(a, '\n'); // prochain champ if (a == NULL) a = cookie->data + strlen(cookie->data); // fin else a++; while(*a == '\n') a++; insert = a; // insérer ici } } // construction du cookie strcpybuff(cook, domain); strcatbuff(cook, "\t"); strcatbuff(cook, "TRUE"); strcatbuff(cook, "\t"); strcatbuff(cook, path); strcatbuff(cook, "\t"); strcatbuff(cook, "FALSE"); strcatbuff(cook, "\t"); strcatbuff(cook, "1999999999"); strcatbuff(cook, "\t"); strcatbuff(cook, cook_name); strcatbuff(cook, "\t"); strcatbuff(cook, cook_value); strcatbuff(cook, "\n"); if (!(((int) strlen(cookie->data) + (int) strlen(cook)) < cookie->max_len)) return -1; // impossible d'ajouter cookie_insert(insert, cook); #if DEBUG_COOK printf("add_new cookie: name=\"%s\" value=\"%s\" domain=\"%s\" path=\"%s\"\n", cook_name, cook_value, domain, path); //printf(">>>cook: %s<<<\n",cookie->data); #endif return 0; }
// forme à partir d'un lien et du contexte (origin_fil et origin_adr d'où il est tiré) adr et fil // [adr et fil sont des buffers de 1ko] // 0 : ok // -1 : erreur // -2 : protocole non supporté (ftp) int ident_url_relatif(const char *lien,const char* origin_adr,const char* origin_fil,char* adr,char* fil) { int ok=0; int scheme=0; adr[0]='\0'; fil[0]='\0'; //effacer buffers // lien non vide! if (strnotempty(lien)==0) return -1; // erreur! // Scheme? { const char* a=lien; while (isalpha((unsigned char)*a)) a++; if (*a == ':') scheme=1; } // filtrer les parazites (mailto & cie) // scheme+authority (//) if ( (strfield(lien,"http://")) // scheme+// || (strfield(lien,"file://")) // scheme+// || (strncmp(lien,"//",2)==0) // // sans scheme (-> default) ) { if (ident_url_absolute(lien,adr,fil)==-1) { ok=-1; // erreur URL } } else if (strfield(lien,"ftp://")) { // Note: ftp:foobar.gif is not valid if (ftp_available()) { // ftp supporté if (ident_url_absolute(lien,adr,fil)==-1) { ok=-1; // erreur URL } } else { ok=-2; // non supporté } #if HTS_USEMMS } else if (strfield(lien,"mms://")) { if (ident_url_absolute(lien,adr,fil)==-1) { ok=-1; // erreur URL } #endif #if HTS_USEOPENSSL } else if (strfield(lien,"https://")) { if (SSL_is_available) { // Note: ftp:foobar.gif is not valid if (ident_url_absolute(lien,adr,fil)==-1) { ok=-1; // erreur URL } } else { ok=-1; } #endif } else if ((scheme) && ( (!strfield(lien,"http:")) && (!strfield(lien,"https:")) && (!strfield(lien,"ftp:")) #if HTS_USEMMS && (!strfield(lien,"mms:")) #endif )) { ok=-1; // unknown scheme } else { // c'est un lien relatif // On forme l'URL complète à partie de l'url actuelle // et du chemin actuel si besoin est. // copier adresse if (((int) strlen(origin_adr)<HTS_URLMAXSIZE) && ((int) strlen(origin_fil)<HTS_URLMAXSIZE) && ((int) strlen(lien)<HTS_URLMAXSIZE)) { /* patch scheme if necessary */ if (strfield(lien,"http:")) { lien+=5; strcpybuff(adr, jump_protocol(origin_adr)); // même adresse ; protocole vide (http) } else if (strfield(lien,"https:")) { lien+=6; strcpybuff(adr, "https://"); // même adresse forcée en https strcatbuff(adr, jump_protocol(origin_adr)); } else if (strfield(lien,"ftp:")) { lien+=4; strcpybuff(adr, "ftp://"); // même adresse forcée en ftp strcatbuff(adr, jump_protocol(origin_adr)); #if HTS_USEMMS } else if (strfield(lien,"mms:")) { lien+=4; strcpybuff(adr, "mms://"); // même adresse forcée en ftp strcatbuff(adr, jump_protocol(origin_adr)); #endif } else { strcpybuff(adr,origin_adr); // même adresse ; et même éventuel protocole } if (*lien!='/') { // sinon c'est un lien absolu if (*lien == '\0') { strcpybuff(fil,origin_fil); } else if (*lien == '?') { // example: a href="?page=2" char* a; strcpybuff(fil,origin_fil); a=strchr(fil,'?'); if (a) *a='\0'; strcatbuff(fil,lien); } else { const char *a=strchr(origin_fil,'?'); if (a == NULL) a=origin_fil+strlen(origin_fil); while((*a!='/') && ( a > origin_fil) ) a--; if (*a=='/') { // ok on a un '/' if ( (((int) (a - origin_fil))+1+strlen(lien)) < HTS_URLMAXSIZE) { // copier chemin strncpy(fil,origin_fil,((int) (a - origin_fil))+1); *(fil + ((int) (a - origin_fil))+1)='\0'; // copier chemin relatif if (((int) strlen(fil)+(int) strlen(lien)) < HTS_URLMAXSIZE) { strcatbuff(fil,lien + ((*lien=='/')?1:0) ); // simplifier url pour les ../ fil_simplifie(fil); } else ok=-1; // erreur } else { // erreur ok=-1; // erreur URL } } else { // erreur ok=-1; // erreur URL } } } else { // chemin absolu // copier chemin directement strcatbuff(fil,lien); fil_simplifie(fil); } // *lien!='/' } else ok=-1; } // test news: etc. // case insensitive pour adresse { char *a=jump_identification(adr); while(*a) { if ((*a>='A') && (*a<='Z')) *a+='a'-'A'; a++; } } return ok; }
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 */ // TStamp mytime; long int rate = 0; char st[256]; // int stat_written = -1; int stat_updated = -1; int stat_errors = -1; int stat_warnings = -1; int stat_infos = -1; int nbk = -1; LLint nb = -1; int stat_nsocket = -1; LLint stat_bytes = -1; LLint stat_bytes_recv = -1; int irate = -1; if (stats) { stat_written = stats->stat_files; stat_updated = stats->stat_updated_files; stat_errors = stats->stat_errors; stat_warnings = stats->stat_warnings; stat_infos = stats->stat_infos; nbk = stats->nbk; stat_nsocket = stats->stat_nsocket; irate = (int) stats->rate; nb = stats->nb; stat_bytes = stats->nb; stat_bytes_recv = stats->HTS_TOTAL_RECV; } if (!use_show) return 1; mytime = mtime_local(); if ((stat_time > 0) && (stat_bytes_recv > 0)) rate = (int) (stat_bytes_recv / stat_time); else rate = 0; // pas d'infos /* Infos */ if (stat_bytes >= 0) SInfo.stat_bytes = stat_bytes; // bytes if (stat_time >= 0) SInfo.stat_time = stat_time; // time if (lien_tot >= 0) SInfo.lien_tot = lien_tot; // nb liens if (lien_n >= 0) SInfo.lien_n = lien_n; // scanned SInfo.stat_nsocket = stat_nsocket; // socks if (rate > 0) SInfo.rate = rate; // rate if (irate >= 0) SInfo.irate = irate; // irate if (SInfo.irate < 0) SInfo.irate = SInfo.rate; if (nbk >= 0) SInfo.stat_back = nbk; if (stat_written >= 0) SInfo.stat_written = stat_written; if (stat_updated >= 0) SInfo.stat_updated = stat_updated; if (stat_errors >= 0) SInfo.stat_errors = stat_errors; if (stat_warnings >= 0) SInfo.stat_warnings = stat_warnings; if (stat_infos >= 0) SInfo.stat_infos = stat_infos; if (((mytime - prev_mytime) > 100) || ((mytime - prev_mytime) < 0)) { strc_int2bytes2 strc, strc2, strc3; prev_mytime = mytime; st[0] = '\0'; qsec2str(st, stat_time); vt_home(); printf(VT_GOTOXY("1","1") VT_CLREOL STYLE_STATTEXT "Bytes saved:" STYLE_STATVALUES " \t%s" "\t" VT_CLREOL VT_GOTOXY("40","1") STYLE_STATTEXT "Links scanned:" STYLE_STATVALUES " \t%d/%d (+%d)" VT_CLREOL"\n"VT_CLREOL VT_GOTOXY("1","2") STYLE_STATTEXT "Time:" " \t" STYLE_STATVALUES "%s" "\t" VT_CLREOL VT_GOTOXY("40","2") STYLE_STATTEXT "Files written:" " \t" STYLE_STATVALUES "%d" VT_CLREOL"\n"VT_CLREOL VT_GOTOXY("1","3") STYLE_STATTEXT "Transfer rate:" " \t" STYLE_STATVALUES "%s (%s)" "\t" VT_CLREOL VT_GOTOXY("40","3") STYLE_STATTEXT "Files updated:" " \t" STYLE_STATVALUES "%d" VT_CLREOL"\n"VT_CLREOL VT_GOTOXY("1","4") STYLE_STATTEXT "Active connections:" " \t" STYLE_STATVALUES "%d" "\t" VT_CLREOL VT_GOTOXY("40","4") STYLE_STATTEXT "Errors:" STYLE_STATVALUES " \t" STYLE_STATVALUES "%d" VT_CLREOL"\n" STYLE_STATRESET, /* */ (char*) int2bytes(&strc, SInfo.stat_bytes), (int) lien_n, (int) SInfo.lien_tot, (int) nbk, (char*) st, (int) SInfo.stat_written, (char*) int2bytessec(&strc2, SInfo.irate), (char*) int2bytessec(&strc3, SInfo.rate), (int) SInfo.stat_updated, (int) SInfo.stat_nsocket, (int) SInfo.stat_errors /* */ ); // parcourir registre des liens if (back_index >= 0) { // seulement si index pass� int j, k; int index = 0; int ok = 0; // idem int l; // idem // t_StatsBuffer StatsBuffer[NStatsBuffer]; { int i; for (i = 0; i < NStatsBuffer; i++) { strcpybuff(StatsBuffer[i].state,""); strcpybuff(StatsBuffer[i].name,""); strcpybuff(StatsBuffer[i].file,""); strcpybuff(StatsBuffer[i].url_sav,""); StatsBuffer[i].back = 0; StatsBuffer[i].size = 0; StatsBuffer[i].sizetot = 0; } } for (k = 0; k < 2; k++) { // 0: lien en cours 1: autres liens for (j = 0; (j < 3) && (index < NStatsBuffer); j++) { // passe de priorit� int _i; for (_i = 0 + k; (_i < max(back_max*k,1)) && (index < NStatsBuffer); _i++) { // no lien int i = (back_index + _i) % back_max; // commencer par le "premier" (l'actuel) if (back[i].status >= 0) { // signifie "lien actif" // int ok=0; // OPTI ok = 0; switch (j) { case 0: // prioritaire if ((back[i].status > 0) && (back[i].status < 99)) { strcpybuff(StatsBuffer[index].state,"receive"); ok = 1; } break; case 1: if (back[i].status == STATUS_WAIT_HEADERS) { strcpybuff(StatsBuffer[index].state,"request"); ok = 1; } else if (back[i].status == STATUS_CONNECTING) { strcpybuff(StatsBuffer[index].state,"connect"); ok = 1; } else if (back[i].status == STATUS_WAIT_DNS) { strcpybuff(StatsBuffer[index].state,"search"); ok = 1; } 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 == STATUS_READY) { // pr�t if ((back[i].r.statuscode == 200)) { strcpybuff(StatsBuffer[index].state,"ready"); ok = 1; } else if ((back[i].r.statuscode >= 100) && (back[i].r.statuscode <= 599)) { char tempo[256]; tempo[0] = '\0'; infostatuscode(tempo, back[i].r.statuscode); strcpybuff(StatsBuffer[index].state,tempo); ok = 1; } else { strcpybuff(StatsBuffer[index].state,"error"); ok = 1; } } break; } if (ok) { char BIGSTK s[HTS_URLMAXSIZE * 2]; // StatsBuffer[index].back = i; // index pour + d'infos // s[0] = '\0'; strcpybuff(StatsBuffer[index].url_sav,back[i].url_sav); // pour cancel if (strcmp(back[i].url_adr, "file://")) strcatbuff(s,back[i].url_adr); else strcatbuff(s,"localhost"); if (back[i].url_fil[0] != '/') strcatbuff(s,"/"); strcatbuff(s,back[i].url_fil); StatsBuffer[index].file[0] = '\0'; { char* a = strrchr(s, '/'); if (a) { strncatbuff(StatsBuffer[index].file,a,200); *a = '\0'; } } if ((l = (int) strlen(s)) < MAX_LEN_INPROGRESS) strcpybuff(StatsBuffer[index].name,s); else { // couper StatsBuffer[index].name[0] = '\0'; strncatbuff(StatsBuffer[index].name,s,MAX_LEN_INPROGRESS/2-2); strcatbuff(StatsBuffer[index].name,"..."); strcatbuff(StatsBuffer[index].name,s+l-MAX_LEN_INPROGRESS/2+2); } if (back[i].r.totalsize > 0) { // taille pr�d�finie 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 == STATUS_READY) { // pr�t StatsBuffer[index].sizetot = back[i].r.size; StatsBuffer[index].size = back[i].r.size; } else { StatsBuffer[index].sizetot = 8192; StatsBuffer[index].size = (back[i].r.size % 8192); } } index++; } } } } } /* LF */ printf("%s\n", VT_CLREOL); /* Display current job */ { int parsing = 0; printf("Current job: "); if (!(parsing = hts_is_parsing(opt, -1))) printf("receiving files"); else { switch (hts_is_testing(opt)) { case 0: printf("parsing HTML file (%d%%)", parsing); break; case 1: printf("parsing HTML file: testing links (%d%%)", parsing); break; case 2: printf("purging files"); break; case 3: printf("loading cache"); break; case 4: printf("waiting (scheduler)"); break; case 5: printf("waiting (throttle)"); break; } } printf("%s\n", VT_CLREOL); } /* Display background jobs */ { int i; for (i = 0; i < NStatsBuffer; i++) { if (strnotempty(StatsBuffer[i].state)) { printf(VT_CLREOL" %s - \t%s%s \t%s / \t%s", StatsBuffer[i].state, StatsBuffer[i].name, StatsBuffer[i].file, int2bytes(&strc, StatsBuffer[i].size), int2bytes(&strc2, StatsBuffer[i].sizetot)); } printf("%s\n", VT_CLREOL); } } } } return 1; }
void CNewProj::OnChangeprojpath() { CWaitCursor wait; CString st; CString old_name; char tempo[HTS_URLMAXSIZE*2]; GetDlgItemText(IDC_projname,old_name); GetDlgItemText(IDC_projpath,st); if (st.GetLength() > MAX_PATH) { SetDlgItemText(IDC_projpath, ""); return; } tempo[0] = '\0'; strcatbuff(tempo, st); if ((tempo[strlen(tempo)-1]=='/') || (tempo[strlen(tempo)-1]=='\\')) { tempo[strlen(tempo)-1]='\0'; //SetDlgItemTextCP(this, IDC_projpath,tempo); } strcatbuff(tempo,"\\"); TStamp t_start = mtime_local(); // chargement de la liste m_ctl_projname.ResetContent(); m_ctl_projcateg.ResetContent(); WIN32_FIND_DATA find; char pth[MAX_PATH + 32]; strcpybuff(pth,tempo); strcatbuff(pth,"*.*"); HANDLE h = FindFirstFile(pth,&find); if (h != INVALID_HANDLE_VALUE) { do { if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) if (!(find.dwFileAttributes & (FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN) )) if (strcmp(find.cFileName,"..")) if (strcmp(find.cFileName,".")) { CString st; st=tempo; st=st+find.cFileName; st=st+"\\hts-cache"; WIN32_FIND_DATA find2; HANDLE h2 = FindFirstFile(st,&find2); if (h2 != INVALID_HANDLE_VALUE) { FindClose(h2); m_ctl_projname.AddString(find.cFileName); // Read category st += "\\winprofile.ini"; CString strSection = "OptionsValues"; CString categ = MyGetProfileString(st, strSection, "Category"); if (categ.GetLength() > 0 && m_ctl_projcateg.FindStringExact(0, categ) < 0) { m_ctl_projcateg.AddString(categ); } } } } while(FindNextFile(h,&find)); FindClose(h); } // nouveau nom! SetDlgItemTextCP(this, IDC_projname,old_name); TStamp t_proj = mtime_local(); OnChangeprojname(); TStamp t_end = mtime_local(); TStamp l_dir = t_proj - t_start; TStamp l_proj = t_end - t_proj; //CString a; //a.Format("%s: build=%dms proj=%dms", __FUNCTION__, (int)l_dir, (int)l_proj); //(void) AfxMessageBox(a, MB_OK); }
// tester taille int hts_testlinksize(httrackp* opt, char* adr,char* fil, LLint size) { int jok=0; if (size>=0) { char BIGSTK l[HTS_URLMAXSIZE*2]; char BIGSTK lfull[HTS_URLMAXSIZE*2]; if (size>=0) { LLint sz=size; int size_flag=0; // former URL complète du lien actuel strcpybuff(l,jump_identification(adr)); if (*fil!='/') strcatbuff(l,"/"); strcatbuff(l,fil); // if (!link_has_authority(adr)) strcpybuff(lfull,"http://"); else lfull[0]='\0'; strcatbuff(lfull,adr); if (*fil!='/') strcatbuff(l,"/"); strcatbuff(lfull,fil); // filters, 0=sait pas 1=ok -1=interdit { int jokDepth1=0,jokDepth2=0; int jok1=0,jok2=0; LLint sz1=size,sz2=size; int size_flag1=0,size_flag2=0; jok1 = fa_strjoker(/*url*/0, *opt->filters.filters,*opt->filters.filptr,lfull,&sz1,&size_flag1,&jokDepth1); jok2 = fa_strjoker(/*url*/0, *opt->filters.filters,*opt->filters.filptr,l, &sz2,&size_flag2,&jokDepth2); if (jok2 == 0) { // #2 doesn't know jok = jok1; // then, use #1 sz = sz1; size_flag = size_flag1; } else if (jok1 == 0) { // #1 doesn't know jok = jok2; // then, use #2 sz = sz2; size_flag = size_flag2; } else if (jokDepth1 >= jokDepth2) { // #1 matching rule is "after" #2, then it is prioritary jok = jok1; sz = sz1; size_flag = size_flag1; } else { // #2 matching rule is "after" #1, then it is prioritary jok = jok2; sz = sz2; size_flag = size_flag2; } } // log if (jok==1) { if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"File confirmed (size test): %s%s ("LLintP")"LF,adr,fil,(LLint)(size)); } } else if (jok==-1) { if (size_flag) { /* interdit à cause de la taille */ if ((opt->debug>1) && (opt->log!=NULL)) { HTS_LOG(opt,LOG_DEBUG); fprintf(opt->log,"File cancelled due to its size: %s%s ("LLintP", limit: "LLintP")"LF,adr,fil,(LLint)(size),(LLint)(sz)); } } else { jok=1; } } } } return jok; }
// catch_url // returns 0 if error // url: buffer where URL must be stored - or ip:port in case of failure // data: 32Kb HTSEXT_API int catch_url(T_SOC soc, char *url, char *method, char *data) { int retour = 0; // connexion (accept) if (soc != INVALID_SOCKET) { T_SOC soc2; while((soc2 = (T_SOC) accept(soc, NULL, NULL)) == INVALID_SOCKET) ; /* #ifdef _WIN32 closesocket(soc); #else close(soc); #endif */ soc = soc2; /* INFOS */ { SOCaddr server2; SOClen len = SOCaddr_capacity(server2); if (getpeername(soc, &SOCaddr_sockaddr(server2), &len) == 0) { char dot[256 + 2]; SOCaddr_inetntoa(dot, sizeof(dot), server2); sprintf(url, "%s:%d", dot, ntohs(SOCaddr_sinport(server2))); } } /* INFOS */ // réception if (soc != INVALID_SOCKET) { char line[1000]; char protocol[256]; line[0] = protocol[0] = '\0'; // socinput(soc, line, 1000); if (strnotempty(line)) { if (sscanf(line, "%s %s %s", method, url, protocol) == 3) { lien_adrfil af; // méthode en majuscule size_t i; int r = 0; af.adr[0] = af.fil[0] = '\0'; // for(i = 0; method[i] != '\0'; i++) { if ((method[i] >= 'a') && (method[i] <= 'z')) method[i] -= ('a' - 'A'); } // adresse du lien if (ident_url_absolute(url, &af) >= 0) { // Traitement des en-têtes char BIGSTK loc[HTS_URLMAXSIZE * 2]; htsblk blkretour; hts_init_htsblk(&blkretour); //memset(&blkretour, 0, sizeof(htsblk)); // effacer blkretour.location = loc; // si non nul, contiendra l'adresse véritable en cas de moved xx // Lire en têtes restants sprintf(data, "%s %s %s\r\n", method, af.fil, protocol); while(strnotempty(line)) { socinput(soc, line, 1000); treathead(NULL, NULL, NULL, &blkretour, line); // traiter strcatbuff(data, line); strcatbuff(data, "\r\n"); } // CR/LF final de l'en tête inutile car déja placé via la ligne vide juste au dessus //strcatbuff(data,"\r\n"); if (blkretour.totalsize > 0) { int len = (int) min(blkretour.totalsize, 32000); int pos = (int) strlen(data); // Copier le reste (post éventuel) while((len > 0) && ((r = recv(soc, (char *) data + pos, len, 0)) > 0)) { pos += r; len -= r; data[pos] = '\0'; // terminer par NULL } } // Envoyer page sprintf(line, CATCH_RESPONSE); send(soc, line, (int) strlen(line), 0); // OK! retour = 1; } } } // sinon erreur } } if (soc != INVALID_SOCKET) { #ifdef _WIN32 closesocket(soc); /* WSACleanup(); */ #else close(soc); #endif } return retour; }
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 */ // TStamp mytime; long int rate=0; // int stat_written=-1; int stat_updated=-1; int stat_errors=-1; int stat_warnings=-1; int stat_infos=-1; int nbk=-1; LLint nb=-1; int stat_nsocket=-1; LLint stat_bytes=-1; LLint stat_bytes_recv=-1; int irate=-1; // char st[256]; /* Exit now */ if (commandEndRequested == 2) return 0; /* Lock */ webhttrack_lock(); if (stats) { stat_written=stats->stat_files; stat_updated=stats->stat_updated_files; stat_errors=stats->stat_errors; stat_warnings=stats->stat_warnings; stat_infos=stats->stat_infos; nbk=stats->nbk; stat_nsocket=stats->stat_nsocket; irate=(int)stats->rate; nb=stats->nb; stat_bytes=stats->nb; stat_bytes_recv=stats->HTS_TOTAL_RECV; } mytime=mtime_local(); if ((stat_time>0) && (stat_bytes_recv>0)) rate=(int)(stat_bytes_recv/stat_time); else rate=0; // pas d'infos /* Infos */ if (stat_bytes>=0) SInfo.stat_bytes=stat_bytes; // bytes if (stat_time>=0) SInfo.stat_time=stat_time; // time if (lien_tot>=0) SInfo.lien_tot=lien_tot; // nb liens if (lien_n>=0) SInfo.lien_n=lien_n; // scanned SInfo.stat_nsocket=stat_nsocket; // socks if (rate>0) SInfo.rate=rate; // rate if (irate>=0) SInfo.irate=irate; // irate if (SInfo.irate<0) SInfo.irate=SInfo.rate; if (nbk>=0) SInfo.stat_back=nbk; if (stat_written>=0) SInfo.stat_written=stat_written; if (stat_updated>=0) SInfo.stat_updated=stat_updated; if (stat_errors>=0) SInfo.stat_errors=stat_errors; if (stat_warnings>=0) SInfo.stat_warnings=stat_warnings; if (stat_infos>=0) SInfo.stat_infos=stat_infos; st[0]='\0'; qsec2str(st,stat_time); /* Set keys */ smallserver_setkeyint("info.stat_bytes", SInfo.stat_bytes); smallserver_setkeyint("info.stat_time", SInfo.stat_time); smallserver_setkeyint("info.lien_tot", SInfo.lien_tot); smallserver_setkeyint("info.lien_n", SInfo.lien_n); smallserver_setkeyint("info.stat_nsocket", SInfo.stat_nsocket); smallserver_setkeyint("info.rate", SInfo.rate); smallserver_setkeyint("info.irate", SInfo.irate); smallserver_setkeyint("info.stat_back", SInfo.stat_back); smallserver_setkeyint("info.stat_written", SInfo.stat_written); smallserver_setkeyint("info.stat_updated", SInfo.stat_updated); smallserver_setkeyint("info.stat_errors", SInfo.stat_errors); smallserver_setkeyint("info.stat_warnings", SInfo.stat_warnings); smallserver_setkeyint("info.stat_infos", SInfo.stat_infos); /* */ smallserver_setkey("info.stat_time_str", st); if ( ((mytime - prev_mytime)>100) || ((mytime - prev_mytime)<0) ) { prev_mytime=mytime; // parcourir registre des liens if (back_index>=0 && back_max > 0) { // seulement si index passé int j,k; int index=0; int ok=0; // idem int l; // idem // t_StatsBuffer StatsBuffer[NStatsBuffer]; { int i; for(i=0;i<NStatsBuffer;i++) { strcpybuff(StatsBuffer[i].state,""); strcpybuff(StatsBuffer[i].name,""); strcpybuff(StatsBuffer[i].file,""); strcpybuff(StatsBuffer[i].url_sav,""); StatsBuffer[i].back=0; StatsBuffer[i].size=0; StatsBuffer[i].sizetot=0; } } for(k=0;k<2;k++) { // 0: lien en cours 1: autres liens for(j=0;(j<3) && (index<NStatsBuffer);j++) { // passe de priorité int _i; for(_i=0+k;(_i< max(back_max*k,1) ) && (index<NStatsBuffer);_i++) { // no lien int i=(back_index+_i)%back_max; // commencer par le "premier" (l'actuel) if (back[i].status>=0) { // signifie "lien actif" // int ok=0; // OPTI ok=0; switch(j) { case 0: // prioritaire if ((back[i].status>0) && (back[i].status<99)) { strcpybuff(StatsBuffer[index].state,"receive"); ok=1; } break; case 1: if (back[i].status==STATUS_WAIT_HEADERS) { strcpybuff(StatsBuffer[index].state,"request"); ok=1; } else if (back[i].status==STATUS_CONNECTING) { strcpybuff(StatsBuffer[index].state,"connect"); ok=1; } else if (back[i].status==STATUS_WAIT_DNS) { strcpybuff(StatsBuffer[index].state,"search"); ok=1; } else if (back[i].status==STATUS_FTP_TRANSFER) { // ohh le beau ftp char proto[] = "ftp"; if (back[i].url_adr[0]) { char* ep = strchr(back[i].url_adr, ':'); char* eps = strchr(back[i].url_adr, '/'); int count; if (ep != NULL && ep < eps && (count = (int) (ep - back[i].url_adr) ) < 4) { proto[0] = '\0'; strncat(proto, back[i].url_adr, count); } } sprintf(StatsBuffer[index].state,"%s: %s",proto,back[i].info); ok=1; } break; default: if (back[i].status==STATUS_READY) { // prêt if ((back[i].r.statuscode==HTTP_OK)) { strcpybuff(StatsBuffer[index].state,"ready"); ok=1; } else if ((back[i].r.statuscode>=100) && (back[i].r.statuscode<=599)) { char tempo[256]; tempo[0]='\0'; infostatuscode(tempo,back[i].r.statuscode); strcpybuff(StatsBuffer[index].state,tempo); ok=1; } else { strcpybuff(StatsBuffer[index].state,"error"); ok=1; } } break; } if (ok) { char s[HTS_URLMAXSIZE*2]; // StatsBuffer[index].back=i; // index pour + d'infos // s[0]='\0'; strcpybuff(StatsBuffer[index].url_sav,back[i].url_sav); // pour cancel if (strcmp(back[i].url_adr,"file://")) strcatbuff(s,back[i].url_adr); else strcatbuff(s,"localhost"); if (back[i].url_fil[0]!='/') strcatbuff(s,"/"); strcatbuff(s,back[i].url_fil); StatsBuffer[index].file[0]='\0'; { char* a=strrchr(s,'/'); if (a) { strncatbuff(StatsBuffer[index].file,a,200); *a='\0'; } } if ((l = (int) strlen(s))<MAX_LEN_INPROGRESS) strcpybuff(StatsBuffer[index].name,s); else { // couper StatsBuffer[index].name[0]='\0'; strncatbuff(StatsBuffer[index].name,s,MAX_LEN_INPROGRESS/2-2); strcatbuff(StatsBuffer[index].name,"..."); strcatbuff(StatsBuffer[index].name,s+l-MAX_LEN_INPROGRESS/2+2); } if (back[i].r.totalsize>0) { // taille prédéfinie 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==STATUS_READY) { // prêt StatsBuffer[index].sizetot=back[i].r.size; StatsBuffer[index].size=back[i].r.size; } else { StatsBuffer[index].sizetot=8192; StatsBuffer[index].size=(back[i].r.size % 8192); } } index++; } } } } } /* Display current job */ { int parsing=0; if (commandEndRequested) smallserver_setkey("info.currentjob", "finishing pending transfers - Select [Cancel] to stop now!"); else if (!(parsing=hts_is_parsing(opt, -1))) smallserver_setkey("info.currentjob", "receiving files"); else { char tmp[1024]; tmp[0] = '\0'; switch(hts_is_testing(opt)) { case 0: sprintf(tmp, "parsing HTML file (%d%%)",parsing); break; case 1: sprintf(tmp, "parsing HTML file: testing links (%d%%)",parsing); break; case 2: sprintf(tmp, "purging files"); break; case 3: sprintf(tmp, "loading cache"); break; case 4: sprintf(tmp, "waiting (scheduler)"); break; case 5: sprintf(tmp, "waiting (throttle)"); break; } smallserver_setkey("info.currentjob", tmp); } } /* Display background jobs */ { int i; for(i=0;i<NStatsBuffer;i++) { if (strnotempty(StatsBuffer[i].state)) { strc_int2bytes2 strc; smallserver_setkeyarr("info.state[", i, "]", StatsBuffer[i].state); smallserver_setkeyarr("info.name[", i, "]", StatsBuffer[i].name); smallserver_setkeyarr("info.file[", i, "]", StatsBuffer[i].file); smallserver_setkeyarr("info.size[", i, "]", int2bytes(&strc,StatsBuffer[i].size)); smallserver_setkeyarr("info.sizetot[", i, "]", int2bytes(&strc,StatsBuffer[i].sizetot)); smallserver_setkeyarr("info.url_adr[", i, "]", StatsBuffer[i].url_adr); smallserver_setkeyarr("info.url_fil[", i, "]", StatsBuffer[i].url_fil); smallserver_setkeyarr("info.url_sav[", i, "]", StatsBuffer[i].url_sav); } } } } } /* UnLock */ webhttrack_release(); return 1; }
CDocument* CWinHTTrackApp::OpenDocumentFile( LPCTSTR lpszFileName) { // Eviter deux fenêtres (un seul document) // Le CMultui..->CSingleDoc.. est trop complexe à changer (à cause du splitter-wnd) int count=1; { /* Check if a document exists, and if exists if empty or not, and if name is different */ POSITION pos; pos=GetFirstDocTemplatePosition(); if (pos) { CDocTemplate* tmpl=GetNextDocTemplate(pos); if (tmpl) { pos=tmpl->GetFirstDocPosition(); if (pos) { CDocument* doc = tmpl->GetNextDoc(pos); if (doc) { if (dialog0->GetName().GetLength()==0) { CloseAllDocuments(FALSE); count=0; /* No documents */ } else { if (dialog0->GetPath0()+".whtt" == LPCSTR(lpszFileName)) return NULL; } } } else count=0; /* No documents */ } } } // Ouvrir nouvelle instance if (count) { char cmdl[2048]; TCHAR ModulePath[MAX_PATH + 1]; ModulePath[0] = '\0'; ::GetModuleFileName(NULL, ModulePath, sizeof(ModulePath)/sizeof(TCHAR) - 1); CString name = ModulePath; strcpybuff(cmdl,"\""); strcatbuff(cmdl,lpszFileName); strcatbuff(cmdl,"\""); ShellExecute(NULL,"open",name,cmdl,"",SW_RESTORE); return NULL; } // Ouvrir nouveau? //if (count) // return; // ne rien faire, car limité à 1 document //count++; /* Ouvrir */ /* CWinApp* app=AfxGetApp(); POSITION pos; pos=app->GetFirstDocTemplatePosition(); CDocTemplate* templ = app->GetNextDocTemplate(pos); pos=templ->GetFirstDocPosition(); if (pos) { CDocument* doc = templ->GetNextDoc(pos); if (doc) if (!doc->SaveModified()) return NULL; } CloseAllDocuments(FALSE); */ if (strlen(lpszFileName)) return CWinApp::OpenDocumentFile(lpszFileName); else CWinApp::OnFileNew(); return NULL; }
/* Code mainly written by Nicolas BENOIT */ static int run_launch_mms(MMSDownloadStruct* pStruct) { lien_back* back = pStruct->pBack; httrackp* opt = pStruct->pOpt; /* */ char url[HTS_URLMAXSIZE*2]; char catbuff[CATBUFF_SIZE]; char catbuff2[CATBUFF_SIZE]; MMS *mms; FILE *f; ssize_t len_written; uint64_t total_len_written; int delay = opt->mms_maxtime; time_t end = time(NULL) + delay; short checkPending = 0; ssize_t existingSize = fsize(back->url_sav); // effacer strcpybuff(back->r.msg,""); back->status=STATUS_FTP_TRANSFER; back->r.statuscode=HTTP_OK; back->r.size=0; /* Create file */ if (existingSize > 0) { /* back->r.out = fileappend(back->url_sav); */ (void) unlink(fconcat(catbuff,back->url_sav, ".old")); if (rename(fconcat(catbuff,back->url_sav, ""), fconcat(catbuff2,back->url_sav, ".old")) == 0) { checkPending = 1; } back->r.out = filecreate(&pStruct->pOpt->state.strc, back->url_sav); } else { back->r.out = filecreate(&pStruct->pOpt->state.strc, back->url_sav); } if ((f = back->r.out) != NULL) { // create mms resource strcpybuff(url, back->url_adr); /* mms:// */ strcatbuff(url, back->url_fil); if ( ( mms = mms_create( url, f, NULL, 0, 1 ) ) != NULL ) { if ( mms_connect ( mms ) == 0 ) { if ( mms_handshake ( mms ) == 0 ) { if ( ( len_written = mms_write_stream_header ( mms ) ) != -1 ) { total_len_written = len_written; HTS_STAT.HTS_TOTAL_RECV += len_written; /* not modified */ if (checkPending) { if (mms->is_live != MMS_LIVE && mms->expected_file_size == existingSize + 50 /* Why 50 additional bytes declared ?? */ ) // abort download { fclose(back->r.out); f = back->r.out = NULL; if (unlink(fconcat(catbuff, back->url_sav, "")) == 0 && rename(fconcat(catbuff, back->url_sav, ".old"), fconcat(catbuff2, back->url_sav, "")) == 0) { back->r.notmodified = 1; back->r.statuscode = HTTP_OK; strcpybuff(back->r.msg, "Not modified"); } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Unable to rename previous file (not updated)"); } } else { (void) unlink(fconcat(catbuff, back->url_sav, ".old")); } } /* begin rip */ if ( f != NULL && mms_begin_rip ( mms ) == 0 ) { if ( mms->is_live != MMS_LIVE ) { back->r.totalsize = mms->expected_file_size; back->r.totalsize -= 50; /* Why 50 additional bytes declared ?? */ } else back->r.totalsize = -1; /* Start download */ while ( !stop_mms(back) ) { len_written = mms_write_stream_data ( mms ); if ( len_written == 0 ) { break; } else if ( len_written == -1 ) { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Unable to write stream data"); break; } total_len_written += len_written; back->r.size = total_len_written; HTS_STAT.HTS_TOTAL_RECV += len_written; fflush ( f ); if ( delay != 0 && end <= time(NULL) ) { delay = -1; back->r.statuscode = HTTP_OK; strcpybuff(back->r.msg, "Download interrupted"); break; } } // while back->r.statuscode = HTTP_OK; /* Finished */ } else if (f != NULL) { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Can not begin ripping"); } } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Can not write stream header"); } } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Can not handshake"); } mms_disconnect ( mms ); } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Can not connect"); } mms_destroy ( mms ); } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Can not create mms resource"); } } else { back->r.statuscode = HTTP_INTERNAL_SERVER_ERROR; strcpybuff(back->r.msg, "Unable to open local output file"); } return 0; }
// créer dans s, à partir du chemin courant curr_fil, le lien vers link (absolu) // un ident_url_relatif a déja été fait avant, pour que link ne soit pas un chemin relatif int lienrelatif(char* s,const char* link,const char* curr_fil) { char BIGSTK _curr[HTS_URLMAXSIZE*2]; char BIGSTK newcurr_fil[HTS_URLMAXSIZE*2],newlink[HTS_URLMAXSIZE*2]; char* curr; //int n=0; char* a; int slash=0; // newcurr_fil[0]='\0'; newlink[0]='\0'; // // patch: éliminer les ? (paramètres) sinon bug { const char* a; if ( (a=strchr(curr_fil,'?')) ) { strncatbuff(newcurr_fil,curr_fil,(int) (a - curr_fil)); curr_fil = newcurr_fil; } if ( (a=strchr(link,'?')) ) { strncatbuff(newlink,link,(int) (a - link)); link = newlink; } } // recopier uniquement le chemin courant curr=_curr; strcpybuff(curr,curr_fil); if ((a=strchr(curr,'?'))==NULL) // couper au ? (params) a=curr+strlen(curr)-1; // pas de params: aller à la fin while((*a!='/') && ( a> curr)) a--; // chercher dernier / du chemin courant if (*a=='/') *(a+1)='\0'; // couper dernier / // "effacer" s s[0]='\0'; // sauter ce qui est commun aux 2 chemins { const char *l,*c; if (*link=='/') link++; // sauter slash if (*curr=='/') curr++; l=link; c=curr; // couper ce qui est commun while ((streql(*link,*curr)) && (*link!=0)) {link++; curr++; } // mais on veut un répertoirer entier! // si on a /toto/.. et /toto2/.. on ne veut pas sauter /toto ! while(((*link!='/') || (*curr!='/')) && ( link > l)) { link--; curr--; } //if (*link=='/') link++; //if (*curr=='/') curr++; } // calculer la profondeur du répertoire courant et remonter // LES ../ ONT ETE SIMPLIFIES a=curr; if (*a=='/') a++; while(*a) if (*(a++)=='/') strcatbuff(s,"../"); //if (strlen(s)==0) strcatbuff(s,"/"); if (slash) strcatbuff(s,"/"); // garder absolu!! // on est dans le répertoire de départ, copier strcatbuff(s,link + ((*link=='/')?1:0) ); /* Security check */ if (strlen(s) >= HTS_URLMAXSIZE) return -1; // on a maintenant une chaine de la forme ../../test/truc.html return 0; }
LRESULT Cinprogress::OnEndMirror(WPARAM /* wP*/, LPARAM /*lP*/) { char catbuff[CATBUFF_SIZE]; char catbuff2[CATBUFF_SIZE]; //this_CSplitterFrame->SetNewView(0,1,RUNTIME_CLASS(Cinfoend)); // Copie de trans.cpp this_CWizTab->ModifyStyle(WS_VISIBLE,0,0); this_CWizTab->RedrawWindow(); // //{ // CWizTab* tmp; // tmp=this_CWizTab; this_CWizTab=this_intCWizTab; // this_CWizTab2=tmp; //} // this_CWizTab->ModifyStyle(0,WS_VISIBLE,0); this_CWizTab->ModifyStyle(WS_DISABLED,0,0); this_CSplitterFrame->RedrawWindow(); // Fin de Copie de trans.cpp this_CWizTab->EndInProgress(); if (IsWindow(this_Cinfoend->m_hWnd)) SetDlgItemTextCP(this_Cinfoend, IDC_infoend,end_mirror_msg); if (hts_is_exiting(global_opt) == 1) { /* Interrupted mirror! */ char pathlog[HTS_URLMAXSIZE*2]; strcpybuff(pathlog,dialog0->GetPath()); if (strlen(pathlog)>0) { if ((pathlog[strlen(pathlog)-1]!='/') && (pathlog[strlen(pathlog)-1]!='\\')) strcatbuff(pathlog,"/"); } // Aborted updated.. restore old cache?! if ( fexist(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.zip")) || (fexist(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.dat"))) && (fexist(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.ndx"))) ) { if (AfxMessageBox(LANG_F22b,MB_YESNO|MB_DEFBUTTON2) == IDYES) { if (fexist(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.dat")) && fexist(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.ndx"))) { if (remove(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/new.dat"))) { AfxMessageBox(LANG_F24 ); } if (remove(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/new.ndx"))) { AfxMessageBox(LANG_F24 ); } } if (remove(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/new.lst"))) { AfxMessageBox(LANG_F24 ); } if (fexist(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.zip"))) { if (remove(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/new.zip"))) { AfxMessageBox(LANG_F24 ); } } remove(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/new.txt")); rename(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.zip"),fconcat(catbuff2,sizeof(catbuff2),pathlog,"hts-cache/new.zip")); rename(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.dat"),fconcat(catbuff2,sizeof(catbuff2),pathlog,"hts-cache/new.dat")); rename(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.ndx"),fconcat(catbuff2,sizeof(catbuff2),pathlog,"hts-cache/new.ndx")); rename(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.lst"),fconcat(catbuff2,sizeof(catbuff2),pathlog,"hts-cache/new.lst")); rename(fconcat(catbuff,sizeof(catbuff),pathlog,"hts-cache/old.txt"),fconcat(catbuff2,sizeof(catbuff2),pathlog,"hts-cache/new.txt")); } } } else if (hts_is_exiting(global_opt) == 2) { /* No connection! */ AfxMessageBox(LANG_F22c ); } return S_OK; }
// conversion nom de fichier/dossier isolé vers 8-3 ou ISO9660 void longfile_to_83(int mode,char* n83,char* save) { int j=0,max=0; int i = 0; char nom[256]; char ext[256]; nom[0]=ext[0]='\0'; switch(mode) { case 1: max=8; break; case 2: max=31; break; default: max=8; break; } /* No starting . */ if (save[0] == '.') { save[0]='_'; } /* No multiple dots */ { char* last_dot=strrchr(save, '.'); char* dot; while((dot=strchr(save, '.'))) { *dot = '_'; } if (last_dot) { *last_dot='.'; } } /* Avoid: (ISO9660, but also suitable for 8-3) (Thanks to [email protected] for te hint) /:;?\#*~ 0x00-0x1f and 0x80-0xff */ for(i = 0 ; save[i] != 0 ; i++) { char a = save[i]; if (a >= 'a' && a <= 'z') { a -= 'a' - 'A'; } else if ( ! ( (a >= 'A' && a <= 'Z') || (a >= '0' && a <= '9') || a == '_' || a == '.') ) { a = '_'; } save[i] = a; } i=j=0; while((i<max) && (save[j]) && (save[j]!='.')) { if (save[j]!=' ') { nom[i]=save[j]; i++; } j++; } // recopier nom nom[i]='\0'; if (save[j]) { // il reste au moins un point i = (int) strlen(save)-1; while((i>0) && (save[i]!='.') && (save[i]!='/')) i--; // rechercher dernier . if (save[i]=='.') { // point! int j=0; i++; while((j<3) && (save[i]) ) { if (save[i]!=' ') { ext[j]=save[i]; j++; } i++; } ext[j]='\0'; } } // corriger vers 8-3 n83[0]='\0'; strncatbuff(n83,nom,max); if (strnotempty(ext)) { strcatbuff(n83,"."); strncatbuff(n83,ext,3); } }
// lire cookies.txt // lire également (Windows seulement) les *@*.txt (cookies IE copiés) // !=0 : erreur int cookie_load(t_cookie * cookie, const char *fpath, const char *name) { char catbuff[CATBUFF_SIZE]; char buffer[8192]; // cookie->data[0]='\0'; // Fusionner d'abord les éventuels cookies IE #ifdef _WIN32 { WIN32_FIND_DATAA find; HANDLE h; char pth[MAX_PATH + 32]; strcpybuff(pth, fpath); strcatbuff(pth, "*@*.txt"); h = FindFirstFileA((char *) pth, &find); if (h != INVALID_HANDLE_VALUE) { do { if (!(find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) if (!(find.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) { FILE *fp = fopen(fconcat(catbuff, fpath, find.cFileName), "rb"); if (fp) { char cook_name[256]; char cook_value[1000]; char domainpathpath[512]; char dummy[512]; // char domain[256]; // domaine cookie (.netscape.com) char path[256]; // chemin (/) int cookie_merged = 0; // // Read all cookies while(!feof(fp)) { cook_name[0] = cook_value[0] = domainpathpath[0] = dummy[0] = domain[0] = path[0] = '\0'; linput(fp, cook_name, 250); if (!feof(fp)) { linput(fp, cook_value, 250); if (!feof(fp)) { int i; linput(fp, domainpathpath, 500); /* Read 6 other useless values */ for(i = 0; !feof(fp) && i < 6; i++) { linput(fp, dummy, 500); } if (strnotempty(cook_name) && strnotempty(cook_value) && strnotempty(domainpathpath)) { if (ident_url_absolute(domainpathpath, domain, path) >= 0) { cookie_add(cookie, cook_name, cook_value, domain, path); cookie_merged = 1; } } } } } fclose(fp); if (cookie_merged) remove(fconcat(catbuff, fpath, find.cFileName)); } // if fp } } while(FindNextFileA(h, &find)); FindClose(h); } } #endif // Ensuite, cookies.txt { FILE *fp = fopen(fconcat(catbuff, fpath, name), "rb"); if (fp) { char BIGSTK line[8192]; while((!feof(fp)) && (((int) strlen(cookie->data)) < cookie->max_len)) { rawlinput(fp, line, 8100); if (strnotempty(line)) { if (strlen(line) < 8000) { if (line[0] != '#') { char domain[256]; // domaine cookie (.netscape.com) char path[256]; // chemin (/) char cook_name[1024]; // nom cookie (MYCOOK) char BIGSTK cook_value[8192]; // valeur (ID=toto,S=1234) strcpybuff(domain, cookie_get(buffer, line, 0)); // host strcpybuff(path, cookie_get(buffer, line, 2)); // path strcpybuff(cook_name, cookie_get(buffer, line, 5)); // name strcpybuff(cook_value, cookie_get(buffer, line, 6)); // value #if DEBUG_COOK printf("%s\n", line); #endif cookie_add(cookie, cook_name, cook_value, domain, path); } } } } fclose(fp); return 0; } } return -1; }
void help_wizard(httrackp * opt) { help_wizard_buffers *buffers = malloct(sizeof(help_wizard_buffers)); #undef urls #undef mainpath #undef projname #undef stropt #undef stropt2 #undef strwild #undef cmd #undef str #undef argv #define urls (buffers->urls) #define mainpath (buffers->mainpath) #define projname (buffers->projname) #define stropt (buffers->stropt) #define stropt2 (buffers->stropt2) #define strwild (buffers->strwild) #define cmd (buffers->cmd) #define str (buffers->str) #define argv (buffers->argv) //char *urls = (char *) malloct(HTS_URLMAXSIZE * 2); //char *mainpath = (char *) malloct(256); //char *projname = (char *) malloct(256); //char *stropt = (char *) malloct(2048); // options //char *stropt2 = (char *) malloct(2048); // options longues //char *strwild = (char *) malloct(2048); // wildcards //char *cmd = (char *) malloct(4096); //char *str = (char *) malloct(256); //char **argv = (char **) malloct(256 * sizeof(char *)); // char *a; // if (urls == NULL || mainpath == NULL || projname == NULL || stropt == NULL || stropt2 == NULL || strwild == NULL || cmd == NULL || str == NULL || argv == NULL) { fprintf(stderr, "* memory exhausted in %s, line %d\n", __FILE__, __LINE__); return; } urls[0] = mainpath[0] = projname[0] = stropt[0] = stropt2[0] = strwild[0] = cmd[0] = str[0] = '\0'; // strcpybuff(stropt, "-"); mainpath[0] = projname[0] = stropt2[0] = strwild[0] = '\0'; // printf("\n"); printf("Welcome to HTTrack Website Copier (Offline Browser) " HTTRACK_VERSION "%s\n", hts_get_version_info(opt)); printf("Copyright (C) 1998-2016 Xavier Roche and other contributors\n"); #ifdef _WIN32 printf("Note: You are running the commandline version,\n"); printf("run 'WinHTTrack.exe' to get the GUI version.\n"); #endif #ifdef HTTRACK_AFF_WARNING printf("NOTE: " HTTRACK_AFF_WARNING "\n"); #endif #ifdef HTS_PLATFORM_NAME #if USE_BEGINTHREAD printf("[compiled: " HTS_PLATFORM_NAME " - MT]\n"); #else printf("[compiled: " HTS_PLATFORM_NAME "]\n"); #endif #endif printf("To see the option list, enter a blank line or try httrack --help\n"); // // Project name while(strnotempty(projname) == 0) { printf("\n"); printf("Enter project name :"); fflush(stdout); linput(stdin, projname, 250); if (strnotempty(projname) == 0) help("httrack", 1); } // // Path if (strnotempty(hts_gethome())) printf("\nBase path (return=%s/websites/) :", hts_gethome()); else printf("\nBase path (return=current directory) :"); linput(stdin, str, 250); if (!strnotempty(str)) { strcatbuff(str, hts_gethome()); strcatbuff(str, "/websites/"); } if (strnotempty(str)) if ((str[strlen(str) - 1] != '/') && (str[strlen(str) - 1] != '\\')) strcatbuff(str, "/"); strcatbuff(stropt2, "-O \""); strcatbuff(stropt2, str); strcatbuff(stropt2, projname); strcatbuff(stropt2, "\" "); // Créer si ce n'est fait un index.html 1er niveau make_empty_index(str); // printf("\n"); printf("Enter URLs (separated by commas or blank spaces) :"); fflush(stdout); linput(stdin, urls, 250); if (strnotempty(urls)) { while((a = strchr(urls, ','))) *a = ' '; while((a = strchr(urls, '\t'))) *a = ' '; // Action printf("\nAction:\n"); switch (help_query ("Mirror Web Site(s)|Mirror Web Site(s) with Wizard|Just Get Files Indicated|Mirror ALL links in URLs (Multiple Mirror)|Test Links In URLs (Bookmark Test)|Update/Continue a Mirror", 1)) { case 1: break; case 2: strcatbuff(stropt, "W"); break; case 3: strcatbuff(stropt2, "--get "); break; case 4: strcatbuff(stropt2, "--mirrorlinks "); break; case 5: strcatbuff(stropt2, "--testlinks "); break; case 6: strcatbuff(stropt2, "--update "); break; case 0: return; break; } // Proxy printf("\nProxy (return=none) :"); linput(stdin, str, 250); if (strnotempty(str)) { while((a = strchr(str, ' '))) *a = ':'; // port if (!strchr(jump_identification_const(str), ':')) { char str2[256]; printf("\nProxy port (return=8080) :"); linput(stdin, str2, 250); strcatbuff(str, ":"); if (strnotempty(str2) == 0) strcatbuff(str, "8080"); else strcatbuff(str, str2); } strcatbuff(stropt2, "-P "); strcatbuff(stropt2, str); strcatbuff(stropt2, " "); } // Display strcatbuff(stropt2, " -%v "); // Wildcards printf ("\nYou can define wildcards, like: -*.gif +www.*.com/*.zip -*img_*.zip\n"); printf("Wildcards (return=none) :"); linput(stdin, strwild, 250); // Options do { printf ("\nYou can define additional options, such as recurse level (-r<number>), separated by blank spaces\n"); printf("To see the option list, type help\n"); printf("Additional options (return=none) :"); linput(stdin, str, 250); if (strfield2(str, "help")) { help("httrack", 2); } else if (strnotempty(str)) { strcatbuff(stropt2, str); strcatbuff(stropt2, " "); } } while(strfield2(str, "help")); { int argc = 1; int g = 0; int i = 0; // printf("\n"); if (strlen(stropt) == 1) stropt[0] = '\0'; // aucune sprintf(cmd, "%s %s %s %s", urls, stropt, stropt2, strwild); printf("---> Wizard command line: httrack %s\n\n", cmd); printf("Ready to launch the mirror? (Y/n) :"); fflush(stdout); linput(stdin, str, 250); if (strnotempty(str)) { if (!((str[0] == 'y') || (str[0] == 'Y'))) return; } printf("\n"); // couper en morceaux argv[0] = strdup("winhttrack"); argv[1] = cmd; argc++; while(cmd[i]) { if (cmd[i] == '\"') g = !g; if (cmd[i] == ' ') { if (!g) { cmd[i] = '\0'; argv[argc++] = cmd + i + 1; } } i++; } hts_main(argc, argv); } //} else { // help("httrack",1); } /* Free buffers */ free(buffers); #undef urls #undef mainpath #undef projname #undef stropt #undef stropt2 #undef strwild #undef cmd #undef str #undef argv }
// forme à partir d'un lien et du contexte (origin_fil et origin_adr d'où il est tiré) adr et fil // [adr et fil sont des buffers de 1ko] // 0 : ok // -1 : erreur // -2 : protocole non supporté (ftp) int ident_url_relatif(const char *lien, const char *origin_adr, const char *origin_fil, lien_adrfil* const adrfil) { int ok = 0; int scheme = 0; assertf(adrfil != NULL); adrfil->adr[0] = '\0'; adrfil->fil[0] = '\0'; //effacer buffers // lien non vide! if (strnotempty(lien) == 0) return -1; // erreur! // Scheme? { const char *a = lien; while(isalpha((unsigned char) *a)) a++; if (*a == ':') scheme = 1; } // filtrer les parazites (mailto & cie) // scheme+authority (//) if ((strfield(lien, "http://")) // scheme+// || (strfield(lien, "file://")) // scheme+// || (strncmp(lien, "//", 2) == 0) // // sans scheme (-> default) ) { if (ident_url_absolute(lien, adrfil) == -1) { ok = -1; // erreur URL } } else if (strfield(lien, "ftp://")) { // Note: ftp:foobar.gif is not valid if (ftp_available()) { // ftp supporté if (ident_url_absolute(lien, adrfil) == -1) { ok = -1; // erreur URL } } else { ok = -2; // non supporté } #if HTS_USEOPENSSL } else if (strfield(lien, "https://")) { // Note: ftp:foobar.gif is not valid if (ident_url_absolute(lien, adrfil) == -1) { ok = -1; // erreur URL } #endif } else if ((scheme) && ((!strfield(lien, "http:")) && (!strfield(lien, "https:")) && (!strfield(lien, "ftp:")) )) { ok = -1; // unknown scheme } else { // c'est un lien relatif // On forme l'URL complète à partie de l'url actuelle // et du chemin actuel si besoin est. // sanity check if (origin_adr == NULL || origin_fil == NULL || *origin_adr == '\0' || *origin_fil == '\0') { return -1; } // copier adresse if (((int) strlen(origin_adr) < HTS_URLMAXSIZE) && ((int) strlen(origin_fil) < HTS_URLMAXSIZE) && ((int) strlen(lien) < HTS_URLMAXSIZE)) { /* patch scheme if necessary */ if (strfield(lien, "http:")) { lien += 5; strcpybuff(adrfil->adr, jump_protocol_const(origin_adr)); // même adresse ; protocole vide (http) } else if (strfield(lien, "https:")) { lien += 6; strcpybuff(adrfil->adr, "https://"); // même adresse forcée en https strcatbuff(adrfil->adr, jump_protocol_const(origin_adr)); } else if (strfield(lien, "ftp:")) { lien += 4; strcpybuff(adrfil->adr, "ftp://"); // même adresse forcée en ftp strcatbuff(adrfil->adr, jump_protocol_const(origin_adr)); } else { strcpybuff(adrfil->adr, origin_adr); // même adresse ; et même éventuel protocole } if (*lien != '/') { // sinon c'est un lien absolu if (*lien == '\0') { strcpybuff(adrfil->fil, origin_fil); } else if (*lien == '?') { // example: a href="?page=2" char *a; strcpybuff(adrfil->fil, origin_fil); a = strchr(adrfil->fil, '?'); if (a) *a = '\0'; strcatbuff(adrfil->fil, lien); } else { const char *a = strchr(origin_fil, '?'); if (a == NULL) a = origin_fil + strlen(origin_fil); while((*a != '/') && (a > origin_fil)) a--; if (*a == '/') { // ok on a un '/' if ((((int) (a - origin_fil)) + 1 + strlen(lien)) < HTS_URLMAXSIZE) { // copier chemin strncpy(adrfil->fil, origin_fil, ((int) (a - origin_fil)) + 1); *(adrfil->fil + ((int) (a - origin_fil)) + 1) = '\0'; // copier chemin relatif if (((int) strlen(adrfil->fil) + (int) strlen(lien)) < HTS_URLMAXSIZE) { strcatbuff(adrfil->fil, lien + ((*lien == '/') ? 1 : 0)); // simplifier url pour les ../ fil_simplifie(adrfil->fil); } else ok = -1; // erreur } else { // erreur ok = -1; // erreur URL } } else { // erreur ok = -1; // erreur URL } } } else { // chemin absolu // copier chemin directement strcatbuff(adrfil->fil, lien); fil_simplifie(adrfil->fil); } // *lien!='/' } else ok = -1; } // test news: etc. // case insensitive pour adresse { char *a = jump_identification(adrfil->adr); while(*a) { if ((*a >= 'A') && (*a <= 'Z')) *a += 'a' - 'A'; a++; } } // IDNA / RFC 3492 (Punycode) handling for HTTP(s) if (!link_has_authority(adrfil->adr) || strfield(adrfil->adr, "https:")) { char *const a = jump_identification(adrfil->adr); // Non-ASCII characters (theorically forbidden, but browsers are lenient) if (!hts_isStringAscii(a, strlen(a))) { char *const idna = hts_convertStringUTF8ToIDNA(a, strlen(a)); if (idna != NULL) { if (strlen(idna) < HTS_URLMAXSIZE) { strcpybuff(a, idna); } free(idna); } } } return ok; }